Refactor AGV error handling: Standardize AGVErrorCode usage and update SetRunStepError
This commit is contained in:
@@ -41,9 +41,8 @@ namespace Project
|
|||||||
public string Memo;
|
public string Memo;
|
||||||
public eResult ResultCode { get; set; }
|
public eResult ResultCode { get; set; }
|
||||||
public eECode ResultErrorCode;
|
public eECode ResultErrorCode;
|
||||||
public eECode RunStepErrorCode { get; set; }
|
public ENIGProtocol.AGVErrorCode RunStepErrorCode { get; set; }
|
||||||
public string ResultMessage { get; set; }
|
public string ResultMessage { get; set; }
|
||||||
public Boolean isError { get; set; }
|
|
||||||
public int retry = 0;
|
public int retry = 0;
|
||||||
public DateTime retryTime;
|
public DateTime retryTime;
|
||||||
public Device.Socket.Message RecvMessage;
|
public Device.Socket.Message RecvMessage;
|
||||||
@@ -191,9 +190,8 @@ namespace Project
|
|||||||
JobEndTime = DateTime.Parse("1982-11-23");
|
JobEndTime = DateTime.Parse("1982-11-23");
|
||||||
|
|
||||||
Memo = string.Empty;
|
Memo = string.Empty;
|
||||||
isError = false;
|
|
||||||
ResultCode = eResult.NoError;
|
ResultCode = eResult.NoError;
|
||||||
RunStepErrorCode = eECode.NOERROR;
|
RunStepErrorCode = ENIGProtocol.AGVErrorCode.None;
|
||||||
ResultMessage = string.Empty;
|
ResultMessage = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,20 +65,6 @@ namespace Project
|
|||||||
DION,
|
DION,
|
||||||
|
|
||||||
NOTALLOWUP,
|
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
|
public enum eResult : byte
|
||||||
|
|||||||
@@ -183,6 +183,10 @@ namespace Project.Device
|
|||||||
/// <param name="errcode"></param>
|
/// <param name="errcode"></param>
|
||||||
public void SendError(ENIGProtocol.AGVErrorCode errcode, string errormessage)
|
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;
|
var id = PUB.setting.XBE_ID;
|
||||||
byte cmd = (byte)ENIGProtocol.AGVCommandEH.Error;
|
byte cmd = (byte)ENIGProtocol.AGVCommandEH.Error;
|
||||||
if (errormessage.Length > 30) errormessage = errormessage.Substring(0, 29);
|
if (errormessage.Length > 30) errormessage = errormessage.Substring(0, 29);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ namespace Project
|
|||||||
else if (turnState == arDev.eNarumiTurn.Right || turnState == arDev.eNarumiTurn.RightIng)
|
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
|
else
|
||||||
{
|
{
|
||||||
@@ -114,7 +114,7 @@ namespace Project
|
|||||||
if (PUB.AGV.TurnInformation.Runtime.TotalSeconds > overtime)
|
if (PUB.AGV.TurnInformation.Runtime.TotalSeconds > overtime)
|
||||||
{
|
{
|
||||||
//30초동안 AGV까 움직이지 않았다면 오류 처리한다.
|
//30초동안 AGV까 움직이지 않았다면 오류 처리한다.
|
||||||
SetRunStepError($"[{funcname}] {overtime}초이내 턴 감지 안됨", eECode.TURN_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL, $"[{funcname}] {overtime}초이내 턴 감지 안됨");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else PUB._mapCanvas.SetAlertMessage($"턴 진행 중({PUB.AGV.TurnInformation.Runtime.TotalSeconds:N0}/{overtime})");
|
else PUB._mapCanvas.SetAlertMessage($"턴 진행 중({PUB.AGV.TurnInformation.Runtime.TotalSeconds:N0}/{overtime})");
|
||||||
@@ -162,7 +162,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqtime.TotalSeconds > 20)
|
if (seqtime.TotalSeconds > 20)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] 리프트가 내려가지 않습니다", eECode.LIFT_ERROR);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}] 리프트가 내려가지 않습니다");
|
||||||
}
|
}
|
||||||
else PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)");
|
else PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)");
|
||||||
return false;
|
return false;
|
||||||
@@ -197,7 +197,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (ret >= arDev.eNarumiCommandResult.Error)
|
if (ret >= arDev.eNarumiCommandResult.Error)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] AGV속도설정이 완료되지 않았습니다", eECode.AGV_SPEED_SET_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -215,7 +215,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if(seqtime.TotalSeconds > 3)
|
if(seqtime.TotalSeconds > 3)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] AGV이동이 확인되지 않습니다", eECode.AGV_RUN_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -237,7 +237,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqtime.TotalSeconds > 3)
|
if (seqtime.TotalSeconds > 3)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] MARK STOP신호가 확인되지 않습니다", eECode.MARK_TIMEOUT);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,7 +253,7 @@ namespace Project
|
|||||||
var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime);
|
var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime);
|
||||||
if (ts.TotalSeconds > 10)
|
if (ts.TotalSeconds > 10)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] AGV가 멈추지 않아 강제종료 합니다", eECode.AGV_STOP_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqtime.TotalSeconds > 20)
|
if (seqtime.TotalSeconds > 20)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] 리프트가 동작하지 않습니다", eECode.LIFT_ERROR);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}] 리프트가 동작하지 않습니다");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -92,7 +92,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (ret >= arDev.eNarumiCommandResult.Error)
|
if (ret >= arDev.eNarumiCommandResult.Error)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] AGV속도설정이 완료되지 않았습니다", eECode.AGV_SPEED_SET_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ namespace Project
|
|||||||
if (seqtime.TotalSeconds > 3)
|
if (seqtime.TotalSeconds > 3)
|
||||||
{
|
{
|
||||||
//구동이확인되지 않으면 오류처리를 한다.
|
//구동이확인되지 않으면 오류처리를 한다.
|
||||||
SetRunStepError($"[{funcname}] AGV 전진 구동이 확인되지 않습니다", eECode.AGV_RUN_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -132,7 +132,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqtime.TotalSeconds > 3)
|
if (seqtime.TotalSeconds > 3)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] MARK STOP신호가 확인되지 않습니다", eECode.MARK_TIMEOUT);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -146,7 +146,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqtime.TotalSeconds > 15)
|
if (seqtime.TotalSeconds > 15)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] AGV가 멈추지 않아 강제종료 합니다", eECode.AGV_STOP_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -176,7 +176,7 @@ namespace Project
|
|||||||
else if (turnState == arDev.eNarumiTurn.Left || turnState == arDev.eNarumiTurn.LeftIng)
|
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
|
else
|
||||||
{
|
{
|
||||||
@@ -208,7 +208,7 @@ namespace Project
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetRunStepError($"[{funcname}] Turn 구동 실패", eECode.TURN_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -222,7 +222,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqtime.TotalSeconds > 25)
|
if (seqtime.TotalSeconds > 25)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] Turn 완료 실패 (Timeout)", eECode.TURN_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ namespace Project
|
|||||||
if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true || PUB.AGV.system1.Battery_charging == true ||
|
if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true || PUB.AGV.system1.Battery_charging == true ||
|
||||||
VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true)
|
VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true)
|
||||||
{
|
{
|
||||||
SetRunStepError($"현재 충전중이므로 충전시퀀스를 시작할 수 없습니다", eECode.ALREADY_CHARGE);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.ALREADY_CHARGE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ namespace Project
|
|||||||
var targetnode = PUB.FindByRFID(PUB.setting.NodeMAP_RFID_Charger);
|
var targetnode = PUB.FindByRFID(PUB.setting.NodeMAP_RFID_Charger);
|
||||||
if (targetnode == null)
|
if (targetnode == null)
|
||||||
{
|
{
|
||||||
SetRunStepError($"충전기 노드가 설정되지 않았습니다", eECode.NOTSET_CHARGEPOINT);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.NOTSET_CHARGEPOINT);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ namespace Project
|
|||||||
var curnode = PUB._virtualAGV.CurrentNode;
|
var curnode = PUB._virtualAGV.CurrentNode;
|
||||||
if (PUB.AGV.signal1.mark_sensor == false || curnode.Id != targetnode.Id)
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ namespace Project
|
|||||||
PUB.counter.Save();
|
PUB.counter.Save();
|
||||||
VAR.BYTE[eVarByte.CHARGE_CMDCNT] = 0;
|
VAR.BYTE[eVarByte.CHARGE_CMDCNT] = 0;
|
||||||
|
|
||||||
SetRunStepError($"충전명령 재전송 횟수 초과", eECode.MESSAGE_ERROR);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.CHARGE_RETRY_OVER);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace Project
|
|||||||
//마크센서가 감지된상태여야 완전한위치로 가정한다
|
//마크센서가 감지된상태여야 완전한위치로 가정한다
|
||||||
if(PUB.AGV.signal1.mark_sensor == false)
|
if(PUB.AGV.signal1.mark_sensor == false)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] 마크센서가 감지되지 않습니다", eECode.MARK_SENSOR_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_SENSOR_FAIL, $"[{funcname}] 마크센서가 감지되지 않습니다");
|
||||||
}
|
}
|
||||||
PUB.sm.UpdateRunStepSeq();
|
PUB.sm.UpdateRunStepSeq();
|
||||||
return false;
|
return false;
|
||||||
@@ -51,7 +51,7 @@ namespace Project
|
|||||||
//가지러가야하는 경우이므로 카트가 없어야한다.
|
//가지러가야하는 경우이므로 카트가 없어야한다.
|
||||||
if (PUB.AGV.signal2.cart_detect1 || PUB.AGV.signal2.cart_detect2)
|
if (PUB.AGV.signal2.cart_detect1 || PUB.AGV.signal2.cart_detect2)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] 카트가 존재하여 진입을 할 수 없습니다", eECode.CART_EXIST);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.CART_EXIST, $"[{funcname}] 카트가 존재하여 진입을 할 수 없습니다");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,14 +61,14 @@ namespace Project
|
|||||||
if (PUB.AGV.signal2.cart_detect1 == false || PUB.AGV.signal2.cart_detect2 == false)
|
if (PUB.AGV.signal2.cart_detect1 == false || PUB.AGV.signal2.cart_detect2 == false)
|
||||||
{
|
{
|
||||||
var errmsg = $"[{funcname}] 카트감지센서가 인식되지 않았습니다";
|
var errmsg = $"[{funcname}] 카트감지센서가 인식되지 않았습니다";
|
||||||
SetRunStepError(errmsg, eECode.CART_EXIST);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.CART_EXIST, errmsg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var errmsg = $"[{funcname}] 알수없는 작업형태입니다({PUB.NextWorkCmd})";
|
var errmsg = $"[{funcname}] 알수없는 작업형태입니다({PUB.NextWorkCmd})";
|
||||||
SetRunStepError(errmsg, eECode.NOMODELV);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.UnknownCommand, errmsg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ namespace Project
|
|||||||
if (ts.TotalSeconds > 10)
|
if (ts.TotalSeconds > 10)
|
||||||
{
|
{
|
||||||
var errmsg = $"[{funcname}] 리프트다운이 확인되지 않습니다";
|
var errmsg = $"[{funcname}] 리프트다운이 확인되지 않습니다";
|
||||||
SetRunStepError(errmsg, eECode.LIFT_ERROR);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, errmsg);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -119,7 +119,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (ret >= arDev.eNarumiCommandResult.Error)
|
if (ret >= arDev.eNarumiCommandResult.Error)
|
||||||
{
|
{
|
||||||
SetRunStepError("AGV속도설정이 완료되지 않았습니다", eECode.AGV_SPEED_SET_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -143,7 +143,7 @@ namespace Project
|
|||||||
if (seqTime.TotalMilliseconds > 1000)
|
if (seqTime.TotalMilliseconds > 1000)
|
||||||
{
|
{
|
||||||
//구동이확인되지 않으면 오류처리를 한다.
|
//구동이확인되지 않으면 오류처리를 한다.
|
||||||
SetRunStepError("AGV 구동이 확인되지 않습니다", eECode.AGV_RUN_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -159,7 +159,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqTime.TotalMilliseconds > 3000)
|
if (seqTime.TotalMilliseconds > 3000)
|
||||||
{
|
{
|
||||||
SetRunStepError("MARK STOP신호가 확인되지 않습니다", eECode.MARK_TIMEOUT);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -173,7 +173,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqTime.TotalSeconds > 10)
|
if (seqTime.TotalSeconds > 10)
|
||||||
{
|
{
|
||||||
SetRunStepError("AGV가 멈추지 않아 강제종료 합니다", eECode.AGV_STOP_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -188,7 +188,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqTime.TotalSeconds > 5)
|
if (seqTime.TotalSeconds > 5)
|
||||||
{
|
{
|
||||||
SetRunStepError("마크센서가 감지되지 않았습니다", eECode.MARK_SENSOR_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_SENSOR_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ namespace Project
|
|||||||
var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime);
|
var ts = VAR.TIME.RUN(eVarTime.LastTurnCommandTime);
|
||||||
if (ts.TotalSeconds > 10)
|
if (ts.TotalSeconds > 10)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] 리프트({liftCmd})이 확인되지 않습니다", eECode.LIFT_ERROR);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}] 리프트({liftCmd})이 확인되지 않습니다");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -89,7 +89,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (ret >= arDev.eNarumiCommandResult.Error)
|
if (ret >= arDev.eNarumiCommandResult.Error)
|
||||||
{
|
{
|
||||||
SetRunStepError($"[{funcname}] AGV속도설정이 완료되지 않았습니다", eECode.AGV_SPEED_SET_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -112,7 +112,7 @@ namespace Project
|
|||||||
if (seqTime.TotalMilliseconds > 1000)
|
if (seqTime.TotalMilliseconds > 1000)
|
||||||
{
|
{
|
||||||
//구동이확인되지 않으면 오류처리를 한다.
|
//구동이확인되지 않으면 오류처리를 한다.
|
||||||
SetRunStepError("AGV 구동이 확인되지 않습니다", eECode.AGV_RUN_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_RUN_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -128,7 +128,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqTime.TotalMilliseconds > 3000)
|
if (seqTime.TotalMilliseconds > 3000)
|
||||||
{
|
{
|
||||||
SetRunStepError("MARK STOP신호가 확인되지 않습니다", eECode.MARK_TIMEOUT);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -142,7 +142,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqTime.TotalSeconds > 10)
|
if (seqTime.TotalSeconds > 10)
|
||||||
{
|
{
|
||||||
SetRunStepError("AGV가 멈추지 않아 강제종료 합니다", eECode.AGV_STOP_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -156,7 +156,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
if (seqTime.TotalSeconds > 5)
|
if (seqTime.TotalSeconds > 5)
|
||||||
{
|
{
|
||||||
SetRunStepError("마크센서가 감지되지 않았습니다", eECode.MARK_SENSOR_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_SENSOR_FAIL);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ using Project.StateMachine;
|
|||||||
using COMM;
|
using COMM;
|
||||||
using AR;
|
using AR;
|
||||||
using AGVNavigationCore.Utils;
|
using AGVNavigationCore.Utils;
|
||||||
|
using AGVNavigationCore.PathFinding.Core;
|
||||||
|
using AGVNavigationCore.Models;
|
||||||
|
using AGVNavigationCore.PathFinding.Planning;
|
||||||
|
|
||||||
namespace Project
|
namespace Project
|
||||||
{
|
{
|
||||||
@@ -38,6 +41,32 @@ namespace Project
|
|||||||
return true;
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 실행스텝을 오류로 전환합니다.
|
/// 실행스텝을 오류로 전환합니다.
|
||||||
/// 로그메세지(에러)가 추가됩니다.
|
/// 로그메세지(에러)가 추가됩니다.
|
||||||
@@ -45,8 +74,13 @@ namespace Project
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ermsg"></param>
|
/// <param name="ermsg"></param>
|
||||||
/// <param name="ecode"></param>
|
/// <param name="ecode"></param>
|
||||||
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.AGV.AGVMoveStop(errmsg);
|
||||||
PUB.log.AddE(errmsg);
|
PUB.log.AddE(errmsg);
|
||||||
PUB._mapCanvas.SetAlertMessage(errmsg);
|
PUB._mapCanvas.SetAlertMessage(errmsg);
|
||||||
@@ -152,7 +186,7 @@ namespace Project
|
|||||||
VAR.I32[eVarInt32.PathValidationError] += 1;
|
VAR.I32[eVarInt32.PathValidationError] += 1;
|
||||||
if (VAR.I32[eVarInt32.PathValidationError] > 50)
|
if (VAR.I32[eVarInt32.PathValidationError] > 50)
|
||||||
{
|
{
|
||||||
SetRunStepError($"연속 경로 무결성 오류로 인해 중지 합니다", eECode.PATH_INTEGRITY_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.PATH_INTEGRITY_FAIL, $"연속 경로 무결성 오류로 인해 중지 합니다");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ namespace Project
|
|||||||
{
|
{
|
||||||
|
|
||||||
case ENIGProtocol.AGVCommandHE.SetCurrent: //Set Current Position
|
case ENIGProtocol.AGVCommandHE.SetCurrent: //Set Current Position
|
||||||
|
Resultclear();
|
||||||
|
|
||||||
if (data.Length > 4)
|
if (data.Length > 4)
|
||||||
{
|
{
|
||||||
@@ -75,6 +76,7 @@ namespace Project
|
|||||||
case ENIGProtocol.AGVCommandHE.PickOnEnter: // 110
|
case ENIGProtocol.AGVCommandHE.PickOnEnter: // 110
|
||||||
case ENIGProtocol.AGVCommandHE.PickOffEnter: // 111
|
case ENIGProtocol.AGVCommandHE.PickOffEnter: // 111
|
||||||
{
|
{
|
||||||
|
Resultclear();
|
||||||
PUB.log.AddI($"XBEE:작업명령수신:{cmd}");
|
PUB.log.AddI($"XBEE:작업명령수신:{cmd}");
|
||||||
|
|
||||||
// 현재 위치 확인 (TargetNode가 아닌 CurrentNode 기준)
|
// 현재 위치 확인 (TargetNode가 아닌 CurrentNode 기준)
|
||||||
@@ -120,6 +122,7 @@ namespace Project
|
|||||||
|
|
||||||
case ENIGProtocol.AGVCommandHE.Charger: // 112
|
case ENIGProtocol.AGVCommandHE.Charger: // 112
|
||||||
{
|
{
|
||||||
|
Resultclear();
|
||||||
PUB.log.AddI($"XBEE:충전명령수신");
|
PUB.log.AddI($"XBEE:충전명령수신");
|
||||||
PUB.NextWorkCmd = ENIGProtocol.AGVCommandHE.Charger;
|
PUB.NextWorkCmd = ENIGProtocol.AGVCommandHE.Charger;
|
||||||
PUB.sm.SetNewRunStep(ERunStep.GOCHARGE);
|
PUB.sm.SetNewRunStep(ERunStep.GOCHARGE);
|
||||||
@@ -128,6 +131,7 @@ namespace Project
|
|||||||
|
|
||||||
case ENIGProtocol.AGVCommandHE.GotoAlias:
|
case ENIGProtocol.AGVCommandHE.GotoAlias:
|
||||||
case ENIGProtocol.AGVCommandHE.Goto: //move to tag
|
case ENIGProtocol.AGVCommandHE.Goto: //move to tag
|
||||||
|
Resultclear();
|
||||||
var datalength = cmd == ENIGProtocol.AGVCommandHE.GotoAlias ? 2 : 1;
|
var datalength = cmd == ENIGProtocol.AGVCommandHE.GotoAlias ? 2 : 1;
|
||||||
if (data.Length > datalength)
|
if (data.Length > datalength)
|
||||||
{
|
{
|
||||||
@@ -210,10 +214,11 @@ namespace Project
|
|||||||
break;
|
break;
|
||||||
case ENIGProtocol.AGVCommandHE.Reset: //Error Reset
|
case ENIGProtocol.AGVCommandHE.Reset: //Error Reset
|
||||||
PUB.log.Add($"[{logPrefix}-Reset]");
|
PUB.log.Add($"[{logPrefix}-Reset]");
|
||||||
PUB.AGV.AGVErrorReset();
|
ResetSystemError();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ENIGProtocol.AGVCommandHE.Manual: //Manual Move (Direction, speed, runtime)
|
case ENIGProtocol.AGVCommandHE.Manual: //Manual Move (Direction, speed, runtime)
|
||||||
|
Resultclear();
|
||||||
var Direction = data[1]; //0=back, 1=forward, 2=left, 3=right
|
var Direction = data[1]; //0=back, 1=forward, 2=left, 3=right
|
||||||
var Speed = data[2]; //0=slow, 1=normal, 2=fast
|
var Speed = data[2]; //0=slow, 1=normal, 2=fast
|
||||||
|
|
||||||
@@ -234,6 +239,7 @@ namespace Project
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ENIGProtocol.AGVCommandHE.AutoMove:
|
case ENIGProtocol.AGVCommandHE.AutoMove:
|
||||||
|
Resultclear();
|
||||||
var MotDirection = data[1]; //0=back, 1=forward
|
var MotDirection = data[1]; //0=back, 1=forward
|
||||||
var MagDirection = data[2]; //0=straight, 1=left, 2=right
|
var MagDirection = data[2]; //0=straight, 1=left, 2=right
|
||||||
var AutSpeed = data[3]; //0=slow, 1=normal, 2=fast
|
var AutSpeed = data[3]; //0=slow, 1=normal, 2=fast
|
||||||
@@ -310,31 +316,6 @@ namespace Project
|
|||||||
else PUB.log.Add(e.Message);
|
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;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -425,7 +425,7 @@ namespace Project
|
|||||||
}
|
}
|
||||||
if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) //자동상태가 아니라면
|
if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) //자동상태가 아니라면
|
||||||
{
|
{
|
||||||
PUB.AGV.AGVErrorReset();
|
ResetSystemError();
|
||||||
if (Prompt)
|
if (Prompt)
|
||||||
{
|
{
|
||||||
if (UTIL.MsgQ("AGV상태를 자동으로 전환 할까요?") != DialogResult.Yes) return;
|
if (UTIL.MsgQ("AGV상태를 자동으로 전환 할까요?") != DialogResult.Yes) return;
|
||||||
@@ -454,6 +454,13 @@ namespace Project
|
|||||||
PUB.log.AddI("Clear Resultclear");
|
PUB.log.AddI("Clear Resultclear");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ResetSystemError()
|
||||||
|
{
|
||||||
|
PUB.AGV.AGVErrorReset();
|
||||||
|
Resultclear();
|
||||||
|
PUB.log.AddI("System Error Reset");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CheckFreeSpace()
|
void CheckFreeSpace()
|
||||||
{
|
{
|
||||||
@@ -768,7 +775,7 @@ namespace Project
|
|||||||
switch (title.ToLower())
|
switch (title.ToLower())
|
||||||
{
|
{
|
||||||
case "emg":
|
case "emg":
|
||||||
PUB.AGV.AGVErrorReset();
|
ResetSystemError();
|
||||||
break;
|
break;
|
||||||
case "itm":
|
case "itm":
|
||||||
var itemon = VAR.BOOL[eVarBool.ITEMON];
|
var itemon = VAR.BOOL[eVarBool.ITEMON];
|
||||||
|
|||||||
Submodule Cs_HMI/SubProject/EnigProtocol updated: ae5585c00f...aaea811e4a
Reference in New Issue
Block a user