using Rs.Controls; using Rs.Framework; using Rs.MotionPlat.Commom; using Rs.MotionPlat.Entitys; using Rs.MotionPlat.Flow.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Rs.MotionPlat.Flow.SubFlow { enum EStockTakeFlowStep { 待触发, 到料仓取料位上方, 等待到料仓取料位上方, 到料仓取料位下方, 等待到料仓取料位下方, 料仓取料完成抬起, 等待料仓取料完成抬起, 料仓取料真空吸检测, } /// /// 料仓取料流程 /// public class StockTakeFlow { bool finished = true; EStockTakeFlowStep flowStep = EStockTakeFlowStep.待触发; private StockTakeFlow() { } private static StockTakeFlow instance; public static StockTakeFlow Instance { get { if (instance == null) instance = new StockTakeFlow(); return instance; } } public string GetCurStep() { return flowStep.ToString(); } /// /// 料仓取料 /// /// public void Take(ETrayType trayType, int slotIndex,int nozzleIndex) { if (finished) finished = false; else return; flowStep = EStockTakeFlowStep.待触发; string logInfo = string.Empty; TargetPosition targetPosition = new TargetPosition(); Nozzle curNozzle = null; TraySlot waitTakeProductSlot = null; while (!finished) { if (MachineManage.Instance.MachineStatus== EMachineStatus.Stop) { Thread.Sleep(10); continue; } switch (flowStep) { case EStockTakeFlowStep.待触发: flowStep = EStockTakeFlowStep.到料仓取料位上方; break; case EStockTakeFlowStep.到料仓取料位上方: //获取空闲吸嘴 curNozzle = NozzleManager.GetNozzle(nozzleIndex); if (curNozzle != null) { if(trayType== ETrayType.Input) { waitTakeProductSlot = GlobalTray.InputTray.GetSlot(slotIndex); } else if(trayType== ETrayType.Grr) { waitTakeProductSlot = GlobalTray.GrrTray.GetSlot(slotIndex); } targetPosition = NozzleManager.GetToTraySlot(trayType, waitTakeProductSlot.Index, curNozzle.NozzleIndex); ProductLocationResult result = OneGrabSixteenManager.Instance.GetResultBySlotIndex(waitTakeProductSlot.Index); if (result!=null || GlobalVar.RunSpace) { if(!GlobalVar.RunSpace) { MessageQueue.Instance.Insert($"拍照偏移量 x:{result.OffsetX},y:{result.OffsetY}"); targetPosition.X += result.OffsetX; targetPosition.Y2 += result.OffsetY; } } if (GroupAxisMove.XY1Y2MovePos(targetPosition, GlobalVar.WholeSpeed)) { AxisPosPrint.PrintXY1Y2TargetPos($"到料仓{waitTakeProductSlot.Index}号穴位取料位上方,", targetPosition, GetClassName()); flowStep = EStockTakeFlowStep.等待到料仓取料位上方; } } break; case EStockTakeFlowStep.等待到料仓取料位上方: if (Ops.IsStop("LoadX", "LoadY1", "LoadY2") || GlobalVar.VirtualAxis) { AxisPosPrint.PrintXY1Y2CurrentPos("轴XY1Y2已停止运动,", GetClassName()); if (AxisArrived.LoadXY1Y2IsArrived(targetPosition.X, targetPosition.Y1, targetPosition.Y2)) { AxisPosPrint.PrintXY1Y2CurrentPos("已运动到料仓取料位上方,", GetClassName()); flowStep = EStockTakeFlowStep.到料仓取料位下方; } else { flowStep = EStockTakeFlowStep.到料仓取料位上方; } } break; case EStockTakeFlowStep.到料仓取料位下方: targetPosition.StockZ = NozzleManager.GetNozzleToTrayTakeProductPos(ETrayType.Input, curNozzle.NozzleIndex); if (NozzleManager.Go(curNozzle, targetPosition.StockZ, GlobalVar.WholeSpeed)) { logInfo = $"{GetClassName()}到料仓取料位下方,tz:{targetPosition.StockZ}"; MessageQueue.Instance.Insert(logInfo); flowStep = EStockTakeFlowStep.等待到料仓取料位下方; } break; case EStockTakeFlowStep.等待到料仓取料位下方: if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}")) { Thread.Sleep(200); logInfo = $"{GetClassName()} 已运动到料仓取料位下方"; MessageQueue.Instance.Insert(logInfo); if (!GlobalVar.RunSpace) { //打开真空吸 curNozzle.VacSuction(EIoOperate.Open, GetClassName()); } flowStep = EStockTakeFlowStep.料仓取料完成抬起; } break; case EStockTakeFlowStep.料仓取料完成抬起: if (NozzleManager.GotoSafePos(curNozzle.NozzleIndex)) { logInfo =$"{GetClassName()} 料仓取料完成抬起"; MessageQueue.Instance.Insert(logInfo); flowStep = EStockTakeFlowStep.等待料仓取料完成抬起; } break; case EStockTakeFlowStep.等待料仓取料完成抬起: if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}")) { logInfo =$"{GetClassName()} 料仓取料完成已抬起"; MessageQueue.Instance.Insert(logInfo); flowStep = EStockTakeFlowStep.料仓取料真空吸检测; } break; case EStockTakeFlowStep.料仓取料真空吸检测: if (curNozzle.HasProduct()|| GlobalVar.RunSpace) { //curNozzle.Product = new TestProduct() { SN = VirtualBarCode.Code, TestNum = 0 }; if(GlobalVar.RunSpace) { curNozzle.Product = new TestProduct() { SN = VirtualBarCode.Code, TestNum = 0, From = $"R{waitTakeProductSlot.Row + 1}C{waitTakeProductSlot.Column + 1}" }; } else { curNozzle.Product = new TestProduct() { SN = OneGrabSixteenManager.Instance.GetResultBySlotIndex(slotIndex).SN, TestNum = 0, From = $"R{waitTakeProductSlot.Row + 1}C{waitTakeProductSlot.Column + 1}" }; } curNozzle.Status = ENozzleStatus.ToTest; //curNozzle.Status = ENozzleStatus.ToUnload; GlobalTray.NozzleTray.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.Have); GlobalTray.InputTray.ChangeStatus(waitTakeProductSlot.Index, ESlotStatus.NotHave); logInfo = $"{GetClassName()} from r{waitTakeProductSlot.Row+1}c{waitTakeProductSlot.Column+1} 穴位索引:{waitTakeProductSlot.Index} 产品:{curNozzle.Product.SN}被吸嘴{curNozzle.NozzleIndex}取料完成,"; MessageQueue.Instance.Insert(logInfo); //flowStep = EStockTakeFlowStep.判断是否需要从料仓取料; finished = true; flowStep = EStockTakeFlowStep.待触发; } else { AlarmEntity alarmEntity = AlarmCollection.Get(AlarmConstID.排料吸嘴取料失败报警).Transform($"{curNozzle.NozzleIndex}",$"{waitTakeProductSlot.Row}",$"{waitTakeProductSlot.Column}",$"{waitTakeProductSlot.Index}"); EButtonType btnSelect = Msgbox.ShowDialog(alarmEntity,EButtonType.EndInput | EButtonType.Retry | EButtonType.Skip | EButtonType.Recheck); switch (btnSelect) { case EButtonType.EndInput: logInfo = GetClassName() + $"选择了结束上料"; MessageQueue.Instance.Insert(logInfo); GlobalVar.Clear = true; finished = true; flowStep = EStockTakeFlowStep.待触发; break; case EButtonType.Retry: logInfo = GetClassName() + $"选择了重试"; MessageQueue.Instance.Insert(logInfo); //先把产品放下 //StockPlaceFlow.Instance.Place(ETrayType.Input, waitTakeProductSlot.Index, curNozzle.NozzleIndex); flowStep = EStockTakeFlowStep.到料仓取料位下方; break; case EButtonType.Recheck: logInfo = GetClassName() + $"选择了重新检查真空"; MessageQueue.Instance.Insert(logInfo); flowStep = EStockTakeFlowStep.料仓取料真空吸检测; break; case EButtonType.Skip: logInfo = GetClassName() + $"选择了跳过"; MessageQueue.Instance.Insert(logInfo); finished = true; flowStep = EStockTakeFlowStep.待触发; break; default: break; } } break; } } } string GetClassName() { return $"{nameof(StockTakeFlow)}-"; } } }