nextstop 시그널을 bool변수에서 agv 으 ㅣspeed = 'L' 조건으로 변경

This commit is contained in:
ChiKyun Kim
2026-01-27 16:27:17 +09:00
parent b4d3cd8bb5
commit b0e75b351a
13 changed files with 76 additions and 41 deletions

View File

@@ -100,7 +100,7 @@ namespace AGVNavigationCore.Controls
} }
//예측문자는 디버깅시에만 표시한다. //예측문자는 디버깅시에만 표시한다.
if (string.IsNullOrEmpty(PredictMessage) == false && System.Diagnostics.Debugger.IsAttached) if (string.IsNullOrEmpty(PredictMessage) == false)
{ {
g.DrawString(this.PredictMessage, this.Font, Brushes.White, 10, 100); g.DrawString(this.PredictMessage, this.Font, Brushes.White, 10, 100);
} }

View File

@@ -143,6 +143,7 @@ namespace AGVNavigationCore.Controls
showalert = !string.IsNullOrEmpty(m); showalert = !string.IsNullOrEmpty(m);
} }
// 브러쉬 및 펜 // 브러쉬 및 펜
private Brush _normalNodeBrush; private Brush _normalNodeBrush;
private Brush _rotationNodeBrush; private Brush _rotationNodeBrush;

View File

