329 lines
14 KiB
C#
329 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using AR;
|
|
|
|
namespace Project
|
|
{
|
|
public partial class FMain
|
|
{
|
|
|
|
//System.Threading.ManualResetEvent LockLL = new System.Threading.ManualResetEvent(true);
|
|
//System.Threading.ManualResetEvent LockLR = new System.Threading.ManualResetEvent(true);
|
|
|
|
System.Threading.ManualResetEvent LockPK = new System.Threading.ManualResetEvent(true);
|
|
|
|
System.Threading.ManualResetEvent LockUserL = new System.Threading.ManualResetEvent(true);
|
|
System.Threading.ManualResetEvent LockUserR = new System.Threading.ManualResetEvent(true);
|
|
|
|
|
|
async public void _STEP_RUN_START(eSMStep step)
|
|
{
|
|
|
|
//새로시작하면 포트 얼라인을 해제 해준다
|
|
PUB.flag.set(eVarBool.FG_RDY_PORT_PL, false, "SM_RUN");
|
|
PUB.flag.set(eVarBool.FG_RDY_PORT_PC, false, "SM_RUN");
|
|
PUB.flag.set(eVarBool.FG_RDY_PORT_PR, false, "SM_RUN");
|
|
|
|
//작업완료기준시간 초기화
|
|
if (PUB.flag.get(eVarBool.FG_JOB_END) == true) VAR.TIME.Update(eVarTime.JOB_END);
|
|
|
|
//라이브뷰시간 초기화
|
|
VAR.TIME.Update(eVarTime.LIVEVIEW0);
|
|
VAR.TIME.Update(eVarTime.LIVEVIEW1);
|
|
VAR.TIME.Update(eVarTime.LIVEVIEW2);
|
|
|
|
//룸조명과, 타워램프 ON 한다 - 210402
|
|
//COMM.SETTING.Data.Disable_RoomLight = false;
|
|
//COMM.SETTING.Data.Disable_TowerLamp = false;
|
|
|
|
//얼라인상태 초기화
|
|
hmi1.arVar_Port[1].AlignReset();
|
|
hmi1.Scean = UIControl.HMI.eScean.Nomal;
|
|
//loader1.arVar_Port.ToList().ForEach(t => t.AlignReset());
|
|
|
|
//daycount 초기화
|
|
if (SETTING.Counter.DateStr != DateTime.Now.ToString("yyyy-MM-dd"))
|
|
{
|
|
SETTING.Counter.ClearDay();
|
|
SETTING.Counter.DateStr = DateTime.Now.ToString("yyyy-MM-dd");
|
|
SETTING.Counter.Save();
|
|
}
|
|
|
|
|
|
//키엔스 시작시간을 초기화한다.
|
|
VAR.TIME.Update(eVarTime.KEYENCEWAIT);
|
|
|
|
//조명켜기 - 201228
|
|
DIO.SetRoomLight(true); //조명은 켜는 것으로 한다 221107
|
|
|
|
//각스텝의 시작변수 초기화한다.
|
|
PUB.sm.seq.ClearTime();//.ClearRunStepSeqTime();
|
|
|
|
//대기메세지소거
|
|
PUB.WaitMessage = new string[] { "", "", "", "", "", "", "", "", "", "", "" };
|
|
|
|
if (PUB.flag.get(eVarBool.FG_PRC_VISIONL) && PUB.flag.get(eVarBool.FG_END_VISIONL) == false)
|
|
{
|
|
//작업을 재시작하면 카메라 트리거를 다시 보낸다
|
|
WS_Send(eWorkPort.Left, PUB.wsL, PUB.Result.ItemDataL.guid, "TRIG", PUB.Result.ItemDataL.VisionData.PrintQRData);
|
|
}
|
|
|
|
if (PUB.flag.get(eVarBool.FG_PRC_VISIONR) && PUB.flag.get(eVarBool.FG_END_VISIONR) == false)
|
|
{
|
|
//Pub.Result.ItemData[2].Clear("[0] RUN FIRST");
|
|
WS_Send(eWorkPort.Right, PUB.wsR, PUB.Result.ItemDataR.guid, "TRIG", PUB.Result.ItemDataR.VisionData.PrintQRData);
|
|
}
|
|
|
|
//재시작할때에는 이것이 동작하면 안됨
|
|
if (PUB.sm.getOldStep == eSMStep.IDLE)
|
|
{
|
|
//인쇄용지감지상태 초기화
|
|
PUB.flag.set(eVarBool.FG_WAIT_PAPERDETECTL, false, "");
|
|
PUB.flag.set(eVarBool.FG_WAIT_PAPERDETECTR, false, "");
|
|
|
|
|
|
PUB.flag.set(eVarBool.FG_PRC_VISIONL, false, "");
|
|
PUB.flag.set(eVarBool.FG_PRC_VISIONR, false, "");
|
|
|
|
PUB.flag.set(eVarBool.FG_END_VISIONL, false, "");
|
|
PUB.flag.set(eVarBool.FG_END_VISIONR, false, "");
|
|
|
|
PUB.flag.set(eVarBool.FG_OK_PRINTL, false, "");
|
|
PUB.flag.set(eVarBool.FG_OK_PRINTR, false, "");
|
|
PUB.flag.set(eVarBool.FG_RUN_PRINTL, false, "");
|
|
PUB.flag.set(eVarBool.FG_RUN_PRINTR, false, "");
|
|
|
|
PUB.flag.set(eVarBool.FG_RDY_PX_PICKON, false, "");
|
|
PUB.flag.set(eVarBool.FG_RDY_PX_LPICKOF, false, "");
|
|
PUB.flag.set(eVarBool.FG_RDY_PX_RPICKOF, false, "");
|
|
PUB.flag.set(eVarBool.FG_SET_DATA_PORT0, false, "");
|
|
PUB.flag.set(eVarBool.FG_SET_DATA_PORT2, false, "");
|
|
PUB.flag.set(eVarBool.FG_RDY_PX_PICKONWAITL, false, "");
|
|
PUB.flag.set(eVarBool.FG_RDY_PX_PICKONWAITR, false, "");
|
|
|
|
PUB.flag.set(eVarBool.FG_PORTL_ITEMON, false, "");
|
|
PUB.flag.set(eVarBool.FG_PORTR_ITEMON, false, "");
|
|
|
|
//PUB.flag.set(eVarBool.INPUT_LEFT, false, "SM_RUN");
|
|
|
|
//step seq 를 모두 소거해준다
|
|
PUB.sm.seq.Clear(eSMStep.RUN_PICK_RETRY);
|
|
|
|
//자료를 소거한다.
|
|
//PUB.Result.Clear("RUN_START");
|
|
//PUB.Result.JobStartTime = DateTime.Now; //200728
|
|
|
|
//신규실행이므로 작업차수별 수량을 초기화해준다
|
|
SETTING.Counter.ClearP(); //200711
|
|
|
|
PUB.flag.set(eVarBool.FG_JOB_END, false, "SM_RUN");
|
|
|
|
PUB.sm.seq.Clear(eSMStep.RUN_ROOT_SEQUENCE_L);
|
|
PUB.sm.seq.Clear(eSMStep.RUN_ROOT_SEQUENCE_R);
|
|
|
|
if (await _SM_RUN_STARTCHKSW(true, new TimeSpan(0)) == false) return;
|
|
if (_SM_RUN_STARTCHKHW(true, new TimeSpan(0)) == false) return;
|
|
|
|
//plc의 SID 데이터를 갱신하도록 한다
|
|
PUB.Result.ClearAllSID = true;
|
|
PUB.log.AddI("*** New job has started ***");
|
|
//PUB.flag.set(eVarBool.RDY_VISION1, true, "JOB START"); //최초 시작시에는 1번 비젼이 동작하게 한다
|
|
|
|
//새로시작할때에는 이 값을 초기화 해준다.
|
|
PUB.Result.LastSIDFrom = string.Empty;
|
|
PUB.Result.LastSIDTo = string.Empty;
|
|
//Pub.Result.LastSID103_2 = string.Empty;
|
|
PUB.Result.LastSIDCnt = -1;
|
|
PUB.Result.LastVName = string.Empty;
|
|
|
|
|
|
//릴아디이 221107
|
|
VAR.STR[eVarString.PrePick_ReelIDNew] = string.Empty;
|
|
VAR.STR[eVarString.PrePick_ReelIDOld] = string.Empty;
|
|
VAR.STR[eVarString.PrePick_ReelIDTarget] = string.Empty;
|
|
}
|
|
else
|
|
{
|
|
if (VAR.BOOL[eVarBool.wait_for_keyence])
|
|
{
|
|
PUB.log.Add($"Deleting existing values because barcode reception was waiting (CONF={PUB.Result.ItemDataC.VisionData.Confirm}, ID:{PUB.Result.ItemDataC.VisionData.RID})");
|
|
PUB.Result.ItemDataC.VisionData.Clear("RESTART", true);
|
|
}
|
|
PUB.log.AddI("*** Job has been restarted ***");
|
|
}
|
|
}
|
|
|
|
public StepResult _STEP_RUN(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
|
{
|
|
if (PUB.popup.needClose)
|
|
{
|
|
System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다.
|
|
return StepResult.Wait;
|
|
}
|
|
|
|
//사용자 스텝처리가 아닌경우에만 동작 중지를 검사 한다
|
|
//중단조건 검사는 0번 축에만 동작하게 한다
|
|
//if (PUB.flag.get(eVarBool.UserStepCheck) == false)
|
|
//{
|
|
// return false;
|
|
//}
|
|
|
|
if (CheckSystemRunCondition() == false)
|
|
{
|
|
return StepResult.Wait;
|
|
}
|
|
|
|
//동작상태가 아니라면 처리하지 않는다.
|
|
if (PUB.sm.Step == eSMStep.RUN && PUB.sm.getNewStep == eSMStep.RUN)
|
|
{
|
|
var RStepisFirst = runStepisFirst[0];
|
|
|
|
//릴포트 제어
|
|
_SM_RUN_MOT_PORT(0, false, PUB.sm.seq.GetTime(eSMStep.RUN_COM_PT0));
|
|
_SM_RUN_MOT_PORT(1, false, PUB.sm.seq.GetTime(eSMStep.RUN_COM_PT1));
|
|
_SM_RUN_MOT_PORT(2, false, PUB.sm.seq.GetTime(eSMStep.RUN_COM_PT2));
|
|
|
|
//컨베어 상시동작 - 230503
|
|
Boolean cvl = PUB.iLockCVL.IsEmpty();
|
|
Boolean cvr = PUB.iLockCVR.IsEmpty();
|
|
DIO.SetOutput(eDOName.LEFT_CONV, cvl);
|
|
DIO.SetOutput(eDOName.RIGHT_CONV, cvr);
|
|
|
|
//왼쪽작업
|
|
if (PUB.flag.get(eVarBool.FG_ENABLE_LEFT))
|
|
{
|
|
_RUN_ROOT_SEQUENCE(eWorkPort.Left, eSMStep.RUN_ROOT_SEQUENCE_L);
|
|
}
|
|
|
|
//오른쪽작업
|
|
if (PUB.flag.get(eVarBool.FG_ENABLE_RIGHT))
|
|
{
|
|
_RUN_ROOT_SEQUENCE(eWorkPort.Right, eSMStep.RUN_ROOT_SEQUENCE_R);
|
|
}
|
|
|
|
//작업완료조건확인
|
|
var PLReady = MOT.GetLMPos(eLMLoc.READY);
|
|
var PRReady = MOT.GetRMPos(eRMLoc.READY);
|
|
|
|
//최종이벤트시간에서 10초이상 기다려준다 230504
|
|
var tsEventTime = VAR.TIME.RUN((int)eVarTime.JOBEVENT);
|
|
|
|
//컨베이어모드
|
|
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
|
|
|
if (tsEventTime.TotalSeconds > 10 &&
|
|
stepTime.TotalSeconds > 5.0 &&
|
|
DIO.isSaftyDoorF(false) == true &&
|
|
PUB.flag.get(eVarBool.FG_PK_ITEMON) == false &&
|
|
PUB.flag.get(eVarBool.FG_PL_ITEMON) == false &&
|
|
PUB.flag.get(eVarBool.FG_PR_ITEMON) == false &&
|
|
|
|
//신규로 추가된 컨베이어 센서이다
|
|
(CVMode == false || DIO.GetIOInput(eDIName.L_CONV1) == false) &&
|
|
// (CVMode == false || DIO.GetIOInput(eDIName.L_CONV3) == false) &&
|
|
(CVMode == false || DIO.GetIOInput(eDIName.L_CONV4) == false) &&
|
|
(CVMode == false || DIO.GetIOInput(eDIName.R_CONV1) == false) &&
|
|
// (CVMode == false || DIO.GetIOInput(eDIName.R_CONV3) == false) &&
|
|
(CVMode == false || DIO.GetIOInput(eDIName.R_CONV4) == false) &&
|
|
|
|
//작업진행중 확인
|
|
PUB.flag.get(eVarBool.FG_BUSY_LEFT) == false &&
|
|
PUB.flag.get(eVarBool.FG_BUSY_RIGHT) == false &&
|
|
|
|
//비전처리중 확인
|
|
//PUB.flag.get(eVarBool.FG_PRC_VISIONL) == false &&
|
|
//PUB.flag.get(eVarBool.FG_PRC_VISIONR) == false &&
|
|
|
|
//모든 모터는 멈춰있어야 한다
|
|
PUB.mot.HasMoving == false && //피커는 중앙에 있어야 한다
|
|
|
|
//좌,우측 프린터 Y축이 정위치에 있어야 한다
|
|
MOT.getPositionMatch(PLReady) &&
|
|
MOT.getPositionMatch(PRReady) &&
|
|
|
|
isPortDetUp(1) == false &&
|
|
isPortLimUP(1) &&
|
|
|
|
//드라이런 중에는 완료하지 않는다
|
|
PUB.Result.DryRun == false)
|
|
{
|
|
|
|
if (PUB.flag.get(eVarBool.FG_JOB_END) == false)
|
|
{
|
|
PUB.log.AddAT("Work completion condition execution");
|
|
VAR.TIME.Update(eVarTime.JOB_END);
|
|
PUB.flag.set(eVarBool.FG_JOB_END, true, "SM_RUN");
|
|
}
|
|
else
|
|
{
|
|
//10초가 지나면 최조 완료로 한다
|
|
var ts = VAR.TIME.RUN((int)eVarTime.JOB_END);
|
|
if (ts.TotalSeconds >= AR.SETTING.Data.Timeout_JOBEnd)
|
|
{
|
|
PUB.Result.JobEndTime = DateTime.Now;
|
|
PUB.log.AddI($"Switching to job completion state (wait time: {AR.SETTING.Data.Timeout_JOBEnd} seconds)");
|
|
PUB.sm.SetNewStep(eSMStep.FINISH);
|
|
PUB.flag.set(eVarBool.FG_JOB_END, false, "SM_RUN:FINISH");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//이조건일때에는 job_End 가 없어야한다
|
|
if (PUB.flag.get(eVarBool.FG_JOB_END) == true)
|
|
{
|
|
PUB.log.AddI("Work completion condition released");
|
|
PUB.flag.set(eVarBool.FG_JOB_END, false, "run");
|
|
|
|
//메인메세지를 제거 해준다.
|
|
PUB.StatusMessage.set(Class.eStatusMesage.Main, string.Empty);
|
|
}
|
|
}
|
|
}
|
|
return StepResult.Wait;
|
|
}
|
|
|
|
public Boolean CheckSystemRunCondition()
|
|
{
|
|
if (PUB.mot.IsInit == false)
|
|
{
|
|
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.AZJINIT, eNextStep.ERROR);
|
|
return false;
|
|
}
|
|
|
|
if (PUB.dio.IsInit == false)
|
|
{
|
|
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.AZJINIT, eNextStep.ERROR);
|
|
return false;
|
|
}
|
|
|
|
if (PUB.mot.HasHomeSetOff == true)
|
|
{
|
|
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.MOT_HSET, eNextStep.ERROR);
|
|
return false;
|
|
}
|
|
|
|
if (PUB.Result.vModel == null || PUB.Result.vModel.Title.isEmpty())
|
|
{
|
|
PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOMODELV, eNextStep.ERROR);
|
|
return false;
|
|
}
|
|
if (PUB.Result.mModel == null || PUB.Result.mModel.Title.isEmpty())
|
|
{
|
|
PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOMODELM, eNextStep.ERROR);
|
|
return false;
|
|
}
|
|
|
|
if (DIO.isSaftyDoorF() == false || DIO.isSaftyDoorR() == false)
|
|
{
|
|
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.DOORSAFTY, eNextStep.PAUSE);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|