This commit is contained in:
backuppc
2026-02-02 14:59:48 +09:00
parent 02105d49a3
commit 9bca8f67d1
15 changed files with 452 additions and 201 deletions

View File

@@ -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}) 완료. 대기 상태로 전환 (퇴출 명령 대기)");

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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)