using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using AR; namespace Project { public partial class FMain { public Boolean PRINTER_OFF(eWorkPort target, eSMStep cmdIndex) { UInt16 idx = 1; var mv = PUB.Result.vModel; var mc = PUB.Result.mModel; var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name; var seqTime = PUB.sm.seq.GetTime(cmdIndex); var msgType = (Class.eStatusMesage)target; var item = target == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR; var CVMode = VAR.BOOL[eVarBool.Use_Conveyor]; //option check var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target); var OPT_CameraOff = PUB.OPT_CAMERA(); //var OPT_BYPASS = PUB.OPT_BYPASS(target); //#################################################### //### 인터락 확인 //#################################################### Boolean MotMoveM, MotMoveZ; AR.CInterLock iLockM, iLockZ; eAxis axisM = target == eWorkPort.Left ? eAxis.PL_MOVE : eAxis.PR_MOVE; eAxis axisZ = target == eWorkPort.Left ? eAxis.PL_UPDN : eAxis.PR_UPDN; if (target == eWorkPort.Left) { MotMoveM = PUB.mot.IsMotion((int)eAxis.PL_MOVE); MotMoveZ = PUB.mot.IsMotion((int)eAxis.PL_UPDN); iLockM = PUB.iLock[(int)eAxis.PL_MOVE]; iLockZ = PUB.iLock[(int)eAxis.PL_UPDN]; } else { MotMoveM = PUB.mot.IsMotion((int)eAxis.PR_MOVE); MotMoveZ = PUB.mot.IsMotion((int)eAxis.PR_UPDN); iLockM = PUB.iLock[(int)eAxis.PR_MOVE]; iLockZ = PUB.iLock[(int)eAxis.PR_UPDN]; } if (iLockM.IsEmpty() == false && MotMoveM) { var locklistX = MOT.GetActiveLockList(axisM, iLockM); PUB.mot.MoveStop("ILock(" + string.Join(",", locklistX) + ")", (short)axisM); } if (iLockZ.IsEmpty() == false && MotMoveZ) { var locklistZ = MOT.GetActiveLockList(axisZ, iLockZ); PUB.mot.MoveStop("ILock(" + string.Join(",", locklistZ) + ")", (short)axisZ); } //#################################################### //### 작업시작 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { //PUB.log.Add($"[{target}] 프린트 OFF 작업 시작"); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 피커Y축 위치 확인 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { var PosX = MOT.GetPXPos(ePXLoc.PICKON); var OffX = MOT.getPositionOffset(PosX); if (target == eWorkPort.Left) { if (OffX < -1) return false; //충돌조건이므로 Y축을 움직이면 안된다 } else { if (OffX > 1) return false;//충돌조건이므로 Y축을 움직이면 안된다 } //PUB.log.Add($"[{target}] 프린트 OFF 작업 시작"); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 프린터Z축 위치 확인 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (iLockZ.IsEmpty() == false) return false; sPositionData Pos; if (target == eWorkPort.Left) { Pos = MOT.GetLZPos(eLZLoc.READY); } else { Pos = MOT.GetRZPos(eRZLoc.READY); } if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false; //PUB.log.Add($"[{target}] 프린트 OFF 작업 시작"); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### Y이동 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { sPositionData Pos; if (OPT_PrinterOff == false) { //릴크기없으면 오류 var reelSize = item.VisionData.ReelSize; if (reelSize == eCartSize.None) { PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOREELSIZE, eNextStep.PAUSE, target); return false; } //부착위치 var PrintPutPos = item.VisionData.GetPrintPutPosition(); if (PrintPutPos == ePrintPutPos.None) { PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOPUTPOSITION, eNextStep.PAUSE, target); return false; } if (target == eWorkPort.Left) { //위에 찍을지 아래에 찍을지 위치를 결정한다 if (reelSize == eCartSize.Inch13) { if (PrintPutPos == ePrintPutPos.Middle) Pos = MOT.GetLMPos(eLMLoc.PRINTM13); else if (PrintPutPos == ePrintPutPos.Bottom) Pos = MOT.GetLMPos(eLMLoc.PRINTL13); else Pos = MOT.GetLMPos(eLMLoc.PRINTH13); } else { if (PrintPutPos == ePrintPutPos.Middle) Pos = MOT.GetLMPos(eLMLoc.PRINTM07); else if (PrintPutPos == ePrintPutPos.Bottom) Pos = MOT.GetLMPos(eLMLoc.PRINTL07); else Pos = MOT.GetLMPos(eLMLoc.PRINTH07); } } else //Right Move { //위에 찍을지 아래에 찍을지 위치를 결정한다 if (reelSize == eCartSize.Inch13) { if (PrintPutPos == ePrintPutPos.Middle) Pos = MOT.GetRMPos(eRMLoc.PRINTM13); else if (PrintPutPos == ePrintPutPos.Bottom) Pos = MOT.GetRMPos(eRMLoc.PRINTL13); else Pos = MOT.GetRMPos(eRMLoc.PRINTH13); } else { if (PrintPutPos == ePrintPutPos.Middle) Pos = MOT.GetRMPos(eRMLoc.PRINTM07); else if (PrintPutPos == ePrintPutPos.Bottom) Pos = MOT.GetRMPos(eRMLoc.PRINTL07); else Pos = MOT.GetRMPos(eRMLoc.PRINTH07); } } if (iLockM.IsEmpty() == false) return false; //if (iLockZ.IsEmpty() == false) return false; //위치오류확인 if (Pos.isError == false) { if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false; } else { PUB.Result.SetResultMessage(eResult.OPERATION, eECode.POSITION_ERROR, eNextStep.PAUSE, "PRINTPOS"); return false; } } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 실린더 전/후진 상태를 전환한다 -- 210207 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (OPT_PrinterOff == false) { var Cylinder = item.VisionData.NeedCylinderForward; if (Cylinder == true) { //전진이 필요하다 if (target == eWorkPort.Left) DIO.SetOutput(eDOName.PRINTL_FWD, true); else DIO.SetOutput(eDOName.PRINTR_FWD, true); } else { //전진이 필요하지 않다. if (target == eWorkPort.Left) DIO.SetOutput(eDOName.PRINTL_FWD, false); else DIO.SetOutput(eDOName.PRINTR_FWD, false); } } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 카트모드에서는 추가 실린더 down 해야한다 230809 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (OPT_PrinterOff == false) { if (SETTING.Data.Enable_PickerCylinder) { //전진이 필요하다 if (target == eWorkPort.Left) DIO.SetOutput(eDOName.L_CYLDN, true); else DIO.SetOutput(eDOName.R_CYLDN, true); } else { if (target == eWorkPort.Left) DIO.SetOutput(eDOName.L_CYLDN, false); else DIO.SetOutput(eDOName.R_CYLDN, false); } } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 카트상태확인 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (OPT_PrinterOff == false) { eVarBool fg = target == eWorkPort.Left ? eVarBool.FG_RDY_PORT_PL : eVarBool.FG_RDY_PORT_PR; if (PUB.flag.get(fg) == false) return false; } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 실린더상태확인 -- 210207 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (OPT_PrinterOff == false) { var Cylinder = item.VisionData.NeedCylinderForward; if (Cylinder == true) { //전진이 필요하다 if (target == eWorkPort.Left) { if (DIO.checkDigitalO(eDIName.L_PICK_FW, seqTime, true) != eNormalResult.True) return false; } else { if (DIO.checkDigitalO(eDIName.R_PICK_FW, seqTime, true) != eNormalResult.True) return false; } } else { //전진이 필요하지 않다. if (target == eWorkPort.Left) { if (DIO.checkDigitalO(eDIName.L_PICK_BW, seqTime, true) != eNormalResult.True) return false; } else { if (DIO.checkDigitalO(eDIName.R_PICK_BW, seqTime, true) != eNormalResult.True) return false; } } } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 피커 down 실린더상태확인 -- 230809 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (OPT_PrinterOff == false && SETTING.Data.Enable_PickerCylinder) { //전진이 필요하다 if (target == eWorkPort.Left) { if (DIO.checkDigitalO(eDIName.L_CYLDN, seqTime, true, timeoutcode: eECode.PICKER_LCYL_NODOWN) != eNormalResult.True) return false; } else { if (DIO.checkDigitalO(eDIName.R_CYLDN, seqTime, true, timeoutcode: eECode.PICKER_RCYL_NODOWN) != eNormalResult.True) return false; } } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### Z값을 내린다. //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (iLockZ.IsEmpty() == false) return false; if (OPT_PrinterOff == false) { sPositionData Pos; if (target == eWorkPort.Left) Pos = MOT.GetLZPos(eLZLoc.PICKOFF); else Pos = MOT.GetRZPos(eRZLoc.PICKOFF); if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false; } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 진공파기 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (OPT_PrinterOff == false) { if (target == eWorkPort.Left) { DIO.SetPrintLVac(ePrintVac.exhaust); } else { DIO.SetPrintRVac(ePrintVac.exhaust); } } if (target == eWorkPort.Left) { VAR.BOOL[eVarBool.LEFT_ITEM_PICKOFF] = true; VAR.TIME[eVarTime.LEFT_ITEM_PICKOFF] = DateTime.Now; VAR.DBL[eVarDBL.LEFT_ITEM_PICKOFF] = 0; VAR.I32[eVarInt32.LEFT_ITEM_COUNT] += 1; } else { VAR.BOOL[eVarBool.RIGT_ITEM_PICKOFF] = true; VAR.TIME[eVarTime.RIGT_ITEM_PICKOFF] = DateTime.Now; VAR.DBL[eVarDBL.RIGT_ITEM_PICKOFF] = 0; VAR.I32[eVarInt32.RIGT_ITEM_COUNT] += 1; } PUB.log.Add($"[{target}] Placing reel down"); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 잠시대기 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (OPT_PrinterOff == false) { if (seqTime.TotalMilliseconds < AR.SETTING.Data.PrintVacOffPurgeMS) return false; } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 저속으로올린다 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (iLockZ.IsEmpty() == false) return false; if (OPT_PrinterOff == false) { sPositionData Pos; if (target == eWorkPort.Left) Pos = MOT.GetLZPos(eLZLoc.PICKOFF); else Pos = MOT.GetRZPos(eRZLoc.PICKOFF); Pos.Position -= 30; Pos.Speed = 30; if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false; } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 카트모드에서는 추가 실린더 down 해야한다 230809 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { //if (ByPassMode == false) //{ // if (CVMode == false) //{ //전진이 필요하다 if (target == eWorkPort.Left) DIO.SetOutput(eDOName.L_CYLDN, false); else DIO.SetOutput(eDOName.R_CYLDN, false); //} // } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### Z값 대기위치로 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (iLockZ.IsEmpty() == false) return false; if (OPT_PrinterOff == false) { sPositionData Pos; if (target == eWorkPort.Left) Pos = MOT.GetLZPos(eLZLoc.READY); else Pos = MOT.GetRZPos(eRZLoc.READY); if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false; } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### AIR해제 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (target == eWorkPort.Left) DIO.SetPrintLVac(ePrintVac.off); else DIO.SetPrintRVac(ePrintVac.off); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 실린더 복귀 확인 -- 230809 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (SETTING.Data.Enable_PickerCylinder) { //상승이 필요하다 if (target == eWorkPort.Left) { if (DIO.checkDigitalO(eDIName.L_CYLUP, seqTime, true, timeoutcode: eECode.PICKER_LCYL_NOUP) != eNormalResult.True) return false; } else { if (DIO.checkDigitalO(eDIName.R_CYLUP, seqTime, true, timeoutcode: eECode.PICKER_RCYL_NOUP) != eNormalResult.True) return false; } } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (OPT_PrinterOff == false) { if (target == eWorkPort.Left) { if (DIO.checkDigitalO(eDIName.L_PICK_VAC, seqTime, false) != eNormalResult.True) return false; VAR.I32[eVarInt32.LPickOfCount] += 1; } else { if (DIO.checkDigitalO(eDIName.R_PICK_VAC, seqTime, false) != eNormalResult.True) return false; VAR.I32[eVarInt32.RPickOfCount] += 1; } //PUB.log.AddAT($"용지 떨어짐 확인 필요"); } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (target == eWorkPort.Left) { PUB.flag.set(eVarBool.FG_PL_ITEMON, false, funcName); } else { PUB.flag.set(eVarBool.FG_PR_ITEMON, false, funcName); } //프린터 사용여부 확인 if (OPT_PrinterOff == false) { item.PrintAttach = true; item.Attachtime = DateTime.Now; } PUB.sm.seq.Update(cmdIndex); return false; } return true; } } }