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 logPLC, logAGV, logBMS, logCAL; DevBMS BMS; DevAGV AGV; DevPLC PLC; DevCAL CAL; 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(); 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(); PLC = new DevPLC(); CAL = new DevCAL(); this.serAGV.dev = AGV; this.serPLC.dev = PLC; this.serBMS.dev = BMS; this.serCAL.dev = CAL; BMS.Message += Bms_Message; AGV.Message += Bms_Message; PLC.Message += Bms_Message; CAL.Message += Bms_Message; BMS.RequestBatteryData += Bms_RequestBatteryData; BMS.RequestVoltageData += BMS_RequestVoltageData; PLC.RequestData += Plc_RequestData; PLC.ValueChanged += Plc_ValueChanged; 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); timer1.Start(); //plc inout 이름 설정 List titles = new List(); List values = new List(); for (int i = 0; i < 16; i++) { var pin = (DevPLC.DIName)i; titles.Add(pin.ToString()); values.Add(false); } for (int i = 0; i < 8; i++) { var pin = (DevPLC.DOName)i; titles.Add(pin.ToString()); values.Add(false); } this.gvdPLCInOut.setTitle(titles.ToArray()); this.gvdPLCInOut.setValue(values.ToArray()); titles.Clear(); values.Clear(); for (int i = 0; i < 32; i++) { titles.Add(i.ToString()); values.Add(false); } this.gvdPLCFlag.setTitle(titles.ToArray()); this.gvdPLCFlag.setValue(values.ToArray()); this.gvdPLCInOut.ItemClick += GvdPLCInOut_ItemClick; this.gvdPLCFlag.ItemClick += GvdPLCFlag_ItemClick; this.gvdPLCFlag.ColorList = new arFrame.Control.ColorListItem[] { new arFrame.Control.ColorListItem(){ BackColor1 = Color.DimGray, BackColor2 = Color.Gray }, new arFrame.Control.ColorListItem(){ BackColor1 = Color.Green, BackColor2 = Color.Lime }, new arFrame.Control.ColorListItem(){ BackColor1 = Color.Red, BackColor2 = Color.Tomato }, }; this.gvdPLCInOut.ColorList = this.gvdPLCFlag.ColorList; 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; } private void Agv_Command(object sender, commandargs e) { switch (e.Command.ToLower()) { case "stopmark": agvViewer1.StopbyMark = true; break; } } void MakeViewer() { //태그목록 List listTAG = new List(); //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 listMRK = new List(); 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(); } private void Agv_StsValueChanged(object sender, DevAGV.StsValueChangedArgs e) { Console.WriteLine($"STS [{e.vtype}] VAL={e.Value}"); if (this.InvokeRequired) { this.BeginInvoke(new EventHandler(Agv_StsValueChanged), sender, e); return; } switch (e.vtype) { case DevAGV.estsvaluetype.direction: foreach (RadioButton c in this.groupBox5.Controls) { if (c.Text[0].Equals(e.Value)) { c.Checked = true; } else { c.Checked = false; } c.Refresh(); } groupBox5.Refresh(); break; case DevAGV.estsvaluetype.bunki: foreach (RadioButton c in this.groupBox2.Controls) { if (c.Text[0].Equals(e.Value)) { c.Checked = true; c.Refresh(); break; } } break; case DevAGV.estsvaluetype.speed: foreach (RadioButton c in this.groupBox4.Controls) { if (c.Text[0].Equals(e.Value)) { c.Checked = true; c.Refresh(); break; } } break; case DevAGV.estsvaluetype.sensor: foreach (RadioButton c in this.groupBox8.Controls) { if (c.Text.Equals(e.Value)) { c.Checked = true; c.Refresh(); break; } } break; } } private void Agv_ValueChanged(object sender, DevAGV.ValueChangedArgs e) { if (this.InvokeRequired) { this.Invoke(new EventHandler(Agv_ValueChanged), sender, e); return; } //내부값이 바뀌었다면 컨트롤을 변경해준다. switch (e.vtype) { case DevAGV.evaluetype.system0: foreach (CheckBox c in panel6.Controls) { var idx = int.Parse(c.Tag.ToString()); if (idx == e.Idx) { c.Checked = e.Value; break; } } break; case DevAGV.evaluetype.system1: var v = (DevAGV.esystemflag1)e.Idx; if (e.Value) { if (v == esystemflag1.agv_run) { agvViewer1.wat.Restart(); } if (v == esystemflag1.agv_stop) { agvViewer1.wat.Stop(); } } foreach (CheckBox c in panel7.Controls) { var idx = int.Parse(c.Tag.ToString()); if (idx == e.Idx) { c.Checked = e.Value; break; } } break; case DevAGV.evaluetype.error: foreach (CheckBox c in panel9.Controls) { var idx = int.Parse(c.Tag.ToString()); if (idx == e.Idx) { c.Checked = e.Value; break; } } break; case DevAGV.evaluetype.signal: foreach (CheckBox c in panel8.Controls) { var idx = int.Parse(c.Tag.ToString()); if (idx == e.Idx) { c.Checked = e.Value; break; } } break; } } 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; private void Plc_ValueChanged(object sender, DevPLC.ValueChangedArgs e) { if (e.IsOut) { this.gvdPLCInOut.setValue(e.Idx + 16, e.Value); var doname = (DevPLC.DOName)e.Idx; switch (doname) { case DevPLC.DOName.PINO_GUIDEMOTOR_RRUN: break; case DevPLC.DOName.PINO_GUIDEMOTOR_LRUN: break; } } else { this.gvdPLCInOut.setValue(e.Idx, e.Value); } this.gvdPLCInOut.Invalidate(); } private void Plc_RequestData(object sender, DevPLC.RequestBatteryDataArgs e) { var idx = 0; UInt32 val = 0; foreach (var data in gvdPLCInOut.Values) { SetBit(ref val, idx++, (data > 0)); } e.IOValue = val; idx = 0; val = 0; foreach (var data in gvdPLCFlag.Values) { SetBit(ref val, idx++, (data > 0)); } e.FGValue = val; } public void SetBit(ref UInt32 _value, int idx, Boolean value) { if (value) { var offset = (UInt32)(1 << idx); _value = _value | offset; } else { var offset = (UInt32)(~(1 << idx)); _value = _value & offset; } } 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 Agv_RequestStatusData(object sender, DevAGV.RequestStatusDataArgs e) { //UInt16 system0 = 0xFFFF; //UInt16 system1 = 0xFFFF; //UInt16 error = 0xFFFF; //byte signal = 0xFF; aaplycheckboxbit(ref AGV.system0, panel6); aaplycheckboxbit(ref AGV.system1, panel7); aaplycheckboxbit(ref AGV.error, panel9); aaplycheckboxbit(ref AGV.signal, panel8); if (this.agvViewer1.StopbyMark) AGV.sts_speed = 'S'; else AGV.sts_speed = GetGroupItemCheckbox(groupBox4); AGV.sts_bunki = GetGroupItemCheckbox(groupBox2); AGV.sts_dir = GetGroupItemCheckbox(groupBox5); AGV.sts_sensor = GetGroupItemCheckbox(groupBox8); //this.Invoke(new Action(() => //{ // e.system0 = system0; // e.system1 = system1; // e.error = error; // e.signal = signal; // e.speed = GetGroupItemCheckbox(groupBox4); // e.bunki = GetGroupItemCheckbox(groupBox2); // e.direction = GetGroupItemCheckbox(groupBox5); // e.sensor = GetGroupItemCheckbox(groupBox8); // e.volt = 23.4f; //})); } private void BMS_RequestVoltageData(object sender, DevBMS.RequestVoltageDataArgs e) { //cell전압값추가 for (int i = 0; i < cellvolt.Length; i++) { this.cellvolt[i] = (UInt16)rnd.Next(3300, 3350); } Array.Copy(this.cellvolt, 0, e.cellVolt, 0, 8); this.btc1.Invoke(new Action(() => { var idx = 0; btc1.Text = (this.cellvolt[idx++] / 1000f).ToString(); btc2.Text = (this.cellvolt[idx++] / 1000f).ToString(); btc3.Text = (this.cellvolt[idx++] / 1000f).ToString(); btc4.Text = (this.cellvolt[idx++] / 1000f).ToString(); btc5.Text = (this.cellvolt[idx++] / 1000f).ToString(); btc6.Text = (this.cellvolt[idx++] / 1000f).ToString(); btc7.Text = (this.cellvolt[idx++] / 1000f).ToString(); btc8.Text = (this.cellvolt[idx++] / 1000f).ToString(); })); } private void Bms_RequestBatteryData(object sender, DevBMS.RequestBatteryDataArgs e) { if (checkBox1.Checked) this.trackBar1.Invoke(new Action(() => { this.trackBar1.Value -= 1; trackBar1_Scroll(null, null); })); e.CurA = (int)BMS_CurA; e.MaxA = (int)BMS_MaxA; e.Remain = BMS_Remain; e.Volt = BMS_Volt; } private void button5_Click(object sender, EventArgs e) { AGV.WriteData("ACK"); } private void button4_Click(object sender, EventArgs e) { AGV.WriteData("NAK"); } private void button7_Click(object sender, EventArgs e) { var pinL = DevPLC.DOName.PINO_GUIDEMOTOR_LRUN; var pinR = DevPLC.DOName.PINO_GUIDEMOTOR_RRUN; var pinDL = DevPLC.DOName.PINO_GUIDEMOTOR_LDIR; var pinDR = DevPLC.DOName.PINO_GUIDEMOTOR_RDIR; this.gvdPLCInOut.setValue((int)pinDL + 16, true); this.gvdPLCInOut.setValue((int)pinDR + 16, true); this.gvdPLCInOut.setValue((int)pinL + 16, true); this.gvdPLCInOut.setValue((int)pinR + 16, true); this.gvdPLCInOut.Invalidate(); } private void button6_Click(object sender, EventArgs e) { var pinL = DevPLC.DOName.PINO_GUIDEMOTOR_LRUN; var pinR = DevPLC.DOName.PINO_GUIDEMOTOR_RRUN; var cur = gvdPLCInOut.Values[(int)pinL + 16]; this.gvdPLCInOut.setValue((int)pinL + 16, false); this.gvdPLCInOut.setValue((int)pinR + 16, false); this.gvdPLCInOut.Invalidate(); } private void button8_Click(object sender, EventArgs e) { var pinL = DevPLC.DOName.PINO_GUIDEMOTOR_LRUN; var pinR = DevPLC.DOName.PINO_GUIDEMOTOR_RRUN; var pinDL = DevPLC.DOName.PINO_GUIDEMOTOR_LDIR; var pinDR = DevPLC.DOName.PINO_GUIDEMOTOR_RDIR; this.gvdPLCInOut.setValue((int)pinDL + 16, false); this.gvdPLCInOut.setValue((int)pinDR + 16, false); this.gvdPLCInOut.setValue((int)pinL + 16, true); this.gvdPLCInOut.setValue((int)pinR + 16, true); this.gvdPLCInOut.Invalidate(); } 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 = CAL.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 (CAL != null && CAL.IsOpen) CAL.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(); } UpdatePLC(); label7.Text = $"I/O L({PLC_LeftPosition}),R({PLC_RightPosition})"; timer1.Start(); } void UpdatePLC() { //plc값을 업데이트해준다. var LRun = gvdPLCInOut.getValue((int)DevPLC.DOName.PINO_GUIDEMOTOR_LRUN + 16) == 1; var RRun = gvdPLCInOut.getValue((int)DevPLC.DOName.PINO_GUIDEMOTOR_RRUN + 16) == 1; var LDir = gvdPLCInOut.getValue((int)DevPLC.DOName.PINO_GUIDEMOTOR_LDIR + 16) == 1; var RDir = gvdPLCInOut.getValue((int)DevPLC.DOName.PINO_GUIDEMOTOR_RDIR + 16) == 1; if (LRun == false) this.PLC_LeftDir = 0; else if (LDir == true) this.PLC_LeftDir = 1; else this.PLC_LeftDir = -1; if (RRun == false) this.PLC_RightDir = 0; else if (RDir == true) this.PLC_RightDir = 1; else this.PLC_RightDir = -1; this.PLC_LeftPosition += this.PLC_LeftDir; this.PLC_RightPosition += this.PLC_RightDir; var maxvalue = 20; if (PLC_LeftPosition >= maxvalue) { PLC_LeftPosition = maxvalue; PLC_LeftDir = 0;//멈춤 var idx = (int)DevPLC.DOName.PINO_GUIDEMOTOR_LRUN; gvdPLCInOut.setValue(idx + 16, false); idx = (int)DevPLC.DIName.PINI_LIMIT_LD; gvdPLCInOut.setValue(idx, false); idx = (int)DevPLC.DIName.PINI_LIMIT_LU; gvdPLCInOut.setValue(idx, true); } else if (PLC_LeftPosition <= 0) { PLC_LeftPosition = 0; PLC_LeftDir = 0; var idx = (int)DevPLC.DOName.PINO_GUIDEMOTOR_LRUN; gvdPLCInOut.setValue(idx + 16, false); idx = (int)DevPLC.DIName.PINI_LIMIT_LU; gvdPLCInOut.setValue(idx, false); idx = (int)DevPLC.DIName.PINI_LIMIT_LD; gvdPLCInOut.setValue(idx, true); } else if (PLC_LeftPosition > 5 && PLC_LeftPosition < maxvalue - 5) { if (gvdPLCInOut.getValue((int)DevPLC.DIName.PINI_LIMIT_LD) > 0) gvdPLCInOut.setValue((int)DevPLC.DIName.PINI_LIMIT_LD, false); if (gvdPLCInOut.getValue((int)DevPLC.DIName.PINI_LIMIT_LU) > 0) gvdPLCInOut.setValue((int)DevPLC.DIName.PINI_LIMIT_LU, false); } if (PLC_RightPosition >= maxvalue) { PLC_RightPosition = maxvalue; PLC_RightDir = 0;//멈춤 var idx = (int)DevPLC.DOName.PINO_GUIDEMOTOR_RRUN; gvdPLCInOut.setValue(idx + 16, false); idx = (int)DevPLC.DIName.PINI_LIMIT_RD; gvdPLCInOut.setValue(idx, false); idx = (int)DevPLC.DIName.PINI_LIMIT_RU; gvdPLCInOut.setValue(idx, true); } else if (PLC_RightPosition <= 0) { PLC_RightPosition = 0; PLC_RightDir = 0; var idx = (int)DevPLC.DOName.PINO_GUIDEMOTOR_RRUN; gvdPLCInOut.setValue(idx + 16, false); idx = (int)DevPLC.DIName.PINI_LIMIT_RU; gvdPLCInOut.setValue(idx, false); idx = (int)DevPLC.DIName.PINI_LIMIT_RD; gvdPLCInOut.setValue(idx, true); } else if (PLC_RightPosition > 5 && PLC_RightPosition < maxvalue - 5) { if (gvdPLCInOut.getValue((int)DevPLC.DIName.PINI_LIMIT_RD) > 0) gvdPLCInOut.setValue((int)DevPLC.DIName.PINI_LIMIT_RD, false); if (gvdPLCInOut.getValue((int)DevPLC.DIName.PINI_LIMIT_RU) > 0) gvdPLCInOut.setValue((int)DevPLC.DIName.PINI_LIMIT_RU, false); } } private void Bms_Message(object sender, AR.Dev.RS232.MessageEventArgs e) { var dev = sender as AR.Dev.RS232; if (dev is DevBMS) { logBMS.Add(e.Message); } else if (dev is DevAGV) { logAGV.Add(e.Message); } else if (dev is DevPLC) { logPLC.Add(e.Message); } else if (dev is DevCAL) { if (e.MsgType == AR.Dev.RS232.MessageType.Send) logCAL.Add(">> " + e.Data.HexString()); else if (e.MsgType == AR.Dev.RS232.MessageType.Recv) logCAL.Add("<< " + e.Data.HexString()); else logCAL.Add(e.Message); } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { timer1.Stop(); logPLC.Flush(); logAGV.Flush(); logBMS.Flush(); logCAL.Flush(); } private void btPLCemg_Click(object sender, EventArgs e) { var pin = DevPLC.DIName.PINI_EMG; var cur = gvdPLCInOut.Values[(int)pin]; this.gvdPLCInOut.setValue((int)pin, cur == 0); this.gvdPLCInOut.Invalidate(); } private void button9_Click(object sender, EventArgs e) { var pinL = DevPLC.DIName.PINI_LIMIT_LU; var pinR = DevPLC.DIName.PINI_LIMIT_RU; var cur = gvdPLCInOut.Values[(int)pinL]; this.gvdPLCInOut.setValue((int)pinL, cur == 0); this.gvdPLCInOut.setValue((int)pinR, cur == 0); pinL = DevPLC.DIName.PINI_LIMIT_LD; pinR = DevPLC.DIName.PINI_LIMIT_RD; this.gvdPLCInOut.setValue((int)pinL, false); this.gvdPLCInOut.setValue((int)pinR, false); this.gvdPLCInOut.Invalidate(); } private void button10_Click(object sender, EventArgs e) { var pinL = DevPLC.DIName.PINI_LIMIT_LD; var pinR = DevPLC.DIName.PINI_LIMIT_RD; var cur = gvdPLCInOut.Values[(int)pinL]; this.gvdPLCInOut.setValue((int)pinL, cur == 0); this.gvdPLCInOut.setValue((int)pinR, cur == 0); pinL = DevPLC.DIName.PINI_LIMIT_LU; pinR = DevPLC.DIName.PINI_LIMIT_RU; this.gvdPLCInOut.setValue((int)pinL, false); this.gvdPLCInOut.setValue((int)pinR, false); this.gvdPLCInOut.Invalidate(); } private void button13_Click(object sender, EventArgs e) { var pinL = DevPLC.DIName.PINI_BTN_1; var cur = gvdPLCInOut.Values[(int)pinL]; this.gvdPLCInOut.setValue((int)pinL, cur == 0); this.gvdPLCInOut.Invalidate(); } private void button12_Click(object sender, EventArgs e) { var pinL = DevPLC.DIName.PINI_BTN_2; var cur = gvdPLCInOut.Values[(int)pinL]; this.gvdPLCInOut.setValue((int)pinL, cur == 0); this.gvdPLCInOut.Invalidate(); } private void button11_Click(object sender, EventArgs e) { var pinL = DevPLC.DIName.PINI_BTN_3; var cur = gvdPLCInOut.Values[(int)pinL]; this.gvdPLCInOut.setValue((int)pinL, cur == 0); this.gvdPLCInOut.Invalidate(); } private void panel4_Paint(object sender, PaintEventArgs e) { } private void groupBox9_Enter(object sender, EventArgs e) { } 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 button1_Click(object sender, EventArgs e) { var bt = sender as Button; var kitno = nudBMSKitNo.Value.ToString()[0]; var value = bt.Tag.ToString()[0]; var barr = new List(); barr.Add(0x02); barr.Add((byte)kitno); barr.Add((byte)value); barr.Add(0x03); CAL.WriteData(barr.ToArray()); } private void serAGV_Load(object sender, EventArgs e) { } private void agvViewer1_Click(object sender, EventArgs e) { } 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 radioButton20_Click(object sender, EventArgs e) { var rad = sender as RadioButton; var kitno = int.Parse(rad.Text); nudBMSKitNo.Value = (decimal)kitno; } private void toolStripButton1_Click(object sender, EventArgs e) { serAGV.Connect(); serPLC.Connect(); serBMS.Connect(); serCAL.Connect(); } private void toolStripButton2_Click(object sender, EventArgs e) { serAGV.Disconnect(); serPLC.Disconnect(); serBMS.Disconnect(); serCAL.Disconnect(); } private void serBMS_Load(object sender, EventArgs e) { } void checkboxevent() { } private void GvdPLCFlag_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e) { var newvalue = gvdPLCFlag.Values[e.idx]; this.gvdPLCFlag.setValue(e.idx, (ushort)(newvalue == 0 ? 1 : 0)); this.gvdPLCFlag.Invalidate(); } private void GvdPLCInOut_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e) { var newvalue = gvdPLCInOut.Values[e.idx]; this.gvdPLCInOut.setValue(e.idx, (ushort)(newvalue == 0 ? 1 : 0)); this.gvdPLCInOut.Invalidate(); } } }