@@ -347,12 +347,11 @@ namespace AGVNavigationCore.Models
var lastNode = _currentPath.DetailedPath.Last(); var lastNode = _currentPath.DetailedPath.Last();
if (_currentPath.DetailedPath.Where(t => t.seq < lastNode.seq && t.IsPass == false).Any() == false) if (_currentPath.DetailedPath.Where(t => t.seq < lastNode.seq && t.IsPass == false).Any() == false)
{ {
// 마지막 노드에 도착했는지 확인 (현재 노드가 마지막 노드와 같은지) // 마지막 노드에 도착했는지 확인 (현재 노드가 마지막 노드와 같은지) -
// 모터방향오 같아야한다. 간혹 방향전환 후 MARK STOP하는경우가있다. 260127
if (_currentNode != null && _currentNode.Id == lastNode.NodeId && lastNode.MotorDirection == CurrentDirection)
if (_currentNode != null && _currentNode.Id == lastNode.NodeId)
{ {
if (lastNode.IsPass) //이미완료되었다. if (lastNode.IsPass) //이미완료되었다.
{ {
return new AGVCommand( return new AGVCommand(
@@ -365,12 +364,20 @@ namespace AGVNavigationCore.Models
} }
else else
{ {
//도킹노드라면 markstop 을 나머지는 바로 스탑한다.
eAGVCommandReason reason = eAGVCommandReason.MarkStop;
if (_targetnode.StationType == StationType.Normal || _targetnode.StationType == StationType.Limit)
{
//일반노드는 마크스탑포인트가 없으니 바로 종료되도록 한다
reason = eAGVCommandReason.Complete;
}
//마지막노드는 일혔지만 완료되지 않았다. 마크스탑필요 //마지막노드는 일혔지만 완료되지 않았다. 마크스탑필요
return new AGVCommand( return new AGVCommand(
MotorCommand.Stop, MotorCommand.Stop,
MagnetPosition.S, MagnetPosition.S,
SpeedLevel.L, SpeedLevel.L,
eAGVCommandReason.MarkStop, reason,
$"목적지 도착 전(MarkStop) - 최종:{CurrentNodeID2}" $"목적지 도착 전(MarkStop) - 최종:{CurrentNodeID2}"
); );
} }

View File

@@ -483,7 +483,7 @@ namespace Project
//전체테두리 //전체테두리
g.DrawRectangle(new Pen(BorderColor), DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1); g.DrawRectangle(new Pen(BorderColor), DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1);
var nextstop = VAR.BOOL?.Get(eVarBool.NEXTSTOP_MARK) ?? false; var nextstop = PUB.AGV.data.Speed == 'S';// VAR.BOOL?.Get(eVarBool.NEXTSTOP_MARK) ?? false;
//if (VAR.BOOL != null) nextstop = VAR.BOOL[eVarBool.NEXTSTOP_MARK]; //if (VAR.BOOL != null) nextstop = VAR.BOOL[eVarBool.NEXTSTOP_MARK];
//상태메세지표시 //상태메세지표시
string stmsg = string.Empty; string stmsg = string.Empty;

View File

@@ -6,6 +6,8 @@ using System.Text;
using Project.StateMachine; using Project.StateMachine;
using COMM; using COMM;
using AR; using AR;
using System.Windows.Media.Animation;
using System.Net.Security;
namespace Project namespace Project
{ {
@@ -63,9 +65,9 @@ namespace Project
PUB.AGV.AGVMoveLeft180Turn(); PUB.AGV.AGVMoveLeft180Turn();
PUB.log.Add("AGV Left Turn"); PUB.log.Add("AGV Left Turn");
VAR.TIME.Update(eVarTime.LastTurnCommandTime); VAR.TIME.Update(eVarTime.LastTurnCommandTime);
PUB.sm.UpdateRunStepSeq();
} }
else PUB.sm.UpdateRunStepSeq(); //이미완료된상태이므로 다음으로 진행한다. PUB._mapCanvas.SetAlertMessage($"턴 진행 중");
PUB.sm.UpdateRunStepSeq(); //이미완료된상태이므로 다음으로 진행한다.
return false; return false;
} }
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
@@ -77,16 +79,17 @@ namespace Project
if (PUB.AGV.TurnInformation.Runtime.TotalSeconds < 3) return false; if (PUB.AGV.TurnInformation.Runtime.TotalSeconds < 3) return false;
//턴 이동 상태가 확인되어야 한다. //턴 이동 상태가 확인되어야 한다.
var overtime = 10; var overtime = 30;
if (PUB.AGV.TurnInformation.Runtime.TotalSeconds > overtime) if (PUB.AGV.TurnInformation.Runtime.TotalSeconds > overtime)
{ {
//5초동안 AGV까 움직이지 않았다면 오류 처리한다. //5초동안 AGV까 움직이지 않았다면 오류 처리한다.
PUB.AGV.AGVMoveStop($"[bufferin] {overtime}초이내 턴 감지 안됨"); PUB.AGV.AGVMoveStop($"[bufferin] {overtime}초이내 턴 감지 안됨");
PUB.log.AddE($"[{funcname}] {overtime}초이내 턴 감지 안됨"); PUB.log.AddE($"[{funcname}] {overtime}초이내 턴 감지 안됨");
PUB._mapCanvas.SetAlertMessage("턴 완료 확인 불가"); PUB._mapCanvas.SetAlertMessage($"턴 완료 확인 불가(최대:{overtime}초)");
PUB.sm.SetNewRunStep(ERunStep.ERROR); PUB.sm.SetNewRunStep(ERunStep.ERROR);
return false; return false;
} }
else PUB._mapCanvas.SetAlertMessage($"턴 진행 중({PUB.AGV.TurnInformation.Runtime.TotalSeconds:N0}/{overtime})");
return false; return false;
} }
PUB._virtualAGV.Turn = AGVNavigationCore.Models.AGVTurn.L90; //턴완료 PUB._virtualAGV.Turn = AGVNavigationCore.Models.AGVTurn.L90; //턴완료
@@ -115,7 +118,11 @@ namespace Project
PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.DN); PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.DN);
//재시도를 했으니 다음으로 진행하게한다 //재시도를 했으니 다음으로 진행하게한다
} }
else return false; else
{
PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)");
return false;
}
} }
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
@@ -132,6 +139,7 @@ namespace Project
PUB._mapCanvas.SetAlertMessage("리프트가 내려가지 않음"); PUB._mapCanvas.SetAlertMessage("리프트가 내려가지 않음");
PUB.sm.SetNewRunStep(ERunStep.ERROR); PUB.sm.SetNewRunStep(ERunStep.ERROR);
} }
else PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)");
return false; return false;
} }
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
@@ -162,21 +170,40 @@ namespace Project
} }
//후진이동을한다 //후진이동을한다
PUB._mapCanvas.SetAlertMessage($"도킹을 위해 후진 이동 시작");
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
} }
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
{
//이동확인을 한다.
if(PUB.AGV.system1.agv_run == false)
{
if(seqtime.TotalSeconds > 3)
{
PUB.AGV.AGVMoveStop(funcname);
PUB.log.AddE($"[{funcname}] AGV이동이 확인되지 않습니다");
PUB._mapCanvas.SetAlertMessage($"[{funcname}] AGV이동이 확인되지 않습니다");
PUB.sm.SetNewRunStep(ERunStep.ERROR);
}
return false;
}
PUB.sm.UpdateRunStepSeq();
return false;
}
else if (PUB.sm.RunStepSeq == idx++)
{ {
//마크스탑으로 이동 //마크스탑으로 이동
PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop); PUB.AGV.AGVMoveStop(funcname, arDev.Narumi.eStopOpt.MarkStop);
PUB._mapCanvas.SetAlertMessage($"도킹을 위해 후진 이동 시작");
PUB.sm.UpdateRunStepSeq(); PUB.sm.UpdateRunStepSeq();
return false; return false;
} }
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
{ {
//마크스탑신호가 3초이내로 들어와야 한다 //마크스탑신호가 3초이내로 들어와야 한다
if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) if (PUB.AGV.data.Speed != 'S')
{ {
if (seqtime.TotalSeconds > 3) if (seqtime.TotalSeconds > 3)
{ {

View File

@@ -174,7 +174,7 @@ namespace Project
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
{ {
//마크스탑신호가 3초이내로 들어와야 한다 //마크스탑신호가 3초이내로 들어와야 한다
if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) if (PUB.AGV.data.Speed != 'S')
{ {
if (seqTime.TotalMilliseconds > 3000) if (seqTime.TotalMilliseconds > 3000)
{ {

View File

@@ -134,7 +134,7 @@ namespace Project
else if (PUB.sm.RunStepSeq == idx++) else if (PUB.sm.RunStepSeq == idx++)
{ {
//마크스탑신호가 3초이내로 들어와야 한다 //마크스탑신호가 3초이내로 들어와야 한다
if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) if (PUB.AGV.data.Speed != 'S')
{ {
if (seqTime.TotalMilliseconds > 3000) if (seqTime.TotalMilliseconds > 3000)
{ {

View File

@@ -191,7 +191,7 @@ namespace Project
} }
else else
{ {
PUB.log.Add("다음행동예측에서 장비 멈춤이 확인되었습니다"); PUB.log.Add($"다음행동예측에서 장비 멈춤이 확인되었습니다({nextAction.Reason})");
PUB.AGV.AGVMoveStop(nextAction.Message); PUB.AGV.AGVMoveStop(nextAction.Message);
} }
} }

View File

@@ -117,15 +117,15 @@ namespace Project
VAR.BOOL[eVarBool.CHG_POSERR] = PUB.AGV.error.Charger_pos_error; VAR.BOOL[eVarBool.CHG_POSERR] = PUB.AGV.error.Charger_pos_error;
} }
//나르미가 멈췄다면 다음 마크 이동 기능이 OFF 된다 ////나르미가 멈췄다면 다음 마크 이동 기능이 OFF 된다
if (agv_stp) //if (agv_stp)
{ //{
if (VAR.BOOL[eVarBool.NEXTSTOP_MARK]) // if (VAR.BOOL[eVarBool.NEXTSTOP_MARK])
{ // {
VAR.BOOL[eVarBool.NEXTSTOP_MARK] = false; // VAR.BOOL[eVarBool.NEXTSTOP_MARK] = false;
PUB.logagv.Add($"NEXTSTOP_MARK 변경({VAR.BOOL[eVarBool.NEXTSTOP_MARK]})"); // PUB.logagv.Add($"NEXTSTOP_MARK 변경({VAR.BOOL[eVarBool.NEXTSTOP_MARK]})");
} // }
} //}
//마크센서 상태가 변경이 되었다면 //마크센서 상태가 변경이 되었다면
if (VAR.BOOL[eVarBool.MARK_SENSOR] != PUB.AGV.signal1.mark_sensor) if (VAR.BOOL[eVarBool.MARK_SENSOR] != PUB.AGV.signal1.mark_sensor)
@@ -145,7 +145,7 @@ namespace Project
else PUB.log.AddAT($"마크스탑이 확인되었으나 현재 노드가없어 PASS를 설정하지 못함"); else PUB.log.AddAT($"마크스탑이 확인되었으나 현재 노드가없어 PASS를 설정하지 못함");
} }
} }
if (VAR.BOOL[eVarBool.MARK_SENSOROFF] != VAR.BOOL[eVarBool.MARK_SENSOR]) if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == VAR.BOOL[eVarBool.MARK_SENSOR])
{ {
VAR.BOOL[eVarBool.MARK_SENSOROFF] = !VAR.BOOL[eVarBool.MARK_SENSOR]; VAR.BOOL[eVarBool.MARK_SENSOROFF] = !VAR.BOOL[eVarBool.MARK_SENSOR];
VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now; VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now;

View File

@@ -87,14 +87,14 @@ namespace Project
PUB.Speak(Lang.); PUB.Speak(Lang.);
} }
} }
else if (flag == COMM.eVarBool.NEXTSTOP_MARK) //else if (flag == COMM.eVarBool.NEXTSTOP_MARK)
{ //{
if (NewValue) // if (NewValue)
{ // {
//PUB.Speak("다음 위치에서 멈춥니다"); // //PUB.Speak("다음 위치에서 멈춥니다");
PUB.log.Add($"마크인식시 멈춤 신호 변경 : {NewValue}"); // PUB.log.Add($"마크인식시 멈춤 신호 변경 : {NewValue}");
} // }
} //}
} }

