initial commit
This commit is contained in:
550
Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs
Normal file
550
Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs
Normal file
@@ -0,0 +1,550 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
DateTime LastSpeakTime = DateTime.Now;
|
||||
DateTime CoverControlTime = DateTime.Now;
|
||||
DateTime LastCommandTime = DateTime.Now;
|
||||
DateTime LastCommandTimeNextStop = DateTime.Now;
|
||||
bool runStepisFirst = false;
|
||||
private void _SM_RUN(Boolean isFirst, TimeSpan stepTime)
|
||||
{
|
||||
//중단기능이 동작이라면 처리하지 않는다.
|
||||
if (PUB.sm.bPause)
|
||||
{
|
||||
System.Threading.Thread.Sleep(200);
|
||||
return;
|
||||
}
|
||||
|
||||
//사용자 스텝처리가 아닌경우에만 검사
|
||||
//if (Pub.flag.get(eFlag.UserStepCheck) == false)
|
||||
{
|
||||
|
||||
//가동불가 조건 확인
|
||||
if (CheckStopCondition() == false)
|
||||
{
|
||||
PUB.sm.SetNewStep(eSMStep.PAUSE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//이머전시상태라면 stop 처리한다.
|
||||
if (PUB.AGV.error.Emergency && PUB.AGV.system1.agv_stop == true &&
|
||||
PUB.AGV.system1.stop_by_front_detect == false)
|
||||
{
|
||||
PUB.Speak(Lang.비상정지로인해작업을중단합니다);
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
}
|
||||
|
||||
//실행스텝보정
|
||||
//if (Pub.sm.runStep == eRunStep.NOTSET && Pub.sm.runStepNew == eRunStep.NOTSET)
|
||||
//{
|
||||
// Pub.sm.setNewRunStep(eRunStep.IDLE);
|
||||
// Pub.log.Add("RUnStep Initialize");
|
||||
//}
|
||||
|
||||
//스텝이 변경되었다면?
|
||||
if (PUB.sm.RunStep != PUB.sm.RunStepNew)
|
||||
{
|
||||
runStepisFirst = true;
|
||||
PUB.sm.ApplyRunStep();
|
||||
}
|
||||
else runStepisFirst = false;
|
||||
|
||||
if (isFirst)
|
||||
{
|
||||
if (PUB.sm.RunStep == ERunStep.READY)
|
||||
VAR.TIME.Set(eVarTime.ReadyStart);
|
||||
else
|
||||
VAR.TIME.Set(eVarTime.RunStart);
|
||||
}
|
||||
|
||||
switch (PUB.sm.RunStep)
|
||||
{
|
||||
case ERunStep.READY:
|
||||
_SM_RUN_READY(runStepisFirst, PUB.sm.GetRunSteptime);
|
||||
break;
|
||||
|
||||
case ERunStep.GOCHARGE: //충전위치로 이동
|
||||
if (runStepisFirst)
|
||||
{
|
||||
VAR.TIME[eVarTime.ChargeTry] = DateTime.Now;
|
||||
PUB.sm.ResetRunStepSeq();
|
||||
PUB.log.Add("충전 명령 시작");
|
||||
}
|
||||
else if (_SM_RUN_GOCHARGE(runStepisFirst, PUB.sm.GetRunSteptime))
|
||||
{
|
||||
//230601
|
||||
//if (PUB.Result != null && PUB.sm != null)
|
||||
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
|
||||
|
||||
PUB.Speak(Lang.충전을시작합니다) ;
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGECHECK);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case ERunStep.CHARGECHECK: //충전중
|
||||
if (runStepisFirst)
|
||||
{
|
||||
VAR.TIME.Set(eVarTime.ChargeStart);
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
else if (_SM_RUN_GOCHARGECHECK(runStepisFirst, PUB.sm.GetRunSteptime))
|
||||
{
|
||||
//충전상태가 활성화되었으므로 대기상태로 전환한다
|
||||
PUB.sm.SetNewRunStep(ERunStep.READY);
|
||||
PUB.log.AddAT("충전상태 확인 완료로 인해 대기 합니다");
|
||||
}
|
||||
break;
|
||||
|
||||
case ERunStep.CHARGEOFF:
|
||||
if (runStepisFirst)
|
||||
{
|
||||
VAR.TIME.Set(eVarTime.ChargeEnd);
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
//충전 상태가 OFF되어야 동작하게한다
|
||||
if (_SM_RUN_CHGOFF(isFirst, stepTime) == true)
|
||||
{
|
||||
//충전상태가 활성화되었으므로 대기상태로 전환한다
|
||||
PUB.sm.ClearRunStep();
|
||||
|
||||
//충전기위치에서 OFF를 한 경우이다
|
||||
if (PUB.Result.CurrentPos != ePosition.CHARGE || PUB.Result.TargetPos != ePosition.CHARGE)
|
||||
{
|
||||
PUB.Result.CurrentPos = ePosition.NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.Result.TargetPos = ePosition.QC;
|
||||
}
|
||||
PUB.Result.CurrentPosCW = "1";
|
||||
PUB.sm.SetNewRunStep(ERunStep.GOHOME);
|
||||
PUB.log.AddAT("충전 해제로 홈으로 이동");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ERunStep.GOUP: //상차이동
|
||||
if (_SM_RUN_GOUP(runStepisFirst, PUB.sm.GetRunSteptime))
|
||||
{
|
||||
PUB.Speak(Lang.상차작업이완료되었습니다);
|
||||
|
||||
//230601
|
||||
// if (PUB.Result != null && PUB.sm != null)
|
||||
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
|
||||
|
||||
//QA를 제외한 경우에는 기본 QC로 이동한다
|
||||
if (PUB.Result.NextPos == ePosition.QA)
|
||||
PUB.Result.TargetPos = ePosition.QA;
|
||||
else
|
||||
PUB.Result.TargetPos = ePosition.QC;
|
||||
|
||||
|
||||
PUB.sm.SetNewRunStep(ERunStep.GODOWN); //하차작업으로 전환
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case ERunStep.GODOWN: //하차이동
|
||||
if (_SM_RUN_GODOWN(runStepisFirst, PUB.sm.GetRunSteptime))
|
||||
{
|
||||
PUB.Speak(Lang.하차작업이완료되었습니다);
|
||||
VAR.TIME.Set(eVarTime.ChargeTry);
|
||||
PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down);// (Device.PLC.ZMotDirection.Down); //하차작업이 완료되면 커버를 내려서 바로 작업할 수 있게 한다.
|
||||
|
||||
//230601
|
||||
//if (PUB.Result != null && PUB.sm != null)
|
||||
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
|
||||
|
||||
//하차가 완료되면 충전대기시간을 30초 남겨두고 없데이트한다
|
||||
//충전이 필요할 경우 바로 될수있도록 220118
|
||||
VAR.TIME[eVarTime.ChargeTry] = DateTime.Now.AddSeconds(-1 * PUB.setting.ChargeRetryTerm + 30);
|
||||
|
||||
if (PUB.Result.CurrentPos == ePosition.QC)
|
||||
{
|
||||
PUB.Speak(Lang.대기상태로전환합니다);
|
||||
PUB.sm.SetNewRunStep(ERunStep.READY);
|
||||
}
|
||||
else
|
||||
{
|
||||
//홈 이동 명령처리
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.Result.TargetPos = ePosition.QC;
|
||||
PUB.sm.SetNewRunStep(ERunStep.GOHOME);
|
||||
PUB.Speak( Lang.홈위치로이동합니다);
|
||||
}
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case ERunStep.GOHOME:
|
||||
if (runStepisFirst)
|
||||
{
|
||||
PUB.Speak(Lang.홈검색을시작합니다);
|
||||
}
|
||||
else if (_SM_RUN_GOHOME(runStepisFirst, PUB.sm.GetRunSteptime))
|
||||
{
|
||||
//230601
|
||||
// if (PUB.Result != null && PUB.sm != null)
|
||||
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
|
||||
|
||||
PUB.Speak(Lang.홈이동완료대기상태로전환합니다);
|
||||
VAR.TIME.Set(eVarTime.ChargeTry);
|
||||
PUB.sm.SetNewRunStep(ERunStep.READY); //대기상태로 전환한다
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckStopCondition()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void CheckAGVMoveTo(eGoDir dir)
|
||||
{
|
||||
//계속내려간다
|
||||
if (dir == eGoDir.Down)
|
||||
{
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (tsCmd.TotalMilliseconds >= 1999)
|
||||
{
|
||||
//현재 동작중인상태에서 방향이 맞지 않다면 일단 움직임을 멈춘다
|
||||
if (PUB.AGV.system1.agv_run)
|
||||
{
|
||||
if (PUB.AGV.data.Direction == 'B')
|
||||
{
|
||||
PUB.log.Add($"방향이 맞지 않아 정지 합니다({dir})");
|
||||
PUB.AGV.AGVMoveStop("CheckAGVMoveTo");
|
||||
}
|
||||
else if (PUB.AGV.data.Speed == 'S')
|
||||
{
|
||||
PUB.log.Add($"마크정지를 해제하기 위해 장비를 멈춥니다");
|
||||
}
|
||||
//이동해야하는데 마크 스탑이 되어있다면 일단 멈춘다
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//움직이지 않으므로 전진하도록 한다
|
||||
PUB.log.Add($"AGV 기동 방향(DOWN):{dir}");
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);//PUB.PLC.Move(Device.PLC.Rundirection.Backward, "UpdateMotionPosition(" + sender + ")");
|
||||
|
||||
}
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (tsCmd.TotalMilliseconds >= 1999)
|
||||
{
|
||||
if (PUB.AGV.system1.agv_run)
|
||||
{
|
||||
if (PUB.AGV.data.Direction == 'F')
|
||||
{
|
||||
PUB.log.Add($"방향이 맞지 않아 정지 합니다({dir})");
|
||||
PUB.AGV.AGVMoveStop("CheckAGVMoveTo");
|
||||
}
|
||||
else if (PUB.AGV.data.Speed == 'S')
|
||||
{
|
||||
PUB.log.Add($"마크정지를 해제하기 위해 장비를 멈춥니다");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.log.Add($"AGV 기동 방향(UP):{dir}");
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);//PUB.PLC.Move(Device.PLC.Rundirection.Backward, "UpdateMotionPosition(" + sender + ")");
|
||||
|
||||
}
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CheckAGVStopbyMARK(string sender)
|
||||
{
|
||||
//계속내려간다
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false || tsCmd.TotalMilliseconds >= 1500)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("CheckAGVStopbyMARK", arDev.Narumi.eStopOpt.MarkStop);
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.log.Add($"[{sender}] MARK신호에 멈춤 설정");
|
||||
}
|
||||
}
|
||||
|
||||
Boolean UpdateMotionPositionForMark(string sender)
|
||||
{
|
||||
//이머전시상태에서는 처리하지 않는다.
|
||||
if (VAR.BOOL[eVarBool.EMERGENCY]) return false;
|
||||
|
||||
//DOWN 작업
|
||||
// if (goDIR == eGoDir.Down)
|
||||
{
|
||||
//1. 현재위치 > 대상위치
|
||||
if (PUB.Result.CurrentPos > PUB.Result.TargetPos)
|
||||
{
|
||||
//계속내려간다
|
||||
if (PUB.setting.AGV_Direction_FVI_Backward)
|
||||
CheckAGVMoveTo(eGoDir.Down);
|
||||
else
|
||||
CheckAGVMoveTo(eGoDir.Up);
|
||||
}
|
||||
//2. 현재위치 < 대상위치
|
||||
else if (PUB.Result.CurrentPos < PUB.Result.TargetPos)
|
||||
{
|
||||
//올라가야한다
|
||||
if (PUB.setting.AGV_Direction_FVI_Backward)
|
||||
CheckAGVMoveTo(eGoDir.Up);
|
||||
else
|
||||
CheckAGVMoveTo(eGoDir.Down);
|
||||
}
|
||||
//3. 현재위치 = 대상위치
|
||||
else
|
||||
{
|
||||
//현재위치가 확정되었는가?
|
||||
var actpos = ctlPos1.GetPositionActive(PUB.Result.CurrentPos);
|
||||
if (actpos == false && PUB.AGV.system1.agv_stop == true)
|
||||
{
|
||||
//위치확정이되지 않았다면 AGV멈춤시에 기동하게 한다.
|
||||
var lastcom = DateTime.Now - LastCommandTime;
|
||||
if (lastcom.TotalSeconds > 3)
|
||||
{
|
||||
if (PUB.Result.CurrentPosCW == "1")
|
||||
{
|
||||
if (PUB.setting.AGV_Direction_FVI_Backward)
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);
|
||||
else
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if (PUB.setting.AGV_Direction_FVI_Backward)
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);
|
||||
else
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);
|
||||
}
|
||||
|
||||
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.logagv.Add($"AGV가 멈춰있다 동작을 재개 합니다");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//마크센서가 들어와잇고, 위치가 act 되어있다면 해당 위치에 있는 것이다
|
||||
if (PUB.AGV.error.Emergency == false &&
|
||||
PUB.AGV.system1.agv_stop &&
|
||||
PUB.AGV.signal.mark_sensor && actpos &&
|
||||
PUB.Result.CurrentPos == PUB.Result.TargetPos)
|
||||
{
|
||||
//PUB.AGV.AGVMoveStop();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (PUB.AGV.system1.agv_stop == true && PUB.AGV.system1.agv_run == false)
|
||||
{
|
||||
PUB.log.Add($"멈춰있으므로 이동을 시작 합니다");
|
||||
if (PUB.Result.CurrentPosCW == "1")
|
||||
{
|
||||
if (PUB.setting.AGV_Direction_FVI_Backward)
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);
|
||||
else
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PUB.setting.AGV_Direction_FVI_Backward)
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);
|
||||
else
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//AGV는 아래로 FVI방향으로 내려가고 있다
|
||||
if (VAR.BOOL[eVarBool.AGVDIR_UP] == false)
|
||||
{
|
||||
if (PUB.Result.CurrentPosCW == "0")
|
||||
{
|
||||
//장비가 마크센서에의해 멈췃다면 완료이다
|
||||
if (PUB.AGV.error.Emergency == false && PUB.AGV.signal.mark_sensor)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("UPdateMotionPositionForMark");
|
||||
return true;
|
||||
}
|
||||
else CheckAGVStopbyMARK(sender);
|
||||
}
|
||||
else if (PUB.Result.CurrentPosCW == "1")
|
||||
{
|
||||
//내려가는 작업이고 AGV는 올라가고 있는데 RFID는 위졲이 감지되었다면 아래로 내려가야한다
|
||||
CheckAGVMoveTo(eGoDir.Up);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.Result.CurrentPosCW = "1";
|
||||
CheckAGVMoveTo(eGoDir.Up);
|
||||
}
|
||||
}
|
||||
//AGV는 Qc방향으로 올라가고 있다
|
||||
else
|
||||
{
|
||||
if (PUB.Result.CurrentPosCW == "1")
|
||||
{
|
||||
//네려가는 방향에서 내려가는 위치가 인식되었다면 마크에서 멈춰야 한다
|
||||
if (PUB.AGV.error.Emergency == false && PUB.AGV.signal.mark_sensor)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("UPdateMotionPositionForMark");
|
||||
return true;
|
||||
}
|
||||
else CheckAGVStopbyMARK(sender);
|
||||
}
|
||||
else if (PUB.Result.CurrentPosCW == "0")
|
||||
{
|
||||
//내려가는 작업이고 AGV는 올라가고 있는데 RFID는 위졲이 감지되었다면 아래로 내려가야한다
|
||||
CheckAGVMoveTo(eGoDir.Down);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.Result.CurrentPosCW = "0";
|
||||
CheckAGVMoveTo(eGoDir.Down);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
//UP 작업
|
||||
//else
|
||||
//{
|
||||
// //1. 현재위치 > 대상위치
|
||||
// if (PUB.Result.CurrentPos > PUB.Result.TargetPos)
|
||||
// {
|
||||
// //계속내려간다
|
||||
// CheckAGVMoveTo(eGoDir.Down);
|
||||
// }
|
||||
// //2. 현재위치 < 대상위치
|
||||
// else if (PUB.Result.CurrentPos < PUB.Result.TargetPos)
|
||||
// {
|
||||
// //올라가야한다
|
||||
// CheckAGVMoveTo(eGoDir.Up);
|
||||
// }
|
||||
// //3. 현재위치 = 대상위치
|
||||
// else
|
||||
// {
|
||||
// //AGV는 위로가고 있다
|
||||
// if (VAR.BOOL[eVarBool.AGVDIR_UP] == true)
|
||||
// {
|
||||
// if (PUB.Result.CurrentPosCW == "0")
|
||||
// {
|
||||
// //장비가 마크센서에의해 멈췃다면 완료이다
|
||||
// if (PUB.AGV.system1.agv_stop && PUB.AGV.system1.stop_by_front_detect == false && PUB.AGV.error.Emergency == false && PUB.AGV.signal.mark_sensor)
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
// else CheckAGVStopbyMARK();
|
||||
// }
|
||||
// else if (PUB.Result.CurrentPosCW == "1")
|
||||
// {
|
||||
// //내려가는 작업이고 AGV는 올라가고 있는데 RFID는 위졲이 감지되었다면 아래로 내려가야한다
|
||||
// CheckAGVMoveTo(eGoDir.Down);
|
||||
// }
|
||||
// }
|
||||
// //AGV는 내려가고 있다
|
||||
// else if (VAR.BOOL[eVarBool.AGVDIR_UP] == false)
|
||||
// {
|
||||
// if (PUB.Result.CurrentPosCW == "1")
|
||||
// {
|
||||
// //네려가는 방향에서 내려가는 위치가 인식되었다면 마크에서 멈춰야 한다
|
||||
// if (PUB.AGV.system1.agv_stop && PUB.AGV.system1.stop_by_front_detect == false && PUB.AGV.error.Emergency == false && PUB.AGV.signal.mark_sensor)
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
// else CheckAGVStopbyMARK();
|
||||
// }
|
||||
// else if (PUB.Result.CurrentPosCW == "0")
|
||||
// {
|
||||
// //내려가는 작업이고 AGV는 올라가고 있는데 RFID는 위졲이 감지되었다면 아래로 내려가야한다
|
||||
// CheckAGVMoveTo(eGoDir.Up);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
Boolean UpdateMotionPositionForCharger(string sender)
|
||||
{
|
||||
if (VAR.BOOL[eVarBool.AGVDIR_UP] == false)// PUB.flag.get(EFlag.FLAG_DIR_BW) == true)
|
||||
{
|
||||
//충전기 검색은 항상 뒤로 검색한다
|
||||
var tsCmd = DateTime.Now - tm_gocharge_command;
|
||||
if (tsCmd.TotalMilliseconds >= 1999 &&
|
||||
PUB.AGV.error.Emergency == false &&
|
||||
PUB.AGV.system1.agv_run == false)
|
||||
{
|
||||
//PUB.PLC.Move(Device.PLC.Rundirection.Backward, "UpdateMotionPosition(" + sender + ")");
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);//
|
||||
tm_gocharge_command = DateTime.Now;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//CCW (역방향 )
|
||||
//if (Pub.Result.RFIDPos < ePosition.CHARGE || Pub.Result.RFIDPos > ePosition.QC)
|
||||
//{
|
||||
// //정상적이라면 RFID값은 QC + 혹은 QC - 에 있어야 하므로 항상 차저보다 높이 있다
|
||||
// //그렇지 않다면 초기화해서 QC검색부터 다시 실행하게 한다
|
||||
// //여기는 비정상 위치 값이다.
|
||||
// Pub.sm.SetStepSeq(1);
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
//현재위치가 충전위치이고, 움직이지 않았다면 완료된 경우라 할수 있따
|
||||
if (PUB.Result.CurrentPos == ePosition.CHARGE &&
|
||||
PUB.AGV.signal.mark_sensor == true)
|
||||
{
|
||||
PUB.log.AddI("충전위치 검색 완료");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
//이동중이지 않다면 항상 이동을 해줘야한다
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (tsCmd.TotalMilliseconds >= 1999 &&
|
||||
PUB.AGV.error.Emergency == false &&
|
||||
PUB.AGV.system1.agv_run == false)
|
||||
{
|
||||
//PUB.PLC.Move(Device.PLC.Rundirection.Backward, "UpdateMotionPosition #1(" + sender + ")");
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);//
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}//cvass
|
||||
}
|
||||
60
Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHGOFF.cs
Normal file
60
Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHGOFF.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
|
||||
public Boolean _SM_RUN_CHGOFF(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
//
|
||||
if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true || PUB.AGV.system1.Battery_charging == true)
|
||||
{
|
||||
if (isFirst)
|
||||
{
|
||||
VAR.TIME.Set(eVarTime.ChargeEnd);
|
||||
if (VAR.BOOL[eVarBool.FLAG_CHARGEONA])
|
||||
{
|
||||
PUB.Speak(Lang.충전을해제합니다);
|
||||
}
|
||||
}
|
||||
|
||||
//AGV는 충전을 해제한 상태이다
|
||||
if (PUB.AGV.system1.Battery_charging == false)
|
||||
{
|
||||
//너무빨리 처리되지 않도록 5초후에 완료 처리를 한다
|
||||
var ts1 = VAR.TIME.RUN(eVarTime.ChargeEnd);
|
||||
var ts2 = VAR.TIME.RUN(eVarTime.SendChargeOff);
|
||||
if (ts1.TotalSeconds >= 5 && ts2.TotalSeconds > 5) VAR.BOOL[eVarBool.FLAG_CHARGEONA] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//OFF전송이 처음이라면 시간 섲렁
|
||||
if (VAR.TIME.IsSet(eVarTime.SendChargeOff)==false)
|
||||
VAR.TIME[eVarTime.SendChargeOff] = DateTime.Now.AddSeconds(-10);
|
||||
|
||||
var tsChgOff = VAR.TIME.RUN(eVarTime.SendChargeOff);
|
||||
if (tsChgOff.TotalSeconds >= 3)
|
||||
{
|
||||
PUB.log.Add("충전 해제 전송");
|
||||
PUB.AGV.AGVCharge(PUB.setting.ChargerID, false);
|
||||
VAR.TIME.Set(eVarTime.SendChargeOff);
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//PUB.logsys.Add($"충전OFF확인완료");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
264
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGE.cs
Normal file
264
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGE.cs
Normal file
@@ -0,0 +1,264 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
DateTime tm_gocharge_command = DateTime.Now;
|
||||
public Boolean _SM_RUN_GOCHARGE(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
if (runStepisFirst)
|
||||
{
|
||||
//홈을 찾도록 항상 위치를 지워버리자
|
||||
PUB.Result.CurrentPos = ePosition.NONE;
|
||||
PUB.Result.CurrentPos = ePosition.NONE;
|
||||
}
|
||||
|
||||
//HW 연결오류
|
||||
if (PUB.AGV.IsOpen == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
else if (PUB.PLC.IsValid == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.PLCCONN, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//충전 상태가 OFF되어야 동작하게한다
|
||||
if (_SM_RUN_CHGOFF(isFirst, stepTime) == false)
|
||||
return false;
|
||||
|
||||
|
||||
//라이더멈춤이 설정되어있다면 음성으로 알려준다 200409
|
||||
if (PUB.AGV.system1.stop_by_front_detect == true)
|
||||
{
|
||||
var tsSpeak = DateTime.Now - LastSpeakTime;
|
||||
if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm)
|
||||
{
|
||||
PUB.Speak(Lang.전방에물체가감지되었습니다);
|
||||
LastSpeakTime = DateTime.Now;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//현재 위치가 결정되어있는지 체크한다
|
||||
if (_SM_RUN_POSCHK(isFirst, stepTime) == false)
|
||||
{
|
||||
PUB.Result.result_message = "충전기 검색 전 현재 위치 검색";
|
||||
PUB.Result.result_progressmax = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
//충전작업진행상태 //220629
|
||||
//if (PUB.flag.get(EFlag.FLAG_GO_CHAGER_TEMP) == false)
|
||||
//{
|
||||
// PUB.flag.set(EFlag.FLAG_GO_CHAGER_TEMP, true);
|
||||
//}
|
||||
|
||||
var idx = 1;
|
||||
if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
PUB.Speak(Lang.충전을위해홈위치로이동합니다);
|
||||
PUB.Result.TargetPos = ePosition.QC;
|
||||
VAR.TIME.Set(eVarTime.ChargeSearch);
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
PUB.log.Add($"충전:대상위치 QC 시작");
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//모션 전후진 제어
|
||||
if (UpdateMotionPositionForMark("GOCHARGE #1") == true)
|
||||
{
|
||||
PUB.log.Add($"충전:충전기 검색 전 QC위치 확인 완료");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
//아직 충진기 위치를 찾지 못했다
|
||||
var ts = VAR.TIME.RUN(eVarTime.ChargeSearch);
|
||||
if (ts.TotalSeconds > PUB.setting.ChargeSearchTime)
|
||||
{
|
||||
PUB.log.Add($"충전:충전검색시간초과({ts.TotalSeconds}/{PUB.setting.ChargeSearchTime})");
|
||||
PUB.Speak(Lang.충전기검색실패);
|
||||
VAR.BOOL[eVarBool.WAIT_CHARGEACK] = false;
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
PUB.counter.CountChargeE += 1;
|
||||
PUB.counter.Save();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
if (PUB.setting.chargerpos == 0) //down search
|
||||
{
|
||||
PUB.log.Add($"충전:충전기 검색을 위한 전진시작");
|
||||
PUB.Speak(Lang.충전기를검색합니다);
|
||||
PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData
|
||||
{
|
||||
Speed = arDev.Narumi.eMoveSpd.Low,
|
||||
Bunki = arDev.Narumi.eBunki.Strate,
|
||||
Direction = arDev.Narumi.eMoveDir.Forward,
|
||||
PBSSensor = 1,
|
||||
});
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);
|
||||
//PUB.Result.TargetPos = ePosition.CHARGE;
|
||||
VAR.TIME.Set(eVarTime.ChargeSearch);
|
||||
}
|
||||
else if (PUB.setting.chargerpos == 2) //up search
|
||||
{
|
||||
PUB.log.Add($"충전:충전기 검색을 위한 전진시작");
|
||||
PUB.Speak(Lang.충전기를검색합니다);
|
||||
PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData
|
||||
{
|
||||
Speed = arDev.Narumi.eMoveSpd.Low,
|
||||
Bunki = arDev.Narumi.eBunki.Strate,
|
||||
Direction = arDev.Narumi.eMoveDir.Backward,
|
||||
PBSSensor = 1,
|
||||
});
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);
|
||||
//PUB.Result.TargetPos = ePosition.CHARGE;
|
||||
VAR.TIME.Set(eVarTime.ChargeSearch);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.log.Add($"충전기위치가 QC위치로 설정되어 있습니다");
|
||||
}
|
||||
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
if (PUB.setting.chargerpos != 1)
|
||||
{
|
||||
if (PUB.AGV.system1.agv_run)
|
||||
{
|
||||
PUB.log.Add($"충전:AGV기동확인으로 마크정지신호설정");
|
||||
PUB.Speak(Lang.다음마크위치에서정지합니다);
|
||||
PUB.AGV.AGVMoveStop("SM_RUN_GOCHARGE", arDev.Narumi.eStopOpt.MarkStop);
|
||||
VAR.TIME.Set(eVarTime.ChargeSearch);
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (VAR.TIME.RUN(eVarTime.ChargeSearch).TotalSeconds > 5)
|
||||
{
|
||||
//5초이상 이곳에서 대기한다면 다시 돌려준다
|
||||
PUB.sm.UpdateRunStepSeq(-1);
|
||||
PUB.log.Add($"충전:AGV기동확인 안됨, 롤백 다시 이동할 수 있게 함");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
VAR.TIME.Set(eVarTime.ChargeSearch);
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
if (PUB.AGV.system1.agv_stop)
|
||||
{
|
||||
PUB.log.Add($"충전:충전기멈춤확인 다음진행");
|
||||
PUB.logagv.Add("충전 위치에 멈췄습니다");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (VAR.TIME.RUN(eVarTime.ChargeSearch).TotalSeconds > 60)
|
||||
{
|
||||
PUB.log.Add($"충전:멈춤 확인 60초 초과로 전체 취소함");
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
PUB.counter.CountChargeE += 1;
|
||||
PUB.counter.Save();
|
||||
VAR.BOOL[eVarBool.WAIT_CHARGEACK] = false;
|
||||
PUB.AddEEDB("충전실패로 인한 취소");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
//충전기위치까지 왔다
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//센서가 안정화되기 위한 5초간 기다려준다
|
||||
if (stepTime.TotalSeconds <= 3) return false;
|
||||
PUB.log.Add($"충전:충전기위치정지완료");
|
||||
PUB.Result.CurrentPos = ePosition.CHARGE; //현재위치를 충전기로 한다
|
||||
PUB.Result.TargetPos = ePosition.CHARGE;
|
||||
PUB.Result.CurrentPosCW = "1";
|
||||
ctlPos1.SetPosition(ePosition.CHARGE);
|
||||
ctlPos1.SetPositionActive(ePosition.CHARGE);
|
||||
ctlPos1.Invalidate();
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//충전시작 명령을 전송한다
|
||||
PUB.log.Add($"충전:충전명령전송");
|
||||
PUB.Speak(Lang.충전시작명령을전송합니다);
|
||||
PUB.AGV.AGVCharge(PUB.setting.ChargerID, true);
|
||||
VAR.BOOL[eVarBool.WAIT_CHARGEACK] = true;
|
||||
LastCommandTime = DateTime.Now;
|
||||
VAR.BYTE[eVarByte.CHARGE_CMDCNT] = 0;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
//충전시작명령의 ACK를 체크합니다
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//충전시작 명령을 전송한다
|
||||
if (PUB.AGV.ACKData.Equals("CBT"))
|
||||
{
|
||||
PUB.log.Add($"충전명령 회신 확인");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalSeconds > 3)
|
||||
{
|
||||
if (VAR.BYTE[eVarByte.CHARGE_CMDCNT] > 5)
|
||||
{
|
||||
PUB.logagv.Add($"충전명령 재전송 5회초과로 전체 취소함");
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
PUB.counter.CountChargeE += 1;
|
||||
PUB.counter.Save();
|
||||
VAR.BOOL[eVarBool.WAIT_CHARGEACK] = false;
|
||||
PUB.AddEEDB("충전실패로 인한 취소");
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.logagv.Add($"충전시작명령 재전송");
|
||||
VAR.BYTE.Add(eVarByte.CHARGE_CMDCNT, 1);
|
||||
PUB.AGV.AGVCharge(PUB.setting.ChargerID, true);
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
58
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGECHECK.cs
Normal file
58
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGECHECK.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
|
||||
public Boolean _SM_RUN_GOCHARGECHECK(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
//충전상태체크를 확인합니다
|
||||
//10초안에 충전 플래그가 활성화되지 않으면 QC상태로 이동한다
|
||||
if (PUB.AGV.system1.Battery_charging == false || VAR.BOOL[eVarBool.FLAG_CHARGEONA] == false)
|
||||
{
|
||||
if (PUB.AGV.error.Charger_pos_error)
|
||||
{
|
||||
PUB.Speak(Lang.충전기위치오류로작업을취소합니다, true);
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
}
|
||||
else if (PUB.AGV.error.Charger_run_error)
|
||||
{
|
||||
PUB.Speak(Lang.충전기위치오류로작업을취소합니다, true);
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
}
|
||||
else
|
||||
{
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (tsCmd.TotalSeconds >= 30)
|
||||
{
|
||||
PUB.log.AddE( Lang.충전기작동확인이오버되어홈으로이동조치합니다);
|
||||
PUB.AGV.AGVCharge(PUB.setting.ChargerID, false);
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.Result.result_message = string.Format("충전기 활성화 수신 확인 중({0:N1}/{1})", tsCmd.TotalSeconds, 30);
|
||||
PUB.Result.result_progressmax = 15;
|
||||
PUB.Result.result_progressvalue = tsCmd.TotalSeconds;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
226
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GODOWN.cs
Normal file
226
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GODOWN.cs
Normal file
@@ -0,0 +1,226 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
public Boolean _SM_RUN_GODOWN(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
if (runStepisFirst)
|
||||
{
|
||||
//PUB.flag.set(EFlag.FLAG_NEXTSTOP_ALIGN, false);
|
||||
VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;//
|
||||
//VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;//);
|
||||
}
|
||||
|
||||
//HW 연결오류
|
||||
if (PUB.AGV.IsOpen == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
else if (PUB.PLC.IsValid == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.PLCCONN, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//충전 상태가 OFF되어야 동작하게한다
|
||||
if (_SM_RUN_CHGOFF(isFirst, stepTime) == false)
|
||||
return false;
|
||||
|
||||
//라이더멈춤이 설정되어있다면 음성으로 알려준다 200409
|
||||
if (PUB.AGV.system1.stop_by_front_detect == true)
|
||||
{
|
||||
var tsSpeak = DateTime.Now - LastSpeakTime;
|
||||
if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm)
|
||||
{
|
||||
PUB.Speak(Lang.전방에물체가감지되었습니다);
|
||||
LastSpeakTime = DateTime.Now;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//현재 위치가 결정되어있는지 체크한다
|
||||
if (_SM_RUN_POSCHK(isFirst, stepTime) == false)
|
||||
return false;
|
||||
|
||||
if (PUB.sm.RunStepSeq == 1)
|
||||
{
|
||||
//하차는 무조건 대상이 QC가 된다
|
||||
if (PUB.Result.TargetPos == ePosition.NONE)
|
||||
PUB.Result.TargetPos = ePosition.QC;
|
||||
|
||||
//if (PUB.Result.TargetPos == ePosition.QA &&
|
||||
// PUB.Result.CurrentPos == ePosition.QC &&
|
||||
// (PUB.PLC.IsLimitDn()))
|
||||
//{
|
||||
// PUB.Speak("안전 커버를 올리고 다시 시도하세요", true);
|
||||
// PUB.sm.ClearRunStep();
|
||||
// PUB.sm.SetNewRunStep(ERunStep.READY);
|
||||
//}
|
||||
PUB.AddEEDB($"하차작업시작({PUB.Result.TargetPos})");
|
||||
PUB.Speak(Lang.하차작업을시작합니다);
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == 2)
|
||||
{
|
||||
//모션 전후진 제어
|
||||
if (UpdateMotionPositionForMark("GODOWN"))
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == 3)
|
||||
{
|
||||
//위치 확정이 완료될때까지 대기
|
||||
if (PUB.Result.CurrentPos == PUB.Result.TargetPos)
|
||||
{
|
||||
//PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GODOWN:위치확정");
|
||||
PUB.AGV.AGVMoveStop("sm_run_godown");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else if (PUB.AGV.system1.agv_run == false)
|
||||
{
|
||||
//움직이지않으면 방향을 다시 조정한다
|
||||
PUB.sm.SetStepSeq(2);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == 4)
|
||||
{
|
||||
//대상까지 모두 완료되었다.(완전히 정차할때까지 기다린다)
|
||||
if (PUB.AGV.system1.agv_run == false)
|
||||
{
|
||||
PUB.log.Add("이동 정지 확인");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == 5)
|
||||
{
|
||||
//하차수량증가
|
||||
if (PUB.Result.TargetPos == ePosition.QA)
|
||||
PUB.counter.CountQA += 1;
|
||||
else
|
||||
PUB.counter.CountQC += 1;
|
||||
PUB.counter.Save();
|
||||
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == 6)
|
||||
{
|
||||
//커버를 자동으로 내려준다
|
||||
CoverControlTime = DateTime.Now;
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를내립니다);
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = true;
|
||||
PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down);//
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == 7)
|
||||
{
|
||||
//커버 내림이 완료될때까지 기다린다
|
||||
if (PUB.PLC.IsLimitDn() == true)
|
||||
{
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = false;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
//경과시간이 10초가 지나면 5초마다 음성을 출력한다
|
||||
var tsCover = DateTime.Now - CoverControlTime;
|
||||
if (tsCover.TotalSeconds >= 7)
|
||||
{
|
||||
PUB.Speak(Lang.안전커버를내려주세요);
|
||||
CoverControlTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == 8)
|
||||
{
|
||||
//IO업데이트 간격 전송
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를올려주세요);
|
||||
PUB.Speak(Lang.안전커버를올리면하차가완료됩니다);
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_UP] = true;
|
||||
CoverControlTime = DateTime.Now;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == 9)
|
||||
{
|
||||
//커버 올림이 완료될때까지 기다린다
|
||||
if (VAR.BOOL[eVarBool.FLAG_LIMITHIGH] == true)
|
||||
{
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_UP] = false;
|
||||
VAR.BOOL[eVarBool.ITEMON] = false;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
//경과시간이 10초가 지나면 5초마다 음성을 출력한다
|
||||
var tsCover = DateTime.Now - CoverControlTime;
|
||||
if (tsCover.TotalSeconds >= PUB.setting.doorSoundTerm)
|
||||
{
|
||||
PUB.Speak(Lang.안전커버를올려주세요);
|
||||
CoverControlTime = DateTime.Now;
|
||||
|
||||
//한쪽이 올라가 있는 상태에..
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == true)
|
||||
{
|
||||
//모터는 올리는 방향일때에...
|
||||
if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LDIR) == true)
|
||||
{
|
||||
//모터가 멈춰있을때에..
|
||||
if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LRUN) == false)
|
||||
{
|
||||
//자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음)
|
||||
|
||||
//왼쪽이 올라가 있지 않은 경우
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == false)
|
||||
PUB.PLC.ZMot_Left(arDev.FakePLC.ZMotDirection.Up);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == true)
|
||||
{
|
||||
//모터는 올리는 방향일때에...
|
||||
if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RDIR) == true)
|
||||
{
|
||||
//모터가 멈춰있을때에..
|
||||
if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RRUN) == false)
|
||||
{
|
||||
//자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음)
|
||||
|
||||
//왼쪽이 올라가 있지 않은 경우
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == false)
|
||||
PUB.PLC.ZMot_Right(arDev.FakePLC.ZMotDirection.Up);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
PUB.AddEEDB($"하차작업완료({PUB.Result.TargetPos})");
|
||||
EEMStatus.AddStatusCount(1, PUB.Result.TargetPos.ToString()); //230620
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
94
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOHOME.cs
Normal file
94
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOHOME.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
public Boolean _SM_RUN_GOHOME(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
if (runStepisFirst)
|
||||
{
|
||||
// PUB.flag.set(EFlag.FLAG_NEXTSTOP_ALIGN, false);
|
||||
|
||||
//VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;//);
|
||||
VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;//);
|
||||
}
|
||||
|
||||
//220629
|
||||
// if(PUB.flag.get(EFlag.FLAG_GO_CHAGER_TEMP))
|
||||
//{
|
||||
// PUB.flag.set(EFlag.FLAG_GO_CHAGER_TEMP, false);
|
||||
//}
|
||||
|
||||
//HW 연결오류
|
||||
if (PUB.AGV.IsOpen == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
else if (PUB.PLC.IsValid == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.PLCCONN, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//충전 상태가 OFF되어야 동작하게한다
|
||||
if (_SM_RUN_CHGOFF(isFirst, stepTime) == false)
|
||||
return false;
|
||||
|
||||
//라이더멈춤이 설정되어있다면 음성으로 알려준다 200409
|
||||
if (PUB.AGV.system1.stop_by_front_detect == true)
|
||||
{
|
||||
var tsSpeak = DateTime.Now - LastSpeakTime;
|
||||
if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm)
|
||||
{
|
||||
PUB.Speak(Lang.전방에물체가감지되었습니다);
|
||||
LastSpeakTime = DateTime.Now;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//현재 위치가 결정되어있는지 체크한다
|
||||
if (_SM_RUN_POSCHK(isFirst, stepTime) == false)
|
||||
return false;
|
||||
|
||||
var idx = 1;
|
||||
if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
PUB.Speak(Lang.홈으로이동합니다);
|
||||
|
||||
//홈은 무조건 QC위치로 간다
|
||||
PUB.AddEEDB($"홈검색시작({PUB.Result.TargetPos})");
|
||||
PUB.Result.TargetPos = ePosition.QC;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//모션 전후진 제어
|
||||
if (UpdateMotionPositionForMark("GOHOME"))
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("SM_RUN_GOHOME");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//QC까지 모두 완료되었다.(완전히 정차할때까지 기다린다)
|
||||
PUB.Speak(Lang.홈검색완료, true);
|
||||
PUB.AddEEDB($"홈검색완료({PUB.Result.TargetPos})");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
272
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOUP.cs
Normal file
272
Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOUP.cs
Normal file
@@ -0,0 +1,272 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
|
||||
public Boolean _SM_RUN_GOUP(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
if (runStepisFirst)
|
||||
{
|
||||
// VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;//);
|
||||
VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;
|
||||
}
|
||||
|
||||
//HW 연결오류
|
||||
if (PUB.AGV.IsOpen == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
else if (PUB.PLC.IsValid == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.PLCCONN, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//충전 상태가 OFF되어야 동작하게한다
|
||||
if (_SM_RUN_CHGOFF(isFirst, stepTime) == false)
|
||||
return false;
|
||||
|
||||
//라이더멈춤이 설정되어있다면 음성으로 알려준다 200409
|
||||
if (PUB.AGV.system1.stop_by_front_detect == true)
|
||||
{
|
||||
var tsSpeak = DateTime.Now - LastSpeakTime;
|
||||
if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm)
|
||||
{
|
||||
PUB.Speak(Lang.전방에물체가감지되었습니다);
|
||||
LastSpeakTime = DateTime.Now;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//현재 위치가 결정되어있는지 체크한다
|
||||
if (_SM_RUN_POSCHK(isFirst, stepTime) == false)
|
||||
return false;
|
||||
|
||||
var idx = 1;
|
||||
if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//상차 가능 조건 확인
|
||||
if (PUB.Result.TargetPos == ePosition.NONE)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.Hardware, eECode.NOTALLOWUP, eNextStep.ERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.AddEEDB($"상차작업시작({PUB.Result.TargetPos})");
|
||||
PUB.Speak(Lang.상차작업을시작합니다);
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//모션 전후진 제어
|
||||
if (UpdateMotionPositionForMark("GOUP"))
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//장비멈춤확인
|
||||
if (PUB.AGV.system1.agv_run == true)
|
||||
{
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalMilliseconds > 2000)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//움직이지 않고 있다면 다시 이동을 시켜준다.
|
||||
PUB.log.Add("이동 정지 확인");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
if (PUB.AGV.system1.agv_run == true)
|
||||
{
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalMilliseconds > 2000)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
//커버를 자동으로 내려준다
|
||||
CoverControlTime = DateTime.Now;
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를내립니다);
|
||||
PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down);
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = true;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
if (PUB.AGV.system1.agv_run == true)
|
||||
{
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalMilliseconds > 2000)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//커버 내림이 완료될때까지 기다린다
|
||||
if (PUB.PLC.IsLimitDn() == true)
|
||||
{
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = false;
|
||||
PUB.Result.NextPos = ePosition.NONE;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
//경과시간이 10초가 지나면 5초마다 음성을 출력한다
|
||||
var tsCover = DateTime.Now - CoverControlTime;
|
||||
if (tsCover.TotalSeconds >= 7)
|
||||
{
|
||||
PUB.Speak(Lang.안전커버를내려주세요);
|
||||
CoverControlTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
if (PUB.AGV.system1.agv_run == true)
|
||||
{
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalMilliseconds > 2000)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//상차는 여기서 수량확인한다
|
||||
if (PUB.Result.TargetPos == ePosition.F1)
|
||||
PUB.counter.CountUp1 += 1;
|
||||
else if (PUB.Result.TargetPos == ePosition.F2)
|
||||
PUB.counter.CountUp2 += 1;
|
||||
else if (PUB.Result.TargetPos == ePosition.F3)
|
||||
PUB.counter.CountUp3 += 1;
|
||||
else if (PUB.Result.TargetPos == ePosition.F4)
|
||||
PUB.counter.CountUp4 += 1;
|
||||
//else if (PUB.Result.TargetPos == ePosition.QA)
|
||||
// PUB.counter.CountQA += 1;
|
||||
PUB.counter.Save();
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
|
||||
//IO업데이트 간격 전송
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를올려주세요);
|
||||
PUB.Speak(Lang.안전커버를올리면상차가완료됩니다);
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_UP] = true;
|
||||
PUB.Result.NextPos = ePosition.NONE;
|
||||
CoverControlTime = DateTime.Now;
|
||||
return false;
|
||||
}
|
||||
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
if (PUB.AGV.system1.agv_run == true)
|
||||
{
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalMilliseconds > 2000)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//커버 올림이 완료될때까지 기다린다
|
||||
if (VAR.BOOL[eVarBool.FLAG_LIMITHIGH] == true)
|
||||
{
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_UP] = false;
|
||||
VAR.BOOL[eVarBool.ITEMON] = true;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
//경과시간이 10초가 지나면 5초마다 음성을 출력한다
|
||||
var tsCover = DateTime.Now - CoverControlTime;
|
||||
if (tsCover.TotalSeconds >= PUB.setting.doorSoundTerm)
|
||||
{
|
||||
PUB.Speak(Lang.안전커버를올려주세요);
|
||||
CoverControlTime = DateTime.Now;
|
||||
|
||||
//한쪽이 올라가 있는 상태에..
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == true)
|
||||
{
|
||||
//모터는 올리는 방향일때에...
|
||||
if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LDIR) == true)
|
||||
{
|
||||
//모터가 멈춰있을때에..
|
||||
if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LRUN) == false)
|
||||
{
|
||||
//자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음)
|
||||
|
||||
//왼쪽이 올라가 있지 않은 경우
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == false)
|
||||
PUB.PLC.ZMot_Left(arDev.FakePLC.ZMotDirection.Up);
|
||||
|
||||
//오른쪽이 올라가 있지 않은 경우
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == false)
|
||||
PUB.PLC.ZMot_Right(arDev.FakePLC.ZMotDirection.Up);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == true)
|
||||
{
|
||||
//모터는 올리는 방향일때에...
|
||||
if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RDIR) == true)
|
||||
{
|
||||
//모터가 멈춰있을때에..
|
||||
if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RRUN) == false)
|
||||
{
|
||||
//자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음)
|
||||
|
||||
//왼쪽이 올라가 있지 않은 경우
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == false)
|
||||
PUB.PLC.ZMot_Left(arDev.FakePLC.ZMotDirection.Up);
|
||||
|
||||
//오른쪽이 올라가 있지 않은 경우
|
||||
if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == false)
|
||||
PUB.PLC.ZMot_Right(arDev.FakePLC.ZMotDirection.Up);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
PUB.AddEEDB($"상차작업완료({PUB.Result.TargetPos})");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
121
Cs_HMI/Project/StateMachine/Step/_SM_RUN_INIT.cs
Normal file
121
Cs_HMI/Project/StateMachine/Step/_SM_RUN_INIT.cs
Normal file
@@ -0,0 +1,121 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
/// <summary>
|
||||
/// 웨이퍼를 집기 위해 지정된 위치로 이동을 합니다.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool _SM_RUN_INIT(Boolean firstRun, TimeSpan RunTime)
|
||||
{
|
||||
//result message
|
||||
int progress = 0;
|
||||
var ProgressMax = 13;
|
||||
|
||||
//setting socket
|
||||
UpdateProgressStatus(++progress, ProgressMax, "소켓 초기화"); System.Threading.Thread.Sleep(5);
|
||||
if (PUB.sock_debug.Listen(PUB.setting.listenPort))
|
||||
PUB.log.AddI("Socket Listen : " + PUB.setting.listenPort);
|
||||
else
|
||||
PUB.log.AddE("Socket Listen : " + PUB.sock_debug.errorMessage);
|
||||
|
||||
|
||||
//UpdateProgressStatus(++progress, ProgressMax, "PLC 확인"); System.Threading.Thread.Sleep(5);
|
||||
//if (PUB.setting.Port_PLC != "")
|
||||
//{
|
||||
// if (PUB.PLC.Init(PUB.setting.Port_PLC, PUB.setting.Baud_PLC))
|
||||
// {
|
||||
// //VAR.BOOL[eVarBool.FLAG_SETUP] = true;
|
||||
// PUB.log.Add("Entering Setup Mode (Main)");
|
||||
// }
|
||||
// else PUB.log.AddE("PLC Init error : " + PUB.PLC.GetErrorMessage());
|
||||
//}
|
||||
|
||||
//UpdateProgressStatus("PLC #2 확인", ++progress, ProgressMax); System.Threading.Thread.Sleep(5);
|
||||
//if (Pub.setting.Port_PLC2 != "")
|
||||
//{
|
||||
// if (Pub.plcS.Init(Pub.setting.Port_PLC2, Pub.setting.Baud_plc2))
|
||||
// {
|
||||
// Pub.plcS.SetFlag(Device.PLC2.PLCFlag.FLAG_SETUP, true);
|
||||
// Pub.log.Add("Entering Setup Mode (Sub)");
|
||||
// }
|
||||
// else Pub.log.AddE("DIO #S Init error : " + Pub.plcS.GetErrorMessage());
|
||||
//}
|
||||
|
||||
//setting Port_Xbee
|
||||
//UpdateProgressStatus(++progress, ProgressMax, "Port_Xbee 확인"); System.Threading.Thread.Sleep(5);
|
||||
//if (PUB.setting.Port_XBE.isEmpty() == false)
|
||||
//{
|
||||
// PUB.XBE.PortName = PUB.setting.Port_XBE;
|
||||
// if (PUB.XBE.Open() == false)
|
||||
// PUB.log.AddE(string.Format("Barcode Port({0}) Open Error: {1}", PUB.setting.Port_XBE, PUB.XBE.errorMessage));
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// PUB.log.AddAT("NOT-SET Port_Xbee PORTNAME");
|
||||
// PUB.XBE.errorMessage = "NOT-SET Port_Xbee PORTNAME";
|
||||
//}
|
||||
|
||||
////setting Port_Xbee
|
||||
//UpdateProgressStatus(++progress, ProgressMax, "Port_AGV 확인"); System.Threading.Thread.Sleep(5);
|
||||
//if (PUB.setting.Port_AGV.isEmpty() == false)
|
||||
//{
|
||||
// PUB.AGV.PortName = PUB.setting.Port_AGV;
|
||||
// PUB.AGV.BaudRate = PUB.setting.Baud_AGV;
|
||||
// if (PUB.AGV.Open() == false)
|
||||
// PUB.log.AddE(string.Format("RFID Host:{0} Open Error: {1}", PUB.setting.Port_AGV, PUB.AGV.errorMessage));
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// PUB.log.AddAT("NOT-SET Port_AGV PORTNAME");
|
||||
// PUB.AGV.errorMessage = "NOT-SET Port_AGV PORTNAME";
|
||||
//}
|
||||
|
||||
|
||||
////setting Port_Xbee
|
||||
//UpdateProgressStatus(++progress, ProgressMax, "Port_BMS 확인"); System.Threading.Thread.Sleep(5);
|
||||
//if (!PUB.setting.Port_BAT.isEmpty())
|
||||
//{
|
||||
// PUB.BAT.PortName = PUB.setting.Port_BAT;//.Port_BMS;
|
||||
// PUB.BAT.BaudRate = PUB.setting.Baud_BAT;//
|
||||
// PUB.BAT.ScanInterval = 1000;// Pub.setting.interval_bms;
|
||||
// var binit_bms = PUB.BAT.Open();
|
||||
// if (binit_bms == false) PUB.log.AddE(string.Format("binit_bms Port({0}) Open Error: {1}", PUB.setting.Port_BAT, PUB.BAT.errorMessage));
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// PUB.log.AddAT("NOT-SET binit_bms PORTNAME");
|
||||
//}
|
||||
|
||||
//남은 공간
|
||||
UpdateProgressStatus(++progress, ProgressMax, "공간 확인"); System.Threading.Thread.Sleep(5);
|
||||
CheckFreeSpace(); //181225
|
||||
|
||||
//시스템 오류가 있다면 경고 메시지를 표싷ㄴ다.
|
||||
UpdateProgressStatus(++progress, ProgressMax, "오류 수집"); System.Threading.Thread.Sleep(5);
|
||||
//var AlertMessage = new System.Text.StringBuilder();
|
||||
//if (Pub.Xbee.IsInit == false) AlertMessage.AppendLine(string.Format("BARCODE : {0}", Pub.Xbee.errorMessage));
|
||||
if (freeSpaceRate < PUB.setting.AutoDeleteThreshold)
|
||||
{
|
||||
PUB.Speak(string.Format("디스크 용량이 {0:N0}% 남았습니다", freeSpaceRate));
|
||||
}
|
||||
|
||||
//if (AlertMessage.Length > 1)
|
||||
//{
|
||||
// AlertMessage.Insert(0, "SYSTEM ALERT\n");
|
||||
// Pub.popup.setMessage(AlertMessage.ToString());
|
||||
//}
|
||||
|
||||
UpdateProgressStatus(++progress, ProgressMax, "--"); System.Threading.Thread.Sleep(5);
|
||||
PUB.log.Add("초기화 완료");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
54
Cs_HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs
Normal file
54
Cs_HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
public Boolean _SM_RUN_POSCHK(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
//현재 위치가 찾아지지 않았다면. 먼저 위치를 찾는다. 위로 이동시켜서 찾는다.
|
||||
if (PUB.Result.CurrentPos == ePosition.NONE)
|
||||
{
|
||||
if (isFirst)
|
||||
{
|
||||
PUB.Speak( Lang.현재위치를검색합니다);
|
||||
}
|
||||
|
||||
if (PUB.AGV.system1.agv_run)
|
||||
{
|
||||
//방향을 체크한다
|
||||
var basedir = PUB.setting.AGV_Direction_FVI_Backward ? 'F' : 'B';
|
||||
if (PUB.AGV.data.Direction == basedir)
|
||||
{
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalMilliseconds >= 1999)
|
||||
{
|
||||
PUB.AGV.AGVMoveStop("SM_RUN_POSCHK",arDev.Narumi.eStopOpt.Stop);
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (PUB.AGV.system1.agv_run == false)
|
||||
{
|
||||
//전진이동한다
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalMilliseconds >= 1999)
|
||||
{
|
||||
if (PUB.setting.AGV_Direction_FVI_Backward)
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);//
|
||||
else
|
||||
PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);//
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
144
Cs_HMI/Project/StateMachine/Step/_SM_RUN_READY.cs
Normal file
144
Cs_HMI/Project/StateMachine/Step/_SM_RUN_READY.cs
Normal file
@@ -0,0 +1,144 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using COMM;
|
||||
using static Project.StateMachine;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
public Boolean _SM_RUN_READY(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
//이동 불가 조건이 걸려있다면 충전을 하지 못하게 한다.
|
||||
Boolean bAutoChageOn = true;
|
||||
if (PUB.AGV.system1.stop_by_front_detect) bAutoChageOn = false;
|
||||
else if (PUB.AGV.error.Emergency) bAutoChageOn = false;
|
||||
else if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) bAutoChageOn = false;
|
||||
else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) bAutoChageOn = false;
|
||||
|
||||
|
||||
//자동 충전 중이라면 최대 충전시간과 레벨을 체크한다
|
||||
if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true)
|
||||
{
|
||||
if (VAR.TIME.IsSet(eVarTime.ChargeStart) == false)
|
||||
VAR.TIME.Set(eVarTime.ChargeStart);
|
||||
|
||||
//충전중이라면 최대 충전 시간을 체크한다.
|
||||
var tsChargeRunTime = VAR.TIME.RUN(eVarTime.ChargeStart);
|
||||
if (PUB.BMS.Current_Level >= PUB.setting.ChargeMaxLevel)
|
||||
{
|
||||
PUB.AGV.AGVCharge(PUB.setting.ChargerID, false);
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
PUB.log.Add($"최대충전레벨 OVER로 인한 자동 해제(레벨:{PUB.setting.ChargeMaxLevel})");
|
||||
PUB.AddEEDB($"최대충전레벨 OVER로 인한 자동 해제(레벨:{PUB.setting.ChargeMaxLevel})");
|
||||
PUB.Speak(Lang.충전완료로해제합니다);
|
||||
}
|
||||
else if (PUB.setting.ChargeMaxTime > 1 && tsChargeRunTime.TotalSeconds >= PUB.setting.ChargeMaxTime)
|
||||
{
|
||||
PUB.AGV.AGVCharge(PUB.setting.ChargerID, false);
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
PUB.log.Add($"최대충전시간 OVER로 인한 자동 해제(시간:{PUB.setting.ChargeMaxTime})");
|
||||
PUB.AddEEDB($"최대충전시간 OVER로 인한 자동 해제(시간:{PUB.setting.ChargeMaxTime})");
|
||||
PUB.Speak(Lang.충전완료로해제합니다);
|
||||
}
|
||||
VAR.STR[eVarString.ChargeCheckMsg] = "자동 충전 중";
|
||||
}
|
||||
else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true)
|
||||
{
|
||||
if (VAR.TIME.IsSet(eVarTime.ChargeStart) == false)
|
||||
VAR.TIME.Set(eVarTime.ChargeStart);
|
||||
VAR.STR[eVarString.ChargeCheckMsg] = "수동 충전";
|
||||
}
|
||||
|
||||
//현재위치를 모르는 상태라면 이동하여 현재 위치를 찾는다
|
||||
else if (PUB.Result.CurrentPos == ePosition.NONE)
|
||||
{
|
||||
if (PUB.AGV.system1.agv_run == false &&
|
||||
PUB.AGV.error.Emergency == false &&
|
||||
PUB.AGV.error.runerror_by_no_magent_line == false)
|
||||
{
|
||||
//현재위치를 검색해야함
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.GOHOME);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
PUB.AddEEDB($"READY상태에서 현재위치를 몰라 홈으로 이동");
|
||||
}
|
||||
VAR.STR[eVarString.ChargeCheckMsg] = "현재 위치 모름";
|
||||
}
|
||||
else if (PUB.setting.Enable_AutoCharge == true )
|
||||
{
|
||||
if(bAutoChageOn)
|
||||
{
|
||||
VAR.BOOL[eVarBool.CHARGE_READY] = true;
|
||||
if (PUB.BMS.Current_Level < PUB.setting.ChargeStartLevel)
|
||||
{
|
||||
//레벨에 의한 자동 충전간격은
|
||||
var ts = VAR.TIME.RUN(eVarTime.ChargeTry);
|
||||
if (ts.TotalSeconds >= PUB.setting.ChargeRetryTerm)
|
||||
{
|
||||
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
|
||||
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
|
||||
PUB.log.Add($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
|
||||
PUB.sm.ClearRunStep();
|
||||
PUB.sm.SetNewRunStep(ERunStep.GOCHARGE);
|
||||
PUB.sm.SetNewStep(eSMStep.RUN);
|
||||
PUB.AddEEDB($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
|
||||
}
|
||||
else
|
||||
{
|
||||
VAR.I32[eVarInt32.ChargeWaitSec] = (int)(PUB.setting.ChargeRetryTerm - ts.TotalSeconds);
|
||||
VAR.BOOL[eVarBool.CHARGE_WAIT] = true;
|
||||
}
|
||||
VAR.STR[eVarString.ChargeCheckMsg] = "배터리 충전 레벨 필요";
|
||||
}
|
||||
else
|
||||
{
|
||||
//아직 레벨이 높다
|
||||
VAR.BOOL[eVarBool.CHARGE_READY] = false;
|
||||
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
|
||||
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
|
||||
VAR.STR[eVarString.ChargeCheckMsg] = "배터리 레벨상 충전 불필요";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
VAR.BOOL[eVarBool.CHARGE_READY] = false;
|
||||
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
|
||||
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
|
||||
VAR.STR[eVarString.ChargeCheckMsg] = "충전 불가 조건";
|
||||
//충전조건이 맞지 않는다
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
VAR.BOOL[eVarBool.CHARGE_READY] = false;
|
||||
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
|
||||
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
|
||||
//자동충전이 해제된 상태이므로 처리하지 않는다
|
||||
VAR.STR[eVarString.ChargeCheckMsg] = "자동 충전 해제 됨";
|
||||
}
|
||||
|
||||
//대기모드에서는 움직이지 않게 한다
|
||||
if(PUB.AGV.system1.agv_run)
|
||||
{
|
||||
var ts = VAR.TIME.RUN(eVarTime.IdleStopTime);
|
||||
if(ts.TotalSeconds > 1)
|
||||
{
|
||||
PUB.log.Add($"대기상태에서는 정차");
|
||||
PUB.AGV.AGVMoveStop("대기상태에서는 정차");
|
||||
VAR.TIME.Set(eVarTime.IdleStopTime);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
163
Cs_HMI/Project/StateMachine/Step/_SM_RUN_RESET.cs
Normal file
163
Cs_HMI/Project/StateMachine/Step/_SM_RUN_RESET.cs
Normal file
@@ -0,0 +1,163 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
public Boolean _SM_RUN_RESET(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
if (runStepisFirst)
|
||||
{
|
||||
PUB.Speak(Lang.장비상태초기화);
|
||||
|
||||
//충전기검색시퀀스 OFF
|
||||
//PUB.flag.set(EFlag.FLAG_GO_CHAGER_TEMP, false);
|
||||
}
|
||||
|
||||
var idx = 1;
|
||||
if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//충전중이라면 충전off코드를 넣는다
|
||||
PUB.AGV.AGVCharge(PUB.setting.ChargerID, false,PUB.setting.ChargetWaitSec);
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.AddEEDB($"초기화");
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, "SYNC : 수동 모드 확인 중");
|
||||
if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false)
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
else
|
||||
{
|
||||
//일정시간동안 명령을 재전송한다
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (tsCmd.TotalMilliseconds >= 1999)
|
||||
{
|
||||
VAR.BOOL[eVarBool.FLAG_AUTORUN] = false;
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//모션을 멈춥니다
|
||||
//PUB.PLC.Move(Device.PLC.Rundirection.Stop,"RESET");
|
||||
PUB.AGV.AGVMoveStop("_sm_run_reset");
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//모션이 멈출때까지 기다린다
|
||||
if (PUB.AGV.system1.agv_stop == false)
|
||||
{
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
//모션이 멈추지 않는다면 멈춤코드를 계속 넣는다
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (tsCmd.TotalMilliseconds >= 1999)
|
||||
{
|
||||
//PUB.PLC.Move(Device.PLC.Rundirection.Stop,"RESET(Re)");
|
||||
PUB.AGV.AGVMoveStop("_sm_run_reset");
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//대상위치 초기화
|
||||
PUB.Result.TargetPos = ePosition.NONE;
|
||||
PUB.Result.CurrentPos = ePosition.NONE;
|
||||
PUB.Result.CurrentPosCW = "0";
|
||||
ctlPos1.SetPositionDeActive();
|
||||
ctlPos1.SetPosition(ePosition.NONE);
|
||||
ctlPos1.SetDirection("0");
|
||||
ctlPos1.Invalidate();
|
||||
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//자동 스탑 플래그 해제
|
||||
//VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;//"reset #6");
|
||||
VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;
|
||||
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, "자동멈춤해제(ALIGN)");
|
||||
if (VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] == false)
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
else
|
||||
{
|
||||
//일정시간동안 명령을 재전송한다
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (tsCmd.TotalMilliseconds >= 1999)
|
||||
{
|
||||
VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;// "reset #7");
|
||||
//VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;//
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//자동 스탑 플래그 해제
|
||||
//VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;// "reset #8");
|
||||
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//설정모드가 되어있다면 해제 해준다
|
||||
VAR.BOOL[eVarBool.FLAG_SETUP] = false;
|
||||
VAR.BOOL[eVarBool.ITEMON] = false;
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = false;
|
||||
VAR.BOOL[eVarBool.WAIT_COVER_UP] = false;
|
||||
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, "설정모드해제(MARK)");
|
||||
|
||||
if (VAR.BOOL[eVarBool.FLAG_SETUP] == false)
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
else
|
||||
{
|
||||
//일정시간동안 명령을 재전송한다
|
||||
var tsCmd = DateTime.Now - LastCommandTime;
|
||||
if (tsCmd.TotalMilliseconds >= 1999)
|
||||
{
|
||||
VAR.BOOL[eVarBool.FLAG_SETUP] = false;
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
148
Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs
Normal file
148
Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs
Normal file
@@ -0,0 +1,148 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
using COMM;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
Dictionary<string, string> synlist;
|
||||
int synidx;
|
||||
public Boolean _SM_RUN_SYNC(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
var idx = 1;
|
||||
if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
// return true;
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, "SYNC : 장치 연결(MAIN) 확인 중");
|
||||
if (PUB.AGV.IsOpen == false)
|
||||
{
|
||||
//agv connect
|
||||
ConnectSerialPort(PUB.AGV, PUB.setting.Port_AGV, PUB.setting.Baud_AGV,
|
||||
eVarTime.LastConn_AGV, eVarTime.LastConnTry_AGV, eVarTime.LastRecv_AGV);
|
||||
}
|
||||
else if (PUB.AGV.IsValid == true)
|
||||
{
|
||||
//설정모드 진입
|
||||
VAR.BOOL[eVarBool.FLAG_SETUP] = true;
|
||||
LastCommandTime = DateTime.Now;
|
||||
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
else
|
||||
{
|
||||
UpdateProgressStatus(stepTime.TotalMilliseconds, 10000.0, "wait");
|
||||
if (stepTime.TotalSeconds >= 10)
|
||||
{
|
||||
PUB.log.AddE("시간초과로 인해 Sync 작업이 실패되었습니다");
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//동기화 명령 생성
|
||||
synlist = new Dictionary<string, string>();
|
||||
synlist.Add("SSH", PUB.setting.SPD_H.ToString("0000")); // PUB.AGV.AGVCommand(item.Key, item.Value);
|
||||
synlist.Add("SSM", PUB.setting.SPD_M.ToString("0000"));
|
||||
synlist.Add("SSL", PUB.setting.SPD_L.ToString("0000"));
|
||||
|
||||
synlist.Add("SSS", PUB.setting.SPD_S.ToString("0000"));
|
||||
synlist.Add("SRS", PUB.setting.SPD_R.ToString("0000"));
|
||||
|
||||
synlist.Add("SPK", PUB.setting.PID_PH.ToString("0000"));
|
||||
synlist.Add("SPM", PUB.setting.PID_PM.ToString("0000"));
|
||||
synlist.Add("SPL", PUB.setting.PID_PL.ToString("0000"));
|
||||
|
||||
synlist.Add("SIK", PUB.setting.PID_IH.ToString("0000"));
|
||||
synlist.Add("SIM", PUB.setting.PID_IM.ToString("0000"));
|
||||
synlist.Add("SIL", PUB.setting.PID_IL.ToString("0000"));
|
||||
|
||||
synlist.Add("SDK", PUB.setting.PID_DH.ToString("0000"));
|
||||
synlist.Add("SDM", PUB.setting.PID_DM.ToString("0000"));
|
||||
synlist.Add("SDL", PUB.setting.PID_DL.ToString("0000"));
|
||||
|
||||
synlist.Add("SPS", PUB.setting.PID_PS.ToString("0000"));
|
||||
synlist.Add("SIS", PUB.setting.PID_IS.ToString("0000"));
|
||||
synlist.Add("SDS", PUB.setting.PID_DS.ToString("0000"));
|
||||
|
||||
//추가 230110
|
||||
synlist.Add("SCK", PUB.setting.SCK.ToString("0000"));
|
||||
synlist.Add("SSK", PUB.setting.SSK.ToString("0000"));
|
||||
synlist.Add("STT", PUB.setting.STT.ToString("0000"));
|
||||
//synlist.Add("SBN", PUB.setting.ChargerID.ToString("0000"));
|
||||
|
||||
PUB.AddEEDB($"SYNC시작({PUB.Result.TargetPos})");
|
||||
|
||||
synidx = 0;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//잠시 대기
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
if (ts.TotalSeconds > 0.15)
|
||||
{
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
//통신 확인되었으므로 스피드를 전송한다.
|
||||
if (synidx < synlist.Count)
|
||||
{
|
||||
var item = synlist.ElementAt(synidx);
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, $"SYNC :{item.Key}");
|
||||
PUB.AGV.AGVCommand(item.Key, item.Value);
|
||||
}
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
if (synidx < synlist.Count)
|
||||
{
|
||||
var ts = DateTime.Now - LastCommandTime;
|
||||
var item = synlist.ElementAt(synidx);
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, $"SYNC 변경 확인 중 :{item.Key}");
|
||||
if (PUB.AGV.ACKData.Equals(item.Key))
|
||||
{
|
||||
synidx += 1;
|
||||
if(ts.TotalSeconds < 0.15) PUB.sm.UpdateRunStepSeq(-2); //싱크중에 추가 지연시간 확보
|
||||
else PUB.sm.UpdateRunStepSeq(-1);
|
||||
LastCommandTime = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ts.TotalSeconds > 1)
|
||||
{
|
||||
PUB.AGV.AGVCommand(item.Key, item.Value);
|
||||
LastCommandTime = DateTime.Now;
|
||||
Console.WriteLine($"RE.send Sync : {item.Key}:{item.Value}");
|
||||
}
|
||||
}
|
||||
}
|
||||
else PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
else if (PUB.sm.RunStepSeq == idx++)
|
||||
{
|
||||
PUB.AddEEDB($"SYNC완료({PUB.Result.TargetPos})");
|
||||
UpdateProgressStatus(stepTime.TotalSeconds, 5, "SYNC : 완료");
|
||||
LastCommandTime = DateTime.Now;
|
||||
PUB.sm.UpdateRunStepSeq();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
63
Cs_HMI/Project/StateMachine/Step/_STEP_CLOSE.cs
Normal file
63
Cs_HMI/Project/StateMachine/Step/_STEP_CLOSE.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Project.StateMachine;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class fMain
|
||||
{
|
||||
/// <summary>
|
||||
/// 프로그램을 닫을때 1회 실행되는 함수
|
||||
/// </summary>
|
||||
private void _STEP_CLOSING_START(eSMStep step)
|
||||
{
|
||||
PUB.bShutdown = true;
|
||||
if (PUB.PLC != null) PUB.PLC.Dispose();
|
||||
|
||||
PUB.AddEEDB("프로그램 종료");
|
||||
PUB.log.Add("Program Close");
|
||||
PUB.log.Flush();
|
||||
PUB.logagv.Flush();
|
||||
PUB.logplc.Flush();
|
||||
PUB.logbms.Flush();
|
||||
PUB.logcal.Flush();
|
||||
// PUB.sm.Stop();
|
||||
|
||||
}
|
||||
public StepResult _STEP_CLOSING(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
|
||||
//############################
|
||||
//#### 사용자 전용 코드
|
||||
//############################
|
||||
|
||||
|
||||
//############################
|
||||
//#### 개발자 권장코드
|
||||
//############################
|
||||
PUB.sm.SetNewStep(eSMStep.CLOSED);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
public void _STEP_CLOSED_START(eSMStep step)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.BeginInvoke(new Action(() =>
|
||||
{
|
||||
//화면을 닫는다
|
||||
PUB.sm.Stop();
|
||||
this.Close();
|
||||
}));
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
public StepResult _STEP_CLOSED(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
return StepResult.Wait;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user