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