From 9ee829548939d8b95affdc33ef031cbb97966d62 Mon Sep 17 00:00:00 2001 From: backuppc Date: Tue, 27 Jan 2026 14:01:30 +0900 Subject: [PATCH] .. --- AGVEmulator/DevAGV.cs | 20 +- AGVEmulator/DevXBE.cs | 34 +- AGVEmulator/fMain.Designer.cs | 442 ++++++++++-------- AGVEmulator/fMain.cs | 20 +- Cs_HMI/Project/AGV4.csproj | 12 - Cs_HMI/Project/Device/Xbee.cs | 78 ++-- Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs | 89 +--- .../StateMachine/Step/_SM_RUN_BUFFER_IN.cs | 22 +- .../StateMachine/Step/_SM_RUN_BUFFER_OUT.cs | 8 +- .../StateMachine/Step/_SM_RUN_CLEANER_IN.cs | 181 ------- .../StateMachine/Step/_SM_RUN_CLEANER_OUT.cs | 92 ---- .../StateMachine/Step/_SM_RUN_LOADER_IN.cs | 196 +++++--- .../StateMachine/Step/_SM_RUN_LOADER_OUT.cs | 135 +++++- .../StateMachine/Step/_SM_RUN_UNLOADER_IN.cs | 183 -------- .../StateMachine/Step/_SM_RUN_UNLOADER_OUT.cs | 92 ---- Cs_HMI/Project/StateMachine/Step/_Util.cs | 32 +- Cs_HMI/Project/StateMachine/_Xbee.cs | 73 +-- Cs_HMI/Project/ViewForm/fAuto.cs | 8 +- 18 files changed, 644 insertions(+), 1073 deletions(-) delete mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_CLEANER_IN.cs delete mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_CLEANER_OUT.cs delete mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_UNLOADER_IN.cs delete mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_UNLOADER_OUT.cs diff --git a/AGVEmulator/DevAGV.cs b/AGVEmulator/DevAGV.cs index 7dcf64d..b4b7896 100644 --- a/AGVEmulator/DevAGV.cs +++ b/AGVEmulator/DevAGV.cs @@ -67,13 +67,13 @@ namespace AGVEmulator public enum esignal1 { front_gate_out = 0, - rear_sensor_out, + rear_gte_out, mark_sensor_1, mark_sensor_2, + lift_down_sensor, + lift_up_sensor, + magnet_relay, charger_align_sensor, - lift_up, - lift_down, - magnet_on } public enum esystemflag0 { @@ -330,20 +330,20 @@ namespace AGVEmulator switch(cmd2) { case "ON": - SetAGV(esignal1.magnet_on, true); + SetAGV(esignal1.magnet_relay, true); break; case "UP": - SetAGV(esignal1.lift_down, false); - SetAGV(esignal1.lift_up, true); + SetAGV(esignal1.lift_down_sensor, false); + SetAGV(esignal1.lift_up_sensor, true); break; case "DN": - SetAGV(esignal1.lift_up, false); - SetAGV(esignal1.lift_down, true); + SetAGV(esignal1.lift_up_sensor, false); + SetAGV(esignal1.lift_down_sensor, true); break; case "ST": break; case "OF": - SetAGV(esignal1.magnet_on, false); + SetAGV(esignal1.magnet_relay, false); break; } diff --git a/AGVEmulator/DevXBE.cs b/AGVEmulator/DevXBE.cs index efd096f..edff2e2 100644 --- a/AGVEmulator/DevXBE.cs +++ b/AGVEmulator/DevXBE.cs @@ -74,24 +74,48 @@ namespace AGVEmulator /// 카트를 가지러 들어간다 /// /// - public void SendPickOn(byte id) + public void SendPickOnEnter(byte id) { var data = new List(); data.Add(id); - Send(ENIGProtocol.AGVCommandHE.PickOn, data.ToArray()); + Send(ENIGProtocol.AGVCommandHE.PickOnEnter, data.ToArray()); } /// - /// 카트를 내려놓는다 + /// 카트를 내려놓으로 들어간다 /// /// - public void SendPickOff(byte id) + public void SendPickOffEnter(byte id) { var data = new List(); data.Add(id); - Send(ENIGProtocol.AGVCommandHE.PickOff, data.ToArray()); + Send(ENIGProtocol.AGVCommandHE.PickOffEnter, data.ToArray()); } + /// + /// 카트를 가지러 들어가서 나온다 + /// + /// + public void SendPickOnExit(byte id) + { + var data = new List(); + data.Add(id); + Send(ENIGProtocol.AGVCommandHE.PickOnExit, data.ToArray()); + } + + /// + /// 카트를 내려놓으러 들어가서 나온다 + /// + /// + public void SendPickOffExit(byte id) + { + var data = new List(); + data.Add(id); + Send(ENIGProtocol.AGVCommandHE.PickOffExit, data.ToArray()); + } + + + public void SendCurrentPos(byte id, uint tag) { var data = new List(); diff --git a/AGVEmulator/fMain.Designer.cs b/AGVEmulator/fMain.Designer.cs index 9ac93be..5c2203b 100644 --- a/AGVEmulator/fMain.Designer.cs +++ b/AGVEmulator/fMain.Designer.cs @@ -32,35 +32,35 @@ namespace AGVEmulator private void InitializeComponent() { this.components = new System.ComponentModel.Container(); + AGVEmulator.UC.AgvViewer.ptdata ptdata113 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata114 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata115 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata116 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata117 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata118 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata119 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata120 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata121 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata122 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata123 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata124 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata125 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata126 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata127 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata128 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata129 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata130 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata131 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata132 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata133 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata134 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata135 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata136 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata137 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata138 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata139 = new AGVEmulator.UC.AgvViewer.ptdata(); + AGVEmulator.UC.AgvViewer.ptdata ptdata140 = new AGVEmulator.UC.AgvViewer.ptdata(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fMain)); - AGVEmulator.UC.AgvViewer.ptdata ptdata1 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata2 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata3 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata4 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata5 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata6 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata7 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata8 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata9 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata10 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata11 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata12 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata13 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata14 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata15 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata16 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata17 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata18 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata19 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata20 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata21 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata22 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata23 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata24 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata25 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata26 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata27 = new AGVEmulator.UC.AgvViewer.ptdata(); - AGVEmulator.UC.AgvViewer.ptdata ptdata28 = new AGVEmulator.UC.AgvViewer.ptdata(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.rtBMS = new arCtl.LogTextBox(); this.panel1 = new System.Windows.Forms.Panel(); @@ -86,6 +86,7 @@ namespace AGVEmulator this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.trackBar1 = new System.Windows.Forms.TrackBar(); + this.serBMS = new AGVEmulator.SerialConn(); this.rtAGV = new arCtl.LogTextBox(); this.panel4 = new System.Windows.Forms.Panel(); this.groupBox9 = new System.Windows.Forms.GroupBox(); @@ -128,6 +129,7 @@ namespace AGVEmulator this.button4 = new System.Windows.Forms.Button(); this.groupBox3 = new System.Windows.Forms.GroupBox(); this.rtCAL = new arCtl.LogTextBox(); + this.serCAL = new AGVEmulator.SerialConn(); this.timer1 = new System.Windows.Forms.Timer(this.components); this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage4 = new System.Windows.Forms.TabPage(); @@ -135,6 +137,8 @@ namespace AGVEmulator this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); this.rtAGVPro = new arCtl.LogTextBox(); this.panel12 = new System.Windows.Forms.Panel(); + this.agvViewer1 = new AGVEmulator.UC.AgvViewer(); + this.serAGV = new AGVEmulator.SerialConn(); this.tabPage2 = new System.Windows.Forms.TabPage(); this.tabPage3 = new System.Windows.Forms.TabPage(); this.panel3 = new System.Windows.Forms.Panel(); @@ -166,10 +170,10 @@ namespace AGVEmulator this.sbBMS = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); this.sbCAL = new System.Windows.Forms.ToolStripStatusLabel(); - this.agvViewer1 = new AGVEmulator.UC.AgvViewer(); - this.serAGV = new AGVEmulator.SerialConn(); - this.serBMS = new AGVEmulator.SerialConn(); - this.serCAL = new AGVEmulator.SerialConn(); + this.label12 = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.button6 = new System.Windows.Forms.Button(); + this.button13 = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.panel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.trbT2)).BeginInit(); @@ -504,6 +508,18 @@ namespace AGVEmulator this.trackBar1.Value = 7000; this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll); // + // serBMS + // + this.serBMS.BaudRate = 9600; + this.serBMS.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.serBMS.dev = null; + this.serBMS.Dock = System.Windows.Forms.DockStyle.Top; + this.serBMS.Location = new System.Drawing.Point(3, 17); + this.serBMS.Name = "serBMS"; + this.serBMS.PortName = "COM31"; + this.serBMS.Size = new System.Drawing.Size(1134, 84); + this.serBMS.TabIndex = 1; + // // rtAGV // this.rtAGV.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24))))); @@ -997,6 +1013,18 @@ namespace AGVEmulator this.rtCAL.TabIndex = 2; this.rtCAL.Text = ""; // + // serCAL + // + this.serCAL.BaudRate = 9600; + this.serCAL.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.serCAL.dev = null; + this.serCAL.Dock = System.Windows.Forms.DockStyle.Top; + this.serCAL.Location = new System.Drawing.Point(3, 17); + this.serCAL.Name = "serCAL"; + this.serCAL.PortName = "COM41"; + this.serCAL.Size = new System.Drawing.Size(776, 84); + this.serCAL.TabIndex = 1; + // // timer1 // this.timer1.Interval = 200; @@ -1082,6 +1110,149 @@ namespace AGVEmulator this.panel12.Size = new System.Drawing.Size(1140, 120); this.panel12.TabIndex = 5; // + // agvViewer1 + // + this.agvViewer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.agvViewer1.FontMrk = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.agvViewer1.FontTag = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.agvViewer1.lastmark = ""; + this.agvViewer1.lastmarkdir = ""; + this.agvViewer1.lasttag = ""; + this.agvViewer1.lasttagdir = ""; + ptdata113.active = false; + ptdata113.data = "NOT"; + ptdata113.pos = 30F; + ptdata114.active = false; + ptdata114.data = "QA"; + ptdata114.pos = 200F; + ptdata115.active = false; + ptdata115.data = "CHG"; + ptdata115.pos = 300F; + ptdata116.active = false; + ptdata116.data = "QC"; + ptdata116.pos = 400F; + ptdata117.active = false; + ptdata117.data = "#FVI-1"; + ptdata117.pos = 500F; + ptdata118.active = false; + ptdata118.data = "#FVI-2"; + ptdata118.pos = 600F; + ptdata119.active = false; + ptdata119.data = "#FVI-3"; + ptdata119.pos = 700F; + ptdata120.active = false; + ptdata120.data = "#FVI-4"; + ptdata120.pos = 800F; + ptdata121.active = false; + ptdata121.data = "#FVI-5"; + ptdata121.pos = 900F; + ptdata122.active = false; + ptdata122.data = "POT"; + ptdata122.pos = 970F; + this.agvViewer1.listMRK = new AGVEmulator.UC.AgvViewer.ptdata[] { + ptdata113, + ptdata114, + ptdata115, + ptdata116, + ptdata117, + ptdata118, + ptdata119, + ptdata120, + ptdata121, + ptdata122}; + ptdata123.active = false; + ptdata123.data = "9000"; + ptdata123.pos = 80F; + ptdata124.active = false; + ptdata124.data = "9001"; + ptdata124.pos = 120F; + ptdata125.active = false; + ptdata125.data = "9010"; + ptdata125.pos = 180F; + ptdata126.active = false; + ptdata126.data = "9011"; + ptdata126.pos = 220F; + ptdata127.active = false; + ptdata127.data = "9020"; + ptdata127.pos = 280F; + ptdata128.active = false; + ptdata128.data = "9021"; + ptdata128.pos = 320F; + ptdata129.active = false; + ptdata129.data = "9030"; + ptdata129.pos = 380F; + ptdata130.active = false; + ptdata130.data = "9031"; + ptdata130.pos = 420F; + ptdata131.active = false; + ptdata131.data = "9040"; + ptdata131.pos = 480F; + ptdata132.active = false; + ptdata132.data = "9041"; + ptdata132.pos = 520F; + ptdata133.active = false; + ptdata133.data = "9050"; + ptdata133.pos = 580F; + ptdata134.active = false; + ptdata134.data = "9051"; + ptdata134.pos = 620F; + ptdata135.active = false; + ptdata135.data = "9060"; + ptdata135.pos = 680F; + ptdata136.active = false; + ptdata136.data = "9061"; + ptdata136.pos = 720F; + ptdata137.active = false; + ptdata137.data = "9070"; + ptdata137.pos = 780F; + ptdata138.active = false; + ptdata138.data = "9071"; + ptdata138.pos = 820F; + ptdata139.active = false; + ptdata139.data = "9000"; + ptdata139.pos = 10F; + ptdata140.active = false; + ptdata140.data = "9001"; + ptdata140.pos = 50F; + this.agvViewer1.listTAG = new AGVEmulator.UC.AgvViewer.ptdata[] { + ptdata123, + ptdata124, + ptdata125, + ptdata126, + ptdata127, + ptdata128, + ptdata129, + ptdata130, + ptdata131, + ptdata132, + ptdata133, + ptdata134, + ptdata135, + ptdata136, + ptdata137, + ptdata138, + ptdata139, + ptdata140}; + this.agvViewer1.Location = new System.Drawing.Point(241, 0); + this.agvViewer1.Name = "agvViewer1"; + this.agvViewer1.Size = new System.Drawing.Size(899, 120); + this.agvViewer1.StopbyMark = false; + this.agvViewer1.TabIndex = 0; + this.agvViewer1.Text = "agvViewer1"; + this.agvViewer1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.agvViewer1_MouseDown); + // + // serAGV + // + this.serAGV.BaudRate = 9600; + this.serAGV.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.serAGV.dev = null; + this.serAGV.Dock = System.Windows.Forms.DockStyle.Left; + this.serAGV.Location = new System.Drawing.Point(0, 0); + this.serAGV.Name = "serAGV"; + this.serAGV.PortName = "COM21"; + this.serAGV.Size = new System.Drawing.Size(241, 120); + this.serAGV.TabIndex = 0; + // // tabPage2 // this.tabPage2.Controls.Add(this.groupBox1); @@ -1106,6 +1277,10 @@ namespace AGVEmulator // // panel3 // + this.panel3.Controls.Add(this.label13); + this.panel3.Controls.Add(this.button6); + this.panel3.Controls.Add(this.button13); + this.panel3.Controls.Add(this.label12); this.panel3.Controls.Add(this.button3); this.panel3.Controls.Add(this.button2); this.panel3.Controls.Add(this.nudIDAgv); @@ -1128,9 +1303,9 @@ namespace AGVEmulator // // button3 // - this.button3.Location = new System.Drawing.Point(246, 339); + this.button3.Location = new System.Drawing.Point(204, 305); this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(86, 38); + this.button3.Size = new System.Drawing.Size(133, 38); this.button3.TabIndex = 15; this.button3.Tag = "--"; this.button3.Text = "Pick Off"; @@ -1139,9 +1314,9 @@ namespace AGVEmulator // // button2 // - this.button2.Location = new System.Drawing.Point(246, 295); + this.button2.Location = new System.Drawing.Point(65, 305); this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(86, 38); + this.button2.Size = new System.Drawing.Size(133, 38); this.button2.TabIndex = 14; this.button2.Tag = "--"; this.button2.Text = "Pick On"; @@ -1408,172 +1583,45 @@ namespace AGVEmulator this.sbCAL.Size = new System.Drawing.Size(19, 17); this.sbCAL.Text = "●"; // - // agvViewer1 + // label12 // - this.agvViewer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.agvViewer1.FontMrk = new System.Drawing.Font("Microsoft Sans Serif", 7F); - this.agvViewer1.FontTag = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.agvViewer1.lastmark = ""; - this.agvViewer1.lastmarkdir = ""; - this.agvViewer1.lasttag = ""; - this.agvViewer1.lasttagdir = ""; - ptdata1.active = false; - ptdata1.data = "NOT"; - ptdata1.pos = 30F; - ptdata2.active = false; - ptdata2.data = "QA"; - ptdata2.pos = 200F; - ptdata3.active = false; - ptdata3.data = "CHG"; - ptdata3.pos = 300F; - ptdata4.active = false; - ptdata4.data = "QC"; - ptdata4.pos = 400F; - ptdata5.active = false; - ptdata5.data = "#FVI-1"; - ptdata5.pos = 500F; - ptdata6.active = false; - ptdata6.data = "#FVI-2"; - ptdata6.pos = 600F; - ptdata7.active = false; - ptdata7.data = "#FVI-3"; - ptdata7.pos = 700F; - ptdata8.active = false; - ptdata8.data = "#FVI-4"; - ptdata8.pos = 800F; - ptdata9.active = false; - ptdata9.data = "#FVI-5"; - ptdata9.pos = 900F; - ptdata10.active = false; - ptdata10.data = "POT"; - ptdata10.pos = 970F; - this.agvViewer1.listMRK = new AGVEmulator.UC.AgvViewer.ptdata[] { - ptdata1, - ptdata2, - ptdata3, - ptdata4, - ptdata5, - ptdata6, - ptdata7, - ptdata8, - ptdata9, - ptdata10}; - ptdata11.active = false; - ptdata11.data = "9000"; - ptdata11.pos = 80F; - ptdata12.active = false; - ptdata12.data = "9001"; - ptdata12.pos = 120F; - ptdata13.active = false; - ptdata13.data = "9010"; - ptdata13.pos = 180F; - ptdata14.active = false; - ptdata14.data = "9011"; - ptdata14.pos = 220F; - ptdata15.active = false; - ptdata15.data = "9020"; - ptdata15.pos = 280F; - ptdata16.active = false; - ptdata16.data = "9021"; - ptdata16.pos = 320F; - ptdata17.active = false; - ptdata17.data = "9030"; - ptdata17.pos = 380F; - ptdata18.active = false; - ptdata18.data = "9031"; - ptdata18.pos = 420F; - ptdata19.active = false; - ptdata19.data = "9040"; - ptdata19.pos = 480F; - ptdata20.active = false; - ptdata20.data = "9041"; - ptdata20.pos = 520F; - ptdata21.active = false; - ptdata21.data = "9050"; - ptdata21.pos = 580F; - ptdata22.active = false; - ptdata22.data = "9051"; - ptdata22.pos = 620F; - ptdata23.active = false; - ptdata23.data = "9060"; - ptdata23.pos = 680F; - ptdata24.active = false; - ptdata24.data = "9061"; - ptdata24.pos = 720F; - ptdata25.active = false; - ptdata25.data = "9070"; - ptdata25.pos = 780F; - ptdata26.active = false; - ptdata26.data = "9071"; - ptdata26.pos = 820F; - ptdata27.active = false; - ptdata27.data = "9000"; - ptdata27.pos = 10F; - ptdata28.active = false; - ptdata28.data = "9001"; - ptdata28.pos = 50F; - this.agvViewer1.listTAG = new AGVEmulator.UC.AgvViewer.ptdata[] { - ptdata11, - ptdata12, - ptdata13, - ptdata14, - ptdata15, - ptdata16, - ptdata17, - ptdata18, - ptdata19, - ptdata20, - ptdata21, - ptdata22, - ptdata23, - ptdata24, - ptdata25, - ptdata26, - ptdata27, - ptdata28}; - this.agvViewer1.Location = new System.Drawing.Point(241, 0); - this.agvViewer1.Name = "agvViewer1"; - this.agvViewer1.Size = new System.Drawing.Size(899, 120); - this.agvViewer1.StopbyMark = false; - this.agvViewer1.TabIndex = 0; - this.agvViewer1.Text = "agvViewer1"; - this.agvViewer1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.agvViewer1_MouseDown); + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(17, 318); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(34, 12); + this.label12.TabIndex = 16; + this.label12.Text = "Enter"; // - // serAGV + // label13 // - this.serAGV.BaudRate = 9600; - this.serAGV.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.serAGV.dev = null; - this.serAGV.Dock = System.Windows.Forms.DockStyle.Left; - this.serAGV.Location = new System.Drawing.Point(0, 0); - this.serAGV.Name = "serAGV"; - this.serAGV.PortName = "COM21"; - this.serAGV.Size = new System.Drawing.Size(241, 120); - this.serAGV.TabIndex = 0; + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(17, 362); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(26, 12); + this.label13.TabIndex = 19; + this.label13.Text = "Exit"; // - // serBMS + // button6 // - this.serBMS.BaudRate = 9600; - this.serBMS.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.serBMS.dev = null; - this.serBMS.Dock = System.Windows.Forms.DockStyle.Top; - this.serBMS.Location = new System.Drawing.Point(3, 17); - this.serBMS.Name = "serBMS"; - this.serBMS.PortName = "COM31"; - this.serBMS.Size = new System.Drawing.Size(1134, 84); - this.serBMS.TabIndex = 1; + this.button6.Location = new System.Drawing.Point(204, 349); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(133, 38); + this.button6.TabIndex = 18; + this.button6.Tag = "--"; + this.button6.Text = "Pick Off"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click_1); // - // serCAL + // button13 // - this.serCAL.BaudRate = 9600; - this.serCAL.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.serCAL.dev = null; - this.serCAL.Dock = System.Windows.Forms.DockStyle.Top; - this.serCAL.Location = new System.Drawing.Point(3, 17); - this.serCAL.Name = "serCAL"; - this.serCAL.PortName = "COM41"; - this.serCAL.Size = new System.Drawing.Size(776, 84); - this.serCAL.TabIndex = 1; + this.button13.Location = new System.Drawing.Point(65, 349); + this.button13.Name = "button13"; + this.button13.Size = new System.Drawing.Size(133, 38); + this.button13.TabIndex = 17; + this.button13.Tag = "--"; + this.button13.Text = "Pick On"; + this.button13.UseVisualStyleBackColor = true; + this.button13.Click += new System.EventHandler(this.button13_Click); // // fMain // @@ -1746,6 +1794,10 @@ namespace AGVEmulator private Button button3; private Button button2; private Panel panel2; + private Label label12; + private Label label13; + private Button button6; + private Button button13; } } diff --git a/AGVEmulator/fMain.cs b/AGVEmulator/fMain.cs index e6f6e93..655384a 100644 --- a/AGVEmulator/fMain.cs +++ b/AGVEmulator/fMain.cs @@ -938,21 +938,25 @@ namespace AGVEmulator private void button2_Click(object sender, EventArgs e) { var target = (byte)nudIDAgv.Value; - this.XBE.SendPickOn(target); + this.XBE.SendPickOnEnter(target); } private void button3_Click(object sender, EventArgs e) { var target = (byte)nudIDAgv.Value; - this.XBE.SendPickOff(target); + this.XBE.SendPickOffEnter(target); } + + 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(); @@ -966,8 +970,16 @@ namespace AGVEmulator serBMS.Disconnect(); serCAL.Disconnect(); } - - + private void button13_Click(object sender, EventArgs e) + { + var target = (byte)nudIDAgv.Value; + this.XBE.SendPickOnExit(target); + } + private void button6_Click_1(object sender, EventArgs e) + { + var target = (byte)nudIDAgv.Value; + this.XBE.SendPickOffExit(target); + } } } diff --git a/Cs_HMI/Project/AGV4.csproj b/Cs_HMI/Project/AGV4.csproj index 53b86d3..5f8703d 100644 --- a/Cs_HMI/Project/AGV4.csproj +++ b/Cs_HMI/Project/AGV4.csproj @@ -289,24 +289,12 @@ - - Form - - - Form - Form Form - - Form - - - Form - Form diff --git a/Cs_HMI/Project/Device/Xbee.cs b/Cs_HMI/Project/Device/Xbee.cs index 06760a7..89b30a9 100644 --- a/Cs_HMI/Project/Device/Xbee.cs +++ b/Cs_HMI/Project/Device/Xbee.cs @@ -21,27 +21,27 @@ namespace Project.Device /// /// 투입준비됨 /// - InReady = 10, + ReadyForEnter = 10, /// /// 투입완료 /// - InComplete = 11, + EnterComplete = 11, /// /// 투입(진행중) /// - InIng = 12, + EnterIng = 12, /// /// 진출완료 /// - OutComplete = 21, + ExitComplete = 21, /// /// 진출중 /// - OutIng = 22, + ExitIng = 22, } public class Xbee : SerialPort, arDev.ISerialComm @@ -196,10 +196,7 @@ namespace Project.Device Send(packet); } - public eDocStep StepBuffer { get; set; } = eDocStep.NotSet; - public eDocStep StepUnloader { get; set; } = eDocStep.NotSet; - public eDocStep StepLoader { get; set; } = eDocStep.NotSet; - public eDocStep StepCleaner { get; set; } = eDocStep.NotSet; + public eDocStep StepMC { get; set; } = eDocStep.NotSet; ManualResetEvent sendlock = new ManualResetEvent(true); @@ -225,67 +222,80 @@ namespace Project.Device */ try { - byte[] data = new byte[12]; // 총 12바이트 데이터 + List data = new List(); + byte value = 0; + // Autoron Mode - // Mode - data[0] = (byte)(VAR.BOOL[eVarBool.FLAG_AUTORUN] ? 1 : 0); + value = (byte)(VAR.BOOL[eVarBool.FLAG_AUTORUN] ? 1 : 0); + data.Add(value); // RunSt if (PUB.AGV.error.Emergency) - data[1] = 2; // error + value = 2; // error else if (PUB.AGV.system1.agv_run) - data[1] = 1; // run + value = 1; // run else - data[1] = 0; // stop + value = 0; // stop + data.Add(value); + + //runstep + value = (byte)PUB.sm.RunStep; + data.Add(value); + + //runstepseq + value = (byte)StepMC; + data.Add(value); // Motor Direction if (PUB.AGV.data.Direction == 'F') - data[2] = 0; + value = 0; else if (PUB.AGV.data.Direction == 'B') - data[2] = 1; + value = 1; else - data[2] = 0xff; //unknown + value = 0xff; //unknown + data.Add(value); // Magnet Direction if (PUB.AGV.data.Sts == 'L') - data[3] = 1; // left + value = 1; // left else if (PUB.AGV.data.Sts == 'R') - data[3] = 2; // right + value = 2; // right else if (PUB.AGV.data.Sts == 'S') - data[3] = 0; // straight + value = 0; // straight else - data[3] = 0xFF; //unknown - - // Inposition - data[4] = (byte)(PUB.AGV.system1.agv_stop ? 1 : 0); + value = 0xFF; //unknown + data.Add(value); // ChargeSt - data[5] = (byte)((VAR.BOOL[eVarBool.FLAG_CHARGEONA] || VAR.BOOL[eVarBool.FLAG_CHARGEONM]) ? 1 : 0); + value = (byte)((VAR.BOOL[eVarBool.FLAG_CHARGEONA] || VAR.BOOL[eVarBool.FLAG_CHARGEONM]) ? 1 : 0); + data.Add(value); // CartSt if (PUB.AGV.signal2.cart_detect1 && PUB.AGV.signal2.cart_detect2) - data[6] = 1; // 센서두개가 모두 감지되는 경우 + value = 1; // 센서두개가 모두 감지되는 경우 else if (PUB.AGV.signal2.cart_detect1 == false && PUB.AGV.signal2.cart_detect2 == false) - data[6] = 0; // 센서두개가 모두 감지되지 않는 경우 + value = 0; // 센서두개가 모두 감지되지 않는 경우 else - data[6] = 2; // 센서하나만 감지되는 경우 + value = 2; // 센서하나만 감지되는 경우 + data.Add(value); // LiftSt if (PUB.AGV.signal1.lift_up) - data[7] = 1; // 위로 올라가는 경우 + value = 1; // 위로 올라가는 경우 else if (PUB.AGV.signal1.lift_down) - data[7] = 0; // 아래로 내려가는 경우 + value = 0; // 아래로 내려가는 경우 else - data[7] = 2; // unknown (기본값) + value = 2; // unknown (기본값) + data.Add(value); // LastTag string lastTag = PUB.AGV.data.TagNo.ToString("0000") ?? "0000"; byte[] tagBytes = Encoding.ASCII.GetBytes(lastTag.PadRight(4, '0')); - Array.Copy(tagBytes, 0, data, 8, lastTag.Length); + data.AddRange(tagBytes); // 데이터 전송 var cmd = (byte)ENIGProtocol.AGVCommandEH.Status; - var packet = proto.CreatePacket(PUB.setting.XBE_ID, cmd, data); + var packet = proto.CreatePacket(PUB.setting.XBE_ID, cmd, data.ToArray()); if (Send(packet)) PUB.logxbee.AddI($"Send status [O] : {packet.Length} {packet.HexString()}"); else diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs index 2839809..f88b6a3 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs @@ -115,10 +115,7 @@ namespace Project var target = PUB._virtualAGV.TargetNode; PUB.log.Add($"목적지({target.RfidId}) 도착완료 타입:{target.Type}, 출발지:{PUB._virtualAGV.StartNode.RfidId}"); - PUB.XBE.StepLoader = Device.eDocStep.NotSet; - PUB.XBE.StepCleaner = Device.eDocStep.NotSet; - PUB.XBE.StepUnloader = Device.eDocStep.NotSet; - PUB.XBE.StepBuffer = Device.eDocStep.NotSet; + PUB.XBE.StepMC = Device.eDocStep.NotSet; switch (target.StationType) { @@ -127,12 +124,12 @@ namespace Project if (lastPath.NodeId.Equals(PUB._virtualAGV.CurrentNode.Id)) { //버퍼진입전 노드에 도착완료했따 - PUB.XBE.StepBuffer = Device.eDocStep.InReady; + PUB.XBE.StepMC = Device.eDocStep.ReadyForEnter; } else { //마지막위치가 아닌 다른 위치에 있으니 버퍼 작업을 할 수없다 - PUB.XBE.StepBuffer = Device.eDocStep.NotSet; + PUB.XBE.StepMC = Device.eDocStep.NotSet; PUB.log.AddE($"목적지가 버퍼이나 노드가 불일치 한다 오류사항"); PUB._mapCanvas.SetAlertMessage("목적지가 버퍼이나 노드 불일치 오류"); PUB.sm.SetNewRunStep(ERunStep.ERROR); @@ -144,15 +141,15 @@ namespace Project break; case AGVNavigationCore.Models.StationType.Loader: - PUB.XBE.StepLoader = Device.eDocStep.InReady; + PUB.XBE.StepMC = Device.eDocStep.ReadyForEnter; break; case AGVNavigationCore.Models.StationType.Clearner: - PUB.XBE.StepCleaner = Device.eDocStep.InReady; + PUB.XBE.StepMC = Device.eDocStep.ReadyForEnter; break; case AGVNavigationCore.Models.StationType.UnLoader: - PUB.XBE.StepUnloader = Device.eDocStep.InReady; + PUB.XBE.StepMC = Device.eDocStep.ReadyForEnter; break; default: @@ -230,69 +227,31 @@ namespace Project } } break; - case ERunStep.LOADER_OUT: //로더아웃 - if (_SM_RUN_LOADER_OUT(runStepisFirst, PUB.sm.GetRunSteptime)) - { - PUB.Speak(Lang.버퍼도킹해제완료); - - //도킹완료상태를 업데이트한다. - PUB.XBE.StepLoader = Device.eDocStep.OutComplete; - - //대기상태로 전환 - PUB.sm.SetNewRunStep(ERunStep.READY); - return; - } - break; + case ERunStep.CLEANER_IN: //클리너도킹 + case ERunStep.UNLOADER_IN: //언로더도킹 case ERunStep.LOADER_IN: //로더도킹 if (_SM_RUN_LOADER_IN(runStepisFirst, PUB.sm.GetRunSteptime)) { PUB.Speak(Lang.버퍼도킹이완료되었습니다); //도킹완료상태를 업데이트한다. - PUB.XBE.StepLoader = Device.eDocStep.InComplete; + PUB.XBE.StepMC = Device.eDocStep.EnterComplete; //대기상태로 전환 PUB.sm.SetNewRunStep(ERunStep.READY); return; } break; - - case ERunStep.UNLOADER_OUT: //언로더아웃 - if (_SM_RUN_UNLOADER_OUT(runStepisFirst, PUB.sm.GetRunSteptime)) - { - PUB.Speak(Lang.버퍼도킹해제완료); - - //도킹완료상태를 업데이트한다. - PUB.XBE.StepUnloader = Device.eDocStep.OutComplete; - - //대기상태로 전환 - PUB.sm.SetNewRunStep(ERunStep.READY); - return; - } - break; - - case ERunStep.UNLOADER_IN: //언로더도킹 - if (_SM_RUN_UNLOADER_IN(runStepisFirst, PUB.sm.GetRunSteptime)) - { - PUB.Speak(Lang.버퍼도킹이완료되었습니다); - - //도킹완료상태를 업데이트한다. - PUB.XBE.StepUnloader = Device.eDocStep.InComplete; - - //대기상태로 전환 - PUB.sm.SetNewRunStep(ERunStep.READY); - return; - } - break; - case ERunStep.CLEANER_OUT: //클리너아웃 - if (_SM_RUN_CLEANER_OUT(runStepisFirst, PUB.sm.GetRunSteptime)) + case ERunStep.UNLOADER_OUT: //언로더아웃 + case ERunStep.LOADER_OUT: //로더아웃 + if (_SM_RUN_LOADER_OUT(runStepisFirst, PUB.sm.GetRunSteptime)) { PUB.Speak(Lang.버퍼도킹해제완료); //도킹완료상태를 업데이트한다. - PUB.XBE.StepCleaner = Device.eDocStep.OutComplete; + PUB.XBE.StepMC = Device.eDocStep.ExitComplete; //대기상태로 전환 PUB.sm.SetNewRunStep(ERunStep.READY); @@ -300,33 +259,19 @@ namespace Project } break; - case ERunStep.CLEANER_IN: //클리너도킹 - if (_SM_RUN_CLEANER_IN(runStepisFirst, PUB.sm.GetRunSteptime)) - { - PUB.Speak(Lang.버퍼도킹이완료되었습니다); - - //도킹완료상태를 업데이트한다. - PUB.XBE.StepCleaner = Device.eDocStep.InComplete; - - //클리너아웃으로 자동 진행하지 않음 - PUB.sm.SetNewRunStep(ERunStep.READY); - return; - } - break; - case ERunStep.BUFFER_OUT: //버퍼아웃 if (_SM_RUN_BUFFER_OUT(runStepisFirst, PUB.sm.GetRunSteptime)) { PUB.Speak(Lang.버퍼도킹해제완료); //도킹완료상태를 업데이트한다. - PUB.XBE.StepBuffer = Device.eDocStep.OutComplete; + PUB.XBE.StepMC = Device.eDocStep.ExitComplete; //대기상태로 전환 PUB.sm.SetNewRunStep(ERunStep.READY); return; } - else PUB.XBE.StepBuffer = Device.eDocStep.OutIng; + else PUB.XBE.StepMC = Device.eDocStep.ExitIng; break; case ERunStep.BUFFER_IN: //버퍼도킹 @@ -335,13 +280,13 @@ namespace Project PUB.Speak(Lang.버퍼도킹이완료되었습니다); //도킹완료상태를 업데이트한다. - PUB.XBE.StepBuffer = Device.eDocStep.InComplete; + PUB.XBE.StepMC = Device.eDocStep.EnterComplete; //대기상태로 전환 PUB.sm.SetNewRunStep(ERunStep.READY); return; } - else PUB.XBE.StepBuffer = Device.eDocStep.InIng; + else PUB.XBE.StepMC = Device.eDocStep.EnterIng; break; } diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs index adbc4e9..eedf195 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs @@ -29,7 +29,6 @@ namespace Project * 3. 후진-저속-마크다운 실행 */ - if (PUB.sm.RunStepSeq == idx++) { PUB.log.Add($"[{funcname}] 버퍼진입시작({PUB.NextWorkCmd}) Turn:{PUB._virtualAGV.Turn}"); @@ -90,7 +89,7 @@ namespace Project } return false; } - + PUB._virtualAGV.Turn = AGVNavigationCore.Models.AGVTurn.L90; //턴완료 PUB.log.Add($"[{funcname}] Turn(left) 완료"); PUB.sm.UpdateRunStepSeq(); //이미완료된상태이므로 다음으로 진행한다. return false; @@ -139,14 +138,6 @@ namespace Project return false; } else if (PUB.sm.RunStepSeq == idx++) - { - //마크스탑셋팅 - PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) { //저속이동 (후진 진입) var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData @@ -172,11 +163,13 @@ namespace Project //후진이동을한다 PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); - + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { //마크스탑으로 이동 PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); - - VAR.TIME.Update(eVarTime.LastTurnCommandTime); PUB.sm.UpdateRunStepSeq(); return false; } @@ -185,8 +178,7 @@ namespace Project //마크스탑신호가 3초이내로 들어와야 한다 if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) { - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 3) + if (seqtime.TotalSeconds > 3) { PUB.AGV.AGVMoveStop(funcname); PUB.log.AddE($"[{funcname}] MARK STOP신호가 확인되지 않습니다"); diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs index 83610eb..2295d4b 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs @@ -39,7 +39,7 @@ namespace Project } else if (PUB.sm.RunStepSeq == idx++) { - arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOn ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN; + arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN; PUB.log.Add($"[{funcname}] 리프트제어 {lift}"); PUB.AGV.LiftControl(lift); PUB.sm.UpdateRunStepSeq(); @@ -48,13 +48,13 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { //리프트 센서 확인 - var checksensor = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOn ? PUB.AGV.signal1.lift_up : PUB.AGV.signal1.lift_down; + var checksensor = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? PUB.AGV.signal1.lift_up : PUB.AGV.signal1.lift_down; if (checksensor == false) { if (seqtime.TotalSeconds > 20) { PUB.log.AddAT($"[{funcname}] 리프트가 완료되지 않아 1회 재시도 합니다"); - arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOn ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN; + arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN; PUB.AGV.LiftControl(lift); } else return false; @@ -65,7 +65,7 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { //리프트 센서 확인 - var checksensor = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOn ? PUB.AGV.signal1.lift_up : PUB.AGV.signal1.lift_down; + var checksensor = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? PUB.AGV.signal1.lift_up : PUB.AGV.signal1.lift_down; if (checksensor == false) { if (seqtime.TotalSeconds > 20) diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CLEANER_IN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CLEANER_IN.cs deleted file mode 100644 index 65cdc32..0000000 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CLEANER_IN.cs +++ /dev/null @@ -1,181 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using Project.StateMachine; -using COMM; -using AR; - -namespace Project -{ - public partial class fMain - { - /// - /// 클리너 진입 - /// - public Boolean _SM_RUN_CLEANER_IN(bool isFirst, TimeSpan stepTime) - { - var funcname = "_SM_RUN_CLEANER_IN"; - var idx = 1; - - //충전 상태가 OFF되어야 동작하게한다 - if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) return false; - - //라이더멈춤이 설정되어있다면 음성으로 알려준다 - if (CheckLiderStop() == false) return false; - - /* - * 클리너 IN 시퀀스 (버퍼 복사 - 턴 제거) - * 1. LIFT DOWN - * 2. 후진-저속-마크다운 실행 - */ - - if (PUB.sm.RunStepSeq == idx++) - { - PUB.log.Add("클리너진입시작"); - PUB.Speak("클리너 작업을 시작합니다"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - // [PickOn/PickOff] 초기 리프트 동작 - var liftCmd = arDev.Narumi.LiftCommand.DN; - if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOff) - { - liftCmd = arDev.Narumi.LiftCommand.UP; - } - - PUB.AGV.LiftControl(liftCmd); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //리프트 센서 확인 - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 10) - { - // Timebound check - } - PUB.log.Add("리프트 동작 확인 완료"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //마크스탑셋팅 - PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //저속이동 (후진 진입) - var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData - { - Bunki = arDev.Narumi.eBunki.Strate, - Direction = arDev.Narumi.eMoveDir.Backward, - PBSSensor = 0, - Speed = arDev.Narumi.eMoveSpd.Low, - }); - //명령이 실패되었다면 재시도를 한다 - if (ret != arDev.eNarumiCommandResult.Success) - { - if (ret >= arDev.eNarumiCommandResult.Error) - { - PUB.AGV.AGVMoveStop(funcname); - PUB.log.AddE($"[{funcname}] AGV속도설정이 완료되지 않았습니다"); - PUB._mapCanvas.SetAlertMessage("agv 속도 설정 오류"); - PUB.sm.SetNewRunStep(ERunStep.ERROR); - } - return false; - } - - PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); - PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //마크스탑신호가 3초이내로 들어와야 한다 - if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) - { - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 3) - { - PUB.AGV.AGVMoveStop(funcname); - PUB.log.AddE("MARK STOP신호가 확인되지 않습니다"); - PUB._mapCanvas.SetAlertMessage("mark stop 신호 확인 안됨"); - PUB.sm.SetNewRunStep(ERunStep.ERROR); - return false; - } - } - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //AGV가 멈출때까지 기다린다. - if (PUB.AGV.system1.agv_run == true) - { - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 10) - { - PUB.AGV.AGVMoveStop(funcname); - PUB.log.AddE("AGV가 멈추지 않아 강제종료 합니다"); - PUB._mapCanvas.SetAlertMessage("agv 가 멈추지 않아 강제 종료"); - PUB.sm.SetNewRunStep(ERunStep.ERROR); - return false; - } - return false; - } - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - // [Action] 진입 완료 후 리프트 동작 (Pick/Drop) - PUB.log.Add("클리너 진입 완료. 작업 수행(Lift Pick/Drop)"); - - var liftCmd = arDev.Narumi.LiftCommand.UP; - if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOff) - { - liftCmd = arDev.Narumi.LiftCommand.DN; - } - - PUB.AGV.LiftControl(liftCmd); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - // 리프트 동작 대기 - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds < 2) return false; - - PUB.log.Add("작업(Pick/Drop) 완료. 대기 상태로 전환"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //완료되었다. - PUB.log.Add("클리너 진입 및 작업 완료"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - - PUB.AddEEDB($"클리너작업완료({PUB.Result.TargetPos})"); - return true; - } - } -} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CLEANER_OUT.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CLEANER_OUT.cs deleted file mode 100644 index 2442332..0000000 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CLEANER_OUT.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using Project.StateMachine; -using COMM; -using AR; - -namespace Project -{ - public partial class fMain - { - /// - /// 클리너 배출 - /// - public Boolean _SM_RUN_CLEANER_OUT(bool isFirst, TimeSpan stepTime) - { - var funcname = "CLEANEROUT"; - - //충전 상태가 OFF되어야 동작하게한다 - if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) return false; - - //라이더멈춤이 설정되어있다면 음성으로 알려준다 - if (CheckLiderStop() == false) return false; - - var idx = 1; - if (PUB.sm.RunStepSeq == idx++) - { - //빈 상태로 아웃해야한다. - var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData - { - Bunki = arDev.Narumi.eBunki.Strate, - Direction = arDev.Narumi.eMoveDir.Forward, - PBSSensor = 0, - Speed = arDev.Narumi.eMoveSpd.Low, - }); - //명령이 실패되었다면 재시도를 한다 - if (ret != arDev.eNarumiCommandResult.Success) - { - if (ret >= arDev.eNarumiCommandResult.Error) - { - PUB.AGV.AGVMoveStop(funcname); - PUB.log.AddE($"[{funcname}] AGV속도설정이 완료되지 않았습니다"); - PUB._mapCanvas.SetAlertMessage("agv 속도 설정 실패"); - PUB.sm.SetNewRunStep(ERunStep.ERROR); - } - return false; - } - - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //전진이동 - PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //마크스탑 - PUB.AGV.AGVMoveStop("cleaner out", arDev.Narumi.eStopOpt.MarkStop); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //이동확인 - if (PUB.AGV.system1.agv_run == false) - { - return false; - } - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //멈춤확인 - if (PUB.AGV.system1.agv_run == true) - { - return false; - } - PUB.sm.UpdateRunStepSeq(); - return false; - } - - return true; - } - } -} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_IN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_IN.cs index 7bff4af..8947228 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_IN.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_IN.cs @@ -14,40 +14,82 @@ namespace Project /// /// 로더 진입 /// - public Boolean _SM_RUN_LOADER_IN(bool isFirst, TimeSpan stepTime) + public Boolean _SM_RUN_LOADER_IN(bool isFirst, TimeSpan seqTime) { - var funcname = "_SM_RUN_LOADER_IN"; var idx = 1; + var funcname = PUB.sm.RunStep.ToString(); //충전 상태가 OFF되어야 동작하게한다 - if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) return false; + if (_SM_RUN_CHGOFF(isFirst, seqTime) == false) return false; //라이더멈춤이 설정되어있다면 음성으로 알려준다 if (CheckLiderStop() == false) return false; - - /* - * 로더 IN 시퀀스 (버퍼 복사 - 턴 제거) - * 1. LIFT DOWN - * 2. 후진-저속-마크다운 실행 - */ - if (PUB.sm.RunStepSeq == idx++) { - PUB.log.Add("로더진입시작"); - PUB.Speak("로더 작업을 시작합니다"); // Lang resource might not exist, using string + PUB.log.Add("IN작업-시작"); + PUB.Speak("작업을 시작합니다"); + PUB.AGV.AGVMoveStop(funcname); PUB.sm.UpdateRunStepSeq(); return false; } else if (PUB.sm.RunStepSeq == idx++) { - // [PickOn/PickOff] 초기 리프트 동작 - var liftCmd = arDev.Narumi.LiftCommand.DN; // Default PickOn (Get -> Go Under -> Down) - if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOff) + //마크센서가 감지된상태여야 완전한위치로 가정한다 + if(PUB.AGV.signal1.mark_sensor == false) { - liftCmd = arDev.Narumi.LiftCommand.UP; // PickOff (Put -> Carry In -> Up) + var errmsg = $"[{funcname}] 마크센서가 감지되지 않습니다"; + PUB.AGV.AGVMoveStop(errmsg); + PUB.log.AddE(errmsg); + PUB._mapCanvas.SetAlertMessage(errmsg); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //작업상태에 따라서 카트감지여부를 확인한ㄷ. + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnEnter) + { + //가지러가야하는 경우이므로 카트가 없어야한다. + if (PUB.AGV.signal2.cart_detect1 || PUB.AGV.signal2.cart_detect2) + { + var errmsg = $"[{funcname}] 카트가 존재하여 진입을 할 수 없습니다"; + PUB.AGV.AGVMoveStop(errmsg); + PUB.log.AddE(errmsg); + PUB._mapCanvas.SetAlertMessage(errmsg); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + } + else if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter) + { + //가져다 놓아야하므로 카트가 존재해야 한다 + if (PUB.AGV.signal2.cart_detect1 == false || PUB.AGV.signal2.cart_detect2 == false) + { + var errmsg = $"[{funcname}] 카트감지센서가 인식되지 않았습니다"; + PUB.AGV.AGVMoveStop(errmsg); + PUB.log.AddE(errmsg); + PUB._mapCanvas.SetAlertMessage(errmsg); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + } + else + { + var errmsg = $"[{funcname}] 알수없는 작업형태입니다({PUB.NextWorkCmd})"; + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE(errmsg); + PUB._mapCanvas.SetAlertMessage(errmsg); + PUB.sm.SetNewRunStep(ERunStep.ERROR); } + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //pick off/on 상관없이 리프트는 내려서 이동한다 + var liftCmd = arDev.Narumi.LiftCommand.DN; PUB.AGV.LiftControl(liftCmd); VAR.TIME.Update(eVarTime.LastTurnCommandTime); PUB.sm.UpdateRunStepSeq(); @@ -55,28 +97,24 @@ namespace Project } else if (PUB.sm.RunStepSeq == idx++) { - //리프트 센서 확인 (Direction에 따라 다름) - // TODO: UP 센서 확인 로직 추가 필요 시 구현. 현재는 시간체크만 유지하거나 DN확인만 있음. - // 일단 기존 로직 유지하되, UP일 경우 스킵 고려 - - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 10) - { - // Timebound check - // PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.STP); - // Warning only? - } - - PUB.log.Add("리프트 동작 확인 완료"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //마크스탑셋팅 - PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); + //리프트 센서 확인 + if ((PUB.AGV.signal1.lift_down == true && PUB.AGV.signal1.lift_up == false) == false) + { + var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); + if (ts.TotalSeconds > 10) + { + var errmsg = $"[{funcname}] 리프트다운이 확인되지 않습니다"; + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE(errmsg); + PUB._mapCanvas.SetAlertMessage(errmsg); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + } + else + { + PUB.log.Add("리프트 동작 확인 완료"); + PUB.sm.UpdateRunStepSeq(); + } return false; } else if (PUB.sm.RunStepSeq == idx++) @@ -89,6 +127,7 @@ namespace Project PBSSensor = 0, Speed = arDev.Narumi.eMoveSpd.Low, }); + //명령이 실패되었다면 재시도를 한다 if (ret != arDev.eNarumiCommandResult.Success) { if (ret >= arDev.eNarumiCommandResult.Error) @@ -100,28 +139,52 @@ namespace Project } return false; } - PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); - PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); + VAR.TIME.Update(eVarTime.LastTurnCommandTime); PUB.sm.UpdateRunStepSeq(); return false; } else if (PUB.sm.RunStepSeq == idx++) + { + //전진이동 + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //AGV구동을 확인하고 마크스탑을 설정한다. + if (PUB.AGV.system1.agv_run == false) + { + if (seqTime.TotalMilliseconds > 1000) + { + //구동이확인되지 않으면 오류처리를 한다. + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE("AGV속도설정이 완료되지 않았습니다"); + PUB._mapCanvas.SetAlertMessage("agv 속도 설정 실패"); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + return false; + } + //마크스탑설정 + PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) { //마크스탑신호가 3초이내로 들어와야 한다 if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) { - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 3) + if (seqTime.TotalMilliseconds > 3000) { PUB.AGV.AGVMoveStop(funcname); PUB.log.AddE("MARK STOP신호가 확인되지 않습니다"); PUB._mapCanvas.SetAlertMessage("mark stop 신호 확인 불가"); PUB.sm.SetNewRunStep(ERunStep.ERROR); - return false; } + return false; } - VAR.TIME.Update(eVarTime.LastTurnCommandTime); PUB.sm.UpdateRunStepSeq(); return false; } @@ -130,57 +193,44 @@ namespace Project //AGV가 멈출때까지 기다린다. if (PUB.AGV.system1.agv_run == true) { - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 10) + if (seqTime.TotalSeconds > 10) { PUB.AGV.AGVMoveStop(funcname); PUB.log.AddE("AGV가 멈추지 않아 강제종료 합니다"); PUB._mapCanvas.SetAlertMessage("agv 가 멈추지 않아 강제 종료"); PUB.sm.SetNewRunStep(ERunStep.ERROR); - return false; } return false; } - VAR.TIME.Update(eVarTime.LastTurnCommandTime); PUB.sm.UpdateRunStepSeq(); return false; } - else if (PUB.sm.RunStepSeq == idx++) - { - // [Action] 진입 완료 후 리프트 동작 (Pick/Drop) - PUB.log.Add("로더 진입 완료. 작업 수행(Lift Pick/Drop)"); - - var liftCmd = arDev.Narumi.LiftCommand.UP; // Default PickOn (Lift Up to Pick) - if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOff) - { - liftCmd = arDev.Narumi.LiftCommand.DN; // PickOff (Lift Down to Drop) - } - PUB.AGV.LiftControl(liftCmd); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } else if (PUB.sm.RunStepSeq == idx++) { - // 리프트 동작 대기 - // TODO: 센서 확인 - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds < 2) return false; // 2초 대기 - - PUB.log.Add("작업(Pick/Drop) 완료. 대기 상태로 전환"); - PUB.sm.UpdateRunStepSeq(); - return false; + //마크센서입력을 확인한다. + if (PUB.AGV.signal1.mark_sensor == false) + { + if (seqTime.TotalSeconds > 5) + { + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE("마크센서가 감지되지 않았습니다"); + PUB._mapCanvas.SetAlertMessage("마크센서가 감지되지 않았습니다"); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + return false; + } + PUB.sm.UpdateRunStepSeq(); + return false; } else if (PUB.sm.RunStepSeq == idx++) { //완료되었다. - PUB.log.Add("로더 진입 및 작업 완료"); + PUB.log.Add("진입 완료"); PUB.sm.UpdateRunStepSeq(); return false; } - PUB.AddEEDB($"로더작업완료({PUB.Result.TargetPos})"); return true; } } diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_OUT.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_OUT.cs index 7943d2b..2e127c2 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_OUT.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_OUT.cs @@ -14,17 +14,71 @@ namespace Project /// /// 로더 배출 /// - public Boolean _SM_RUN_LOADER_OUT(bool isFirst, TimeSpan stepTime) + public Boolean _SM_RUN_LOADER_OUT(bool isFirst, TimeSpan seqTime) { - var funcname = "LOADEROUT"; + var idx = 1; + var funcname = PUB.sm.RunStep.ToString(); + //충전 상태가 OFF되어야 동작하게한다 - if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) return false; + if (_SM_RUN_CHGOFF(isFirst, seqTime) == false) return false; //라이더멈춤이 설정되어있다면 음성으로 알려준다 if (CheckLiderStop() == false) return false; - var idx = 1; if (PUB.sm.RunStepSeq == idx++) + { + PUB.log.Add("OUT작업-시작"); + PUB.Speak("작업을 시작합니다"); + PUB.AGV.AGVMoveStop(funcname); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //작업형태에 따라서. 리프트를 제어한다. + var liftCmd = arDev.Narumi.LiftCommand.DN; + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit) liftCmd = arDev.Narumi.LiftCommand.UP; + + PUB.AGV.LiftControl(liftCmd); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + var liftCmd = arDev.Narumi.LiftCommand.DN; + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit) liftCmd = arDev.Narumi.LiftCommand.UP; + + //리프트 센서 확인 + var liftdnok = (PUB.AGV.signal1.lift_down == true && PUB.AGV.signal1.lift_up == false); + var liiftupok = (PUB.AGV.signal1.lift_up == true && PUB.AGV.signal1.lift_down == false); + + if (liftCmd == arDev.Narumi.LiftCommand.DN && liftdnok) + { + //정상조건 + } + else if (liftCmd == arDev.Narumi.LiftCommand.UP && liftdnok) + { + //정상조건 + } + else + { + var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); + if (ts.TotalSeconds > 10) + { + var errmsg = $"[{funcname}] 리프트({liftCmd})이 확인되지 않습니다"; + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE(errmsg); + PUB._mapCanvas.SetAlertMessage(errmsg); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + return false; + } + + PUB.log.Add("리프트 동작 확인 완료"); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) { //빈 상태로 아웃해야한다. var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData @@ -47,7 +101,6 @@ namespace Project return false; } - PUB.sm.UpdateRunStepSeq(); return false; } @@ -60,16 +113,36 @@ namespace Project } else if (PUB.sm.RunStepSeq == idx++) { - //마크스탑 - PUB.AGV.AGVMoveStop("loader out", arDev.Narumi.eStopOpt.MarkStop); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //이동확인 + //AGV구동을 확인하고 마크스탑을 설정한다. if (PUB.AGV.system1.agv_run == false) { + if (seqTime.TotalMilliseconds > 1000) + { + //구동이확인되지 않으면 오류처리를 한다. + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE("AGV속도설정이 완료되지 않았습니다"); + PUB._mapCanvas.SetAlertMessage("agv 속도 설정 실패"); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + return false; + } + //마크스탑설정 + PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //마크스탑신호가 3초이내로 들어와야 한다 + if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) + { + if (seqTime.TotalMilliseconds > 3000) + { + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE("MARK STOP신호가 확인되지 않습니다"); + PUB._mapCanvas.SetAlertMessage("mark stop 신호 확인 불가"); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } return false; } PUB.sm.UpdateRunStepSeq(); @@ -77,16 +150,46 @@ namespace Project } else if (PUB.sm.RunStepSeq == idx++) { - //멈춤확인 + //AGV가 멈출때까지 기다린다. if (PUB.AGV.system1.agv_run == true) { + if (seqTime.TotalSeconds > 10) + { + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE("AGV가 멈추지 않아 강제종료 합니다"); + PUB._mapCanvas.SetAlertMessage("agv 가 멈추지 않아 강제 종료"); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } return false; } PUB.sm.UpdateRunStepSeq(); return false; } - // 턴 제거됨 - + else if (PUB.sm.RunStepSeq == idx++) + { + //마크센서입력을 확인한다. + if (PUB.AGV.signal1.mark_sensor == false) + { + if (seqTime.TotalSeconds > 5) + { + PUB.AGV.AGVMoveStop(funcname); + PUB.log.AddE("마크센서가 감지되지 않았습니다"); + PUB._mapCanvas.SetAlertMessage("마크센서가 감지되지 않았습니다"); + PUB.sm.SetNewRunStep(ERunStep.ERROR); + } + return false; + } + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //완료되었다. + PUB.log.Add("진출 완료"); + PUB.sm.UpdateRunStepSeq(); + return false; + } + return true; } } diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_UNLOADER_IN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_UNLOADER_IN.cs deleted file mode 100644 index c3c9190..0000000 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_UNLOADER_IN.cs +++ /dev/null @@ -1,183 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using Project.StateMachine; -using COMM; -using AR; - -namespace Project -{ - public partial class fMain - { - /// - /// 언로더 진입 - /// - public Boolean _SM_RUN_UNLOADER_IN(bool isFirst, TimeSpan stepTime) - { - var funcname = "_SM_RUN_UNLOADER_IN"; - var idx = 1; - - //충전 상태가 OFF되어야 동작하게한다 - if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) return false; - - //라이더멈춤이 설정되어있다면 음성으로 알려준다 - if (CheckLiderStop() == false) return false; - - /* - * 언로더 IN 시퀀스 (버퍼 복사 - 턴 제거) - * 1. LIFT DOWN - * 2. 후진-저속-마크다운 실행 - */ - - if (PUB.sm.RunStepSeq == idx++) - { - PUB.log.Add("언로더진입시작"); - PUB.Speak("언로더 작업을 시작합니다"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - // [PickOn/PickOff] 초기 리프트 동작 - var liftCmd = arDev.Narumi.LiftCommand.DN; - if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOff) - { - liftCmd = arDev.Narumi.LiftCommand.UP; - } - - PUB.AGV.LiftControl(liftCmd); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //리프트 센서 확인 - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 10) - { - // Timebound check - } - PUB.log.Add("리프트 동작 확인 완료"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //마크스탑셋팅 - PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //저속이동 (후진 진입) - var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData - { - Bunki = arDev.Narumi.eBunki.Strate, - Direction = arDev.Narumi.eMoveDir.Backward, - PBSSensor = 0, - Speed = arDev.Narumi.eMoveSpd.Low, - }); - - //명령이 실패되었다면 재시도를 한다 - if (ret != arDev.eNarumiCommandResult.Success) - { - if (ret >= arDev.eNarumiCommandResult.Error) - { - PUB.AGV.AGVMoveStop(funcname); - PUB.log.AddE($"[{funcname}] AGV속도설정이 완료되지 않았습니다"); - PUB._mapCanvas.SetAlertMessage("agv속도설정오류"); - PUB.sm.SetNewRunStep(ERunStep.ERROR); - } - return false; - } - - - PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); - PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //마크스탑신호가 3초이내로 들어와야 한다 - if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) - { - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 3) - { - PUB.AGV.AGVMoveStop(funcname); - PUB.log.AddE("MARK STOP신호가 확인되지 않습니다"); - PUB._mapCanvas.SetAlertMessage("mark stop 신호 확인 불가"); - PUB.sm.SetNewRunStep(ERunStep.ERROR); - return false; - } - } - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //AGV가 멈출때까지 기다린다. - if (PUB.AGV.system1.agv_run == true) - { - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds > 10) - { - PUB.AGV.AGVMoveStop(funcname); - PUB.log.AddE("AGV가 멈추지 않아 강제종료 합니다"); - PUB._mapCanvas.SetAlertMessage("agv 가 멈추지 않아 강제 종료 합니다"); - PUB.sm.SetNewRunStep(ERunStep.ERROR); - return false; - } - return false; - } - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - // [Action] 진입 완료 후 리프트 동작 (Pick/Drop) - PUB.log.Add("언로더 진입 완료. 작업 수행(Lift Pick/Drop)"); - - var liftCmd = arDev.Narumi.LiftCommand.UP; - if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOff) - { - liftCmd = arDev.Narumi.LiftCommand.DN; - } - - PUB.AGV.LiftControl(liftCmd); - VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - // 리프트 동작 대기 - var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); - if (ts.TotalSeconds < 2) return false; - - PUB.log.Add("작업(Pick/Drop) 완료. 대기 상태로 전환"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //완료되었다. - PUB.log.Add("언로더 진입 및 작업 완료"); - PUB.sm.UpdateRunStepSeq(); - return false; - } - - PUB.AddEEDB($"언로더작업완료({PUB.Result.TargetPos})"); - return true; - } - } -} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_UNLOADER_OUT.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_UNLOADER_OUT.cs deleted file mode 100644 index 832a57d..0000000 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_UNLOADER_OUT.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using Project.StateMachine; -using COMM; -using AR; - -namespace Project -{ - public partial class fMain - { - /// - /// 언로더 배출 - /// - public Boolean _SM_RUN_UNLOADER_OUT(bool isFirst, TimeSpan stepTime) - { - var funcname = "UNLOADEROUT"; - //충전 상태가 OFF되어야 동작하게한다 - if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) return false; - - //라이더멈춤이 설정되어있다면 음성으로 알려준다 - if (CheckLiderStop() == false) return false; - - var idx = 1; - if (PUB.sm.RunStepSeq == idx++) - { - //빈 상태로 아웃해야한다. - var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData - { - Bunki = arDev.Narumi.eBunki.Strate, - Direction = arDev.Narumi.eMoveDir.Forward, - PBSSensor = 0, - Speed = arDev.Narumi.eMoveSpd.Low, - }); - //명령이 실패되었다면 재시도를 한다 - if (ret != arDev.eNarumiCommandResult.Success) - { - if (ret >= arDev.eNarumiCommandResult.Error) - { - PUB.AGV.AGVMoveStop(funcname); - PUB.log.AddE($"[{funcname}] AGV속도설정이 완료되지 않았습니다"); - PUB._mapCanvas.SetAlertMessage($"[{funcname}] AGV속도설정이 완료되지 않았습니다"); - PUB.sm.SetNewRunStep(ERunStep.ERROR); - } - return false; - } - - - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //전진이동 - PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //마크스탑 - PUB.AGV.AGVMoveStop("unloader out", arDev.Narumi.eStopOpt.MarkStop); - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //이동확인 - if (PUB.AGV.system1.agv_run == false) - { - return false; - } - PUB.sm.UpdateRunStepSeq(); - return false; - } - else if (PUB.sm.RunStepSeq == idx++) - { - //멈춤확인 - if (PUB.AGV.system1.agv_run == true) - { - return false; - } - PUB.sm.UpdateRunStepSeq(); - return false; - } - - return true; - } - } -} diff --git a/Cs_HMI/Project/StateMachine/Step/_Util.cs b/Cs_HMI/Project/StateMachine/Step/_Util.cs index 88e0d15..3e17333 100644 --- a/Cs_HMI/Project/StateMachine/Step/_Util.cs +++ b/Cs_HMI/Project/StateMachine/Step/_Util.cs @@ -110,30 +110,17 @@ namespace Project PUB.AGV.AGVMoveStop("경로재생성"); } - var PathResult = CalcPath(PUB._virtualAGV.StartNode, PUB._virtualAGV.TargetNode); - if(PathResult.result !=null && - PathResult.result.Success == true && - PathResult.result.DetailedPath.Where(t => t.NodeId == currentNode.Id).Any() == false) - { - PUB._virtualAGV.StartNode = PUB._virtualAGV.CurrentNode; - PathResult = CalcPath(PUB._virtualAGV.StartNode, PUB._virtualAGV.TargetNode); - } - - - if (PathResult.result == null) + PUB._virtualAGV.StartNode = PUB._virtualAGV.CurrentNode; + var PathResult = CalcPath(currentNode, PUB._virtualAGV.TargetNode); + if (PathResult.Success == false) { PUB.log.AddE($"경로가 계산되지 않았습니다"); PUB.sm.SetNewRunStep(ERunStep.READY); return false; } - else - { - - PUB._mapCanvas.CurrentPath = PathResult.result; - PUB._virtualAGV.SetPath(PathResult.result); - - } + PUB._mapCanvas.CurrentPath = PathResult; + PUB._virtualAGV.SetPath(PathResult); PUB.log.AddI($"경로생성 {PUB._virtualAGV.StartNode.RfidId} -> {PUB._virtualAGV.TargetNode.RfidId}"); } @@ -161,23 +148,22 @@ namespace Project if (PUB._virtualAGV.CurrentPath.DetailedPath.Count > 5) { var PathResult2 = CalcPath(PUB._virtualAGV.CurrentNode, PUB._virtualAGV.TargetNode); - if (PathResult2.result != null && PathResult2.result.Success) + if (PathResult2 != null && PathResult2.Success) { //절반이상 경로가 짧을때에는 재계산을 하게한다 var halfcnt = (int)(PUB._virtualAGV.CurrentPath.DetailedPath.Count / 2.0); - if (PathResult2.result.DetailedPath.Count < halfcnt) + if (PathResult2.DetailedPath.Count < halfcnt) { var msg = $"단축경로가 확인되었습니다. 경로를 삭제 합니다"; PUB.log.AddE(msg); Console.WriteLine(msg); PUB._virtualAGV.SetPath(null); + return false; } - return false; + } } - - //predict 를 이용하여 다음 이동을 모두 확인한다. var nextAction = PUB._virtualAGV.Predict(); if (nextAction.Reason == AGVNavigationCore.Models.eAGVCommandReason.PathOut) diff --git a/Cs_HMI/Project/StateMachine/_Xbee.cs b/Cs_HMI/Project/StateMachine/_Xbee.cs index e287544..a740804 100644 --- a/Cs_HMI/Project/StateMachine/_Xbee.cs +++ b/Cs_HMI/Project/StateMachine/_Xbee.cs @@ -4,6 +4,8 @@ using System.Drawing; using System.Linq; using System.Text; using AGVNavigationCore.Models; +using AGVNavigationCore.PathFinding.Core; +using AGVNavigationCore.PathFinding.Planning; using AGVNavigationCore.Utils; using AR; using arDev; @@ -70,8 +72,8 @@ namespace Project else PUB.log.AddE($"[{logPrefix}-SetCurrent] TagString Lenght Errorr:{data.Length}"); break; - case ENIGProtocol.AGVCommandHE.PickOn: // 110 - case ENIGProtocol.AGVCommandHE.PickOff: // 111 + case ENIGProtocol.AGVCommandHE.PickOnEnter: // 110 + case ENIGProtocol.AGVCommandHE.PickOffEnter: // 111 { PUB.log.AddI($"XBEE:작업명령수신:{cmd}"); @@ -109,6 +111,7 @@ namespace Project return; } + //다음명령처리 PUB.NextWorkCmd = cmd; PUB.log.AddI($"작업 시작: {nextStep} (Type: {cmd})"); PUB.sm.SetNewRunStep(nextStep); @@ -307,18 +310,12 @@ namespace Project else PUB.log.Add(e.Message); } - AGVNavigationCore.PathFinding.Planning.AGVPathfinder _advancedPathfinder = null; - (AGVNavigationCore.PathFinding.Core.AGVPathResult result, string message) CalcPath(MapNode startNode, MapNode targetNode) + AGVPathResult CalcPath(MapNode startNode, MapNode targetNode) { + var nodes = PUB._mapCanvas.Nodes; + var _simulatorCanvas = PUB._mapCanvas; var _mapNodes = PUB._mapCanvas.Nodes; - // 시작 RFID가 없으면 AGV 현재 위치로 설정 - if (startNode == null || targetNode == null) - return (null, "시작 RFID와 목표 RFID를 선택해주세요."); - - //경로계산기확인 - if (_advancedPathfinder == null) - _advancedPathfinder = new AGVNavigationCore.PathFinding.Planning.AGVPathfinder(_mapNodes); - + // 현재 AGV 방향 가져오기 var selectedAGV = PUB._virtualAGV; var currentDirection = selectedAGV.CurrentDirection; @@ -327,55 +324,15 @@ namespace Project var prevNode = selectedAGV.PrevNode; var prevDir = selectedAGV.PrevDirection; - // 고급 경로 계획 사용 (노드 객체 직접 전달) - var advancedResult = _advancedPathfinder.FindBasicPath(startNode, targetNode, prevNode, prevDir); + // Core Logic으로 이관됨 + var pathFinder = new AGVPathfinder(nodes); + var result = pathFinder.CalculatePath(startNode, targetNode, prevNode, prevDir); - var _simulatorCanvas = PUB._mapCanvas; - - _simulatorCanvas.FitToNodes(); - string Message = string.Empty; - if (advancedResult != null && advancedResult.Success) - { - // 도킹 검증이 없는 경우 추가 검증 수행 - if (advancedResult.DockingValidation == null || !advancedResult.DockingValidation.IsValidationRequired) - advancedResult.DockingValidation = DockingValidator.ValidateDockingDirection(advancedResult, _mapNodes); - - //마지막대상이 버퍼라면 시퀀스처리를 해야한다 - if (targetNode.StationType == StationType.Buffer && advancedResult.DetailedPath.Any()) - { - var lastDetailPath = advancedResult.DetailedPath.Last(); - if (lastDetailPath.NodeId == targetNode.Id) //마지막노드 재확인 - { - //버퍼에 도킹할때에는 마지막 노드에서 멈추고 시퀀스를 적용해야한다 - advancedResult.DetailedPath = advancedResult.DetailedPath.Take(advancedResult.DetailedPath.Count - 1).ToList(); - Console.WriteLine("최종위치가 버퍼이므로 마지막 RFID에서 멈추도록 합니다"); - } - } + //게이트웨이노드를 하이라이트강조 한단 + _simulatorCanvas.HighlightNodeId = (result.Gateway?.Id ?? string.Empty); + return result; - _simulatorCanvas.CurrentPath = advancedResult; - //_pathLengthLabel.Text = $"경로 길이: {advancedResult.TotalDistance:F1}"; - //_statusLabel.Text = $"경로 계산 완료 ({advancedResult.CalculationTimeMs}ms)"; - - // 🔥 VirtualAGV에도 경로 설정 (Predict()가 동작하려면 필요) - selectedAGV.SetPath(advancedResult); - - // 도킹 검증 결과 확인 및 UI 표시 - //CheckAndDisplayDockingValidation(advancedResult); - - // 고급 경로 디버깅 정보 표시 - //UpdateAdvancedPathDebugInfo(advancedResult); - - } - else if (advancedResult != null) - { - // 경로 실패시 디버깅 정보 초기화 - //_pathDebugLabel.Text = $"경로: 실패 - {advancedResult.ErrorMessage}"; - Message = $"경로를 찾을 수 없습니다:\n{advancedResult.Message}"; - advancedResult = null; - } - - return (advancedResult, Message); } diff --git a/Cs_HMI/Project/ViewForm/fAuto.cs b/Cs_HMI/Project/ViewForm/fAuto.cs index e6a7ddc..71c5f1a 100644 --- a/Cs_HMI/Project/ViewForm/fAuto.cs +++ b/Cs_HMI/Project/ViewForm/fAuto.cs @@ -62,12 +62,12 @@ namespace Project.ViewForm // PickOn var pickOn = new ToolStripMenuItem("Pick On (Move & Pick)"); - pickOn.Click += (s, args) => ExecuteManualCommand(mapnode, ENIGProtocol.AGVCommandHE.PickOn); + pickOn.Click += (s, args) => ExecuteManualCommand(mapnode, ENIGProtocol.AGVCommandHE.PickOnEnter); menu.Items.Add(pickOn); // PickOff var pickOff = new ToolStripMenuItem("Pick Off (Move & Drop)"); - pickOff.Click += (s, args) => ExecuteManualCommand(mapnode, ENIGProtocol.AGVCommandHE.PickOff); + pickOff.Click += (s, args) => ExecuteManualCommand(mapnode, ENIGProtocol.AGVCommandHE.PickOffEnter); menu.Items.Add(pickOff); // Charge @@ -246,11 +246,11 @@ namespace Project.ViewForm ContextMenuStrip menu = new ContextMenuStrip(); var pickOn = new ToolStripMenuItem("Pick On (Move & Pick)"); - pickOn.Click += (s, args) => ExecuteManualCommand(targetNode, ENIGProtocol.AGVCommandHE.PickOn); + pickOn.Click += (s, args) => ExecuteManualCommand(targetNode, ENIGProtocol.AGVCommandHE.PickOnEnter); menu.Items.Add(pickOn); var pickOff = new ToolStripMenuItem("Pick Off (Move & Drop)"); - pickOff.Click += (s, args) => ExecuteManualCommand(targetNode, ENIGProtocol.AGVCommandHE.PickOff); + pickOff.Click += (s, args) => ExecuteManualCommand(targetNode, ENIGProtocol.AGVCommandHE.PickOffEnter); menu.Items.Add(pickOff); menu.Show(Cursor.Position);