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 PICKER_ON(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 iLockX = PUB.iLock[(int)eAxis.PX_PICK]; var iLockZ = PUB.iLock[(int)eAxis.PZ_PICK]; var CVMode = VAR.BOOL[eVarBool.Use_Conveyor]; //option check var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target); var OPT_CameraOff = PUB.OPT_CAMERA(target); var OPT_BYPASS = PUB.OPT_BYPASS(); //#################################################### //### 인터락 확인 //#################################################### Boolean MotMoveX = PUB.mot.IsMotion((int)eAxis.PX_PICK); Boolean MotMoveZ = PUB.mot.IsMotion((int)eAxis.PZ_PICK); if (iLockX.IsEmpty() == false && MotMoveX) { var locklistX = MOT.GetActiveLockList(eAxis.PX_PICK, iLockX); PUB.mot.MoveStop("ILock(" + string.Join(",", locklistX) + ")", (int)eAxis.PX_PICK); } if (iLockZ.IsEmpty() == false && MotMoveZ) { var locklistZ = MOT.GetActiveLockList(eAxis.PZ_PICK, iLockZ); PUB.mot.MoveStop("ILock(" + string.Join(",", locklistZ) + ")", (int)eAxis.PZ_PICK); } //#################################################### //### 작업시작 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { PUB.log.Add($"[{target}] 피커 ON 작업시작"); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### ON 위치로 이동 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { if (iLockX.IsEmpty() == false) return false; if (iLockZ.IsEmpty() == false) return false; var Pos = MOT.GetPXPos(ePXLoc.PICKON); var PosZ = MOT.GetPZPos(ePZLoc.READY); if (MOT.CheckMotionPos(seqTime, PosZ, funcName) == false) return false; if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false; PUB.log.Add($"[{target}] 피커 ON X,Y 준비위치 확인"); DIO.SetPickerVac(true); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### Z축을 내린다. //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { var PortRDY = PUB.flag.get(eVarBool.FG_RDY_PORT_PC); if (PortRDY == false) return false; PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### Z축을 내린다. //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { // if (iLockX.IsEmpty() == false) return false; if (iLockZ.IsEmpty() == false) return false; var Pos = MOT.GetPZPos(ePZLoc.PICKON); var PosMatch = MOT.getPositionMatch(Pos); //var PortRDY = PUB.flag.get(eVarBool.RDY_PORT_PC); //if (PosMatch==false ) return false; if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false; VAR.I32[eVarInt32.PickOnCount] += 1; PUB.flag.set(eVarBool.FG_PK_ITEMON, true, funcName); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### Z축을 올린다. //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { //if (iLockX.IsEmpty() == false) return false; if (iLockZ.IsEmpty() == false) return false; var Pos = MOT.GetPZPos(ePZLoc.READY); if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false; PUB.flag.set(eVarBool.FG_PK_ITEMON, true, funcName); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 프린트부착위치가 상/하가 아니라면 추가적인 회전이 필요하다 - 210207 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { var vData = target == eWorkPort.Left ? PUB.Result.ItemDataL.VisionData : PUB.Result.ItemDataR.VisionData; if (vData.PrintPositionData == "4") // 왼쪽찍기 { if (vData.ReelSize == eCartSize.Inch7) { vData.NeedCylinderForward = false; double targerPos = 0.0; if (target == eWorkPort.Left) //left printer { vData.PositionAngle = -90; //90도 회전한다 } else { vData.PositionAngle = -90; } } else { //13inch vData.NeedCylinderForward = true; if (target == eWorkPort.Left) //left printer { vData.PositionAngle = -180; } else { vData.PositionAngle = 0; } } } else if (vData.PrintPositionData == "6") //오른쪽찍기 { if (vData.ReelSize == eCartSize.Inch7) { vData.NeedCylinderForward = false; if (target == eWorkPort.Left) //left printer { vData.PositionAngle = 90; //90도 회전한다 } else { vData.PositionAngle = 90; //90도 회전한다 } } else { //13inch vData.NeedCylinderForward = true; double targerPos = 0.0; if (target == eWorkPort.Left) //left printer { vData.PositionAngle = 0; } else { vData.PositionAngle = 180; } } } else { vData.NeedCylinderForward = false; //상하에 붙이는건 실린더를 원위치해야함 vData.PositionAngle = 0; } PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### 바코드에의한 자동 회전 //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { //속도값만 취한다 var thpos = MOT.GetPTPos(ePTLoc.READY); // Baseangle 값으로 변경 210126 - qr의 각도가잇다면 그것이 기준이됨 double baseAngle = 0; string baseSource = "F"; var vdata = target == eWorkPort.Left ? PUB.Result.ItemDataL.VisionData : PUB.Result.ItemDataR.VisionData; if (vdata.BaseAngle(out string msg, out Class.KeyenceBarcodeData bcd)) { baseAngle = bcd.Angle; baseSource = bcd.barcodeSource; //230504 각도 PUB.log.AddI($"[{target}] 각도산출내용:{msg},바코드:{bcd.Data},ID:{vdata.RID}"); //210602 } else if (PUB.Result.DryRun) { PUB.log.AddAT($"[{target}] 드라이런으로 인해 각도를 적용하지 않음"); } else { PUB.log.AddE($"[{target}] base ange error : {msg},ID:{vdata.RID}"); } var addangle = baseSource == "R" ? SETTING.Data.RearBarcodeRotate : SETTING.Data.FrontBarcodeRotate; var rotAngle = baseAngle + addangle + vdata.PositionAngle; PUB.log.AddI($"[{target}]-소스:{baseSource} 회전값(Base:{baseAngle}+추가:{addangle}+비젼:{vdata.PositionAngle}={rotAngle})"); int dir = -1; while (true) { if (rotAngle > 360.0) rotAngle = rotAngle - 360.0; //한반퀴 더 도는것은 역 처리한다 else break; } //rotAngle += 90; //비젼이 90도 돌아가잇으니 다시 적용필요함 //상단이위로가도록 함 if (rotAngle > 180) { rotAngle = 360 - rotAngle; dir = 1; } PUB.log.AddI($"[{target}] 회전(최종) [{rotAngle}도,방향:{dir}],RID:{vdata.RID}"); if (target == eWorkPort.Left) PUB.Result.ItemDataL.VisionData.ApplyAngle = rotAngle; //회전각도를 넣는다 else PUB.Result.ItemDataR.VisionData.ApplyAngle = rotAngle; //회전각도를 넣는다 var curtheta = PUB.mot.GetActPos((int)eAxis.Z_THETA); var newPos = curtheta + (dir * rotAngle); PUB.log.Add($"회전전 모터 위치 : {curtheta}, 대상위치:{newPos},속도:{thpos.Speed},가속:{thpos.Acc}"); if (target == eWorkPort.Left) VAR.DBL[(int)eVarDBL.ThetaPositionL] = newPos; else VAR.DBL[(int)eVarDBL.ThetaPositionR] = newPos; //if (ByPassMode == false) //{ //바이패스에서도 추가 회전을 한다 MOT.Move(eAxis.Z_THETA, newPos, thpos.Speed, thpos.Acc, false); //} //else PUB.log.AddAT($"bypass 로 인해 회전을 하지 않습니다"); PUB.sm.seq.Update(cmdIndex); return false; } //#################################################### //### //#################################################### if (PUB.sm.seq.Get(cmdIndex) == idx++) { PUB.sm.seq.Update(cmdIndex); return false; } return true; } } }