diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs index 5fef289..5420472 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs @@ -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); } diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.cs index 48f78d5..3f30bb4 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.cs @@ -142,6 +142,7 @@ namespace AGVNavigationCore.Controls _alertmesage = m; showalert = !string.IsNullOrEmpty(m); } + // 브러쉬 및 펜 private Brush _normalNodeBrush; diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/VirtualAGV.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/VirtualAGV.cs index 49f8208..aef1102 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/VirtualAGV.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/VirtualAGV.cs @@ -347,12 +347,11 @@ namespace AGVNavigationCore.Models var lastNode = _currentPath.DetailedPath.Last(); if (_currentPath.DetailedPath.Where(t => t.seq < lastNode.seq && t.IsPass == false).Any() == false) { - // 마지막 노드에 도착했는지 확인 (현재 노드가 마지막 노드와 같은지) - - - - if (_currentNode != null && _currentNode.Id == lastNode.NodeId) + // 마지막 노드에 도착했는지 확인 (현재 노드가 마지막 노드와 같은지) - + // 모터방향오 같아야한다. 간혹 방향전환 후 MARK STOP하는경우가있다. 260127 + if (_currentNode != null && _currentNode.Id == lastNode.NodeId && lastNode.MotorDirection == CurrentDirection) { + if (lastNode.IsPass) //이미완료되었다. { return new AGVCommand( @@ -365,12 +364,20 @@ namespace AGVNavigationCore.Models } else { + //도킹노드라면 markstop 을 나머지는 바로 스탑한다. + eAGVCommandReason reason = eAGVCommandReason.MarkStop; + if (_targetnode.StationType == StationType.Normal || _targetnode.StationType == StationType.Limit) + { + //일반노드는 마크스탑포인트가 없으니 바로 종료되도록 한다 + reason = eAGVCommandReason.Complete; + } + //마지막노드는 일혔지만 완료되지 않았다. 마크스탑필요 return new AGVCommand( MotorCommand.Stop, MagnetPosition.S, SpeedLevel.L, - eAGVCommandReason.MarkStop, + reason, $"목적지 도착 전(MarkStop) - 최종:{CurrentNodeID2}" ); } diff --git a/Cs_HMI/Project/CtlAuto.cs b/Cs_HMI/Project/CtlAuto.cs index e85464d..8a4997e 100644 --- a/Cs_HMI/Project/CtlAuto.cs +++ b/Cs_HMI/Project/CtlAuto.cs @@ -483,7 +483,7 @@ namespace Project //전체테두리 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]; //상태메세지표시 string stmsg = string.Empty; diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs index eedf195..3bdd592 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs @@ -6,6 +6,8 @@ using System.Text; using Project.StateMachine; using COMM; using AR; +using System.Windows.Media.Animation; +using System.Net.Security; namespace Project { @@ -63,9 +65,9 @@ namespace Project PUB.AGV.AGVMoveLeft180Turn(); PUB.log.Add("AGV Left Turn"); VAR.TIME.Update(eVarTime.LastTurnCommandTime); - PUB.sm.UpdateRunStepSeq(); } - else PUB.sm.UpdateRunStepSeq(); //이미완료된상태이므로 다음으로 진행한다. + PUB._mapCanvas.SetAlertMessage($"턴 진행 중"); + PUB.sm.UpdateRunStepSeq(); //이미완료된상태이므로 다음으로 진행한다. return false; } else if (PUB.sm.RunStepSeq == idx++) @@ -77,16 +79,17 @@ namespace Project if (PUB.AGV.TurnInformation.Runtime.TotalSeconds < 3) return false; //턴 이동 상태가 확인되어야 한다. - var overtime = 10; + var overtime = 30; if (PUB.AGV.TurnInformation.Runtime.TotalSeconds > overtime) { //5초동안 AGV까 움직이지 않았다면 오류 처리한다. PUB.AGV.AGVMoveStop($"[bufferin] {overtime}초이내 턴 감지 안됨"); PUB.log.AddE($"[{funcname}] {overtime}초이내 턴 감지 안됨"); - PUB._mapCanvas.SetAlertMessage("턴 완료 확인 불가"); + PUB._mapCanvas.SetAlertMessage($"턴 완료 확인 불가(최대:{overtime}초)"); PUB.sm.SetNewRunStep(ERunStep.ERROR); return false; } + else PUB._mapCanvas.SetAlertMessage($"턴 진행 중({PUB.AGV.TurnInformation.Runtime.TotalSeconds:N0}/{overtime})"); return false; } PUB._virtualAGV.Turn = AGVNavigationCore.Models.AGVTurn.L90; //턴완료 @@ -115,7 +118,11 @@ namespace Project PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.DN); //재시도를 했으니 다음으로 진행하게한다 } - else return false; + else + { + PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)"); + return false; + } } PUB.sm.UpdateRunStepSeq(); return false; @@ -132,6 +139,7 @@ namespace Project PUB._mapCanvas.SetAlertMessage("리프트가 내려가지 않음"); PUB.sm.SetNewRunStep(ERunStep.ERROR); } + else PUB._mapCanvas.SetAlertMessage($"리프트 하강 확인 중({seqtime.TotalSeconds:N0}/20)"); return false; } PUB.sm.UpdateRunStepSeq(); @@ -160,23 +168,42 @@ namespace Project } return false; } - + //후진이동을한다 + PUB._mapCanvas.SetAlertMessage($"도킹을 위해 후진 이동 시작"); PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); PUB.sm.UpdateRunStepSeq(); return false; } 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._mapCanvas.SetAlertMessage($"도킹을 위해 후진 이동 시작"); PUB.sm.UpdateRunStepSeq(); return false; } else if (PUB.sm.RunStepSeq == idx++) { //마크스탑신호가 3초이내로 들어와야 한다 - if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) + if (PUB.AGV.data.Speed != 'S') { if (seqtime.TotalSeconds > 3) { diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_IN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_IN.cs index 8947228..832bed2 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_IN.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_IN.cs @@ -174,7 +174,7 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { //마크스탑신호가 3초이내로 들어와야 한다 - if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) + if (PUB.AGV.data.Speed != 'S') { if (seqTime.TotalMilliseconds > 3000) { diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_OUT.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_OUT.cs index 2e127c2..7b2109c 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_OUT.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_LOADER_OUT.cs @@ -134,7 +134,7 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { //마크스탑신호가 3초이내로 들어와야 한다 - if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false) + if (PUB.AGV.data.Speed != 'S') { if (seqTime.TotalMilliseconds > 3000) { diff --git a/Cs_HMI/Project/StateMachine/Step/_Util.cs b/Cs_HMI/Project/StateMachine/Step/_Util.cs index 3e17333..e4a6f09 100644 --- a/Cs_HMI/Project/StateMachine/Step/_Util.cs +++ b/Cs_HMI/Project/StateMachine/Step/_Util.cs @@ -160,7 +160,7 @@ namespace Project PUB._virtualAGV.SetPath(null); return false; } - + } } @@ -191,7 +191,7 @@ namespace Project } else { - PUB.log.Add("다음행동예측에서 장비 멈춤이 확인되었습니다"); + PUB.log.Add($"다음행동예측에서 장비 멈춤이 확인되었습니다({nextAction.Reason})"); PUB.AGV.AGVMoveStop(nextAction.Message); } } diff --git a/Cs_HMI/Project/StateMachine/_AGV.cs b/Cs_HMI/Project/StateMachine/_AGV.cs index cb40c3a..8a70b83 100644 --- a/Cs_HMI/Project/StateMachine/_AGV.cs +++ b/Cs_HMI/Project/StateMachine/_AGV.cs @@ -117,15 +117,15 @@ namespace Project VAR.BOOL[eVarBool.CHG_POSERR] = PUB.AGV.error.Charger_pos_error; } - //나르미가 멈췄다면 다음 마크 이동 기능이 OFF 된다 - if (agv_stp) - { - if (VAR.BOOL[eVarBool.NEXTSTOP_MARK]) - { - VAR.BOOL[eVarBool.NEXTSTOP_MARK] = false; - PUB.logagv.Add($"NEXTSTOP_MARK 변경({VAR.BOOL[eVarBool.NEXTSTOP_MARK]})"); - } - } + ////나르미가 멈췄다면 다음 마크 이동 기능이 OFF 된다 + //if (agv_stp) + //{ + // if (VAR.BOOL[eVarBool.NEXTSTOP_MARK]) + // { + // VAR.BOOL[eVarBool.NEXTSTOP_MARK] = false; + // PUB.logagv.Add($"NEXTSTOP_MARK 변경({VAR.BOOL[eVarBool.NEXTSTOP_MARK]})"); + // } + //} //마크센서 상태가 변경이 되었다면 if (VAR.BOOL[eVarBool.MARK_SENSOR] != PUB.AGV.signal1.mark_sensor) @@ -145,7 +145,7 @@ namespace Project 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.TIME[eVarTime.MarkSensorOff] = DateTime.Now; diff --git a/Cs_HMI/Project/StateMachine/_Flag.cs b/Cs_HMI/Project/StateMachine/_Flag.cs index 01195b8..736546c 100644 --- a/Cs_HMI/Project/StateMachine/_Flag.cs +++ b/Cs_HMI/Project/StateMachine/_Flag.cs @@ -87,14 +87,14 @@ namespace Project PUB.Speak(Lang.수동충전을해제합니다); } } - else if (flag == COMM.eVarBool.NEXTSTOP_MARK) - { - if (NewValue) - { - //PUB.Speak("다음 위치에서 멈춥니다"); - PUB.log.Add($"마크인식시 멈춤 신호 변경 : {NewValue}"); - } - } + //else if (flag == COMM.eVarBool.NEXTSTOP_MARK) + //{ + // if (NewValue) + // { + // //PUB.Speak("다음 위치에서 멈춥니다"); + // PUB.log.Add($"마크인식시 멈춤 신호 변경 : {NewValue}"); + // } + //} } diff --git a/Cs_HMI/Project/StateMachine/_TMDisplay.cs b/Cs_HMI/Project/StateMachine/_TMDisplay.cs index 45da424..fcbfd97 100644 --- a/Cs_HMI/Project/StateMachine/_TMDisplay.cs +++ b/Cs_HMI/Project/StateMachine/_TMDisplay.cs @@ -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, "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, "ITM"); IOState.setValue(inputrow, inputcol++, (VAR.BOOL[eVarBool.ITEMON] ? 1 : 0)); IOState.Invalidate(); diff --git a/Cs_HMI/SubProject/AGV/Command.cs b/Cs_HMI/SubProject/AGV/Command.cs index 2aeb027..5bed8e6 100644 --- a/Cs_HMI/SubProject/AGV/Command.cs +++ b/Cs_HMI/SubProject/AGV/Command.cs @@ -113,8 +113,8 @@ namespace arDev if (this.system1.agv_run) RaiseMessage(MessageType.Normal, $"stop command from {Reason}"); var retval = AddCommand(eAgvCmd.MoveStop, sb.ToString()); - if (retval == eNarumiCommandResult.Success && opt == eStopOpt.MarkStop) - VAR.BOOL[eVarBool.NEXTSTOP_MARK] = true; + //if (retval == eNarumiCommandResult.Success && opt == eStopOpt.MarkStop) + // VAR.BOOL[eVarBool.NEXTSTOP_MARK] = true; return retval; } diff --git a/Cs_HMI/SubProject/CommData/Enum.cs b/Cs_HMI/SubProject/CommData/Enum.cs index e62aa47..f21c5ee 100644 --- a/Cs_HMI/SubProject/CommData/Enum.cs +++ b/Cs_HMI/SubProject/CommData/Enum.cs @@ -82,7 +82,7 @@ namespace COMM FLAG_RUN_CMD, FLAG_GO_CHAGER, FLAG_NEXTSTOP_ALIGN, - NEXTSTOP_MARK, + ///NEXTSTOP_MARK, /// /// mark 1 혹은 2 의 값이 들어오면 설정됨