From 00cc0ef5b7707a431e8ced2a0025fdf4ea566dcd Mon Sep 17 00:00:00 2001 From: backuppc Date: Wed, 28 Jan 2026 16:45:24 +0900 Subject: [PATCH] Refactor AGV error handling: Standardize AGVErrorCode usage and update SetRunStepError --- Cs_HMI/Project/Class/CResult.cs | 6 +-- Cs_HMI/Project/Class/EnumData.cs | 14 ------- Cs_HMI/Project/Device/Xbee.cs | 4 ++ .../StateMachine/Step/_SM_RUN_BUFFER_IN.cs | 14 +++---- .../StateMachine/Step/_SM_RUN_BUFFER_OUT.cs | 16 ++++---- .../StateMachine/Step/_SM_RUN_CHARGE_GO.cs | 8 ++-- .../StateMachine/Step/_SM_RUN_ENTER.cs | 20 +++++----- .../Project/StateMachine/Step/_SM_RUN_EXIT.cs | 12 +++--- Cs_HMI/Project/StateMachine/Step/_Util.cs | 38 ++++++++++++++++++- Cs_HMI/Project/StateMachine/_Xbee.cs | 33 ++++------------ Cs_HMI/Project/fMain.cs | 11 +++++- Cs_HMI/SubProject/EnigProtocol | 2 +- 12 files changed, 94 insertions(+), 84 deletions(-) diff --git a/Cs_HMI/Project/Class/CResult.cs b/Cs_HMI/Project/Class/CResult.cs index 9c4a38e..8c95ce5 100644 --- a/Cs_HMI/Project/Class/CResult.cs +++ b/Cs_HMI/Project/Class/CResult.cs @@ -41,9 +41,8 @@ namespace Project public string Memo; public eResult ResultCode { get; set; } public eECode ResultErrorCode; - public eECode RunStepErrorCode { get; set; } + public ENIGProtocol.AGVErrorCode RunStepErrorCode { get; set; } public string ResultMessage { get; set; } - public Boolean isError { get; set; } public int retry = 0; public DateTime retryTime; public Device.Socket.Message RecvMessage; @@ -191,9 +190,8 @@ namespace Project JobEndTime = DateTime.Parse("1982-11-23"); Memo = string.Empty; - isError = false; ResultCode = eResult.NoError; - RunStepErrorCode = eECode.NOERROR; + RunStepErrorCode = ENIGProtocol.AGVErrorCode.None; ResultMessage = string.Empty; } diff --git a/Cs_HMI/Project/Class/EnumData.cs b/Cs_HMI/Project/Class/EnumData.cs index 589097e..811c4a3 100644 --- a/Cs_HMI/Project/Class/EnumData.cs +++ b/Cs_HMI/Project/Class/EnumData.cs @@ -65,20 +65,6 @@ namespace Project DION, NOTALLOWUP, - - // Operational Errors - CART_EXIST, - MARK_TIMEOUT, - MARK_SENSOR_FAIL, - LIFT_ERROR, - AGV_SPEED_SET_FAIL, - AGV_RUN_FAIL, - AGV_STOP_FAIL, - PATH_INTEGRITY_FAIL, - TURN_FAIL, - NO_CHARGEPOINT, - NOTSET_CHARGEPOINT, - ALREADY_CHARGE, } public enum eResult : byte diff --git a/Cs_HMI/Project/Device/Xbee.cs b/Cs_HMI/Project/Device/Xbee.cs index 9aa5fd0..45b4e9e 100644 --- a/Cs_HMI/Project/Device/Xbee.cs +++ b/Cs_HMI/Project/Device/Xbee.cs @@ -183,6 +183,10 @@ namespace Project.Device /// public void SendError(ENIGProtocol.AGVErrorCode errcode, string errormessage) { + // Update global error state so it persists in Status messages + PUB.Result.RunStepErrorCode = errcode; + PUB.Result.ResultMessage = errormessage; + var id = PUB.setting.XBE_ID; byte cmd = (byte)ENIGProtocol.AGVCommandEH.Error; if (errormessage.Length > 30) errormessage = errormessage.Substring(0, 29); 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 173abfa..1e35bd5 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs @@ -80,7 +80,7 @@ namespace Project else if (turnState == arDev.eNarumiTurn.Right || turnState == arDev.eNarumiTurn.RightIng) { //비정상 상태 (우회전 중?) - SetRunStepError($"[{funcname}] 턴 방향 불일치(Current:{turnState}). 우회전 상태에서 좌회전을 시도할 수 없습니다.", eECode.TURN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL, $"[{funcname}] 턴 방향 불일치(Current:{turnState}). 우회전 상태에서 좌회전을 시도할 수 없습니다."); } else { @@ -114,7 +114,7 @@ namespace Project if (PUB.AGV.TurnInformation.Runtime.TotalSeconds > overtime) { //30초동안 AGV까 움직이지 않았다면 오류 처리한다. - SetRunStepError($"[{funcname}] {overtime}초이내 턴 감지 안됨", eECode.TURN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL, $"[{funcname}] {overtime}초이내 턴 감지 안됨"); return false; } else PUB._mapCanvas.SetAlertMessage($"턴 진행 중({PUB.AGV.TurnInformation.Runtime.TotalSeconds:N0}/{overtime})"); @@ -162,7 +162,7 @@ namespace Project { if (seqtime.TotalSeconds > 20) { - SetRunStepError($"[{funcname}] 리프트가 내려가지 않습니다", eECode.LIFT_ERROR); + SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}] 리프트가 내려가지 않습니다"); } else PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)"); return false; @@ -197,7 +197,7 @@ namespace Project { if (ret >= arDev.eNarumiCommandResult.Error) { - SetRunStepError($"[{funcname}] AGV속도설정이 완료되지 않았습니다", eECode.AGV_SPEED_SET_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL); } return false; } @@ -215,7 +215,7 @@ namespace Project { if(seqtime.TotalSeconds > 3) { - SetRunStepError($"[{funcname}] AGV이동이 확인되지 않습니다", eECode.AGV_RUN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL); } return false; } @@ -237,7 +237,7 @@ namespace Project { if (seqtime.TotalSeconds > 3) { - SetRunStepError($"[{funcname}] MARK STOP신호가 확인되지 않습니다", eECode.MARK_TIMEOUT); + SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT); return false; } } @@ -253,7 +253,7 @@ namespace Project var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); if (ts.TotalSeconds > 10) { - SetRunStepError($"[{funcname}] AGV가 멈추지 않아 강제종료 합니다", eECode.AGV_STOP_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL); return false; } return false; 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 68a65fe..efc72cf 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs @@ -70,7 +70,7 @@ namespace Project { if (seqtime.TotalSeconds > 20) { - SetRunStepError($"[{funcname}] 리프트가 동작하지 않습니다", eECode.LIFT_ERROR); + SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}] 리프트가 동작하지 않습니다"); } return false; } @@ -92,7 +92,7 @@ namespace Project { if (ret >= arDev.eNarumiCommandResult.Error) { - SetRunStepError($"[{funcname}] AGV속도설정이 완료되지 않았습니다", eECode.AGV_SPEED_SET_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL); } return false; } @@ -116,7 +116,7 @@ namespace Project if (seqtime.TotalSeconds > 3) { //구동이확인되지 않으면 오류처리를 한다. - SetRunStepError($"[{funcname}] AGV 전진 구동이 확인되지 않습니다", eECode.AGV_RUN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL); } return false; } @@ -132,7 +132,7 @@ namespace Project { if (seqtime.TotalSeconds > 3) { - SetRunStepError($"[{funcname}] MARK STOP신호가 확인되지 않습니다", eECode.MARK_TIMEOUT); + SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT); } return false; } @@ -146,7 +146,7 @@ namespace Project { if (seqtime.TotalSeconds > 15) { - SetRunStepError($"[{funcname}] AGV가 멈추지 않아 강제종료 합니다", eECode.AGV_STOP_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL); } return false; } @@ -176,7 +176,7 @@ namespace Project else if (turnState == arDev.eNarumiTurn.Left || turnState == arDev.eNarumiTurn.LeftIng) { //비정상 상태 (좌회전 중?) - SetRunStepError($"[{funcname}] 턴 방향 불일치(Current:{turnState}). 좌회전 상태에서 우회전을 시도할 수 없습니다.", eECode.TURN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL, $"[{funcname}] 턴 방향 불일치(Current:{turnState}). 좌회전 상태에서 우회전을 시도할 수 없습니다."); } else { @@ -208,7 +208,7 @@ namespace Project return false; } - SetRunStepError($"[{funcname}] Turn 구동 실패", eECode.TURN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL); } return false; } @@ -222,7 +222,7 @@ namespace Project { if (seqtime.TotalSeconds > 25) { - SetRunStepError($"[{funcname}] Turn 완료 실패 (Timeout)", eECode.TURN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL); } return false; } diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHARGE_GO.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHARGE_GO.cs index 7df1aec..a02c7b5 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHARGE_GO.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHARGE_GO.cs @@ -32,7 +32,7 @@ namespace Project if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true || PUB.AGV.system1.Battery_charging == true || VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true) { - SetRunStepError($"현재 충전중이므로 충전시퀀스를 시작할 수 없습니다", eECode.ALREADY_CHARGE); + SetRunStepError(ENIGProtocol.AGVErrorCode.ALREADY_CHARGE); return false; } @@ -60,7 +60,7 @@ namespace Project var targetnode = PUB.FindByRFID(PUB.setting.NodeMAP_RFID_Charger); if (targetnode == null) { - SetRunStepError($"충전기 노드가 설정되지 않았습니다", eECode.NOTSET_CHARGEPOINT); + SetRunStepError(ENIGProtocol.AGVErrorCode.NOTSET_CHARGEPOINT); return false; } @@ -69,7 +69,7 @@ namespace Project var curnode = PUB._virtualAGV.CurrentNode; if (PUB.AGV.signal1.mark_sensor == false || curnode.Id != targetnode.Id) { - SetRunStepError($"충전기위치가 아니므로 충전을 시작할 수 없습니다(현재위치:{curnode.RfidId})", eECode.NO_CHARGEPOINT); + SetRunStepError(ENIGProtocol.AGVErrorCode.NO_CHARGEPOINT, $"충전기위치가 아니므로 충전을 시작할 수 없습니다(현재위치:{curnode.RfidId})"); return false; } @@ -108,7 +108,7 @@ namespace Project PUB.counter.Save(); VAR.BYTE[eVarByte.CHARGE_CMDCNT] = 0; - SetRunStepError($"충전명령 재전송 횟수 초과", eECode.MESSAGE_ERROR); + SetRunStepError(ENIGProtocol.AGVErrorCode.CHARGE_RETRY_OVER); return false; } else diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_ENTER.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_ENTER.cs index 0ec1038..1548ab6 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_ENTER.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_ENTER.cs @@ -38,7 +38,7 @@ namespace Project //마크센서가 감지된상태여야 완전한위치로 가정한다 if(PUB.AGV.signal1.mark_sensor == false) { - SetRunStepError($"[{funcname}] 마크센서가 감지되지 않습니다", eECode.MARK_SENSOR_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_SENSOR_FAIL, $"[{funcname}] 마크센서가 감지되지 않습니다"); } PUB.sm.UpdateRunStepSeq(); return false; @@ -51,7 +51,7 @@ namespace Project //가지러가야하는 경우이므로 카트가 없어야한다. if (PUB.AGV.signal2.cart_detect1 || PUB.AGV.signal2.cart_detect2) { - SetRunStepError($"[{funcname}] 카트가 존재하여 진입을 할 수 없습니다", eECode.CART_EXIST); + SetRunStepError(ENIGProtocol.AGVErrorCode.CART_EXIST, $"[{funcname}] 카트가 존재하여 진입을 할 수 없습니다"); return false; } } @@ -61,14 +61,14 @@ namespace Project if (PUB.AGV.signal2.cart_detect1 == false || PUB.AGV.signal2.cart_detect2 == false) { var errmsg = $"[{funcname}] 카트감지센서가 인식되지 않았습니다"; - SetRunStepError(errmsg, eECode.CART_EXIST); + SetRunStepError(ENIGProtocol.AGVErrorCode.CART_EXIST, errmsg); return false; } } else { var errmsg = $"[{funcname}] 알수없는 작업형태입니다({PUB.NextWorkCmd})"; - SetRunStepError(errmsg, eECode.NOMODELV); + SetRunStepError(ENIGProtocol.AGVErrorCode.UnknownCommand, errmsg); return false; } @@ -93,7 +93,7 @@ namespace Project if (ts.TotalSeconds > 10) { var errmsg = $"[{funcname}] 리프트다운이 확인되지 않습니다"; - SetRunStepError(errmsg, eECode.LIFT_ERROR); + SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, errmsg); } return false; } @@ -119,7 +119,7 @@ namespace Project { if (ret >= arDev.eNarumiCommandResult.Error) { - SetRunStepError("AGV속도설정이 완료되지 않았습니다", eECode.AGV_SPEED_SET_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL); } return false; } @@ -143,7 +143,7 @@ namespace Project if (seqTime.TotalMilliseconds > 1000) { //구동이확인되지 않으면 오류처리를 한다. - SetRunStepError("AGV 구동이 확인되지 않습니다", eECode.AGV_RUN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL); } return false; } @@ -159,7 +159,7 @@ namespace Project { if (seqTime.TotalMilliseconds > 3000) { - SetRunStepError("MARK STOP신호가 확인되지 않습니다", eECode.MARK_TIMEOUT); + SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT); } return false; } @@ -173,7 +173,7 @@ namespace Project { if (seqTime.TotalSeconds > 10) { - SetRunStepError("AGV가 멈추지 않아 강제종료 합니다", eECode.AGV_STOP_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL); } return false; } @@ -188,7 +188,7 @@ namespace Project { if (seqTime.TotalSeconds > 5) { - SetRunStepError("마크센서가 감지되지 않았습니다", eECode.MARK_SENSOR_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_SENSOR_FAIL); } return false; } diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_EXIT.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_EXIT.cs index cd1e0ef..53f048b 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_EXIT.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_EXIT.cs @@ -65,7 +65,7 @@ namespace Project var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime); if (ts.TotalSeconds > 10) { - SetRunStepError($"[{funcname}] 리프트({liftCmd})이 확인되지 않습니다", eECode.LIFT_ERROR); + SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}] 리프트({liftCmd})이 확인되지 않습니다"); } return false; } @@ -89,7 +89,7 @@ namespace Project { if (ret >= arDev.eNarumiCommandResult.Error) { - SetRunStepError($"[{funcname}] AGV속도설정이 완료되지 않았습니다", eECode.AGV_SPEED_SET_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL); } return false; } @@ -112,7 +112,7 @@ namespace Project if (seqTime.TotalMilliseconds > 1000) { //구동이확인되지 않으면 오류처리를 한다. - SetRunStepError("AGV 구동이 확인되지 않습니다", eECode.AGV_RUN_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL); } return false; } @@ -128,7 +128,7 @@ namespace Project { if (seqTime.TotalMilliseconds > 3000) { - SetRunStepError("MARK STOP신호가 확인되지 않습니다", eECode.MARK_TIMEOUT); + SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT); } return false; } @@ -142,7 +142,7 @@ namespace Project { if (seqTime.TotalSeconds > 10) { - SetRunStepError("AGV가 멈추지 않아 강제종료 합니다", eECode.AGV_STOP_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL); } return false; } @@ -156,7 +156,7 @@ namespace Project { if (seqTime.TotalSeconds > 5) { - SetRunStepError("마크센서가 감지되지 않았습니다", eECode.MARK_SENSOR_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_SENSOR_FAIL); } return false; } diff --git a/Cs_HMI/Project/StateMachine/Step/_Util.cs b/Cs_HMI/Project/StateMachine/Step/_Util.cs index e610927..51f7db4 100644 --- a/Cs_HMI/Project/StateMachine/Step/_Util.cs +++ b/Cs_HMI/Project/StateMachine/Step/_Util.cs @@ -7,6 +7,9 @@ using Project.StateMachine; using COMM; using AR; using AGVNavigationCore.Utils; +using AGVNavigationCore.PathFinding.Core; +using AGVNavigationCore.Models; +using AGVNavigationCore.PathFinding.Planning; namespace Project { @@ -38,6 +41,32 @@ namespace Project return true; } + AGVPathResult CalcPath(MapNode startNode, MapNode targetNode) + { + var nodes = PUB._mapCanvas.Nodes; + var _simulatorCanvas = PUB._mapCanvas; + var _mapNodes = PUB._mapCanvas.Nodes; + + // 현재 AGV 방향 가져오기 + var selectedAGV = PUB._virtualAGV; + var currentDirection = selectedAGV.CurrentDirection; + + // AGV의 이전 위치에서 가장 가까운 노드 찾기 + var prevNode = selectedAGV.PrevNode; + var prevDir = selectedAGV.PrevDirection; + + // Core Logic으로 이관됨 + var pathFinder = new AGVPathfinder(nodes); + var result = pathFinder.CalculatePath(startNode, targetNode, prevNode, prevDir); + + //게이트웨이노드를 하이라이트강조 한단 + _simulatorCanvas.HighlightNodeId = (result.Gateway?.Id ?? string.Empty); + return result; + + + } + + /// /// 실행스텝을 오류로 전환합니다. /// 로그메세지(에러)가 추가됩니다. @@ -45,8 +74,13 @@ namespace Project /// /// /// - public void SetRunStepError(string errmsg, eECode ecode) + public void SetRunStepError(ENIGProtocol.AGVErrorCode ecode, string errmsg = "") { + if (string.IsNullOrEmpty(errmsg)) + { + errmsg = ENIGProtocol.AGVUtility.GetAGVErrorMessage(ecode); + } + PUB.AGV.AGVMoveStop(errmsg); PUB.log.AddE(errmsg); PUB._mapCanvas.SetAlertMessage(errmsg); @@ -152,7 +186,7 @@ namespace Project VAR.I32[eVarInt32.PathValidationError] += 1; if (VAR.I32[eVarInt32.PathValidationError] > 50) { - SetRunStepError($"연속 경로 무결성 오류로 인해 중지 합니다", eECode.PATH_INTEGRITY_FAIL); + SetRunStepError(ENIGProtocol.AGVErrorCode.PATH_INTEGRITY_FAIL, $"연속 경로 무결성 오류로 인해 중지 합니다"); } return false; } diff --git a/Cs_HMI/Project/StateMachine/_Xbee.cs b/Cs_HMI/Project/StateMachine/_Xbee.cs index a740804..4f5a8da 100644 --- a/Cs_HMI/Project/StateMachine/_Xbee.cs +++ b/Cs_HMI/Project/StateMachine/_Xbee.cs @@ -46,6 +46,7 @@ namespace Project { case ENIGProtocol.AGVCommandHE.SetCurrent: //Set Current Position + Resultclear(); if (data.Length > 4) { @@ -75,6 +76,7 @@ namespace Project case ENIGProtocol.AGVCommandHE.PickOnEnter: // 110 case ENIGProtocol.AGVCommandHE.PickOffEnter: // 111 { + Resultclear(); PUB.log.AddI($"XBEE:작업명령수신:{cmd}"); // 현재 위치 확인 (TargetNode가 아닌 CurrentNode 기준) @@ -120,6 +122,7 @@ namespace Project case ENIGProtocol.AGVCommandHE.Charger: // 112 { + Resultclear(); PUB.log.AddI($"XBEE:충전명령수신"); PUB.NextWorkCmd = ENIGProtocol.AGVCommandHE.Charger; PUB.sm.SetNewRunStep(ERunStep.GOCHARGE); @@ -128,6 +131,7 @@ namespace Project case ENIGProtocol.AGVCommandHE.GotoAlias: case ENIGProtocol.AGVCommandHE.Goto: //move to tag + Resultclear(); var datalength = cmd == ENIGProtocol.AGVCommandHE.GotoAlias ? 2 : 1; if (data.Length > datalength) { @@ -210,10 +214,11 @@ namespace Project break; case ENIGProtocol.AGVCommandHE.Reset: //Error Reset PUB.log.Add($"[{logPrefix}-Reset]"); - PUB.AGV.AGVErrorReset(); + ResetSystemError(); break; case ENIGProtocol.AGVCommandHE.Manual: //Manual Move (Direction, speed, runtime) + Resultclear(); var Direction = data[1]; //0=back, 1=forward, 2=left, 3=right var Speed = data[2]; //0=slow, 1=normal, 2=fast @@ -234,6 +239,7 @@ namespace Project break; case ENIGProtocol.AGVCommandHE.AutoMove: + Resultclear(); var MotDirection = data[1]; //0=back, 1=forward var MagDirection = data[2]; //0=straight, 1=left, 2=right var AutSpeed = data[3]; //0=slow, 1=normal, 2=fast @@ -310,31 +316,6 @@ namespace Project else PUB.log.Add(e.Message); } - AGVPathResult CalcPath(MapNode startNode, MapNode targetNode) - { - var nodes = PUB._mapCanvas.Nodes; - var _simulatorCanvas = PUB._mapCanvas; - var _mapNodes = PUB._mapCanvas.Nodes; - - // 현재 AGV 방향 가져오기 - var selectedAGV = PUB._virtualAGV; - var currentDirection = selectedAGV.CurrentDirection; - - // AGV의 이전 위치에서 가장 가까운 노드 찾기 - var prevNode = selectedAGV.PrevNode; - var prevDir = selectedAGV.PrevDirection; - - // Core Logic으로 이관됨 - var pathFinder = new AGVPathfinder(nodes); - var result = pathFinder.CalculatePath(startNode, targetNode, prevNode, prevDir); - - //게이트웨이노드를 하이라이트강조 한단 - _simulatorCanvas.HighlightNodeId = (result.Gateway?.Id ?? string.Empty); - return result; - - - } - } } diff --git a/Cs_HMI/Project/fMain.cs b/Cs_HMI/Project/fMain.cs index dd8b32c..eec827e 100644 --- a/Cs_HMI/Project/fMain.cs +++ b/Cs_HMI/Project/fMain.cs @@ -425,7 +425,7 @@ namespace Project } if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) //자동상태가 아니라면 { - PUB.AGV.AGVErrorReset(); + ResetSystemError(); if (Prompt) { if (UTIL.MsgQ("AGV상태를 자동으로 전환 할까요?") != DialogResult.Yes) return; @@ -454,6 +454,13 @@ namespace Project PUB.log.AddI("Clear Resultclear"); } + public void ResetSystemError() + { + PUB.AGV.AGVErrorReset(); + Resultclear(); + PUB.log.AddI("System Error Reset"); + } + void CheckFreeSpace() { @@ -768,7 +775,7 @@ namespace Project switch (title.ToLower()) { case "emg": - PUB.AGV.AGVErrorReset(); + ResetSystemError(); break; case "itm": var itemon = VAR.BOOL[eVarBool.ITEMON]; diff --git a/Cs_HMI/SubProject/EnigProtocol b/Cs_HMI/SubProject/EnigProtocol index ae5585c..aaea811 160000 --- a/Cs_HMI/SubProject/EnigProtocol +++ b/Cs_HMI/SubProject/EnigProtocol @@ -1 +1 @@ -Subproject commit ae5585c00f69137ef3330b6f88a1160edb0e94b2 +Subproject commit aaea811e4a53be5b76459d3dc94daf542f09dfc7