Initial commit
This commit is contained in:
49
Handler/Project/RunCode/Step/_STEP_FINISH.cs
Normal file
49
Handler/Project/RunCode/Step/_STEP_FINISH.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
public void _STEP_FINISH_START(eSMStep step)
|
||||
{
|
||||
//포트1번을 아래로 이동한다(모든포트를 내린다)
|
||||
DIO.SetPortMotor(1, eMotDir.CCW, true, "FINISH"); //210326
|
||||
|
||||
var cvMODE = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
if(cvMODE==false)
|
||||
{
|
||||
if (AR.SETTING.Data.Disable_Left == false) DIO.SetPortMotor(0, eMotDir.CCW, true, "FINISH"); //210326
|
||||
if (AR.SETTING.Data.Disable_Right == false) DIO.SetPortMotor(2, eMotDir.CCW, true, "FINISH"); //210326
|
||||
}
|
||||
|
||||
//picker move to center
|
||||
if (DIO.GetIOInput(eDIName.PICKER_SAFE) == false)
|
||||
{
|
||||
var PosX = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
MOT.Move(PosX);
|
||||
}
|
||||
|
||||
PUB.Result.JobEndTime = DateTime.Now;
|
||||
|
||||
//컨베어OFF
|
||||
DIO.SetOutput(eDOName.LEFT_CONV, false);
|
||||
DIO.SetOutput(eDOName.RIGHT_CONV, false);
|
||||
|
||||
DIO.SetBuzzer(true, AR.SETTING.Data.Force_JobEndBuzzer);
|
||||
PUB.log.AddI("작업이 완료되었습니다");
|
||||
needShowSummary = true;
|
||||
}
|
||||
|
||||
public StepResult _STEP_FINISH(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
150
Handler/Project/RunCode/Step/_STEP_HOME_CONFIRM.cs
Normal file
150
Handler/Project/RunCode/Step/_STEP_HOME_CONFIRM.cs
Normal file
@@ -0,0 +1,150 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public void _STEP_HOME_CONFIRM_START(eSMStep step)
|
||||
{
|
||||
PUB.sm.seq.Clear(step);
|
||||
}
|
||||
|
||||
public StepResult _STEP_HOME_CONFIRM(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
byte idx = 1;
|
||||
var cmdIndex = step;
|
||||
if (PUB.sm.seq.Get(cmdIndex) < idx) PUB.sm.seq.Set(cmdIndex, idx);
|
||||
|
||||
//*********************
|
||||
//** 하드웨어 조건 확인
|
||||
//*********************
|
||||
if (CheckHomeProcess_HW_Available(false) == false)
|
||||
{
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
// 전체 홈 시간을 체크한다.
|
||||
if (stepTime.TotalSeconds >= AR.SETTING.Data.Timeout_HomeSearch)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.TIMEOUT, eECode.HOME_TIMEOUT, eNextStep.NOTHING, AR.SETTING.Data.Timeout_HomeSearch); //, eECode.(eResult.HomeTimeout,msg ,false);
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
|
||||
//모든축의 완료여부 확인
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//모든축이 완료되었다면 완료처리를 한다.
|
||||
if (
|
||||
PUB.mot.IsHomeSet((short)eAxis.PX_PICK) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PZ_PICK) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.Z_THETA) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PL_MOVE) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PR_MOVE) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PL_UPDN) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PR_UPDN))
|
||||
{
|
||||
//완료처리
|
||||
hmi1.Scean = UIControl.HMI.eScean.Nomal;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//X축을 안전위치로 보낸다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var Pos = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
Pos.Speed = 200;
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, "HOME_SEARCH", false) == false) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//자재를 들고 있는가(왼쪽)
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
if (DIO.isVacOKL() > 0)
|
||||
{
|
||||
//로더에 다시 놓아야 한다
|
||||
var Pos = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, "#6") == false) return 0;
|
||||
|
||||
//피커의Z축은 가져오는 위치에서 +10mm 에서 처리한다
|
||||
var PosZ = MOT.GetPZPos(ePZLoc.PICKON);
|
||||
PosZ.Position -= 60;
|
||||
|
||||
//theta 는 0으로 원복한다
|
||||
if (MOT.CheckMotionPos(eAxis.Z_THETA, seqTime, 0, 400, 1000, 1000, "QUICK") == false) return 0;
|
||||
if (MOT.CheckMotionPos(seqTime, PosZ, "QUICK") == false) return 0;
|
||||
|
||||
//진공끈다(진공이꺼지면 감지 센서도 같이 꺼진다 - 이 프로젝트에는 감지 센서가 없고 , 출력센서를 그대로 감지로 이용한다)
|
||||
DIO.SetPickerVac(false, true);
|
||||
|
||||
//로더의 얼라인을 해제해준다.
|
||||
hmi1.arVar_Port[1].AlignReset();// = 0; loader1.arVar_Port[1].errorCount = 0;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//피커 Z축 정렬 후 Y축을 준비위치로 옮긴다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var PosZ = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, PosZ, "#7") == false) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//중앙포트(로더)를 아래로 내림
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//if (DIO.GetIOInput(eDIName.PORTC_LIM_UP) == true)
|
||||
DIO.SetPortMotor(1, eMotDir.CCW, true, "FINISH", true); //210326
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//연관플래그 소거
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//진공상태를 초기화 해준다.
|
||||
DIO.SetPrintLVac(ePrintVac.off, true);
|
||||
DIO.SetPrintRVac(ePrintVac.off, true);
|
||||
|
||||
DIO.SetOutput(eDOName.PRINTL_AIRON, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_AIRON, false);
|
||||
|
||||
PUB.Result.Clear("home");
|
||||
FlagClear(false);
|
||||
|
||||
//트리거 OFF작업
|
||||
WS_Send(eWorkPort.Left, PUB.wsL, "", "OFF","");
|
||||
WS_Send(eWorkPort.Right, PUB.wsR, "", "OFF","");
|
||||
|
||||
//컨베어off
|
||||
DIO.SetOutput(eDOName.LEFT_CONV, false);
|
||||
DIO.SetOutput(eDOName.RIGHT_CONV, false);
|
||||
|
||||
if (PUB.keyenceF != null && PUB.keyenceF.IsConnect)
|
||||
PUB.keyenceF.Trigger(false);
|
||||
if (PUB.keyenceR != null && PUB.keyenceR.IsConnect)
|
||||
PUB.keyenceR.Trigger(false);
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
}
|
||||
}
|
||||
55
Handler/Project/RunCode/Step/_STEP_HOME_DELAY.cs
Normal file
55
Handler/Project/RunCode/Step/_STEP_HOME_DELAY.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using AR;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
public void _STEP_HOME_DELAY_START(eSMStep step)
|
||||
{
|
||||
//각 파트의 초기 값을 설정해준다.
|
||||
DIO.SetBuzzer(false);
|
||||
|
||||
//홈이완료되었으므로 3초정도 기다려준다.
|
||||
PUB.log.AddAT("홈 완료 확정을 위한 타이머 시작");
|
||||
HomeSuccessTime = DateTime.Now;
|
||||
}
|
||||
|
||||
public StepResult _STEP_HOME_DELAY(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
//*********************
|
||||
//** 하드웨어 조건 확인
|
||||
//*********************
|
||||
if (CheckHomeProcess_HW_Available(false) == false)
|
||||
{
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
var tsHome = DateTime.Now - HomeSuccessTime;
|
||||
if (tsHome.TotalSeconds >= 3.0)
|
||||
{
|
||||
if (PUB.mot.HasMoving == false)
|
||||
{
|
||||
//모든축의 위치를 0으로 한다
|
||||
//Pub.mot.ClearPosition();
|
||||
|
||||
//각 파트의 초기 값을 설정해준다.
|
||||
DIO.SetBuzzer(false);
|
||||
|
||||
PUB.flag.set(eVarBool.FG_USERSTEP, false, "SM_HOME");
|
||||
PUB.log.AddI("홈 작업 완료로 인해 홈 검증 코드로 이동함");
|
||||
|
||||
HomeChkTime = DateTime.Now;
|
||||
PUB.sm.SetNewStep(eSMStep.HOME_CONFIRM);
|
||||
}
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
564
Handler/Project/RunCode/Step/_STEP_HOME_FULL.cs
Normal file
564
Handler/Project/RunCode/Step/_STEP_HOME_FULL.cs
Normal file
@@ -0,0 +1,564 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Project.Commands;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public void _STEP_HOME_FULL_START(eSMStep step)
|
||||
{
|
||||
//ClearBarcode();
|
||||
//Pub.popup.needClose = true; // Pub.popup.CloseAll();
|
||||
|
||||
//181225
|
||||
if (PUB.dio.IsInit)
|
||||
DIO.SetBuzzer(false);
|
||||
|
||||
if (PUB.mot.IsInit)
|
||||
{
|
||||
//알람클리어작업
|
||||
if (PUB.mot.HasServoAlarm)
|
||||
{
|
||||
PUB.mot.SetAlarmClearOn();
|
||||
System.Threading.Thread.Sleep(200);
|
||||
PUB.mot.SetAlarmClearOff();
|
||||
}
|
||||
}
|
||||
|
||||
HomeSuccessTime = DateTime.Parse("1982-11-23");
|
||||
|
||||
|
||||
//홈모드로 전환
|
||||
hmi1.Scean = UIControl.HMI.eScean.MotHome;
|
||||
hmi1.arHomeProgress[0] = 0;
|
||||
hmi1.arHomeProgress[1] = 0;
|
||||
hmi1.arHomeProgress[2] = 0;
|
||||
hmi1.arHomeProgress[3] = 0;
|
||||
hmi1.arHomeProgress[4] = 0;
|
||||
hmi1.arHomeProgress[5] = 0;
|
||||
hmi1.arHomeProgress[6] = 0;
|
||||
|
||||
//실린더 상태 복귀
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
}
|
||||
public StepResult _STEP_HOME_FULL(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
//전체 홈 시간을 체크한다.
|
||||
if (stepTime.TotalSeconds >= AR.SETTING.Data.Timeout_HomeSearch)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.TIMEOUT, eECode.HOME_TIMEOUT, eNextStep.NOTHING, AR.SETTING.Data.Timeout_HomeSearch); //, eECode.(eResult.HomeTimeout,msg ,false);
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
//*********************
|
||||
//** 하드웨어 조건 확인
|
||||
//*********************
|
||||
if (CheckHomeProcess_HW_Available(false) == false)
|
||||
{
|
||||
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
|
||||
int idx = 1;
|
||||
var cmdIndex = step;
|
||||
|
||||
//Check X Safty Area
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//안전위치 센서가 안들어와잇으면 오류 처리한다
|
||||
if (DIO.GetIOInput(eDIName.PICKER_SAFE) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOTX_SAFETY,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PL_MOVE, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
|
||||
//포트 모두내리기(221013 - 박형철)
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor] == false && AR.SETTING.Data.Disable_HomePortDown == false)
|
||||
{
|
||||
DIO.SetPortMotor(0, eMotDir.CCW, true, "HOME");
|
||||
DIO.SetPortMotor(1, eMotDir.CCW, true, "HOME");
|
||||
DIO.SetPortMotor(2, eMotDir.CCW, true, "HOME");
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//홈 설정여부플래그 OFF
|
||||
for (int i = 0; i < PUB.mot.DeviceCount; i++)
|
||||
{
|
||||
if (PUB.mot.IsUse(i) == false) continue;
|
||||
PUB.mot.SetHomeSet(i, false);
|
||||
}
|
||||
|
||||
//부저 OFF
|
||||
DIO.SetBuzzer(false);
|
||||
|
||||
//프린터부착헤드 후진
|
||||
if (DIO.GetIOInput(eDIName.L_PICK_BW) == false)
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
|
||||
if (DIO.GetIOInput(eDIName.R_PICK_BW) == false)
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
|
||||
|
||||
if (DIO.GetIOInput(eDIName.L_CYLUP) == false)
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
|
||||
if (DIO.GetIOInput(eDIName.R_CYLUP) == false)
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//피커실린더 상승
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
if (AR.SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
|
||||
if (DIO.checkDigitalO(eDIName.L_CYLUP, seqTime, true, timeoutcode: eECode.PICKER_LCYL_NOUP) != eNormalResult.True) return StepResult.Wait;
|
||||
if (DIO.checkDigitalO(eDIName.R_CYLUP, seqTime, true, timeoutcode: eECode.PICKER_RCYL_NOUP) != eNormalResult.True) return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터 부착헤드 후진 검사
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//프린터부착헤드 후진
|
||||
if (DIO.GetIOInput(eDIName.L_PICK_BW) == false)
|
||||
{
|
||||
if (stepTime.TotalSeconds > 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_LPICKER_NOBW, eNextStep.PAUSE);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.R_PICK_BW) == false)
|
||||
{
|
||||
if (stepTime.TotalSeconds > 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_RPICKER_NOBW, eNextStep.PAUSE);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터 부착헤드 후진 검사
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//프린터부착헤드 후진
|
||||
if (AR.SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
if (DIO.GetIOInput(eDIName.L_CYLUP) == false)
|
||||
{
|
||||
if (stepTime.TotalSeconds > 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_LPRINTER_NOUP, eNextStep.PAUSE);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.R_CYLUP) == false)
|
||||
{
|
||||
if (stepTime.TotalSeconds > 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_RPRINTER_NOUP, eNextStep.PAUSE);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//전진이 들어와 있다면 오류 로한다
|
||||
if (DIO.GetIOInput(eDIName.L_CYLDN))
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_LPRINTER_NOUP, eNextStep.PAUSE);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.R_CYLDN))
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_RPRINTER_NOUP, eNextStep.PAUSE);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//피커의 Z축을 우선 진행
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var rlt1 = MOT.Home("RUN_SAFTY_HOME", eAxis.PZ_PICK);
|
||||
if (rlt1 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PL_UPDN, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//Z축 안전위치 대기
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PZ_PICK) == false && PUB.mot.IsLimitN((short)eAxis.PZ_PICK) == false && PUB.mot.IsOrg((short)eAxis.PZ_PICK) == false)
|
||||
{
|
||||
System.Threading.Thread.Sleep(10);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터의 Z축을 먼저 한다 221013
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var rlt1 = MOT.Home("RUN_SAFTY_HOME", eAxis.PL_UPDN);
|
||||
var rlt2 = MOT.Home("RUN_SAFTY_HOME", eAxis.PR_UPDN);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//Z축 안전위치 대기
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PL_UPDN) == false && PUB.mot.IsLimitN((short)eAxis.PL_UPDN) == false && PUB.mot.IsOrg((short)eAxis.PL_UPDN) == false)
|
||||
{
|
||||
System.Threading.Thread.Sleep(10);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//Z축 안전위치 대기
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PR_UPDN) == false && PUB.mot.IsLimitN((short)eAxis.PR_UPDN) == false && PUB.mot.IsOrg((short)eAxis.PR_UPDN) == false)
|
||||
{
|
||||
System.Threading.Thread.Sleep(10);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//각 프린터의 Y,Z 축의 홈을 진행한다.
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//유효성 검사를 하지 않는다.. 하게되면 오류남 201208
|
||||
var rlt1 = MOT.Home("RUN_SAFTY_HOME", eAxis.PL_MOVE, false);
|
||||
var rlt2 = MOT.Home("RUN_SAFTY_HOME", eAxis.PR_MOVE, false);
|
||||
//var rlt3 = MOT.Home("RUN_SAFTY_HOME", eAxis.PL_UPDN, false);
|
||||
//var rlt4 = MOT.Home("RUN_SAFTY_HOME", eAxis.PR_UPDN, false);
|
||||
if (rlt1 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PL_MOVE, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
if (rlt2 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PR_MOVE, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
//if (rlt3 == false)
|
||||
//{
|
||||
// PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
// eECode.MOT_HSEARCH,
|
||||
// eNextStep.ERROR,
|
||||
// eAxis.PL_UPDN, PUB.mot.ErrorMessage);
|
||||
// return StepResult.Error;
|
||||
//}
|
||||
//if (rlt4 == false)
|
||||
//{
|
||||
// PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
// eECode.MOT_HSEARCH,
|
||||
// eNextStep.ERROR,
|
||||
// eAxis.PR_UPDN, PUB.mot.ErrorMessage);
|
||||
// return StepResult.Error;
|
||||
//}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터축의 Y,Z축이 완료되기를 기다린다.
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PL_MOVE) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PR_MOVE) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PL_UPDN) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PR_UPDN))
|
||||
{
|
||||
//현재위치를 0으로 설정한다.
|
||||
PUB.mot.ClearPosition((int)eAxis.PL_MOVE);
|
||||
PUB.mot.ClearPosition((int)eAxis.PR_MOVE);
|
||||
|
||||
//var p1 = MOT.GetLMPos(eLMLoc.READY);
|
||||
//MOT.Move(eAxis.PL_MOVE, p1.Position, 200, 500, false, false, false);
|
||||
|
||||
//var p2 = MOT.GetRMPos(eRMLoc.READY);
|
||||
//p2.Speed = 100;
|
||||
//MOT.Move(eAxis.PR_MOVE, p2.Position, 200, 500, false, false, false);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//실린더를OFF한다 - 210207
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//실린더 OFF 확인 - 210207
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//IO가 완료되지 안항ㅆ다면 대기한다
|
||||
if (DIO.checkDigitalO(eDIName.L_PICK_BW, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
if (DIO.checkDigitalO(eDIName.R_PICK_BW, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//프린터 move 축 안전지대로이동
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var PosLM = MOT.GetLMPos(eLMLoc.READY);
|
||||
var PosRM = MOT.GetRMPos(eRMLoc.READY);
|
||||
PosLM.Speed = 200;
|
||||
PosRM.Speed = 200;
|
||||
MOT.Move((eAxis)PosLM.Axis, PosLM.Position, PosLM.Speed, PosLM.Acc, false, false, false);
|
||||
MOT.Move((eAxis)PosRM.Axis, PosRM.Position, PosRM.Speed, PosRM.Acc, false, false, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터 move 축 안전지대로이동
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var PosLM = MOT.GetLMPos(eLMLoc.READY);
|
||||
var PosRM = MOT.GetRMPos(eRMLoc.READY);
|
||||
PosLM.Speed = 250;
|
||||
PosRM.Speed = 250;
|
||||
if (MOT.CheckMotionPos(seqTime, PosLM, "MOT_HOME", false) == false) return StepResult.Wait;
|
||||
if (MOT.CheckMotionPos(seqTime, PosRM, "MOT_HOME", false) == false) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//Theta 홈
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//회전축은 잡지 않는다
|
||||
PUB.mot.SetHomeSet((int)eAxis.Z_THETA, true);
|
||||
PUB.mot.ClearPosition((int)eAxis.Z_THETA);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//피커-X축 홈
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var rlt1 = MOT.Home("RUN_SAFTY_HOME", eAxis.PX_PICK, false);
|
||||
if (rlt1 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PX_PICK, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//모든축의 완료여부 확인
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//모든축이 완료되었다면 완료처리를 한다.
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PX_PICK))
|
||||
{
|
||||
//완료처리
|
||||
PUB.mot.ClearPosition((int)eAxis.PX_PICK);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//X축 값 초기화확인
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//모든축이 완료되었다면 완료처리를 한다.
|
||||
var ts = PUB.sm.seq.GetTime(cmdIndex);
|
||||
if (ts.TotalSeconds >= 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PX_PICK, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
else
|
||||
{
|
||||
var XPos = PUB.mot.GetActPos((int)eAxis.PX_PICK);
|
||||
if (Math.Abs(XPos) <= 0.1 && PUB.mot.IsMotion((int)eAxis.PX_PICK) == false)
|
||||
{
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
}
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//완료됨
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//진공상태를 초기화 해준다.
|
||||
DIO.SetPrintLVac(ePrintVac.off, true);
|
||||
DIO.SetPrintRVac(ePrintVac.off, true);
|
||||
DIO.SetOutput(eDOName.PRINTL_AIRON, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_AIRON, false);
|
||||
|
||||
FlagClear(true);
|
||||
PUB.sm.SetNewStep(eSMStep.HOME_DELAY);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
void FlagClear(bool ClearItemOn)
|
||||
{
|
||||
PUB.log.AddAT($"플래그초기화({ClearItemOn})");
|
||||
//연관플래그 소거
|
||||
if (ClearItemOn)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_PK_ITEMON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PL_ITEMON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PR_ITEMON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PORTL_ITEMON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PORTR_ITEMON, false, "POSRESET");
|
||||
}
|
||||
|
||||
|
||||
PUB.flag.set(eVarBool.FG_OK_PRINTL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_OK_PRINTR, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRINTL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRINTR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PC, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_LPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_RPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_PICKONWAITL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_PICKONWAITR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_SET_DATA_PORT0, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_SET_DATA_PORT2, false, "POSRESET");
|
||||
//PUB.flag.set(eVarBool.SCR_JOBFINISH, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_WAIT_PAPERDETECTL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_WAIT_PAPERDETECTR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_END_VISIONL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_END_VISIONR, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_CMD_YP_LPICKON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_CMD_YP_LPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_CMD_YP_RPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_CMD_YP_RPICKON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PZ_LPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PZ_RPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PZ_PICKON, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RUN_PLM_PICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRM_PICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PLM_PICKON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRM_PICKON, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RUN_PLZ_PICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRZ_PICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PLZ_PICKON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRZ_PICKON, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RUN_LEFT, false, "POSREST");
|
||||
PUB.flag.set(eVarBool.FG_RUN_RIGHT, false, "POSREST");
|
||||
//VAR.BOOL[eVarBool.JOB_BYPASS_LEFT] = false;
|
||||
//VAR.BOOL[eVarBool.JOB_BYPASS_RIGHT] = false;
|
||||
//VAR.STR[eVarString.JOB_BYPASS_SID] = string.Empty;
|
||||
//VAR.STR[eVarString.JOB_TYPE] = string.Empty;
|
||||
|
||||
//retry소거 230510
|
||||
VAR.BOOL[eVarBool.JOB_PickON_Retry] = false;
|
||||
VAR.BOOL[eVarBool.VisionL_Retry] = false;
|
||||
VAR.BOOL[eVarBool.VisionR_Retry] = false;
|
||||
VAR.BOOL[eVarBool.wait_for_keyence] = false;
|
||||
VAR.BOOL[eVarBool.wait_for_keyenceL] = false;
|
||||
VAR.BOOL[eVarBool.wait_for_keyenceR] = false;
|
||||
VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] = false;
|
||||
|
||||
//busy 플래그 제거
|
||||
PUB.iLockCVL.set((int)eILockCV.BUSY, false, "POSREST");
|
||||
PUB.iLockCVR.set((int)eILockCV.BUSY, false, "POSREST");
|
||||
PUB.iLockCVL.set((int)eILockCV.VISION, false, "POSREST");
|
||||
PUB.iLockCVR.set((int)eILockCV.VISION, false, "POSREST");
|
||||
|
||||
VAR.I32[eVarInt32.RIGT_ITEM_COUNT] = 0;
|
||||
VAR.I32[eVarInt32.LEFT_ITEM_COUNT] = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
215
Handler/Project/RunCode/Step/_STEP_HOME_QUICK.cs
Normal file
215
Handler/Project/RunCode/Step/_STEP_HOME_QUICK.cs
Normal file
@@ -0,0 +1,215 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Project.Commands;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{//홈 맞춰
|
||||
|
||||
public void _STEP_HOME_QUICK_START(eSMStep step)
|
||||
{
|
||||
|
||||
|
||||
//모든 홈이 되어야 가능하다
|
||||
if (PUB.mot.IsInit && PUB.mot.HasHomeSetOff == true)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.MOT_HSET, eNextStep.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
if (DIO.IsEmergencyOn() == true)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.EMERGENCY, eNextStep.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
if (DIO.isSaftyDoorF() == false || DIO.isSaftyDoorR() == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.DOORSAFTY, eNextStep.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//실린더 상태 복귀
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
}
|
||||
|
||||
CommandBuffer cmds = new CommandBuffer();
|
||||
|
||||
public StepResult _STEP_HOME_QUICK(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
|
||||
byte idx = 1;
|
||||
var cmdIndex = eSMStep.HOME_QUICK;
|
||||
if (PUB.sm.seq.Get(step) < idx) PUB.sm.seq.Set(cmdIndex, idx);
|
||||
|
||||
//사용자 스텝처리가 아닌경우에만 동작 중지를 검사 한다
|
||||
//중단조건 검사는 0번 축에만 동작하게 한다
|
||||
if (PUB.flag.get(eVarBool.FG_USERSTEP) == false && CheckPauseCondition(true) == false)
|
||||
{
|
||||
//가동불가 조건 확인
|
||||
if (PUB.Result.ResultCode == eResult.EMERGENCY)
|
||||
PUB.sm.SetNewStep(eSMStep.ERROR);
|
||||
else
|
||||
PUB.sm.SetNewStep(eSMStep.PAUSE);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//동작상태가 아니라면 처리하지 않는다.
|
||||
var userStep = PUB.flag.get(eVarBool.FG_USERSTEP);
|
||||
|
||||
|
||||
//*********************
|
||||
//** 하드웨어 조건 확인
|
||||
//*********************
|
||||
if (CheckHomeProcess_HW_Available(true) == false)
|
||||
{
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
//시작정보
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//210415
|
||||
if (DIO.GetPortMotorDir(0) == eMotDir.CW) DIO.SetPortMotor(0, eMotDir.CW, false, "POSRESET");
|
||||
if (DIO.GetPortMotorDir(1) == eMotDir.CW) DIO.SetPortMotor(1, eMotDir.CW, false, "POSRESET");
|
||||
if (DIO.GetPortMotorDir(2) == eMotDir.CW) DIO.SetPortMotor(2, eMotDir.CW, false, "POSRESET");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//피커 Z축을 0으로 이동한다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var Pos = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, "#7") == false) return 0;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//피커 Y축을 안전지대로 이동한다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var Pos = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, "#7", false) == false) return 0;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//PRINT-Z축을 0으로이동한다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var spdinfo = MOT.GetLZPos(eLZLoc.READY);
|
||||
MOT.Move(eAxis.PL_UPDN, spdinfo.Position, spdinfo.Speed, spdinfo.Acc, false, true, false);
|
||||
|
||||
spdinfo = MOT.GetRZPos(eRZLoc.READY);
|
||||
MOT.Move(eAxis.PR_UPDN, spdinfo.Position, spdinfo.Speed, spdinfo.Acc, false, true, false);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//PRINT-Z축 완료대기
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var PosL = MOT.GetLZPos(eLZLoc.READY);
|
||||
var PosR = MOT.GetRZPos(eRZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, PosL, "#7", false) == false) return StepResult.Wait;
|
||||
if (MOT.CheckMotionPos(seqTime, PosR, "#8", false) == false) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//피커실린더 상승
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
if (AR.SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_CYLUP, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
if (DIO.checkDigitalO(eDIName.R_CYLUP, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//프린터부착헤드 후진
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터헤드후진 확인
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_PICK_BW, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
if (DIO.checkDigitalO(eDIName.R_PICK_BW, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//프린터 Y축 이동
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var spdinfo = MOT.GetLMPos(eLMLoc.READY);
|
||||
MOT.Move(eAxis.PL_MOVE, spdinfo.Position, spdinfo.Speed, spdinfo.Acc, false, true, false);
|
||||
|
||||
spdinfo = MOT.GetRMPos(eRMLoc.READY);
|
||||
MOT.Move(eAxis.PR_MOVE, spdinfo.Position, spdinfo.Speed, spdinfo.Acc, false, true, false);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터 Y축 완료대기
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var PosL = MOT.GetLMPos(eLMLoc.READY);
|
||||
var PosR = MOT.GetRMPos(eRMLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, PosL, "#7") == false) return 0;
|
||||
if (MOT.CheckMotionPos(seqTime, PosR, "#8") == false) return 0;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//연관플래그 소거
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//진공상태를 초기화 해준다.
|
||||
DIO.SetPrintLVac(ePrintVac.off, true);
|
||||
DIO.SetPrintRVac(ePrintVac.off, true);
|
||||
DIO.SetOutput(eDOName.PRINTL_AIRON, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_AIRON, false);
|
||||
|
||||
FlagClear(true);
|
||||
PUB.sm.SetNewStep(eSMStep.HOME_CONFIRM);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Clear(step);
|
||||
PUB.sm.SetNewStep(eSMStep.HOME_CONFIRM);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Handler/Project/RunCode/Step/_STEP_IDLE.cs
Normal file
82
Handler/Project/RunCode/Step/_STEP_IDLE.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
DateTime IdleStartTime = DateTime.Now;
|
||||
bool IdleSleep = false;
|
||||
|
||||
public void _STEP_IDLE_START(eSMStep step)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_USERSTEP, false, "SM_IDLE");
|
||||
|
||||
//lbMsgR.ProgressEnable = false;
|
||||
IdleStartTime = DateTime.Now;
|
||||
|
||||
//초기화완료되면 버튼을 활성화한다
|
||||
if (PUB.sm.getOldStep == eSMStep.INIT)
|
||||
{
|
||||
this.BeginInvoke(new Action(() =>
|
||||
{
|
||||
panTopMenu.Enabled = true;
|
||||
btStart.Enabled = true;
|
||||
btStop.Enabled = true;
|
||||
btReset.Enabled = true;
|
||||
}));
|
||||
|
||||
//Pub.sm.setNewStep(eSMStep.XMOVE); //홈을 위해서 바로 이동 모션으로 가게한다
|
||||
if (PUB.mot.HasHomeSetOff == true && DIO.GetIOInput(eDIName.PICKER_SAFE) == false)
|
||||
{
|
||||
//피커의 이동이 필요한 상황
|
||||
this.BeginInvoke(new Action(() => { btManage.PerformClick(); }));
|
||||
}
|
||||
else
|
||||
{
|
||||
//리셋이 필요한 상황
|
||||
if (AR.SETTING.Data.OnlineMode == true)
|
||||
this.BeginInvoke(new Action(() => { btMReset.PerformClick(); }));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public StepResult _STEP_IDLE(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
//대기상태에서 조명 자동으로 끄기
|
||||
if (IdleSleep == false && IdleStartTime.Year != 1982)
|
||||
{
|
||||
var ts = DateTime.Now - IdleStartTime;
|
||||
if (ts.TotalMinutes > AR.SETTING.Data.AutoOffRoomLightMin)
|
||||
{
|
||||
PUB.log.Add("대기상태 전환으로 인해 조명을 끕니다");
|
||||
IdleSleep = true;
|
||||
DIO.SetRoomLight(false);
|
||||
}
|
||||
}
|
||||
|
||||
//자동소거기능
|
||||
if (AR.SETTING.Data.AutoDeleteDay > 0)
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_MINSPACE) == true)
|
||||
{
|
||||
var ts = DateTime.Now - lastDeleteTime;
|
||||
if (ts.TotalSeconds > 1)
|
||||
{
|
||||
//파일을 찾아서 소거한다.
|
||||
var delpath = System.IO.Path.Combine(AR.SETTING.Data.Path_Data, "Images");
|
||||
if (delpath != "") DeleteFile(delpath);
|
||||
|
||||
lastDeleteTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return StepResult.Wait;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
200
Handler/Project/RunCode/Step/_STEP_INIT.cs
Normal file
200
Handler/Project/RunCode/Step/_STEP_INIT.cs
Normal file
@@ -0,0 +1,200 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using Microsoft.Owin.Hosting;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
//Int32[] _hDevice = new Int32[] { 0, 0, 0 };
|
||||
//Int32[] _width = new Int32[] { 0, 0, 0 };
|
||||
//Int32[] _height = new Int32[] { 0, 0, 0 };
|
||||
//Int32[] _stride = new Int32[] { 0, 0, 0 };
|
||||
//Int32[] _bufferSize = new Int32[] { 0, 0, 0 };
|
||||
//Boolean[] _isCrevisOpen = new bool[] { false, false, false };
|
||||
//Boolean[] _isCrevisACQ = new bool[] { false, false, false };
|
||||
// IntPtr[] _pImage = new IntPtr[] { IntPtr.Zero, IntPtr.Zero, IntPtr.Zero };
|
||||
|
||||
public void _STEP_INIT_START(eSMStep step)
|
||||
{
|
||||
|
||||
int progress = 0;
|
||||
var ProgressMax = 13;
|
||||
Color fColor = Color.DarkViolet;
|
||||
|
||||
|
||||
PUB.sm.RaiseStateProgress(++progress, "Motion Initialize", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
if (PUB.mot.Init() == false)
|
||||
{
|
||||
PUB.log.AddE(string.Format("MOT INIT ERROR : {0}", PUB.mot.ErrorMessage));
|
||||
PUB.log.AddE("모션 초기화 오류로 잠시 후 다시 시도합니다");
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
if (PUB.mot.Init() == false)
|
||||
{
|
||||
PUB.log.AddE("모션 초기화 재시도 실패" + PUB.mot.ErrorMessage);
|
||||
}
|
||||
}
|
||||
_SM_RUN_INIT_MOTION();
|
||||
|
||||
|
||||
PUB.sm.RaiseStateProgress(++progress, "DIO Initialize", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
if (PUB.dio.Init())
|
||||
{
|
||||
DIO.InitDIOSensitive();
|
||||
PUB.log.Add("DIO RUN MONITOR");
|
||||
PUB.dio.RunMonitor();
|
||||
|
||||
|
||||
//포트동작을 멈춘다
|
||||
DIO.SetPortMotor(0, eMotDir.CW, false, "init");
|
||||
DIO.SetPortMotor(1, eMotDir.CW, false, "init");
|
||||
DIO.SetPortMotor(2, eMotDir.CW, false, "init");
|
||||
}
|
||||
else PUB.log.AddE(string.Format("DIO INIT ERROR : {0}", PUB.dio.ErrorMessage));
|
||||
TowerLamp.Init(PUB.dio,
|
||||
DIO.Pin[eDOName.TWR_REDF].terminalno,
|
||||
DIO.Pin[eDOName.TWR_GRNF].terminalno,
|
||||
DIO.Pin[eDOName.TWR_YELF].terminalno);
|
||||
|
||||
TowerLamp.Enable = !SETTING.Data.Disable_TowerLamp;
|
||||
|
||||
PUB.sm.RaiseStateProgress(++progress, "Set DIO Names", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
_SM_RUN_INIT_SETDIONAME();
|
||||
|
||||
PUB.log.AddI("모션 초기화 플래그 설정완료");
|
||||
PUB.flag.set(eVarBool.FG_INIT_MOTIO, true, "INIT");
|
||||
|
||||
//230504
|
||||
hmi1.SetDIO(PUB.dio);
|
||||
hmi1.SetMOT(PUB.mot);
|
||||
|
||||
//남은 공간
|
||||
PUB.sm.RaiseStateProgress(++progress, "공간 확인", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
CheckFreeSpace(); //181225
|
||||
|
||||
//모델자동선택 181206
|
||||
PUB.sm.RaiseStateProgress(++progress, "이전모델 확인", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
|
||||
//
|
||||
if (PUB.uSetting.LastModelV != "") PUB.SelectModelV(PUB.uSetting.LastModelV, false);
|
||||
var motionmodel = PUB.uSetting.LastModelM;
|
||||
if (motionmodel.isEmpty()) motionmodel = PUB.Result.vModel.Motion;
|
||||
if (motionmodel.ToUpper().StartsWith("CONV")) PUB.flag.set(eVarBool.Use_Conveyor, true, "load");
|
||||
else PUB.flag.set(eVarBool.Use_Conveyor, false, "load");
|
||||
PUB.SelectModelM(motionmodel, false);
|
||||
|
||||
//프린터설정
|
||||
PUB.sm.RaiseStateProgress(++progress, "프린터설정", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
PUB.PrinterL = new Device.SATOPrinterAPI();
|
||||
PUB.PrinterL.PortName = AR.SETTING.Data.PrintL_Port;
|
||||
PUB.PrinterL.BaudRate = AR.SETTING.Data.PrintL_Baud;
|
||||
|
||||
PUB.PrinterR = new Device.SATOPrinterAPI();
|
||||
PUB.PrinterR.PortName = AR.SETTING.Data.PrintR_Port;
|
||||
PUB.PrinterR.BaudRate = AR.SETTING.Data.PrintR_Baud;
|
||||
|
||||
PUB.flag.set(eVarBool.FG_INIT_PRINTER, true, "INIT");
|
||||
PUB.sm.RaiseStateProgress(ProgressMax, "초기화 완료", ProgressMax, Color.Gold); System.Threading.Thread.Sleep(5);
|
||||
PUB.log.Add("init finish");
|
||||
|
||||
//조명 ON
|
||||
DIO.SetRoomLight(true);
|
||||
|
||||
|
||||
// Start OWIN host
|
||||
var baseAddress = "http://*:9001";
|
||||
WebApp.Start<OWIN.Startup>(url: baseAddress);
|
||||
PUB.log.AddI($"호스팅서비스ON : {baseAddress}");
|
||||
|
||||
}
|
||||
|
||||
public StepResult _STEP_INIT(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
public void _SM_RUN_INIT_SETDIONAME()
|
||||
{
|
||||
//DIO 이름설정
|
||||
Console.WriteLine("## SET DI NAME ##");
|
||||
for (int i = 0; i < PUB.dio.GetDICount; i++)
|
||||
{
|
||||
var name = Enum.GetName(typeof(eDIName), i);
|
||||
Console.WriteLine($"[{i}] {name}");
|
||||
PUB.dio.SetDIName(i, name);
|
||||
}
|
||||
Console.WriteLine("## SET DO NAME ##");
|
||||
for (int i = 0; i < PUB.dio.GetDOCount; i++)
|
||||
{
|
||||
var name = Enum.GetName(typeof(eDOName), i);
|
||||
Console.WriteLine($"[{i}] {name}");
|
||||
PUB.dio.SetDOName(i, name);
|
||||
}
|
||||
|
||||
//Console.WriteLine("## SET FLAG NAME ##");
|
||||
//for (int i = 0; i < PUB.flag.Length; i++)
|
||||
//{
|
||||
// var name = Enum.GetName(typeof(eFlag), i);
|
||||
// PUB.flag.Name[i] = name;
|
||||
// Console.WriteLine($"[{i}] {name}");
|
||||
//}
|
||||
}
|
||||
|
||||
private void _SM_RUN_INIT_MOTION()
|
||||
{
|
||||
PUB.mot.SetAlarmClearOn();
|
||||
System.Threading.Thread.Sleep(5);
|
||||
PUB.mot.SetAlarmClearOff();
|
||||
|
||||
//7개의 축을 사용한다
|
||||
for (int i = 0; i < PUB.system.MotaxisCount; i++)
|
||||
{
|
||||
//설정파일이 있다면 불러온다
|
||||
var file = System.IO.Path.Combine(UTIL.CurrentPath, "Model", "axis" + i.ToString() + ".motaxt");
|
||||
if (System.IO.File.Exists(file) == false)
|
||||
{
|
||||
PUB.log.AddAT($"모션({i}) 설정파일 없음!!");
|
||||
PUB.mot.InitAxis(i, file);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PUB.mot.InitAxis((short)i, file) == false)
|
||||
PUB.log.AddE("모션 설정 실패 축:" + i.ToString());
|
||||
else
|
||||
PUB.log.AddI($"모션({i}) 설정 완료");
|
||||
}
|
||||
}
|
||||
|
||||
//EStop Disable
|
||||
PUB.mot.SetEStopEnable(0, false);
|
||||
PUB.mot.SetEStopEnable(1, false);
|
||||
PUB.mot.SetEStopEnable(2, false);
|
||||
PUB.mot.SetEStopEnable(3, false);
|
||||
PUB.mot.SetEStopEnable(4, false);
|
||||
PUB.mot.SetEStopEnable(5, false);
|
||||
PUB.mot.SetEStopEnable(6, false);
|
||||
|
||||
//softlimit 적용 - 201214
|
||||
UpdateSoftLimit();
|
||||
|
||||
//PUB.mot.[(short)eAxis.Z_PICKER] = true;
|
||||
//PUB.mot.useBrake[(short)eAxis.PL_UPDN] = true;
|
||||
//PUB.mot.useBrake[(short)eAxis.PR_UPDN] = true;
|
||||
|
||||
if (PUB.mot.IsInit)
|
||||
{
|
||||
PUB.log.Add("MOT RUN MONITOR");
|
||||
PUB.mot.RunMonitor();
|
||||
PUB.log.AddAT("ALL SERVO ON");
|
||||
PUB.mot.SetServOn(true);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
328
Handler/Project/RunCode/Step/_STEP_RUN.cs
Normal file
328
Handler/Project/RunCode/Step/_STEP_RUN.cs
Normal file
@@ -0,0 +1,328 @@
|
||||
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 (PUB.counter.DateStr != DateTime.Now.ToString("yyyy-MM-dd"))
|
||||
{
|
||||
PUB.counter.ClearDay();
|
||||
PUB.counter.DateStr = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
PUB.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
|
||||
|
||||
//신규실행이므로 작업차수별 수량을 초기화해준다
|
||||
PUB.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("*** 신규 작업이 시작 되었습니다 ***");
|
||||
//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($"바코드수신대기중이었으므로 기존 값을 삭제 합니다(CONF={PUB.Result.ItemDataC.VisionData.Confirm},ID:{PUB.Result.ItemDataC.VisionData.RID})");
|
||||
PUB.Result.ItemDataC.VisionData.Clear("RESTART", true);
|
||||
}
|
||||
PUB.log.AddI("*** 작업이 재시작 되었습니다 ***");
|
||||
}
|
||||
}
|
||||
|
||||
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("작업완료조건실행");
|
||||
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($"작업완료 상태로 전환합니다(대기시간:{AR.SETTING.Data.Timeout_JOBEnd}초)");
|
||||
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("작업완료조건 해제");
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user