Files
ENIG/Emulator/AGVEmulator/Form1.cs
2025-06-20 11:56:34 +09:00

616 lines
20 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using static AGVEmulator.DevAGV;
namespace AGVEmulator
{
public partial class Form1 : Form
{
arUtil.Log logAGV, logBMS, logCAL;
DevBMS BMS;
DevAGV AGV;
DevXBE XBE;
float BMS_MaxA = 80f;
float BMS_Remain = 79f;
float BMS_CurA = 70f;
float BMS_Volt = 25.4f;
UInt16[] cellvolt = new UInt16[] { 0, 0, 0, 0, 0, 0, 0, 0 };
public Form1()
{
InitializeComponent();
this.Text = $"{Application.ProductName} ver.{Application.ProductVersion}";
// logPLC = new arUtil.Log();
logAGV = new arUtil.Log();
logBMS = new arUtil.Log();
logCAL = new arUtil.Log();
// logPLC.FileNameFormat = "{yyyyMMdd}_PLC";
logAGV.FileNameFormat = "{yyyyMMdd}_AGV";
logBMS.FileNameFormat = "{yyyyMMdd}_BMS";
logCAL.FileNameFormat = "{yyyyMMdd}_CAL";
// logPLC.RaiseMsg += (s1, e1, d1) => { this.rtPLC.AddMsg(s1, e1, d1); };
logAGV.RaiseMsg += (s1, e1, d1) =>
{
if (d1.StartsWith("Tx"))
this.rtAGV.AddMsg(s1, e1, d1);
else
this.rtAGVPro.AddMsg(s1, e1, d1);
};
logBMS.RaiseMsg += (s1, e1, d1) => { this.rtBMS.AddMsg(s1, e1, d1); };
logCAL.RaiseMsg += (s1, e1, d1) => { this.rtCAL.AddMsg(s1, e1, d1); };
var logcolor = new arCtl.sLogMessageColor[] {
new arCtl.sLogMessageColor("NORM", Color.White),
new arCtl.sLogMessageColor("INF", Color.SkyBlue),
new arCtl.sLogMessageColor("WARN", Color.Tomato),
new arCtl.sLogMessageColor("ERR", Color.Red),
new arCtl.sLogMessageColor("RX", Color.Lime),
new arCtl.sLogMessageColor("TX", Color.Orange),
};
//rtPLC.ColorList = logcolor;
rtAGV.ColorList = logcolor;
rtBMS.ColorList = logcolor;
rtCAL.ColorList = logcolor;
rtAGVPro.ColorList = logcolor;
this.FormClosed += Form1_FormClosed;
BMS = new DevBMS();
AGV = new DevAGV();
XBE = new DevXBE();
this.serAGV.dev = AGV;
this.serBMS.dev = BMS;
this.serCAL.dev = XBE;
BMS.Message += BMS_Message;
AGV.Message += AGV_Message;
XBE.Message += CAL_Message;
BMS.RequestBatteryData += Bms_RequestBatteryData;
BMS.RequestVoltageData += BMS_RequestVoltageData;
XBE.ProtocReceived += CAL_ProtocReceived;
AGV.RequestStatusData += Agv_RequestStatusData;
AGV.ValueChanged += Agv_ValueChanged;
AGV.StsValueChanged += Agv_StsValueChanged;
AGV.Command += Agv_Command;
}
Random rnd;
private void Form1_Load(object sender, EventArgs e)
{
rnd = new Random(3000);
serAGV.BaudRate = 57600;
// serPLC.BaudRate = 57600;
trackBar1_Scroll(null, null);
trbT2_Scroll(null, null);
trbT1_Scroll(null, null);
timer1.Start();
//plc inout 이름 설정
List<string> titles = new List<string>();
List<bool> values = new List<bool>();
var arrs = Enum.GetNames(typeof(DevAGV.esystemflag0));
foreach (var item in arrs)
{
var data = (DevAGV.esystemflag0)Enum.Parse(typeof(DevAGV.esystemflag0), item);
var chk = new CheckBox();
chk.Text = $"[{(int)data:00}] {item}";
chk.AutoSize = true;
chk.Visible = true;
chk.Tag = (int)data;
chk.Dock = DockStyle.Top;
chk.CheckedChanged += Chk_CheckedChanged;
this.panel6.Controls.Add(chk);
chk.Checked = true; //기본값 rue
}
arrs = Enum.GetNames(typeof(DevAGV.esystemflag1));
foreach (var item in arrs)
{
var data = (DevAGV.esystemflag1)Enum.Parse(typeof(DevAGV.esystemflag1), item);
var chk = new CheckBox();
chk.Text = $"[{(int)data:00}] {item}";
chk.AutoSize = true;
chk.Visible = true;
chk.Tag = (int)data;
chk.Dock = DockStyle.Top;
chk.CheckedChanged += Chk_CheckedChanged;
this.panel7.Controls.Add(chk);
}
arrs = Enum.GetNames(typeof(DevAGV.esignal));
foreach (var item in arrs)
{
var data = (DevAGV.esignal)Enum.Parse(typeof(DevAGV.esignal), item);
var chk = new CheckBox();
chk.Text = $"[{(int)data:00}] {item}";
chk.AutoSize = true;
chk.Visible = true;
chk.Tag = (int)data;
chk.Dock = DockStyle.Top;
chk.CheckedChanged += Chk_CheckedChanged;
this.panel8.Controls.Add(chk);
}
arrs = Enum.GetNames(typeof(DevAGV.eerror));
foreach (var item in arrs)
{
var data = (DevAGV.eerror)Enum.Parse(typeof(DevAGV.eerror), item);
var chk = new CheckBox();
chk.Text = $"[{(int)data:00}] {item}";
chk.AutoSize = true;
chk.Visible = true;
chk.Tag = (int)data;
chk.Dock = DockStyle.Top;
chk.CheckedChanged += Chk_CheckedChanged;
this.panel9.Controls.Add(chk);
}
//기본 중지상태로 변환
AGV.SetAGV(DevAGV.esystemflag1.agv_stop, true);
foreach (RadioButton rad in groupBox5.Controls)
{
rad.CheckedChanged += (s1, e1) =>
{
if (rad.Checked)
{
AGV.sts_dir = rad.Text[0];
}
};
}
foreach (RadioButton rad in groupBox2.Controls)
{
rad.CheckedChanged += (s1, e1) =>
{
if (rad.Checked)
{
AGV.sts_bunki = rad.Text[0];
}
};
}
foreach (RadioButton rad in groupBox4.Controls)
{
rad.CheckedChanged += (s1, e1) =>
{
if (rad.Checked)
{
AGV.sts_speed = rad.Text[0];
}
};
}
foreach (RadioButton rad in groupBox8.Controls)
{
rad.CheckedChanged += (s1, e1) =>
{
if (rad.Checked)
{
AGV.sts_sensor = rad.Text[0];
}
};
}
MakeViewer();
agvViewer1.TagTouched += AgvViewer1_TagTouched;
agvViewer1.MarkTouched += AgvViewer1_MarkTouched;
agvViewer1.Command += AgvViewer1_Command;
}
void MakeViewer()
{
//태그목록
List<UC.AgvViewer.ptdata> listTAG = new List<UC.AgvViewer.ptdata>();
//var strtag = new string[] {
// "9000", "9001", //not
// "9010", "9011",
// //"9020", "9021",
// "9030", "9031",
// // "9040", "9041",
// "9050", "9051",
// // "9060", "9061",
// "9070", "9071",
// "9080", "9081",
// "9090", "9091"};
//foreach(var tag in strtag)
//{
// listTAG.Add(new UC.AgvViewer.ptdata {
// active=false,
// data = tag,
// pos =
// });
//}
//agvViewer1.listTAG = listTAG.ToArray();
//마크지점
List<UC.AgvViewer.ptdata> listMRK = new List<UC.AgvViewer.ptdata>();
var strmark = new string[] { "NOT", "QC", "CHG", "{0}", "#1", "{1}", "#2", "{2}", "#3", "{3}", "#4", "POT" };
var pos = 50;
var tagstart = 9000;
foreach (var item in strmark)
{
listMRK.Add(new UC.AgvViewer.ptdata
{
pos = pos,
data = item,
});
if (item.Equals("CHG"))
{
pos += 100;
continue;
}
else if (item.Equals("{0}")) tagstart = 9350;
else if (item.Equals("{1}")) tagstart = 9450;
else if (item.Equals("{2}")) tagstart = 9550;
else if (item.Equals("{3}")) tagstart = 9650;
else if (item.Equals("#1")) tagstart = 9400;
else if (item.Equals("#2")) tagstart = 9500;
else if (item.Equals("#3")) tagstart = 9600;
else if (item.Equals("#4")) tagstart = 9700;
//지정위치 좌우에 태그를 심는다
listTAG.Add(new UC.AgvViewer.ptdata
{
pos = pos - 20,
data = tagstart.ToString(),
});
if (item.Equals("NOT") == false && item.Equals("POT") == false && item.StartsWith("{") == false)
tagstart += 1;
listTAG.Add(new UC.AgvViewer.ptdata
{
pos = pos + 20,
data = tagstart.ToString(),
});
pos += 100;
if (item.Equals("NOT") == false && item.Equals("POT") == false && item.StartsWith("{") == false)
tagstart += 99;
else
tagstart += 100;
if (item.Equals("NOT"))
tagstart = 9300;
//else
//{
// pos += 100;
// tagstart += 10;
//}
}
agvViewer1.listMRK = listMRK.ToArray();
agvViewer1.listTAG = listTAG.ToArray();
agvViewer1.Invalidate();
}
private void AgvViewer1_Command(object sender, UC.AgvViewer.TagArgs e)
{
if (e.Data == "stop")
{
AGV.SetAGV(esystemflag1.agv_run, false);
AGV.SetAGV(esystemflag1.agv_stop, true);
logAGV.Add("시뮬로부터 자동 중지");
}
}
private void AgvViewer1_MarkTouched(object sender, UC.AgvViewer.TagArgs e)
{
// throw new NotImplementedException();
AGV.SetAGV(esignal.mark_sensor_1, e.Active);
logAGV.Add($"mark {e.Data} touch:{e.Active}");
}
private void AgvViewer1_TagTouched(object sender, UC.AgvViewer.TagArgs e)
{
logAGV.Add($"tag touch:{e.Data}");
numericUpDown1.Value = decimal.Parse(e.Data);
button18.PerformClick();
}
char GetGroupItemCheckbox(GroupBox grp)
{
foreach (var ctl in grp.Controls)
{
if (ctl is RadioButton)
{
var rad = ctl as RadioButton;
if (rad.Checked) return rad.Text[0];
}
}
return '0';
}
int PLC_LeftPosition = 0;
int PLC_RightPosition = 0;
int PLC_LeftDir = 0;
int PLC_RightDir = 0;
public void SetBit(ref UInt16 _value, int idx, Boolean value)
{
if (value)
{
var offset = (UInt16)(1 << idx);
_value = (UInt16)(_value | offset);
}
else
{
var offset = (UInt16)(~(1 << idx));
_value = (UInt16)(_value & offset);
}
}
public void SetBit(ref byte _value, int idx, Boolean value)
{
if (value)
{
var offset = (byte)(1 << idx);
_value = (byte)(_value | offset);
}
else
{
var offset = (byte)(~(1 << idx));
_value = (byte)(_value & offset);
}
}
void aaplycheckboxbit(ref UInt16 v, Panel p)
{
foreach (CheckBox chk in p.Controls)
{
var idx = int.Parse(chk.Tag.ToString());
SetBit(ref v, idx, chk.Checked);
}
}
void aaplycheckboxbit(ref byte v, Panel p)
{
foreach (CheckBox chk in p.Controls)
{
var idx = int.Parse(chk.Tag.ToString());
SetBit(ref v, idx, chk.Checked);
}
}
private void button5_Click(object sender, EventArgs e)
{
AGV.WriteData("ACK");
}
private void button4_Click(object sender, EventArgs e)
{
AGV.WriteData("NAK");
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
BMS_MaxA = float.Parse(label4.Text);
BMS_CurA = (float)(trackBar1.Value / 100f);
BMS_Remain = 100f * (BMS_CurA / BMS_MaxA);// (trackBar1.Value / 10f);
var minvolt = 20.2f;
var maxvolt = 26.8f;
// BMS_CurA = (BMS_MaxA * (BMS_Remain / 100f));
label3.Text = BMS_CurA.ToString("N0"); //curr amp
label5.Text = $"{BMS_Remain:N2}%";
BMS_Volt = minvolt + ((maxvolt - minvolt) * (BMS_CurA / BMS_MaxA));
label6.Text = $"{BMS_Volt:N2}v";
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
sbAGV.ForeColor = AGV.IsOpen ? Color.ForestGreen : Color.Red;
// sbPLC.ForeColor = PLC.IsOpen ? Color.ForestGreen : Color.Red;
sbBMS.ForeColor = BMS.IsOpen ? Color.ForestGreen : Color.Red;
sbCAL.ForeColor = XBE.IsOpen ? Color.ForestGreen : Color.Red;
//if (checkBox2.Checked && PLC != null && PLC.IsOpen) PLC.AutoSendData(); //자동전송해야함
if (checkBox3.Checked && AGV != null && AGV.IsOpen) AGV.AutoSendData(); //자동전송해야함
if (BMS != null && BMS.IsOpen) BMS.AutoSendData(); //자동전송해야함
if (XBE != null && XBE.IsOpen) XBE.AutoSendData(); //자동전송해야함
if (chkSimulation.Checked && AGV.GetAGV(esystemflag1.agv_run))
{
if (radioButton15.Checked)
{
agvViewer1.dir = 1;
}
else
{
agvViewer1.dir = -1;
}
if (radioButton12.Checked) agvViewer1.mspd = 7;
else if (radioButton11.Checked) agvViewer1.mspd = 20;
else agvViewer1.mspd = 40;
agvViewer1.Invalidate();
}
timer1.Start();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
timer1.Stop();
logAGV.Flush();
logBMS.Flush();
logCAL.Flush();
}
private void button14_Click(object sender, EventArgs e)
{
//agv 정지
//비상정지 에러 플래그
AGV.SetAGV(DevAGV.eerror.Emergency, true);
AGV.SetAGV(DevAGV.esystemflag1.agv_run, false);
AGV.SetAGV(DevAGV.esystemflag1.agv_stop, true);
}
private void button16_Click(object sender, EventArgs e)
{
AGV.SetAGV(DevAGV.esystemflag1.stop_by_front_detect, true);
}
private void button15_Click(object sender, EventArgs e)
{
AGV.SetAGV(DevAGV.esystemflag1.stop_by_front_detect, false);
}
private void button17_Click(object sender, EventArgs e)
{
//agv 정지
//비상정지 에러 플래그
AGV.SetAGV(DevAGV.eerror.Emergency, false);
AGV.SetAGV(DevAGV.eerror.line_out_error, false);
AGV.SetAGV(DevAGV.eerror.Overcurrent, false);
AGV.SetAGV(DevAGV.esystemflag1.agv_run, false);
AGV.SetAGV(DevAGV.esystemflag1.agv_stop, true);
}
private void Chk_CheckedChanged(object sender, EventArgs e)
{
var chk = sender as CheckBox;
var idx = int.Parse(chk.Tag.ToString());
switch (chk.Parent.Tag.ToString().ToLower())
{
case "s0":
var v0 = (DevAGV.esystemflag0)idx;
AGV.SetAGV(v0, chk.Checked);
break;
case "s1":
var v1 = (DevAGV.esystemflag1)idx;
AGV.SetAGV(v1, chk.Checked);
break;
case "er":
var v2 = (DevAGV.eerror)idx;
AGV.SetAGV(v2, chk.Checked);
break;
case "sg":
var v3 = (DevAGV.esignal)idx;
AGV.SetAGV(v3, chk.Checked);
break;
}
chk.BackColor = chk.Checked ? Color.Lime : SystemColors.Window;
}
private void button18_Click(object sender, EventArgs e)
{
AGV.SendTag(numericUpDown1.Value.ToString());
}
private void agvViewer1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
agvViewer1.StopbyMark = !agvViewer1.StopbyMark;
}
else if (e.Button == MouseButtons.Right)
{
MakeViewer();
}
}
private void button6_Click(object sender, EventArgs e)
{
var target = (byte)nudIDAgv.Value;
var tagno = (uint)nudTagNo.Value;
this.XBE.SendGotoTag(target, tagno);
}
private void button1_Click(object sender, EventArgs e)
{
var target = (byte)nudIDAgv.Value;
var tagno = (uint)numericUpDown2.Value;
this.XBE.SendCurrentPos(target, tagno);
}
UInt16 Temp1, Temp2;
private void trbT1_Scroll(object sender, EventArgs e)
{
//값에 /10해서 표시한다.
Temp1 =(UInt16) trbT1.Value;
label10.Text = $"{Temp1 / 10f}º";
}
private void trbT2_Scroll(object sender, EventArgs e)
{
Temp2 = (UInt16)trbT2.Value;
label11.Text = $"{Temp2 / 10f}º";
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
serAGV.Connect();
serBMS.Connect();
serCAL.Connect();
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
serAGV.Disconnect();
serBMS.Disconnect();
serCAL.Disconnect();
}
}
}