buffer-out 시퀀스 테스트 중 - 리프트 작업 후 이후 동작이 이상함
This commit is contained in:
@@ -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.AGV.AGVMoveRight180Turn();
|
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV Right Turn 명령 전송");
|
||||||
PUB.sm.UpdateRunStepSeq();
|
PUB.AGV.AGVMoveRight180Turn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
PUB.sm.UpdateRunStepSeq();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (PUB.sm.RunStepSeq == idx++)
|
else if (PUB.sm.RunStepSeq == idx++)
|
||||||
@@ -192,20 +194,14 @@ 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)
|
||||||
{
|
{
|
||||||
//이미 완료된 상태이므로 이동 확인 패스
|
//이미 완료된 상태이므로 이동 확인 패스
|
||||||
PUB.sm.UpdateRunStepSeq();
|
PUB.sm.UpdateRunStepSeq();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL);
|
SetRunStepError(ENIGProtocol.AGVErrorCode.TURN_FAIL);
|
||||||
@@ -226,25 +222,29 @@ namespace Project
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//턴 완료 상태 업데이트
|
//턴 완료 상태 업데이트
|
||||||
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();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user