View File

@@ -370,7 +370,7 @@ namespace Project
} }
IOState.setTitle(inputrow, inputcol, "RUN"); IOState.setValue(inputrow, inputcol++, (PUB.AGV.system1.agv_run ? 1 : 0)); IOState.setTitle(inputrow, inputcol, "RUN"); IOState.setValue(inputrow, inputcol++, (PUB.AGV.system1.agv_run ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "MARK"); IOState.setValue(inputrow, inputcol++, (VAR.BOOL[eVarBool.MARK_SENSOR] ? 1 : (VAR.BOOL[eVarBool.NEXTSTOP_MARK] ? 2 : 0))); IOState.setTitle(inputrow, inputcol, "MARK"); IOState.setValue(inputrow, inputcol++, (VAR.BOOL[eVarBool.MARK_SENSOR] ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "CHG"); IOState.setValue(inputrow, inputcol++, (PUB.AGV.system1.Battery_charging ? 1 : 0)); IOState.setTitle(inputrow, inputcol, "CHG"); IOState.setValue(inputrow, inputcol++, (PUB.AGV.system1.Battery_charging ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "ITM"); IOState.setValue(inputrow, inputcol++, (VAR.BOOL[eVarBool.ITEMON] ? 1 : 0)); IOState.setTitle(inputrow, inputcol, "ITM"); IOState.setValue(inputrow, inputcol++, (VAR.BOOL[eVarBool.ITEMON] ? 1 : 0));
IOState.Invalidate(); IOState.Invalidate();

View File

@@ -113,8 +113,8 @@ namespace arDev
if (this.system1.agv_run) if (this.system1.agv_run)
RaiseMessage(MessageType.Normal, $"stop command from {Reason}"); RaiseMessage(MessageType.Normal, $"stop command from {Reason}");
var retval = AddCommand(eAgvCmd.MoveStop, sb.ToString()); var retval = AddCommand(eAgvCmd.MoveStop, sb.ToString());
if (retval == eNarumiCommandResult.Success && opt == eStopOpt.MarkStop) //if (retval == eNarumiCommandResult.Success && opt == eStopOpt.MarkStop)
VAR.BOOL[eVarBool.NEXTSTOP_MARK] = true; // VAR.BOOL[eVarBool.NEXTSTOP_MARK] = true;
return retval; return retval;
} }

View File

@@ -82,7 +82,7 @@ namespace COMM
FLAG_RUN_CMD, FLAG_RUN_CMD,
FLAG_GO_CHAGER, FLAG_GO_CHAGER,
FLAG_NEXTSTOP_ALIGN, FLAG_NEXTSTOP_ALIGN,
NEXTSTOP_MARK, ///NEXTSTOP_MARK,
/// <summary> /// <summary>
/// mark 1 혹은 2 의 값이 들어오면 설정됨 /// mark 1 혹은 2 의 값이 들어오면 설정됨