buffer-out 시퀀스 테스트 중 - 리프트 작업 후 이후 동작이 이상함

This commit is contained in:
backuppc
2026-01-29 17:23:41 +09:00
parent 1dde80fa93
commit 3a8cbd3283

View File

@@ -13,7 +13,7 @@ namespace Project
{ {
public Boolean _SM_RUN_BUFFER_OUT(bool isFirst, TimeSpan seqtime) public Boolean _SM_RUN_BUFFER_OUT(bool isFirst, TimeSpan seqtime)
{ {
var funcname = "_SM_RUN_BUFFER_IN"; var funcname = "_SM_RUN_BUFFER_OUT";
var idx = 1; var idx = 1;
//충전 상태가 OFF되어야 동작하게한다 //충전 상태가 OFF되어야 동작하게한다
@@ -32,7 +32,7 @@ namespace Project
if (PUB.sm.RunStepSeq == idx++) if (PUB.sm.RunStepSeq == idx++)
{ {
PUB.log.Add($"[{funcname}] 버퍼진출시작({PUB.NextWorkCmd}) Turn:{PUB._virtualAGV.Turn}"); PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 버퍼진출시작({PUB.NextWorkCmd}) Turn:{PUB._virtualAGV.Turn}");
PUB.Speak(Lang.); PUB.Speak(Lang.);
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
@@ -40,7 +40,7 @@ namespace Project
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
{ {
arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN; arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN;
PUB.log.Add($"[{funcname}] 리프트제어 {lift}"); PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트제어 {lift}");
PUB.AGV.LiftControl(lift); PUB.AGV.LiftControl(lift);
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
@@ -53,7 +53,7 @@ namespace Project
{ {
if (seqtime.TotalSeconds > 20) if (seqtime.TotalSeconds > 20)
{ {
PUB.log.AddAT($"[{funcname}] 리프트가 완료되지 않아 1회 재시도 합니다"); 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; arDev.Narumi.LiftCommand lift = PUB.NextWorkCmd == ENIGProtocol.AGVCommandHE.PickOnExit ? arDev.Narumi.LiftCommand.UP : arDev.Narumi.LiftCommand.DN;
PUB.AGV.LiftControl(lift); PUB.AGV.LiftControl(lift);
} }
@@ -70,10 +70,11 @@ namespace Project
{ {
if (seqtime.TotalSeconds > 20) if (seqtime.TotalSeconds > 20)
{ {
SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}] 리프트가 동작하지 않습니다"); SetRunStepError(ENIGProtocol.AGVErrorCode.LIFT_ERROR, $"[{funcname}-{PUB.sm.RunStepSeq}] 리프트가 동작하지 않습니다");
} }
return false; return false;
} }
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 리프트 확인 완료");
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
} }
@@ -97,13 +98,14 @@ namespace Project
return false; return false;
} }
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 이동 설정 완료 (Dir:Forward, Spd:Low)");
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
} }
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
{ {
//전진이동 //전진이동
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 전진 구동 시작");
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
@@ -120,8 +122,11 @@ namespace Project
} }
return false; return false;
} }
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 구동 확인 완료");
//마크스탑설정 //마크스탑설정
PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop);
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] MarkStop 명령 전송 (진출 정지 장소)");
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
} }
@@ -133,9 +138,11 @@ namespace Project
if (seqtime.TotalSeconds > 3) if (seqtime.TotalSeconds > 3)
{ {
SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT); SetRunStepError(ENIGProtocol.AGVErrorCode.MARK_TIMEOUT);
return false;
} }
return false; return false;
} }
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] MarkStop 신구 확인 완료");
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
} }
@@ -147,9 +154,11 @@ namespace Project
if (seqtime.TotalSeconds > 15) if (seqtime.TotalSeconds > 15)
{ {
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL); SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_STOP_FAIL);
return false;
} }
return false; return false;
} }
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 멈춤 확인 완료");
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
} }
@@ -159,32 +168,25 @@ namespace Project
//이미 턴이 되어있는지 확인한다 (재진입 시 중복 실행 방지) //이미 턴이 되어있는지 확인한다 (재진입 시 중복 실행 방지)
if (PUB._virtualAGV.Turn == AGVNavigationCore.Models.AGVTurn.R90) if (PUB._virtualAGV.Turn == AGVNavigationCore.Models.AGVTurn.R90)
{ {
PUB.log.Add($"[{funcname}] 이미 Right Turn 완료 상태입니다. 턴 명령을 건너뜁니다."); PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 이미 Right Turn 완료 상태입니다. 턴 명령을 건너뜁니다.");
PUB.sm.UpdateRunStepSeq();
} }
else else
{ {
//하드웨어 상태 확인 //하드웨어 상태 확인
var turnState = PUB.AGV.TurnInformation?.State ?? arDev.eNarumiTurn.None; var turnState = PUB.AGV.TurnInformation?.State ?? arDev.eNarumiTurn.None;
if (turnState == arDev.eNarumiTurn.Right)
if (turnState == arDev.eNarumiTurn.Right || turnState == arDev.eNarumiTurn.RightIng)
{ {
//이미 우회전 중이거나 완료된 하드웨어 상태 SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL, $"[{funcname}-{PUB.sm.RunStepSeq}] 턴 방향 불일치(Current:{turnState}). 버퍼진출시에는 LEFT-TURN 상태여야 합니다");
PUB.log.Add($"[{funcname}] 하드웨어 우회전 상태 확인됨({turnState}). 명령을 건너뜁니다."); return false;
PUB.sm.UpdateRunStepSeq();
}
else if (turnState == arDev.eNarumiTurn.Left || turnState == arDev.eNarumiTurn.LeftIng)
{
//비정상 상태 (좌회전 중?)
SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL, $"[{funcname}] 턴 방향 불일치(Current:{turnState}). 좌회전 상태에서 우회전을 시도할 수 없습니다.");
} }
else else
{ {
//정상 (None) -> 턴 명령 실행 //정상 (None) -> 턴 명령 실행
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV Right Turn 명령 전송");
PUB.AGV.AGVMoveRight180Turn(); PUB.AGV.AGVMoveRight180Turn();
}
}
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
}
}
return false; return false;
} }
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
@@ -192,15 +194,9 @@ namespace Project
//이동확인 //이동확인
if (PUB.AGV.system1.agv_run == false) if (PUB.AGV.system1.agv_run == false)
{ {
//최소3초기다려준다.
if (seqtime.TotalSeconds > 3) if (seqtime.TotalSeconds > 3)
{ {
//만약 이미 완료된 상태라서 건너뛰었다면 run이 안될 수 있다.
//하지만 위에서 건너뜀 -> UpdateRunStepSeq -> 바로 여기로 옴.
//건너뛴 경우(Turn == R90), Run 확인을 할 필요가 없으므로...
//로직 보완: 턴 상태가 이미 완료라면 이동확인도 스킵해야 함?
//아니면 위 단계에서 완료 상태면 '다음 다음' 단계로 점프?
//간단하게: Turn이 R90이면 그냥 통과시킴.
if (PUB._virtualAGV.Turn == AGVNavigationCore.Models.AGVTurn.R90) if (PUB._virtualAGV.Turn == AGVNavigationCore.Models.AGVTurn.R90)
{ {
//이미 완료된 상태이므로 이동 확인 패스 //이미 완료된 상태이므로 이동 확인 패스
@@ -230,8 +226,12 @@ namespace Project
//턴 완료 상태 업데이트 //턴 완료 상태 업데이트
if (PUB._virtualAGV.Turn != AGVNavigationCore.Models.AGVTurn.R90) if (PUB._virtualAGV.Turn != AGVNavigationCore.Models.AGVTurn.R90)
{ {
PUB._virtualAGV.Turn = AGVNavigationCore.Models.AGVTurn.R90; if (PUB._virtualAGV.Turn == AGVNavigationCore.Models.AGVTurn.None)
PUB.log.Add($"[{funcname}] Turn State Updated to R90"); PUB._virtualAGV.Turn = AGVNavigationCore.Models.AGVTurn.R90; //left에서 right 턴을 했으니 none 이다
else
PUB._virtualAGV.Turn = AGVNavigationCore.Models.AGVTurn.None;
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] Turn State Updated to {PUB._virtualAGV.Turn}");
} }
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
@@ -239,12 +239,12 @@ namespace Project
} }
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
{ {
PUB.log.Add("BufferOut Complete"); PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] BufferOut Complete");
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
} }
PUB.AddEEDB($"bufferout 완료({PUB.Result.TargetPos})"); PUB.AddEEDB($"[{funcname}] bufferout 완료({PUB.Result.TargetPos})");
return true; return true;
} }
} }