diff --git a/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs b/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs index fec8238..b7832f4 100644 --- a/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs +++ b/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_IN.cs @@ -206,7 +206,7 @@ namespace Project { Bunki = arDev.Narumi.eBunki.Strate, Direction = arDev.Narumi.eMoveDir.Backward, - PBSSensor = 0, + PBSSensor = 0, //라이다를끈다 Speed = arDev.Narumi.eMoveSpd.Low, }); diff --git a/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs b/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs index a94892e..eb7a357 100644 --- a/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs +++ b/HMI/Project/StateMachine/Step/_SM_RUN_BUFFER_OUT.cs @@ -11,6 +11,7 @@ namespace Project { public partial class fMain { + bool SpeedSetRetry = false; public Boolean _SM_RUN_BUFFER_OUT(bool isFirst, TimeSpan seqtime) { var funcname = "_SM_RUN_BUFFER_OUT"; @@ -35,6 +36,7 @@ namespace Project PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] 버퍼진출시작({PUB.NextWorkCmd}) Turn:{PUB._virtualAGV.Turn}"); PUB.Speak(Lang.진출을시작합니다); PUB.sm.UpdateRunStepSeq(); + SpeedSetRetry = false; return false; } else if (PUB.sm.RunStepSeq == idx++) @@ -83,6 +85,11 @@ namespace Project if (PUB.AGV.signal1.mark_sensor == false) { //빈 상태로 아웃해야한다. + if (SpeedSetRetry) + { + if (seqtime.TotalSeconds < 2) + return false; + } var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData { Bunki = arDev.Narumi.eBunki.Strate, @@ -93,10 +100,11 @@ namespace Project //명령이 실패되었다면 재시도를 한다 if (ret != arDev.eNarumiCommandResult.Success) { - if (ret >= arDev.eNarumiCommandResult.Error) + if (SpeedSetRetry == true || ret >= arDev.eNarumiCommandResult.Error) { SetRunStepError(ENIGProtocol.AGVErrorCode.AGV_SPEED_SET_FAIL); } + else SpeedSetRetry = true; return false; } @@ -256,6 +264,19 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { PUB.log.Add($"[{funcname}-{PUB.sm.RunStepSeq}] BufferOut Complete"); + + //라이더를 켜기위해서 기본 값을 설정한다. + var ret = PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData + { + Bunki = arDev.Narumi.eBunki.Strate, + Direction = arDev.Narumi.eMoveDir.Backward, + PBSSensor = 2, + Speed = arDev.Narumi.eMoveSpd.Low, + }); + + if (ret != arDev.eNarumiCommandResult.Success) + PUB.log.AddE($"진출완료 후 라이더ON명령이 실패되었습니다(AGVMoveSet)"); + PUB.sm.UpdateRunStepSeq(); return false; } diff --git a/HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs b/HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs index c30f194..08ae9dc 100644 --- a/HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs +++ b/HMI/Project/StateMachine/Step/_SM_RUN_GOTO.cs @@ -13,14 +13,14 @@ namespace Project { byte GotoTurnStep = 0; DateTime GotoTurnSetTime = DateTime.Now; - public Boolean _SM_RUN_GOTO(bool isFirst, TimeSpan stepTime) + public Boolean _SM_RUN_GOTO(bool isFirst, TimeSpan seqtime) { ///명령어 재전송 간격(기본 2초) var CommandInterval = 2; - var funcName = "_SM_RUN_GOTO"; + var funcname = "_SM_RUN_GOTO"; //충전 상태가 OFF되어야 동작하게한다 - if (_SM_RUN_CHARGE_GOFF(isFirst, stepTime) == false) + if (_SM_RUN_CHARGE_GOFF(isFirst, seqtime) == false) return false; //최초시작이라면 시간변수 초기화 @@ -39,29 +39,66 @@ namespace Project PUB.Speak(Lang.전방에물체가감지되었습니다); LastSpeakTime = DateTime.Now; } + return false; } var idx = 1; if (PUB.sm.RunStepSeq == idx++) { - if(PUB._virtualAGV.TargetNode == null) + SpeedSetRetry = false; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + ////빈 상태로 아웃해야한다. + //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 = 2, + // 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.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + if (PUB._virtualAGV.TargetNode == null) { PUB.log.Add($"대상노드가 없어 이동을할 수 없습니다"); PUB.sm.SetNewRunStep(ERunStep.READY); return false; } - PUB.log.Add($"[GOTO] Step {idx-1}: TargetNode Checked ({PUB._virtualAGV.TargetNode.ID2})"); + PUB.log.Add($"[GOTO] Step {idx - 1}: TargetNode Checked ({PUB._virtualAGV.TargetNode.ID2})"); PUB.sm.UpdateRunStepSeq(); return false; } else if (PUB.sm.RunStepSeq == idx++) { //모션 전후진 제어 - if (UpdateMotionPositionForMark(funcName)) + if (UpdateMotionPositionForMark(funcname)) { - PUB.log.Add($"[GOTO] Step {idx-1}: UpdateMotionPositionForMark Completed. Stopping AGV."); - PUB.AGV.AGVMoveStop(funcName); + PUB.log.Add($"[GOTO] Step {idx - 1}: UpdateMotionPositionForMark Completed. Stopping AGV."); + PUB.AGV.AGVMoveStop(funcname); PUB.sm.UpdateRunStepSeq(); } return false; @@ -69,7 +106,7 @@ namespace Project else if (PUB.sm.RunStepSeq == idx++) { //QC까지 모두 완료되었다.(완전히 정차할때까지 기다린다) - PUB.log.Add($"[GOTO] Step {idx-1}: Movement Finished. Waiting for full stop."); + PUB.log.Add($"[GOTO] Step {idx - 1}: Movement Finished. Waiting for full stop."); PUB.Speak(Lang.이동완료, true); PUB.AddEEDB($"이동완료({PUB._virtualAGV.TargetNode.ID2})"); PUB.sm.UpdateRunStepSeq(); diff --git a/HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs b/HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs index 4443d55..a73cac8 100644 --- a/HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs +++ b/HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs @@ -27,7 +27,7 @@ namespace Project { Bunki = arDev.Narumi.eBunki.Strate, Direction = arDev.Narumi.eMoveDir.Forward, - PBSSensor = 1, + PBSSensor = 2, Speed = arDev.Narumi.eMoveSpd.Low, }); if(ret == arDev.eNarumiCommandResult.Success) diff --git a/HMI/Project/StateMachine/Step/_Util.cs b/HMI/Project/StateMachine/Step/_Util.cs index ccc9056..494196a 100644 --- a/HMI/Project/StateMachine/Step/_Util.cs +++ b/HMI/Project/StateMachine/Step/_Util.cs @@ -270,14 +270,14 @@ namespace Project PUB.log.Add($"다음행동예측에서 장비 멈춤이 확인되었습니다({nextAction.Reason})"); PUB.AGV.AGVMoveStop(nextAction.Message); // 정지 타이머 갱신 (연속 정지 방지) - VAR.TIME.Update(eVarTime.LastStopCommandTime); + VAR.TIME.Update(eVarTime.LastStopCommandTime); // 일반 타이머도 갱신 (정지 직후 불필요한 이동 방지) LastCommandTime = DateTime.Now; } } - + } @@ -357,7 +357,8 @@ namespace Project // 현재 상태와 다를 때만 전송 (불필요한 통신 부하 방지) if (PUB.AGV.data.Sts != bunki.ToString()[0] || PUB.AGV.data.Direction != dir.ToString()[0] || - PUB.AGV.data.Speed != spd.ToString()[0]) + PUB.AGV.data.Speed != spd.ToString()[0] || + PUB.AGV.PBSSensor != arDev.eNarmiPBSSensor.on) { // 2초 쿨타임 적용 var tsCmd = DateTime.Now - LastCommandTime; @@ -367,7 +368,7 @@ namespace Project { Bunki = bunki, Direction = dir, - PBSSensor = 1, + PBSSensor = 2, Speed = spd, }); @@ -380,8 +381,8 @@ namespace Project } } - // AGV가 정지 상태라면 구동 시작 - if (PUB.AGV.system1.agv_run == false) + // AGV가 정지 상태라면 구동 시작 (라이다가켜져있을때에만 사용한다) + if (PUB.AGV.system1.agv_run == false && PUB.AGV.PBSSensor == arDev.eNarmiPBSSensor.on) { // 2초 쿨타임 적용 (AGVMoveSet과 동일한 타이머 사용) var tsCmd = DateTime.Now - LastCommandTime; @@ -417,7 +418,7 @@ namespace Project { Bunki = arDev.Narumi.eBunki.Strate, Direction = arDev.Narumi.eMoveDir.Forward, - PBSSensor = 1, + PBSSensor = 2, Speed = arDev.Narumi.eMoveSpd.Low, }); if (ret == arDev.eNarumiCommandResult.Success) @@ -449,7 +450,7 @@ namespace Project { Bunki = arDev.Narumi.eBunki.Strate, Direction = arDev.Narumi.eMoveDir.Backward, - PBSSensor = 1, + PBSSensor = 2, Speed = arDev.Narumi.eMoveSpd.Low, }); if (ret == arDev.eNarumiCommandResult.Success) diff --git a/HMI/SubProject/AGV/Command.cs b/HMI/SubProject/AGV/Command.cs index 625ddec..f4b92c5 100644 --- a/HMI/SubProject/AGV/Command.cs +++ b/HMI/SubProject/AGV/Command.cs @@ -65,8 +65,17 @@ namespace arDev Timeout, } + public enum eNarmiPBSSensor : byte + { + notset=0, + on = 1, + off = 2 + } + public partial class Narumi { + public eNarmiPBSSensor PBSSensor = eNarmiPBSSensor.notset; + public NarumiTurnInfo TurnInformation { get; set; } = null; Dictionary SendCommandFailList { get; set; } = new Dictionary(); @@ -374,8 +383,17 @@ namespace arDev case eAgvCmd.MoveSet: - cmdString = $"CBR{param}"; + cmdString = $"CBR{param}"; retval = AddCommand(cmdString); + if(retval == eNarumiCommandResult.Success) + { + if (param.Length > 3) + { + var pbschar = param[3];//.Substring(3, 1); + if (pbschar == '2') PBSSensor = eNarmiPBSSensor.on; + else PBSSensor = eNarmiPBSSensor.off; + } + } break; case eAgvCmd.ManualMove: system1.agv_run_manual = true;