재시작관련 코드 업데이트
This commit is contained in:
@@ -15,6 +15,7 @@ namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
DateTime _lastLidarOffTime_IN = DateTime.MinValue;
|
||||
public Boolean _SM_RUN_BUFFER_IN(bool isFirst, TimeSpan seqtime)
|
||||
{
|
||||
var funcname = "_SM_RUN_BUFFER_IN";
|
||||
@@ -26,6 +27,27 @@ namespace Project
|
||||
//라이더멈춤이 설정되어있다면 음성으로 알려준다
|
||||
if (CheckLiderStop() == false) return false;
|
||||
|
||||
// [Global Safety] 버퍼 작업 중에는 무조건 라이다를 끄도록 강제한다 (재시작 시 멈춤 방지)
|
||||
if (PUB.AGV.PBSSensor != arDev.eNarmiPBSSensor.off || PUB.AGV.data.Distance > 0)
|
||||
{
|
||||
if ((DateTime.Now - _lastLidarOffTime_IN).TotalSeconds > 2)
|
||||
{
|
||||
PUB.log.Add($"[{funcname}] 버퍼 작업 중 라이다 강제 OFF 시도");
|
||||
PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData
|
||||
{
|
||||
Bunki = arDev.Narumi.eBunki.Strate,
|
||||
Direction = arDev.Narumi.eMoveDir.Backward,
|
||||
PBSSensor = 0,
|
||||
Speed = arDev.Narumi.eMoveSpd.Low,
|
||||
});
|
||||
_lastLidarOffTime_IN = DateTime.Now;
|
||||
}
|
||||
return false; // 라이다가 꺼질 때까지 진행 스톱 (명령이 적용될 때까지 대기)
|
||||
}
|
||||
|
||||
// [State Save] 현재 진행 단계를 저장한다
|
||||
SaveBufferStep(PUB._virtualAGV.CurrentNode, PUB.sm.RunStepSeq, PUB.NextWorkCmd);
|
||||
|
||||
/*
|
||||
* 버퍼IN시퀀스
|
||||
* 1. 회전이 진행되지 않았다면 회전을 진행한다.
|
||||
@@ -428,6 +450,9 @@ namespace Project
|
||||
// 작업을 마치고 설비 안에 멈춰있는 상태.
|
||||
// ACS가 이 상태를 확인하고 NextWorkCmd로 퇴출(Out) 명령을 보내야 함.
|
||||
//PUB.AddEEDB($"[{funcname}] 버퍼작업완료({PUB.Result.TargetPos})");
|
||||
|
||||
// [State Clear] 작업 완료 시 저장된 상태를 지운다
|
||||
ClearBufferStep(PUB._virtualAGV.CurrentNode);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ namespace Project
|
||||
public partial class fMain
|
||||
{
|
||||
bool SpeedSetRetry = false;
|
||||
DateTime _lastLidarOffTime_OUT = DateTime.MinValue;
|
||||
public Boolean _SM_RUN_BUFFER_OUT(bool isFirst, TimeSpan seqtime)
|
||||
{
|
||||
var funcname = "_SM_RUN_BUFFER_OUT";
|
||||
@@ -25,6 +26,27 @@ namespace Project
|
||||
//라이더멈춤이 설정되어있다면 음성으로 알려준다
|
||||
if (CheckLiderStop() == false) return false;
|
||||
|
||||
// [Global Safety] 버퍼 작업 중에는 무조건 라이다를 끄도록 강제한다 (재시작 시 멈춤 방지)
|
||||
if (PUB.AGV.PBSSensor != arDev.eNarmiPBSSensor.off || PUB.AGV.data.Distance > 0)
|
||||
{
|
||||
if ((DateTime.Now - _lastLidarOffTime_OUT).TotalSeconds > 2)
|
||||
{
|
||||
PUB.log.Add($"[{funcname}] 버퍼 작업 중 라이다 강제 OFF 시도");
|
||||
PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData
|
||||
{
|
||||
Bunki = arDev.Narumi.eBunki.Strate,
|
||||
Direction = arDev.Narumi.eMoveDir.Forward,
|
||||
PBSSensor = 0,
|
||||
Speed = arDev.Narumi.eMoveSpd.Low,
|
||||
});
|
||||
_lastLidarOffTime_OUT = DateTime.Now;
|
||||
}
|
||||
return false; // 라이다가 꺼질 때까지 진행 스톱 (명령이 적용될 때까지 대기)
|
||||
}
|
||||
|
||||
// [State Save] 현재 진행 단계를 저장한다
|
||||
SaveBufferStep(PUB._virtualAGV.CurrentNode, PUB.sm.RunStepSeq, PUB.NextWorkCmd);
|
||||
|
||||
/*
|
||||
* 버퍼 OUT 시퀀스
|
||||
* 1-1. PickOn 라면 리프트를 Up 한다
|
||||
@@ -100,35 +122,42 @@ namespace Project
|
||||
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//if (PUB.AGV.signal1.mark_sensor == false)
|
||||
// [Smart Restart] 재시작 시 안전 검사
|
||||
// 이미 마크센서가 켜져서 도착한 상태라면 전진 구동을 생략하고 턴으로 넘어간다.
|
||||
if (PUB.AGV.signal1.mark_sensor == true && PUB._virtualAGV.Turn == AGVNavigationCore.Models.AGVTurn.L90)
|
||||
{
|
||||
//빈 상태로 아웃해야한다.
|
||||
if (SpeedSetRetry)
|
||||
{
|
||||
if (seqtime.TotalSeconds < 2)
|
||||
return false;
|
||||
}
|
||||
var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData
|
||||
{
|
||||
Bunki = arDev.Narumi.eBunki.Strate,
|
||||
Direction = arDev.Narumi.eMoveDir.Forward,
|
||||
PBSSensor = 0,
|
||||
Speed = arDev.Narumi.eMoveSpd.Low,
|
||||
});
|
||||
//명령이 실패되었다면 재시도를 한다
|
||||
if (ret != arDev.eNarumiCommandResult.Success)
|
||||
{
|
||||
if (SpeedSetRetry == true || ret >= arDev.eNarumiCommandResult.Error)
|
||||
{
|
||||
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL);
|
||||
}
|
||||
else SpeedSetRetry = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 이동 설정 완료 (Dir:Forward, Spd:Low)");
|
||||
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 이미 마크센서 감지됨. 전진 이동을 생략합니다.");
|
||||
PUB.sm.SetStepSeq((byte)(idx + 4)); // Turn 스텝으로 직행 (현재 idx부터 4단계 뒤)
|
||||
return false;
|
||||
}
|
||||
|
||||
//빈 상태로 아웃해야한다.
|
||||
if (SpeedSetRetry)
|
||||
{
|
||||
if (seqtime.TotalSeconds < 2)
|
||||
return false;
|
||||
}
|
||||
var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData
|
||||
{
|
||||
Bunki = arDev.Narumi.eBunki.Strate,
|
||||
Direction = arDev.Narumi.eMoveDir.Forward,
|
||||
PBSSensor = 0,
|
||||
Speed = arDev.Narumi.eMoveSpd.Low,
|
||||
});
|
||||
//명령이 실패되었다면 재시도를 한다
|
||||
if (ret != arDev.eNarumiCommandResult.Success)
|
||||
{
|
||||
if (SpeedSetRetry == true || ret >= arDev.eNarumiCommandResult.Error)
|
||||
{
|
||||
SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL);
|
||||
}
|
||||
else SpeedSetRetry = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 이동 설정 완료 (Dir:Forward, Spd:Low)");
|
||||
|
||||
|
||||
VAR.I32[eVarInt32.RetryMove] = 0;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
@@ -225,6 +254,17 @@ namespace Project
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// [Resume Safety] 재시작 직후 여기에 진입했는데 마크 센서가 꺼져있다면,
|
||||
// 중간에 멈췄을 가능성이 크므로 다시 구동 스텝으로 되돌아간다.
|
||||
// (단, seqtime이 매우 짧은 경우 = 방금 Resume된 경우를 필터링)
|
||||
if (PUB.AGV.signal1.mark_sensor == false && seqtime.TotalSeconds < 1.0)
|
||||
{
|
||||
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 재시작 감지됨. 하지만 목적지(마크) 도착 불확실. 이동을 재시도합니다.");
|
||||
PUB.sm.SetStepSeq(6); // Speed Set 스텝(이동 시작 단계)으로 복귀
|
||||
return false;
|
||||
}
|
||||
|
||||
PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] AGV 멈춤 확인 완료");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
@@ -443,6 +483,9 @@ namespace Project
|
||||
}
|
||||
|
||||
PUB.AddEEDB($"[{funcname}] bufferout 완료({PUB.Result.TargetPos})");
|
||||
|
||||
// [State Clear] 작업 완료 시 저장된 상태를 지운다
|
||||
ClearBufferStep(PUB._virtualAGV.CurrentNode);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user