From 9bca8f67d183ddede03bb14807417c202bddb58e Mon Sep 17 00:00:00 2001 From: backuppc Date: Mon, 2 Feb 2026 14:59:48 +0900 Subject: [PATCH] .. --- .../EnigProtocol/enigprotocol/Commands.cs | 4 +- HMI/Project/Device/Xbee.cs | 30 ++- HMI/Project/Dialog/fLog.Designer.cs | 8 + HMI/Project/Dialog/fLog.cs | 21 ++ HMI/Project/Dialog/fLog.resx | 3 + HMI/Project/PUB.cs | 2 + .../StateMachine/Step/_SM_RUN_BUFFER_IN.cs | 131 ++++++++-- .../StateMachine/Step/_SM_RUN_BUFFER_OUT.cs | 73 ++++-- .../StateMachine/Step/_SM_RUN_ENTER.cs | 96 ++++++- HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs | 3 + HMI/Project/StateMachine/Step/_Util.cs | 9 + HMI/Project/fMain.Designer.cs | 20 +- HMI/Project/fMain.resx | 247 +++++++++--------- HMI/SubProject/AGV/Structure/ErrorFlag.cs | 2 +- HMI/SubProject/CommData/Enum.cs | 4 + 15 files changed, 452 insertions(+), 201 deletions(-) diff --git a/AGVLogic/EnigProtocol/enigprotocol/Commands.cs b/AGVLogic/EnigProtocol/enigprotocol/Commands.cs index 063c8ec..f443fd4 100644 --- a/AGVLogic/EnigProtocol/enigprotocol/Commands.cs +++ b/AGVLogic/EnigProtocol/enigprotocol/Commands.cs @@ -57,7 +57,7 @@ namespace ENIGProtocol CART_EXIST, MARK_TIMEOUT, MARK_SENSOR_FAIL, - LIFT_ERROR, + LIFT_ERROR, AGV_SPEED_SET_FAIL, AGV_RUN_FAIL, AGV_STOP_FAIL, @@ -67,6 +67,8 @@ namespace ENIGProtocol NOTSET_CHARGEPOINT, ALREADY_CHARGE, CHARGE_RETRY_OVER, + MAGNET_ON_ERROR, + MAGNET_OF_ERROR, } public static class AGVUtility diff --git a/HMI/Project/Device/Xbee.cs b/HMI/Project/Device/Xbee.cs index 38727ec..33e8fb9 100644 --- a/HMI/Project/Device/Xbee.cs +++ b/HMI/Project/Device/Xbee.cs @@ -162,7 +162,10 @@ namespace Project.Device byte cmd = (byte)ENIGProtocol.AGVCommandEH.Arrived; var data = System.Text.Encoding.Default.GetBytes(tag); var packet = proto.CreatePacket(id, cmd, data); - Send(packet); + if (Send(packet)) + PUB.logxbee.AddI($"Send SendMoveComplete [O] : {packet.Length} {packet.HexString()}"); + else + PUB.logxbee.AddE($"Send SendMoveComplete [X] : {packet.Length} {packet.HexString()} {PUB.XBE.ErrorMessage}"); } /// @@ -174,7 +177,10 @@ namespace Project.Device byte cmd = (byte)ENIGProtocol.AGVCommandEH.ReadRFID; var data = System.Text.Encoding.Default.GetBytes(tag); var packet = proto.CreatePacket(id, cmd, data); - Send(packet); + if (Send(packet)) + PUB.logxbee.AddI($"Send SendRFIDTag [O] : {packet.Length} {packet.HexString()}"); + else + PUB.logxbee.AddE($"Send SendRFIDTag [X] : {packet.Length} {packet.HexString()} {PUB.XBE.ErrorMessage}"); } /// @@ -189,15 +195,18 @@ namespace Project.Device var id = PUB.setting.XBE_ID; byte cmd = (byte)ENIGProtocol.AGVCommandEH.Error; - // if (errormessage.Length > 30) errormessage = errormessage.Substring(0, 29); + // if (errormessage.Length > 30) errormessage = errormessage.Substring(0, 29); var data = new List(); data.Add((byte)errcode); //var datamsg = System.Text.Encoding.Default.GetBytes(errormessage); - // data.AddRange(datamsg); + // data.AddRange(datamsg); var packet = proto.CreatePacket(id, cmd, data.ToArray()); - Send(packet); + if (Send(packet)) + PUB.logxbee.AddI($"Send SendError [O] : {packet.Length} {packet.HexString()}"); + else + PUB.logxbee.AddE($"Send SendError [X] : {packet.Length} {packet.HexString()} {PUB.XBE.ErrorMessage}"); } public eDocStep StepMC { get; set; } = eDocStep.NotSet; @@ -237,7 +246,7 @@ namespace Project.Device data.Add(value); // RunSt - if (PUB.AGV.error.Emergency) + if (PUB.AGV.error.Value > 0) value = 2; // error else if (PUB.AGV.system1.agv_run) value = 1; // run @@ -245,6 +254,11 @@ namespace Project.Device value = 0; // stop data.Add(value); + + //나르미오류코드전송필요 260202 + //agv\structure\errorflag.cs 파일의 public enum eflag 에 내용있음 + data.AddRange(BitConverter.GetBytes(PUB.AGV.error.Value)); + //runstep value = (byte)PUB.sm.RunStep; data.Add(value); @@ -298,7 +312,7 @@ namespace Project.Device // ErrorCode [New RunStepErrorCode] value = (byte)PUB.Result.RunStepErrorCode; data.Add(value); - + // LastTag string lastTag = PUB.AGV.data.TagNo.ToString("0000") ?? "0000"; byte[] tagBytes = Encoding.ASCII.GetBytes(lastTag.PadRight(4, '0')); @@ -310,7 +324,7 @@ namespace Project.Device if (Send(packet)) PUB.logxbee.AddI($"Send status [O] : {packet.Length} {packet.HexString()}"); else - PUB.logxbee.AddE($"Send status [X] : {packet.Length} {packet.HexString()}"); + PUB.logxbee.AddE($"Send status [X] : {packet.Length} {packet.HexString()} {PUB.XBE.ErrorMessage}"); LastStatusSendTime = DateTime.Now; } catch (Exception ex) diff --git a/HMI/Project/Dialog/fLog.Designer.cs b/HMI/Project/Dialog/fLog.Designer.cs index eac3fb9..4feb708 100644 --- a/HMI/Project/Dialog/fLog.Designer.cs +++ b/HMI/Project/Dialog/fLog.Designer.cs @@ -28,6 +28,7 @@ /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); this.rtsys = new arCtl.LogTextBox(); this.rtTx = new arCtl.LogTextBox(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); @@ -40,6 +41,7 @@ this.panel4 = new System.Windows.Forms.Panel(); this.rtAGV = new arCtl.LogTextBox(); this.titleAGV = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); this.tableLayoutPanel1.SuspendLayout(); this.panel1.SuspendLayout(); this.panel2.SuspendLayout(); @@ -230,6 +232,11 @@ this.titleAGV.Text = "AGV"; this.titleAGV.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // + // timer1 + // + this.timer1.Interval = 1000; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // // fLog // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); @@ -263,5 +270,6 @@ private System.Windows.Forms.Panel panel4; private System.Windows.Forms.Label titleBMS; private System.Windows.Forms.Label titleAGV; + private System.Windows.Forms.Timer timer1; } } \ No newline at end of file diff --git a/HMI/Project/Dialog/fLog.cs b/HMI/Project/Dialog/fLog.cs index f836198..22a2d9f 100644 --- a/HMI/Project/Dialog/fLog.cs +++ b/HMI/Project/Dialog/fLog.cs @@ -20,12 +20,31 @@ namespace Project.Dialog private void FLog_FormClosed(object sender, FormClosedEventArgs e) { + timer1.Stop(); PUB.log.RaiseMsg -= Log_RaiseMsg; PUB.logagv.RaiseMsg -= Log_RaiseMsgagv; PUB.logplc.RaiseMsg -= Log_RaiseMsgplc; PUB.logbms.RaiseMsg -= Log_RaiseMsgbms; PUB.logxbee.RaiseMsg -= Log_RaiseMsgcal; } + private void timer1_Tick(object sender, EventArgs e) + { + //포트열림상태표시 2600202 + if (PUB.XBE.IsOpen) + titleXBEE.BackColor = Color.Lime; + else + titleXBEE.BackColor = Color.Tomato; + + if (PUB.AGV.IsOpen) + titleAGV.BackColor = Color.Lime; + else + titleAGV.BackColor = Color.Tomato; + + if (PUB.BMS.IsOpen) + titleBMS.BackColor = Color.Lime; + else + titleBMS.BackColor = Color.Tomato; + } private void fLog_Load(object sender, EventArgs e) { @@ -52,6 +71,7 @@ namespace Project.Dialog PUB.logplc.RaiseMsg += Log_RaiseMsgplc; PUB.logbms.RaiseMsg += Log_RaiseMsgbms; PUB.logxbee.RaiseMsg += Log_RaiseMsgcal; + timer1.Start(); } private void Log_RaiseMsg(DateTime LogTime, string TypeStr, string Message) @@ -81,5 +101,6 @@ namespace Project.Dialog rtRx.AddMsg(LogTime, TypeStr, Message); } } + } } diff --git a/HMI/Project/Dialog/fLog.resx b/HMI/Project/Dialog/fLog.resx index 1af7de1..1f666f2 100644 --- a/HMI/Project/Dialog/fLog.resx +++ b/HMI/Project/Dialog/fLog.resx @@ -117,4 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file diff --git a/HMI/Project/PUB.cs b/HMI/Project/PUB.cs index 4ce1c3b..a99912e 100644 --- a/HMI/Project/PUB.cs +++ b/HMI/Project/PUB.cs @@ -733,6 +733,8 @@ namespace Project SaveTime = DateTime.Now }; + var fi = new System.IO.FileInfo(LastPosFilePath); + if (fi.Directory.Exists == false) fi.Directory.Create(); string json = JsonConvert.SerializeObject(data, Formatting.Indented); File.WriteAllText(LastPosFilePath, json); } diff --git a/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs b/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs index b7832f4..72701bd 100644 --- a/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs +++ b/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs @@ -145,9 +145,8 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { //버퍼에들어갈때에는 가져다 놓을때도 가지러 갈때에도 리프트는 내려서 들어간다 - var liftCmd = arDev.Narumi.LiftCommand.DN; - PUB.AGV.LiftControl(liftCmd); PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트를 내립니다"); + VAR.I32[eVarInt32.RetryLift] = 0; PUB.sm.UpdateRunStepSeq(); return false; } @@ -156,17 +155,9 @@ namespace Project //리프트 센서 확인 if (PUB.AGV.signal1.lift_down == false) { - if (seqtime.TotalSeconds > 20) - { - PUB.log.AddAT($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 내려가지 않아 1회 재시도 합니다"); - PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.DN); - //재시도를 했으니 다음으로 진행하게한다 - } - else - { - PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)"); - return false; - } + VAR.I32[eVarInt32.RetryLift] = 0; + var rlt = PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.DN); + PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트 하강 실행:{rlt}"); } PUB.sm.UpdateRunStepSeq(); return false; @@ -178,16 +169,64 @@ namespace Project { if (seqtime.TotalSeconds > 20) { - SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 내려가지 않습니다"); + if (VAR.I32[eVarInt32.RetryLift] < 3) + { + PUB.log.AddAT($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 내려가지 않아 재시도 합니다"); + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, + $"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 내려가지 않습니다"); + VAR.I32[eVarInt32.RetryLift] = 0; + } } else PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)"); return false; } - + VAR.I32[eVarInt32.RetryManget] = 0; PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트 하강 완료"); PUB.sm.UpdateRunStepSeq(); return false; } + else if (PUB.sm.RunStepSeq == idx++) + { + if(PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter) + { + VAR.I32[eVarInt32.RetryManget] += 1; + PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.ON); + PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 마그넷ON"); + } + + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //마그넷센서가 들어오는지 5초간 확인한다. + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter && + PUB.AGV.signal1.magnet_on == false) + { + if (seqtime.TotalSeconds > 5) + { + if (VAR.I32[eVarInt32.RetryManget] < 3) + { + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + var errmsg = $"[{funcname}] 마그넷이 ON 되지 않았습니다"; + SetRunStepError(ENIGProtocol.AGVErrorCode.MAGNET_ON_ERROR, errmsg); + VAR.I32[eVarInt32.RetryManget] = 0; + } + } + return false; + } + + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) { //저속이동 (후진 진입) @@ -220,16 +259,17 @@ namespace Project return false; } - //후진이동을한다 + PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 도킹을 위해 후진 이동 시작 (Dir:Backward, Spd:Low)"); + PUB._mapCanvas.SetAlertMessage($"도킹을 위해 후진 이동 시작"); + VAR.I32[eVarInt32.RetryMove] = 0; PUB.sm.UpdateRunStepSeq(); return false; } else if (PUB.sm.RunStepSeq == idx++) { - //이동확인을 한다. - PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 도킹을 위해 후진 이동 시작 (Dir:Backward, Spd:Low)"); - PUB._mapCanvas.SetAlertMessage($"도킹을 위해 후진 이동 시작"); - PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + VAR.I32[eVarInt32.RetryMove] += 1; + var rlt = PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 이동명령 결과:{rlt}"); PUB.sm.UpdateRunStepSeq(); return false; } @@ -240,8 +280,18 @@ namespace Project { if (seqtime.TotalSeconds > 10) { - SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL); + if (VAR.I32[eVarInt32.RetryMove] < 3) + { + PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 이동명령 재전송"); + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL); + VAR.I32[eVarInt32.RetryMove] = 0; + } } + else PUB._mapCanvas.SetAlertMessage($"AGV이동 확인 중"); return false; } @@ -309,11 +359,50 @@ namespace Project return false; } PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 마크센서 확인완료"); + VAR.I32[eVarInt32.RetryManget] = 0; VAR.TIME.Update(eVarTime.LastTurnCommandTime); PUB.sm.UpdateRunStepSeq(); return false; } else if (PUB.sm.RunStepSeq == idx++) + { + //pick off 조건이라면. 마그넷을 on 한후에 민다. + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter) + { + VAR.I32[eVarInt32.RetryManget] += 1; + PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.OFF); + } + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //pick off 조건이라면. 마그넷을 on 한후에 민다. + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter) + { + //마그넷센서가 들어오는지 5초간 확인한다. + if (PUB.AGV.signal1.magnet_on == true) + { + if (seqtime.TotalSeconds > 5) + { + if (VAR.I32[eVarInt32.RetryManget] < 3) + { + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + VAR.I32[eVarInt32.RetryManget] = 0; + var errmsg = $"[{funcname}] 마그넷이 OFF 되지 않았습니다"; + SetRunStepError(ENIGProtocol.AGVErrorCode.MAGNET_OF_ERROR, errmsg); + } + } + return false; + } + } + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) { if (seqtime.TotalSeconds < 2) return false; PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 작업({PUB.NextWorkCmd}) 완료. 대기 상태로 전환 (퇴출 명령 대기)"); diff --git a/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs b/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs index eb7a357..fae9f1c 100644 --- a/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs +++ b/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs @@ -37,12 +37,14 @@ namespace Project PUB.Speak(Lang.진출을시작합니다); PUB.sm.UpdateRunStepSeq(); SpeedSetRetry = false; + VAR.I32[eVarInt32.RetryLift] = 0; return false; } else if (PUB.sm.RunStepSeq == idx++) { arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN; PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트제어 {lift}"); + VAR.I32[eVarInt32.RetryLift] += 1; PUB.AGV.LiftControl(lift); PUB.sm.UpdateRunStepSeq(); return false; @@ -55,31 +57,23 @@ namespace Project { if (seqtime.TotalSeconds > 20) { - PUB.log.AddAT($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 완료되지 않아 1회 재시도 합니다"); - arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN; - PUB.AGV.LiftControl(lift); + if(VAR.I32[eVarInt32.RetryLift] < 3) + { + PUB.log.AddAT($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 완료되지 않아 재시도 합니다"); + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + VAR.I32[eVarInt32.RetryLift] = 0; + SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 동작하지 않습니다"); + } } else return false; } PUB.sm.UpdateRunStepSeq(); return false; } - else if (PUB.sm.RunStepSeq == idx++) - { - //리프트 센서 확인 - var checksensor = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? PUB.AGV.signal1.lift_up : PUB.AGV.signal1.lift_down; - if (checksensor == false) - { - if (seqtime.TotalSeconds > 20) - { - SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 동작하지 않습니다"); - } - return false; - } - PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트 확인 완료"); - PUB.sm.UpdateRunStepSeq(); - return false; - } + else if (PUB.sm.RunStepSeq == idx++) { if (PUB.AGV.signal1.mark_sensor == false) @@ -111,6 +105,7 @@ namespace Project PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 이동 설정 완료 (Dir:Forward, Spd:Low)"); } + VAR.I32[eVarInt32.RetryMove] = 0; PUB.sm.UpdateRunStepSeq(); return false; } @@ -119,10 +114,10 @@ namespace Project //전진이동 if (PUB.AGV.signal1.mark_sensor == false) { + VAR.I32[eVarInt32.RetryMove] += 1; PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 전진 구동 시작"); PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); } - PUB.sm.UpdateRunStepSeq(); return false; } @@ -135,17 +130,32 @@ namespace Project { if (seqtime.TotalSeconds > 3) { - //구동이확인되지 않으면 오류처리를 한다. - SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL); + if(VAR.I32[eVarInt32.RetryMove] < 3) + { + //재시도를 하게한다. + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + //구동이확인되지 않으면 오류처리를 한다. + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL); + VAR.I32[eVarInt32.RetryMove] = 0; + } + } return false; } - PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 구동 확인 완료"); - //마크스탑설정 - PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); - PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] MarkStop 명령 전송 (진출 정지 장소)"); } + VAR.I32[eVarInt32.RetryMarkStop] = 0; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + VAR.I32[eVarInt32.RetryMarkStop] += 1; + PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); + PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] MarkStop 명령 전송 (진출 정지 장소)"); PUB.sm.UpdateRunStepSeq(); return false; } @@ -158,7 +168,16 @@ namespace Project { if (seqtime.TotalSeconds > 3) { - SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT); + if(VAR.I32[eVarInt32.RetryMarkStop] < 3) + { + PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] MarkStop 재시도"); + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT); + VAR.I32[eVarInt32.RetryMarkStop] = 0; + } return false; } return false; diff --git a/HMI/Project/StateMachine/Step/_SM_RUN_ENTER.cs b/HMI/Project/StateMachine/Step/_SM_RUN_ENTER.cs index 1548ab6..82c3153 100644 --- a/HMI/Project/StateMachine/Step/_SM_RUN_ENTER.cs +++ b/HMI/Project/StateMachine/Step/_SM_RUN_ENTER.cs @@ -36,7 +36,7 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { //마크센서가 감지된상태여야 완전한위치로 가정한다 - if(PUB.AGV.signal1.mark_sensor == false) + if (PUB.AGV.signal1.mark_sensor == false) { SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_SENSOR_FAIL, $"[{funcname}] 마크센서가 감지되지 않습니다"); } @@ -95,15 +95,54 @@ namespace Project var errmsg = $"[{funcname}] 리프트다운이 확인되지 않습니다"; SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, errmsg); } - return false; - } - else - { - PUB.log.Add("리프트 동작 확인 완료"); - PUB.sm.UpdateRunStepSeq(); + return false; } + + VAR.I32[eVarInt32.RetryManget] = 0; + PUB.log.Add("리프트 동작 확인 완료"); + PUB.sm.UpdateRunStepSeq(); return false; } + else if (PUB.sm.RunStepSeq == idx++) + { + //pick off 조건이라면. 마그넷을 on 한후에 민다. + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter) + { + VAR.I32[eVarInt32.RetryManget] += 1; + PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.ON); + } + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //pick off 조건이라면. 마그넷을 on 한후에 민다. + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter) + { + //마그넷센서가 들어오는지 5초간 확인한다. + if (PUB.AGV.signal1.magnet_on == false) + { + if (seqTime.TotalSeconds > 5) + { + if(VAR.I32[eVarInt32.RetryManget] < 3) + { + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + var errmsg = $"[{funcname}] 마그넷이 ON 되지 않았습니다"; + SetRunStepError(ENIGProtocol.AGVErrorCode.MAGNET_ON_ERROR, errmsg); + VAR.I32[eVarInt32.RetryManget] = 0; + } + + } + return false; + } + } + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) { //저속이동 (후진 진입) @@ -114,6 +153,7 @@ namespace Project PBSSensor = 0, Speed = arDev.Narumi.eMoveSpd.Low, }); + //명령이 실패되었다면 재시도를 한다 if (ret != arDev.eNarumiCommandResult.Success) { @@ -198,10 +238,50 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { //완료되었다. - PUB.log.Add("진입 완료"); + PUB.log.Add("진입 완료 마그넷을 off합니다"); + VAR.I32[eVarInt32.RetryManget] = 0; PUB.sm.UpdateRunStepSeq(); return false; } + else if (PUB.sm.RunStepSeq == idx++) + { + //pick off 조건이라면. 마그넷을 on 한후에 민다. + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter) + { + VAR.I32[eVarInt32.RetryManget] += 1; + PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.OFF); + } + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //pick off 조건이라면. 마그넷을 on 한후에 민다. + if (PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOffEnter) + { + //마그넷센서가 들어오는지 5초간 확인한다. + if (PUB.AGV.signal1.magnet_on == true) + { + if (seqTime.TotalSeconds > 5) + { + if (VAR.I32[eVarInt32.RetryManget] < 3) + { + PUB.sm.UpdateRunStepSeq(-1); + } + else + { + VAR.I32[eVarInt32.RetryManget] = 0; + var errmsg = $"[{funcname}] 마그넷이 OFF 되지 않았습니다"; + SetRunStepError(ENIGProtocol.AGVErrorCode.MAGNET_OF_ERROR, errmsg); + } + } + return false; + } + } + PUB.sm.UpdateRunStepSeq(); + return false; + } + return true; } diff --git a/HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs b/HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs index 08ae9dc..2e28378 100644 --- a/HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs +++ b/HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs @@ -109,6 +109,9 @@ namespace Project PUB.log.Add($"[GOTO] Step {idx - 1}: Movement Finished. Waiting for full stop."); PUB.Speak(Lang.이동완료, true); PUB.AddEEDB($"이동완료({PUB._virtualAGV.TargetNode.ID2})"); + + //ㅇ목적지 완료신호를 ACS에전송한다. + PUB.XBE.SendMoveComplete(PUB._virtualAGV.TargetNode.RfidId.ToString("0000")); PUB.sm.UpdateRunStepSeq(); return false; } diff --git a/HMI/Project/StateMachine/Step/_Util.cs b/HMI/Project/StateMachine/Step/_Util.cs index 494196a..6aa7a18 100644 --- a/HMI/Project/StateMachine/Step/_Util.cs +++ b/HMI/Project/StateMachine/Step/_Util.cs @@ -287,10 +287,19 @@ namespace Project { if (PUB.AGV.system1.agv_run == false) { + //마크센서확인 + if(PUB.AGV.signal1.mark_sensor==false) + { + PUB.log.AddI($"목표도착되었으나 마크센서가 감지되지 않아 경로를 삭제 합니다"); + PUB._virtualAGV.SetPath(null); + return false; + } + // 경로가 존재한다면... if (PUB._virtualAGV.CurrentPath != null && PUB._virtualAGV.CurrentPath.DetailedPath.Any()) { var lastInfo = PUB._virtualAGV.CurrentPath.DetailedPath.Last(); + // 위치와 방향이 모두 일치해야 완료된 것으로 본다. if (PUB._virtualAGV.CurrentNode.Id == lastInfo.NodeId && PUB._virtualAGV.CurrentDirection == lastInfo.MotorDirection) diff --git a/HMI/Project/fMain.Designer.cs b/HMI/Project/fMain.Designer.cs index 4dcf8bf..5d622e9 100644 --- a/HMI/Project/fMain.Designer.cs +++ b/HMI/Project/fMain.Designer.cs @@ -119,6 +119,7 @@ namespace Project this.demoListLotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); this.refreshListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.xbeeSettingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.debugtestToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.pandBottomDIO = new System.Windows.Forms.Panel(); this.panel9 = new System.Windows.Forms.Panel(); @@ -127,7 +128,6 @@ namespace Project this.panDlg = new System.Windows.Forms.Panel(); this.arPanel2 = new arCtl.arPanel(); this.arPanel1 = new arCtl.arPanel(); - this.xbeeSettingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.panRight.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout(); this.panel4.SuspendLayout(); @@ -1676,7 +1676,7 @@ namespace Project this.refreshListToolStripMenuItem, this.xbeeSettingToolStripMenuItem}); this.cmDebug.Name = "cmVision"; - this.cmDebug.Size = new System.Drawing.Size(229, 368); + this.cmDebug.Size = new System.Drawing.Size(229, 346); // // mapFileToolStripMenuItem // @@ -1727,6 +1727,13 @@ namespace Project this.refreshListToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.refreshListToolStripMenuItem.Text = "Refresh List"; // + // xbeeSettingToolStripMenuItem + // + this.xbeeSettingToolStripMenuItem.Name = "xbeeSettingToolStripMenuItem"; + this.xbeeSettingToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.xbeeSettingToolStripMenuItem.Text = "xbee setting"; + this.xbeeSettingToolStripMenuItem.Click += new System.EventHandler(this.xbeeSettingToolStripMenuItem_Click); + // // debugtestToolStripMenuItem // this.debugtestToolStripMenuItem.Name = "debugtestToolStripMenuItem"; @@ -1824,7 +1831,7 @@ namespace Project this.IOState.Text = "gridView2"; this.IOState.TextAttachToImage = true; this.IOState.Titles = new string[] { - "EMG|TAG|DIR|STS|SPD|SEN|CAL|RUN|MARK|CHG|ITM"}; + "EMG|TAG|DIR|STS|SPD|SEN|CAL|RUN|MARK|CHG|CART"}; this.IOState.Values = new ushort[] { ((ushort)(0)), ((ushort)(1)), @@ -1970,13 +1977,6 @@ namespace Project this.arPanel1.TextShadow = false; this.arPanel1.UseProgressBar = false; // - // xbeeSettingToolStripMenuItem - // - this.xbeeSettingToolStripMenuItem.Name = "xbeeSettingToolStripMenuItem"; - this.xbeeSettingToolStripMenuItem.Size = new System.Drawing.Size(228, 22); - this.xbeeSettingToolStripMenuItem.Text = "xbee setting"; - this.xbeeSettingToolStripMenuItem.Click += new System.EventHandler(this.xbeeSettingToolStripMenuItem_Click); - // // fMain // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; diff --git a/HMI/Project/fMain.resx b/HMI/Project/fMain.resx index ba5941e..18a2a4d 100644 --- a/HMI/Project/fMain.resx +++ b/HMI/Project/fMain.resx @@ -126,163 +126,160 @@ - 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 + hk4AAAAASUVORK5CYII= - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAb9JREFUWEft - lr8vBEEUxxchEST8ARIkOo1KqFwpUQgKdFRKKoVG+AtUSirFSkiuVCk2m9zt7e7dJtcIkVxFcK4QCYld - 3517e9ZkHGLfRuEln8zsvLf7/e7M7A/tP8rlckehUFgCG03IUHnygYsfgeALfMuy5uiUZAMXf5bEPqOa - y+UG6bTkQiHUjCq4/CU2ZnOK5H9sICkedF1vUxnwgQuOgc6JYRg9soFbMBaOlUqlLs/z+jgJgqD1gwGs - yyIYQf8iGmOmBr2FyMCLaZqdaA/pOC1uIgMuzcYVHadFJTKw77puL9pwE8pFbGAJssKAbdtraDPxZErs - CANwMgnWpSQ70JwPDfjhY4H2IJ5MAyz7sNh4tAGL8WQKPIp3ATon9En+7kcpETD9ZnjjGjpbYFRVxMye - MIDODAysSMk0WBUGsBEGcLArJdlxHGdcGMBGaMF74ExVxMgr9l13wwAGalIBN+dCPAys/5CigBud5DUN - 0z+rKGAFN71J8uIp2JYLuMFNT5O8WIKsqoiTfD7fT/JiBipyATP3JF0PDNxJBdycknQ9sB7LGHySiri4 - xvRPkPR7INEu/7Vy0PgT/juhaW/ZS5SxdhC40QAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAa9JREFUWEfl + ls8rhEEch/2IEoo/QKHcXJzEiaNyEA64cXLk5OAi/gInR04Or6IcnRy2t/b9fGbHbr0XkdoTYTlIUfbV + +/a+b3aalux+N2XquWzPNE/T7Mzb1PTvh+/77SSXSG5UYdKcV7dB8ohk8A1lAHPm3LoMkm+WBW2Ustns + gDm/5mFZqBolktc1ogBM/TagXjw5jtNqCyiT1CSPSTqSZDKZbjPgnuRo+Fs+n+8sFAq9kgRB0FIRAGAR + wDDJK8uWSfAMYCEJeHddt4PkoUWU5C4J0PFu3FgkSYpJwL7Wuic+hKYkBoDTKEAptRZet6bQAHaiAAAT + ANYtgigA5sOAcvi3IHlgCtJorYeigxcfwAtTEOYlugtInsRP8k8fpboAwI0uIgBbAEZMoQHsJTfhDIAV + iyDNahSgte4nuWsRRMnlcmNRQBAEzUqpc1MQ5sP3/a40IHwYLJIkl9Hi8SEctAjSOGmAUmrWIogCYDMN + ILltCtIopabTgPBFMgVpPM/r+7oDRVMQ5jFdPA54sEiSnFUEKKWWSb5aRAluPc8brwgIB8k286tVgvRL + +C+NT9lLlLEeyHt7AAAAAElFTkSuQmCC - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAABAlJREFUWEft - V91vFFUU3wiC6AMBY0xIgb13ltJAjBoJMSF+BYkPIgkJH/ogxo8QP6ha1MDandn7qAkxmsiDoYkhJoUA - LyQYQwj1BfkPeFAeBLozszWh0PJR0XbX3296ZvbOfnVteewvOdmZc37nzJk7555zNzOP/4uqyTxQctWT - ZaO3Bq56L3D1+77n7C6Z7FPVvc88KLT7D991NvlF/WPg6b8g1RYyFhb1scCo58Vt7ghNbh0Cn6l7UCcy - RF8JMztwaRHothX0Hyz5Ofx+UvL05tDNrS8Z3Y1P8Zzvqn2w/QzbvxZ/wnf1OxIuE+Zzj3WcVOg5X1iB - KkFR/zRSyDlibonQZLNI5KTlS8kP93Utwe8IpOIb/bLQm8P39BskivN44DnbxdQxUDOvw3dMYlQR08TX - kD6hNWK4oNeA8LcQbwVGbxBTCpfM+kVXD65aRuG1qFMI3ewLiDEhseIXap8AjHHBVXxPvSbqBqA+eoXX - MiCSXwXbKYvXlp9hMcUkbidRJwg81Y+l/J7fE1vycBKwqI5e7s0txvW35AidL/NHwklLiwSKzhEhTAX9 - arWoIwSuU7ACXIPcs+5Z+VeTe1d9Oe2jzya6tDQmwC4Gww0SsHXOizoB3vI7K0BbwQ5y6VPdmVnAXTFi - urUtowf00iiojcBke5IgrvOxqBP8abIPwdauC8ZyZVYt2TdqWxwExbdF1Oj9Ly7kG4WeOg6bXckXOBM4 - A3D9m6Xn5xikD30lzMxA8bwpASrXzMoVosbKrHhY9Cnhw4WSkSQaOPQVSoTQ1R9C/03588cfEVUN053K - OYTl3yuqCC0TwEOFgqaTe7oZx07A73dWxnqszluinhlRIbnOntDTX8F5MgmOZWcSfDg+z0VLf48FyxlA - XwmDFc6+EnPa9ZeWGDZdy+E8GgdpI8P1S09gS34aczjARF0Dt0b9dikXVqv4LTiMrIfMJANRUAvoDb+K - 7XrT4oShTwhpQTOhPRq3tV3AphP3eAqbEpsTryvkRkEFfBHopyJ7Uf0g6jRgbJ6Ap38XCka0+oi1wJ6A - Vv11zGFbjnSwkSP0BCjuEwkXJytRpwFjswROcaAIJQU87IOYx8Ek6gZwlMc8FPNpUTcCBDuBeKknOFKF - kkJH49iojYhxR2LdbXugASFJoO7wMMYDitA6Bj7FTvjekhhToat2iak50BxeIhES8I3wmxfnacExi4NF - 6C3BA010Mq6tYgXJfCbm9vALam0p3/Oo3PJo9jYC3JVAlElsp1+iHYGjN/k8mHJ2IMH9nKLg2IfScXyG - HRJudpBj+ZAVtCNhwTFBCTN3yGlpEHLTflCdlCEDZZN9VtzuPzjrOQlZVFh2/C1T72JLvlp29RP82ya0 - eXSITOY/N4AkP6QQbUkAAAAASUVORK5CYII= + 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 - nZx+lOd9AOxqphdZ7gKgAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAPJJREFUWEft + lj0KwkAQhVNY6n0Uj6BtagvxEFqJvYWnEL1EmiDKvEmXG9gK3kDZsIZk3Jj4s7iEffBB2Pl5r9iEBIGX + lyti5j6A/Qt2ADYAJnEc9+S8OlM13aN65XyO8pLzAYAQwK0hVyKaPmaZeabODH1VhGX39wNkENESwEqe + N+A3Ab7AeoC13le103qA3MBQK9VztS1AHS0PQESHwofnqW49gAt3wAfwAf4bwIXXsA4HAxDR0NBohSRJ + BtI/iKKoA+Akmy1wVF7SP1Oapl1mXjDzVv5IGrgUlqpnWS+hd86Vh/T9SMw8BnDWjGTdy6up7uxqphcq + UCfvAAAAAElFTkSuQmCC - iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAABGdBTUEAALGPC/xhBQAABHFJREFUWEe1 - mFtIXFcUhifk8pqSPORCSGn7VPIcaFpCA+lDSUjfpIRCI97vKN5vGUEUhEFFRGkfRBEVa0GtdzQ+WBE1 - EPRF0XhDJAreo45Dra78a7tncs6e7ajjnAUfnnPW2mv97r32uYzNXwsODv4iPDz8+8jIyN9BVERERBzO - Q8BPYWFh92SYtRYdHf01CueBd+AQkA/mQQWLlsMDZ0j6AMn/BqeJOIlR8Fym89+CgoKuIVER+E8mvij/ - xMTE3Jbpz2chISF3kYD/M13ii7CCHnssy5zNMOgbwD2gSxgI9tEGv8hyvg3Bd8CcYbBVuKKiop7IsnrL - y8u7gsB/lYFWshEaGvqlLO9tCMhVBlyI2NhYyszM1Prc4B72BqUvHSswGBrtKwQ41QGnkZ6eToODg1RU - VOTlKygoIKfTSTU1NV4+IxD1Usr4bLj4py74JBBPVVVVtLu7S2xtbW0mPwvlv/n5+bS9vS1ijX6F97jF - XJZSbDZM7U1cdClBJ5KVlUWTk5NCiNtUQUtLS9TX10doXCosLKS9vT0xzhhjxLTrcBKjC1LhWamtrSWX - yyVlfDZVUHJyMs3NzVF7e7s47+npoZGREVOMEWhoknKEoA5dUFxcHBUXF1NJSQmVl5fT/Py8LO9tbkH1 - 9fVi9hITEykjI0Msqd1up7S0NDo4OKCUlBSvOpKP4CrruYSDbYPDAxc5q7kF4QFMo6OjNDw8LM67u7up - t7dXHE9PT1N1dbUnvwom5iFv9fuqww0nOqsZlywhIUHMTE5Ojmjq9fV1cb2lpYUGBgY8cRpe8XZ/rHEI - /BXEDA0NUWNjo+i7w8NDsfy806ampkxxCnbe7s80DsFFBDU3N4tdxsebm5titrgfFxcXTXEKDssE8e7q - 7OwUx7zls7OzqbS0lGZnZ01xCg7Llmx8fFw0MPeTccnGxsZMcQp2S5qab4D7+/uUlJREFRUV4n7E13kJ - Ozo6PHEaXvnc9rzmExMTgpmZGVlab25BLIb7hHuIz3lG+GbKxysrK+RwODz5VcS2Z8NJu+rUUVZWRhsb - G1KC2dyCFhYWqLW1VeyuyspK8RzjZWMha2tr4lGi5pV4bowsKNrg8An3At/sjo6OpJRjU3uIZ3dnZ0f8 - EyyCm7murs4Uo/CXEMOGl6QbuHDmhyvDrxvLy8tSjllQQ0MDbW1tCTF83tXVJQT5mB2e0RdSzrHh4h9q - 0GnwCxg/NHkXNTU1ea7zErEvPj6e+vv7aXV1lVJTU01jFaZNrx9s/CoJx7lf0Bh+98HnjekaP+15lrip - +djoU8Hs/CplmA3ObDXYX7ipc3NztT6FXlne23jakOiNZpBVrIP7srze+MsSQbOGQVbB32Y/yrK+DcH8 - oWjlt5nTa1edZhjEH4zDhiSB4gO2/w+yzPkMg6+CAhCoHxua8TC/JdP7b0jyLaa4EQn9+jkGvTKC8T/L - dIEz/phE8tco8hb8byyqYQaUQ8gjOdxaQ7HrEPgdBP6Gou6f9IJx/JR/ypFh5zSb7RMJw7xfBlQNxwAA - AABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAABGdBTUEAALGPC/xhBQAABGpJREFUWEe1 + WFtIdFUUnp8ur0U9dCGK6il6DrrwU1AP8Ue9DRFBvzhnrz0XFcX77R9BFARREVHqQRRRMQM172g+mIga + hL4o+ntDJAXvqaNkumJt5gznrLMbxxnng485Z1/W+mbvtfbluFxxIiUl5UUhxMdSyh+klF4ASBNCpAoh + vjAM4w3ePinw+XzvAEAZAPwJANcAgFG4AQCNJJrbSRhCiPcB4JcYRPwf5wDgK273znC73c8DQBUA/KNx + Eg9/9fv9r3I/MSE1NfX18D/jRhPlrmEYD7m/qACAd8MxwI3dFy+EEN9wv1oAwGsAsK4xct+89Hq9n3H/ + NpSVlT0LAL9rOieLhx6P5y2uIwIAKNV0ipuBQAALCwsd5VZKKX9zuVwPuBaXYRhvA0CId7iN+fn5ODU1 + hVVVVY66iooKDIVC2Nra6qizUkr5HdfjklL+xBtGo5QSm5ub8ezsDAn9/f22ehJKv+Xl5XhycqLachsW + PnW73c9ExAQCgZcpyDQNtSwqKsKlpSUlxAQXtL29jePj4+j1erGyshLPz89VP27LpC3rhBB+3kBHGpW2 + tja8vLy0idEJys7OxvX1dRwYGFDvo6OjODs767BpUgjRbRU0yBsQ09LSsKamBmtra7GhoQE3Nja4jghM + QR0dHWr0MjMzsaCgQE1pMBjEvLw8vLq6wpycHIefMP8GgOdIzwMAONE0UE5ihSnI5/Ph3NwczszMqPeR + kREcGxtTzysrK9jS0uLwY1II8QGl+pu8wiQZihXWKcvIyFAjU1JSooL64OBAlff29uLk5KTDj4WPKd0f + aioSEkScnp7Grq4uFXfX19dq+inTlpeXHX4sDFK6P9JUJCyop6dHZRk9Hx0dqdGieNza2nL4sbA6aYIo + u4aGhtQzpXxxcTHW1dXh2tqaw49NULKmbGFhQQUwxZN1yubn5x1+LAwmJahpAby4uMCsrCxsbGxU6xGV + 0xQODg46/Fj4OGra05wvLi4qrq6ucg02mIJIDMUJxRC904jQYkrPu7u7WF1d7fBjUqU9AQAGeKWO9fX1 + eHh4yLUomII2Nzexr69PZVdTU5Pax2jaSMj+/r7aSrjdMCMLIwnyaRpoSbFAi93NzY1WkEka3dPTU/Un + SAQFc3t7u8OehT9Htg6Px/PSXTZXIh03dnZ2tII6Ozvx+PhYiaH34eFhJSjK6NCIfh0RFB6lH3mj20gH + MNo0KYu6u7sj5TRFVJeeno4TExO4t7eHubm5jv4WrtiOHwQ6SsZzQCPS2cfv99vKaLenUaKgpmfex0op + 5bc2MSYAoJg3jpcU1KWlpY5yDce4jgho2OiMq+mULB7QOsh12EA3SwBY03S+b9Ld7FPuX4vwRTGZd7OQ + I6tuQ/jCOKMxlij/8nq9n3B/MYFWTgCouMePDT2GYbzC/dwZhmG8J6XsivdzjBBiVkr5JbebMOgyKYR4 + AgB/AMC/3DHjKgA0SCk/4naSAgB4wTCMD4UQ31s+6aVIKT+nTzm8faz4DwnDvF8jQGuEAAAAAElFTkSu + QmCC - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAlxJREFUWEfV - l81u00AUhcOrIMGqgg0sYEMFe1QE5QlQd63oug/QbstT0B2UVgEKgW1+7GxoWSAeghKJSgGF70bHlpnc - cYbW5edIn6LcuefesT0e263/Ur1e7/pgMHiZZdmB0e/327Cg4fMXzTdhUoUJbGj4/MVRP3cm8FTDzYiC - DyjcodkVhUoR/1RtLg41XMq8xDvUuq9QmjA+xDhW4RP+P55MJhdsjOt/i9h3jVUZ53l+w3Isl/9r8K0Y - g2UbmyubrQxhg3fwIYh55NR448THSWeCpF3H3Ai2dtQmLiZwkeTj0NwAo263e1lt6sVMV5wCZ+WRys+X - LaLIdTwV1GqrdJq0ij+GhQJM2yIDL2cKZ7Sn0mnidrrjFRJfOKK7Si1FfAmia8e2b6XOSnv7lu6Az/Cj - MIZ4zQtxpPc8j7C9wzawZ7DJQV6TbTr7ffBMv0DzvixRkVd7OSrsyzK99dpOgse2LFGR8yTwuFhPWf6B - CRDYCxMiZLJERc4w8MTYk2V6BhZgg+AOHIH3LChYkm1G1LDniOcxrOYh7Fgv6ynbrFjNtyvGkGNb7Uot - peZfg9yS2tswVOJGlINdb6P2tP/2RmQTwPTeK3ZKXltNlZ8vTue6U+SsrKp8vWxxkFy8yTTJCbvfVbWJ - i8ROYGySt2oTl1bzzG3ImjjgN+mVDF4FMSPtlcxE8rIZZBzRfEVDNsFFYt7DasytdlNpxUvNqBiDtJfS - QjZb2B0Oh5cUKkUxe2KGEzjScCnzWo3kI08VzV4EzW1vb/bDpE403HIm8Oc+zfQC8/c+TptTq/UT/J7v - URSJG9cAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAjpJREFUWEfV + V7tu1UAQDb+CBBUiTSigAZE+SsTjCxAdCGo+ANrkK6DjkYiEd3v3nNnbkFBEfESSKxHpgi4atGutx2Nj + uA4RRzqN53HG9nh2vLDwPyKEcInktoi8VQJ4DeCC9TsxkHxMclYSwCPrd2IQkRdOAU+t31wAcJPkBxG5 + aG0k920BJHetn8ZqDgA3rK0TInKb5DQlPhaRB7PZ7IzaQghXSX53CpjGGC+rj/qSvE/yW7aRvGV1XGi1 + hXjJjyQ/O9ctI4B3zvVprycB4KUTPAi1d6xeAwDOkjy0wQNwMhqNzls9FyJy10kwL+9YnVZoE7W8x7+i + Diqr0YnUxV9sIkPFeqI49ooiEqxGJ2KMyzZJwQMAKzaG5GpX7+j4tjEV0mx/kr6AryR/2ASZnniGiKxZ + /4I6O3SAPddRHmNcqgJJbjkBDQJATdHB715Hwa0qSJvEcfC4XlNzQHLDiWuw1pinXgDJTevQQqmpOSA5 + duI8blZBukzoeU7yGcm9lrMgc7WmWCCdI9Y/U3PuqoZqdS4wInLdSZB5qN1uY5L4keP/i52foUXPQRTT + +1Z2PvY/HkRagIh8sonm4Ju8T/QCgIdOknl5z+q40OYoNpkheRxjXLR6DegO5wQPxfdWr4G2lUz3/74r + Gckd53q/lUyhC2RRxEQXlGwDcK3lsJqGEK5kv7TUTLKt91KaodXq6Tgej89ZWzoxbQF71k9jNUfvO+8L + kq9sAYP/mHRBdwengH/3a3bqP6dD4if8nu9RoGmrKgAAAABJRU5ErkJggg== - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAsRJREFUWEft - lz9TU0EUxdOovWKv9Golo59AsRMr0ELQRjsHO4n4CWD8A/oNUD9IZpKQxCYVIg1gKTYChejvvDmbbN57 - IS8gY8OZOZPHuefe3b27+xJKpzgKqtXqhdXV1Sv1ev0OHNezNIdPBgw0Cl8xWAv+6cNmo9GYZzKXnXZ8 - NJvNixR+A/ejgQZR3tdwxGWOBlZzgyLbLhq4g77C5xyfD0U/S9uxJ3Cbro253HAg8R4FdqNiX9Em+Txj - SwaKwSm4DkPeLpObsKUYSNDKO4Mz8Lt2u33W4YGQl7ylkA93C3fCe/49JJP4zKGhQf5sqAO3Ct0UjDpw - SRKdeGs5QZECaQ91lkM9FrNoOR8YRjGG074et53O3ETTIXtsKQPF5JHXUmltbe0c2jeomvuHXlEmoHse - ZjtpWYVHYDjhv2FmEtIck0fezhWkkw+siy8tZ0Hwi0076UPHhGbQwwAH8KlDebEnDiXgb92OH443LPdC - e2eD9n7Fcg+IxatMOpGn2d4D9E/2HFQqlfOWu2Dfrtmg9r+wnAHx9IADBxeIzdmnBV613AWD6kslGKYt - 5yLVcjHT9jScE+rfttyFxGCQ2XIu+kygcybyQM6j4GesW5a7+O9bEB9CJvDRcg+IHecQfrYn/xAKBJs2 - FbmGnT3PifVsh19GPxXHW7ecBa2ZdxFxyrIm9i9fRGXLWeg1ieEkXsUbUDX3Wq3WJYfygUm/ZMJslywn - SH/R5CHtocb7UI9OLFjuD4xqd/wraNahoUHu86jOZpEFJOCcjJEQ/xpaVisdHgh5We2HKP9XrVa77nAx - UGCCxHgSG2j307cjhmI+cGHPk8HR7toyHNyJraiYqOukL5YyhadFPVtLrlrEzaFXnob2jYksUmyYn+V7 - TGyh8J4XAcV0RbXSRjRQmoqVB16140KvUgbSv2bjop77vl5PcShKpb/SGsNeH5IytgAAAABJRU5ErkJg - gg== + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAplJREFUWEft + V7tuFEEQdALkPHIgByIQfAE2GRAZCMCQmAyZDA74AhAPG/7AwIectNfVeyQXnY0TbEJMgu2Ah+rUc/Q2 + s3d7xojEJY20mqrumenpnpmdmtrHLlAUxREAp0TkkojM8Jt9UbenEJGTIvIEQBfAz5pWqurjoihORPtd + oyzLYwBeANjJDFjXqH0O4Gj0NxFU9TyAjeB8U1WXATxU1Zts9s2+zaDdEJFz0W8jiMhVAFvO2YqIzAI4 + ELUJ5ABcA7Dq7LZU9UrUjoStfDi4iLzq9XoHo64O1AJY9JNoHAnb889u8HtR0xQAFtwk1htViiXcwEhV + X3quiYOoAbDkFvPMc3+ApeayfdWHvSzLC5Zkd6pWv0GOGmpTX7/fPwTgo/ncGVmiVudptrOpn+XkMvx7 + bhI2ODlqqB2WoKrecFvxqGrpAOBDchCTTkTm3AA/ANwdwc17W6uOL8ar54aw4zXt/XLkibDKQSRyfdGO + APAuTbDdbh+OPPf4jAv/g8gnZAYcOzjBw8ot8HTkGUZeKklwK/IeIeTZsEeYTfI/HXkmyrSLwFzkPWom + MMyJHETktpvAxcj//y3wSSgibyNPZAafJAnfp2hlk5DgfW6iJmU43PMMV9kOO4y+2uLEcxXwMZGiwFst + 9e/xQdSqWjrwmPxHR/Ga+dzudrvHq1YB9pJJs130XLxocogaAK+TP1V96rksLNz+FbQQNU0B4L7z8ylO + rhZ8PITX0BJDGXV1oFZV3zj7b51O52zUjQSfUWESa6p6PVaHBzlLuLTng8FV9XLUNoJFYt05Y2M58WJp + 8chm47f1DUrNh33ilUdw3/iSmfBZvs2Ea7znTWAlypVqZsDUyLXGltrfgkep/ZrNpF+z2uN1H2PwC9Ia + w16WomAQAAAAAElFTkSuQmCC - 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 + p5p6qCR+AaqNxnTXLPGFAAAAAElFTkSuQmCC diff --git a/HMI/SubProject/AGV/Structure/ErrorFlag.cs b/HMI/SubProject/AGV/Structure/ErrorFlag.cs index e930f06..c7d9da5 100644 --- a/HMI/SubProject/AGV/Structure/ErrorFlag.cs +++ b/HMI/SubProject/AGV/Structure/ErrorFlag.cs @@ -16,7 +16,7 @@ namespace arDev return (UInt16)_value.Value; } } - public enum eflag + public enum eflag { Emergency = 0, Overcurrent, diff --git a/HMI/SubProject/CommData/Enum.cs b/HMI/SubProject/CommData/Enum.cs index 2c527db..5ca8a3b 100644 --- a/HMI/SubProject/CommData/Enum.cs +++ b/HMI/SubProject/CommData/Enum.cs @@ -14,6 +14,10 @@ namespace COMM ChargeWaitSec, SyncItemCount, PathValidationError, + RetryManget, + RetryLift, + RetryMove, + RetryMarkStop, } public enum eVarUInt32 {