initial commit

This commit is contained in:
chi
2025-01-07 16:08:02 +09:00
parent 9e657e2558
commit 0a93a54a6f
268 changed files with 50767 additions and 0 deletions

View 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
}

View 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;
}
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}