Initial commit

This commit is contained in:
ChiKyun Kim
2025-07-17 16:11:46 +09:00
parent 4865711adc
commit 4a1b1924ba
743 changed files with 230954 additions and 0 deletions

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

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

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

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

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

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

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

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