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