From 545734913753e846f435cca441e3755525ba60b8 Mon Sep 17 00:00:00 2001 From: lhiven <236881222@qq.com> Date: Sat, 20 Apr 2024 10:08:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=8A=A5=E8=AD=A6=E5=8F=91?= =?UTF-8?q?=E7=94=9F=E6=97=B6=E6=95=B4=E4=B8=AA=E8=AE=BE=E5=A4=87=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E5=B7=A5=E4=BD=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Rs.SkyLine/Commom/AlarmMessageBox.cs | 2 + Rs.SkyLine/Commom/Ops.cs | 5 +- Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs | 3235 +++++------ Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs | 4807 +++++++++-------- .../DischargeModuleGoSafePosFlow.cs | 10 +- .../SafePosFlow/TransitModuleSafePosFlow.cs | 10 +- Rs.SkyLine/Properties/AssemblyInfo.cs | 2 +- 7 files changed, 4089 insertions(+), 3982 deletions(-) diff --git a/Rs.SkyLine/Commom/AlarmMessageBox.cs b/Rs.SkyLine/Commom/AlarmMessageBox.cs index 326cc67..49ee6a9 100644 --- a/Rs.SkyLine/Commom/AlarmMessageBox.cs +++ b/Rs.SkyLine/Commom/AlarmMessageBox.cs @@ -78,6 +78,7 @@ namespace Rs.MotionPlat.Commom } public static ETipButton ShowDialog(bool pause,ETipButton button, Dictionary buttonText,int msgID, params string[] parameters) { + Ops.Stop(); AlarmEntity ae = AlarmCollection.Get(msgID).Transform(parameters); AlarmItem msg = new AlarmItem(); msg.Pause = pause; @@ -92,6 +93,7 @@ namespace Rs.MotionPlat.Commom public static ETipButton ShowDialog(AlarmEntity alarmEntity,ETipButton button, Dictionary buttonText,bool pause=true) { + Ops.Stop(); AlarmItem msg = new AlarmItem(); msg.Pause = pause; msg.NO = alarmEntity.AlarmID; diff --git a/Rs.SkyLine/Commom/Ops.cs b/Rs.SkyLine/Commom/Ops.cs index b183f11..01f2855 100644 --- a/Rs.SkyLine/Commom/Ops.cs +++ b/Rs.SkyLine/Commom/Ops.cs @@ -154,8 +154,9 @@ namespace Rs.MotionPlat.Commom TurnoverSlotOffset.Init(); MonitorSystemButton.Instance.Start(); TestCenter.Instance.Init(); - - + + DischargeFlow.Instance.Init(); + TurnoverFlow.Instance.Init(); SysConfigParam.Update("EnableVirtuleBarCode", "False"); diff --git a/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs b/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs index 15b2ffd..a7f4663 100644 --- a/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs +++ b/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs @@ -72,8 +72,9 @@ namespace Rs.MotionPlat.Flow /// /// 排料流程 /// - public class DischargeFlow : BaseFlow + public class DischargeFlow { + private Task mainTask; private DischargeFlow() { } private static DischargeFlow instance; @@ -137,1960 +138,1931 @@ namespace Rs.MotionPlat.Flow /// private int undoTaskNum = 0; int scanNum = 0; + string logInfo = string.Empty; + string alarmInfo = string.Empty; - public override void Run() + private bool stop = true; + private bool run = true; + public void Init() { - switch (flowStep) + mainTask = new Task(Run); + mainTask.Start(); + } + + public void Deinit() + { + run = false; + } + private void Run() + { + while (run) { - case EDischargeFlowStep.等待任务: - if (WorkEnvironment.Instance.EnvironmentOk) - { - if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Load) > 0 - || LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Unload) > 0 - || LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Change) > 0) + if(stop || !GlobalVar.DeviceIsAuto) + { + Thread.Sleep(10); + continue; + } + switch (flowStep) + { + case EDischargeFlowStep.等待任务: + if (WorkEnvironment.Instance.EnvironmentOk) { - - StockTrayToTurnoverTray = true; - logInfo = GetClassName() + $"接收到排料任务"; - MessageQueue.Instance.Insert(logInfo); - if (GlobalVar.CleanOut && GlobalVar.DischargeNozzleHasProduct) + if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Load) > 0 + || LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Unload) > 0 + || LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Change) > 0) { - foreach (TurnoverInfo ti in LoadAndUnloadTask.Instance.GetUnDealedTask()) - { - ti.Dealed = true; - } - mrs = new List(); - for (int i = 0; i < 8; i++) + + StockTrayToTurnoverTray = true; + logInfo = GetClassName() + $"接收到排料任务"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.CleanOut && GlobalVar.DischargeNozzleHasProduct) { - mrs.Add(new MatchResult()); + foreach (TurnoverInfo ti in LoadAndUnloadTask.Instance.GetUnDealedTask()) + { + ti.Dealed = true; + } + mrs = new List(); + for (int i = 0; i < 8; i++) + { + mrs.Add(new MatchResult()); + } + flowStep = EDischargeFlowStep.到放料位上方; } - flowStep = EDischargeFlowStep.到放料位上方; - } - else - { - if (GlobalVar.NeedCheckEnvironment && !GlobalVar.CleanOut) + else { - if (GlobalVar.EnableWorkEnviromentCheck) + if (GlobalVar.NeedCheckEnvironment && !GlobalVar.CleanOut) { - WorkEnvironment.Instance.Check(); + if (GlobalVar.EnableWorkEnviromentCheck) + { + WorkEnvironment.Instance.Check(); + } + GlobalVar.NeedCheckEnvironment = false; } - GlobalVar.NeedCheckEnvironment = false; + flowStep = EDischargeFlowStep.到取料位上方; } - flowStep = EDischargeFlowStep.到取料位上方; - } + } } - } - break; - case EDischargeFlowStep.到取料位上方: - //先取上料任务,再取下料任务,最后取换料任务 - if (StockTrayToTurnoverTray) - { - if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Load) > 0) - { - curTask = LoadAndUnloadTask.Instance.GetLoadTask(); - } - else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Unload) > 0) - { - curTask = LoadAndUnloadTask.Instance.GetUnLoadTask(); - } - else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Change) > 0) - { - curTask = LoadAndUnloadTask.Instance.GetChangeTask(); - } - } - else - { - if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Unload) > 0) - { - curTask = LoadAndUnloadTask.Instance.GetUnLoadTask(); - } - else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Load) > 0) - { - curTask = LoadAndUnloadTask.Instance.GetLoadTask(); - } - else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Change) > 0) + break; + case EDischargeFlowStep.到取料位上方: + //先取上料任务,再取下料任务,最后取换料任务 + if (StockTrayToTurnoverTray) { - curTask = LoadAndUnloadTask.Instance.GetChangeTask(); + if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Load) > 0) + { + curTask = LoadAndUnloadTask.Instance.GetLoadTask(); + } + else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Unload) > 0) + { + curTask = LoadAndUnloadTask.Instance.GetUnLoadTask(); + } + else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Change) > 0) + { + curTask = LoadAndUnloadTask.Instance.GetChangeTask(); + } } - } - curNozzle = NozzleManager.GetIdelNozzle(); - if (curTask != null && curNozzle != null) - { - if (XYCanGoLocalArea() || GlobalVar.VirtualAxis) + else { - curSlotPoint = null; - curNozzle.FromType = curTask.FromType; - if (curTask.FromType == TurnoverType.Turnover) + if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Unload) > 0) { - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, curTask.FromIndex + 1); - curNozzle.FromIndex = curTask.FromIndex; - logInfo = GetClassName() + $"排料{curNozzle.NozzleIndex}号吸嘴到{curTask.FromType.ToString()}盘{curNozzle.FromIndex + 1}号穴位取料"; - MessageQueue.Instance.Insert(logInfo); + curTask = LoadAndUnloadTask.Instance.GetUnLoadTask(); } - else if (curTask.FromType == TurnoverType.ToBeTested) + else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Load) > 0) { - TraySlot slot = null; - if (Ops.IsOff("2号料仓缺盘光电检测")) - { - slot = GlobalTray.InputTray.GetSlot(ESlotStatus.Have, true); - } - else - { - slot = GlobalTray.InputTray.GetSlot(ESlotStatus.Have); - } - if (slot != null) + curTask = LoadAndUnloadTask.Instance.GetLoadTask(); + } + else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.Change) > 0) + { + curTask = LoadAndUnloadTask.Instance.GetChangeTask(); + } + } + curNozzle = NozzleManager.GetIdelNozzle(); + if (curTask != null && curNozzle != null) + { + if (XYCanGoLocalArea() || GlobalVar.VirtualAxis) + { + curSlotPoint = null; + curNozzle.FromType = curTask.FromType; + if (curTask.FromType == TurnoverType.Turnover) { - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Input, slot.Index); - curNozzle.FromIndex = slot.Index - 1; + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, curTask.FromIndex + 1); + curNozzle.FromIndex = curTask.FromIndex; logInfo = GetClassName() + $"排料{curNozzle.NozzleIndex}号吸嘴到{curTask.FromType.ToString()}盘{curNozzle.FromIndex + 1}号穴位取料"; MessageQueue.Instance.Insert(logInfo); } - else + else if (curTask.FromType == TurnoverType.ToBeTested) { - //上料完成后判断是否时最后一盘料 - //while (true) + TraySlot slot = null; + if (Ops.IsOff("2号料仓缺盘光电检测")) + { + slot = GlobalTray.InputTray.GetSlot(ESlotStatus.Have, true); + } + else + { + slot = GlobalTray.InputTray.GetSlot(ESlotStatus.Have); + } + if (slot != null) + { + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Input, slot.Index); + curNozzle.FromIndex = slot.Index - 1; + logInfo = GetClassName() + $"排料{curNozzle.NozzleIndex}号吸嘴到{curTask.FromType.ToString()}盘{curNozzle.FromIndex + 1}号穴位取料"; + MessageQueue.Instance.Insert(logInfo); + } + else { - if (Ops.IsOff("2号料仓缺盘光电检测")) + //上料完成后判断是否时最后一盘料 + //while (true) { - logInfo = AlarmCollection.GetAlarm(AlarmConstID.Input最后一盘); - msgBox = PromptMessageBox.ShowDialog(AlarmConstID.Input最后一盘, logInfo, (ETipButton.Yes | ETipButton.No), new Dictionary() { { ETipButton.Yes, "是|Yes" }, { ETipButton.No, "结束上料|EndInput" } }); - if (msgBox.Button == ETipButton.Yes) + if (Ops.IsOff("2号料仓缺盘光电检测")) { - flowStep = EDischargeFlowStep.到取料位上方; - } - else - { - //endInputClicked = true; - //结束上料 - TestCenter.Instance.EndInput(); - LoadAndUnloadTask.Instance.ClearUndoTask(); - if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count > 0) + logInfo = AlarmCollection.GetAlarm(AlarmConstID.Input最后一盘); + msgBox = PromptMessageBox.ShowDialog(AlarmConstID.Input最后一盘, logInfo, (ETipButton.Yes | ETipButton.No), new Dictionary() { { ETipButton.Yes, "是|Yes" }, { ETipButton.No, "结束上料|EndInput" } }); + if (msgBox.Button == ETipButton.Yes) { - flowStep = EDischargeFlowStep.到下相机拍照起始位; + flowStep = EDischargeFlowStep.到取料位上方; } else { - List needScanbarcodeSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); - if (needScanbarcodeSlots != null && needScanbarcodeSlots.Count > 0) - { - ScanBarCode(); - } - if (LoadAndUnloadTask.Instance.GetUnDealedTask().Count > 0) + //endInputClicked = true; + //结束上料 + TestCenter.Instance.EndInput(); + LoadAndUnloadTask.Instance.ClearUndoTask(); + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count > 0) { - StockTrayToTurnoverTray = !StockTrayToTurnoverTray; - flowStep = EDischargeFlowStep.到取料位上方; + flowStep = EDischargeFlowStep.到下相机拍照起始位; } else { - flowStep = EDischargeFlowStep.任务结束到安全位; + List needScanbarcodeSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); + if (needScanbarcodeSlots != null && needScanbarcodeSlots.Count > 0) + { + ScanBarCode(); + } + if (LoadAndUnloadTask.Instance.GetUnDealedTask().Count > 0) + { + StockTrayToTurnoverTray = !StockTrayToTurnoverTray; + flowStep = EDischargeFlowStep.到取料位上方; + } + else + { + flowStep = EDischargeFlowStep.任务结束到安全位; + } } + break; } - break; } - } - else - { - logInfo = GetClassName() + $"{curTask.FromType.ToString()}盘无料,准备切换料盘"; - MessageQueue.Instance.Insert(logInfo); - TakeTrayFlow.Instance.Take(ETrayType.Input, ETrayType.Empty1, - () => - { - Task.Run(() => + else + { + logInfo = GetClassName() + $"{curTask.FromType.ToString()}盘无料,准备切换料盘"; + MessageQueue.Instance.Insert(logInfo); + TakeTrayFlow.Instance.Take(ETrayType.Input, ETrayType.Empty1, + () => { - StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.Whole, null); - }); - }, null, - () => - { - Task.Run(() => + Task.Run(() => + { + StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.Whole, null); + }); + }, null, + () => { - StockManager.Instance.GetStock(ETrayType.Empty1).Unload(EStockTrayUnLoadMode.Whole, null); + Task.Run(() => + { + StockManager.Instance.GetStock(ETrayType.Empty1).Unload(EStockTrayUnLoadMode.Whole, null); + }); }); - }); - StockManager.Instance.GetStock(ETrayType.Input).WaitFinished(); + StockManager.Instance.GetStock(ETrayType.Input).WaitFinished(); + } } + break; } - break; } - } - if (curSlotPoint != null) - { - nozzleDist = TrayPointManager.GetDistToNozzle1(curNozzle.NozzleIndex); - targetX = curSlotPoint.X + nozzleDist.X; - targetY = curSlotPoint.Y + nozzleDist.Y; - errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + if (curSlotPoint != null) { - //if(Ops.IsHomedAndNearStartPos($"NozzleR{NozzleIndex}")) + nozzleDist = TrayPointManager.GetDistToNozzle1(curNozzle.NozzleIndex); + targetX = curSlotPoint.X + nozzleDist.X; + targetY = curSlotPoint.Y + nozzleDist.Y; + errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - errCode = AxisControl.LoadY.MovePos(targetY, (int)(GlobalVar.WholeSpeed)); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + //if(Ops.IsHomedAndNearStartPos($"NozzleR{NozzleIndex}")) { - targetR = SysConfigParam.GetValue($"NozzleR{curNozzle.NozzleIndex}StartPos"); - errCode = AxisControl.GetAxis($"NozzleR{curNozzle.NozzleIndex}").MovePos(targetR, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok | GlobalVar.VirtualAxis) + errCode = AxisControl.LoadY.MovePos(targetY, (int)(GlobalVar.WholeSpeed)); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - if (GlobalVar.VirtualAxis) + targetR = SysConfigParam.GetValue($"NozzleR{curNozzle.NozzleIndex}StartPos"); + errCode = AxisControl.GetAxis($"NozzleR{curNozzle.NozzleIndex}").MovePos(targetR, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok | GlobalVar.VirtualAxis) { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + LogHelper.Debug(GetClassName() + $"到取料位上方tx:{targetX},ty{targetY},tr={targetR}"); + flowStep = EDischargeFlowStep.等待到取料位上方; + } + else + { + //MsgBox.ShowAxisAlarmDialog($"NozzleR{curNozzle.NozzleIndex}", errCode); + alarmEntity = AlarmCollection.Get($"NozzleR{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - LogHelper.Debug(GetClassName() + $"到取料位上方tx:{targetX},ty{targetY},tr={targetR}"); - flowStep = EDischargeFlowStep.等待到取料位上方; } else { - //MsgBox.ShowAxisAlarmDialog($"NozzleR{curNozzle.NozzleIndex}", errCode); - alarmEntity = AlarmCollection.Get($"NozzleR{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); + AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.LoadY运动异常, errCode.ToString()); } } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); - AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.LoadY运动异常, errCode.ToString()); - } + //else + // { + // Msg.ShowError($"吸头 NozzleR{NozzleIndex} 不在起始位,请手动手动回原后运动到起始位"); + // } + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); + AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.LoadX运动异常, errCode.ToString()); } - //else - // { - // Msg.ShowError($"吸头 NozzleR{NozzleIndex} 不在起始位,请手动手动回原后运动到起始位"); - // } - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); - AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.LoadX运动异常, errCode.ToString()); } } + else + { + //logInfo = "x y r move is unsafe"; + //Msg.ShowError(logInfo); + MessageQueue.Instance.Warn($"LoadY运动不安全,请检查TurnoverY的位置"); + AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.运动不安全, $"{AxisAlias.LoadY}", $"{AxisAlias.TurnoverY}"); + } } - else - { - //logInfo = "x y r move is unsafe"; - //Msg.ShowError(logInfo); - MessageQueue.Instance.Warn($"LoadY运动不安全,请检查TurnoverY的位置"); - AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.运动不安全, $"{AxisAlias.LoadY}", $"{AxisAlias.TurnoverY}"); - } - } - break; + break; - case EDischargeFlowStep.等待到取料位上方: - if (Ops.IsStop("LoadX", "LoadY", $"NozzleR{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴XY已停止运动,"); - if (AxisArrived.LoadXYIsArrived(targetX, targetY)) - { - logInfo = GetClassName() + $"已运动到{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}取料位上方,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"; - MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.到取料位下方; - } - else + case EDischargeFlowStep.等待到取料位上方: + if (Ops.IsStop("LoadX", "LoadY", $"NozzleR{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) { - //LogHelper.Debug(GetClassName()+ $"检测到x,y不在目标位置,当前位置x:{Ops.GetCurPosition(AxisControl.LoadX)},y:{Ops.GetCurPosition(AxisControl.LoadY)}"); - PrintXYCurrentPos($"轴XY不在目标位置,tx:{targetX},ty:{targetY}"); - flowStep = EDischargeFlowStep.到取料位上方; + PrintXYCurrentPos("轴XY已停止运动,"); + if (AxisArrived.LoadXYIsArrived(targetX, targetY)) + { + logInfo = GetClassName() + $"已运动到{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}取料位上方,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.到取料位下方; + } + else + { + //LogHelper.Debug(GetClassName()+ $"检测到x,y不在目标位置,当前位置x:{Ops.GetCurPosition(AxisControl.LoadX)},y:{Ops.GetCurPosition(AxisControl.LoadY)}"); + PrintXYCurrentPos($"轴XY不在目标位置,tx:{targetX},ty:{targetY}"); + flowStep = EDischargeFlowStep.到取料位上方; + } } - } - break; + break; - case EDischargeFlowStep.到取料位下方: - //if (AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").HomeStatus == EHomeStatus.Finished || GlobalVar.VirtualAxis) - { - if (curTask.FromType == TurnoverType.Turnover) + case EDischargeFlowStep.到取料位下方: + //if (AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").HomeStatus == EHomeStatus.Finished || GlobalVar.VirtualAxis) { - targetZ = GetVacOffsetHeight(reFetchNum) + SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"); - //在周转盘取料,提前把真空吸打开 - VacManager.DischargeVacSuction(EVacOperator.Open, false, curNozzle.NozzleIndex); - VacManager.TurnoverTrayVacSuction(EVacOperator.Close, false, curNozzle.FromIndex + 1); + if (curTask.FromType == TurnoverType.Turnover) + { + targetZ = GetVacOffsetHeight(reFetchNum) + SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"); + //在周转盘取料,提前把真空吸打开 + VacManager.DischargeVacSuction(EVacOperator.Open, false, curNozzle.NozzleIndex); + VacManager.TurnoverTrayVacSuction(EVacOperator.Close, false, curNozzle.FromIndex + 1); + } + else if (curTask.FromType == TurnoverType.ToBeTested) + { + targetZ = GetVacOffsetHeight(reFetchNum) + SysConfigParam.GetValue($"TrayNozzle{curNozzle.NozzleIndex}TakeHeight"); + } + errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + logInfo = GetClassName() + $"到{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}号穴位取料位下方,tz{curNozzle.NozzleIndex}:{targetZ}"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + flowStep = EDischargeFlowStep.等待到取料位下方; + } + else + { + //MsgBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); + //AlarmMessageBox.ShowDialog(true,ETipButton.Ok,null,) + alarmEntity = AlarmCollection.Get($"NozzleZ{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } } - else if (curTask.FromType == TurnoverType.ToBeTested) + //else + //{ + // logInfo = GetClassName()+ $"NozzleZ{curNozzle.NozzleIndex} 轴状态未回原,请手动回原后点击确定"; + // MessageQueue.Instance.Warn(logInfo); + // //MsgBox.ShowDialog(AlarmConstID.AxisNotAtHomeAlarm, logInfo, ETipButton.Ok); + // AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴不在原点, $"NozzleZ{curNozzle.NozzleIndex}"); + //} + break; + + case EDischargeFlowStep.等待到取料位下方: + if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) { - targetZ = GetVacOffsetHeight(reFetchNum) + SysConfigParam.GetValue($"TrayNozzle{curNozzle.NozzleIndex}TakeHeight"); + if (AxisArrived.LoadXYIsArrived(targetX, targetY)) + { + logInfo = GetClassName() + $"已运动到{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}号穴位取料位下方,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; + MessageQueue.Instance.Insert(logInfo); + if (curTask.FromType == TurnoverType.Turnover) + { + VacManager.TurnoverTrayVacBreak(EVacOperator.Open, true, curNozzle.FromIndex + 1); + } + else + { + VacManager.DischargeVacSuction(EVacOperator.Open, true, curNozzle.NozzleIndex); + } + flowStep = EDischargeFlowStep.取料完成抬起; + //flowStep = EDischargeFlowStep.开真空; + } + else + { + PrintXYCurrentPos($"轴XY不在目标位置,tx:{targetX},ty:{targetY}"); + flowStep = EDischargeFlowStep.到取料位上方; + } } + break; + + //case EDischargeFlowStep.开真空: + // /*打开排料吸嘴真空吸*/ + // //Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀"); + // //Thread.Sleep(GlobalVar.LoadNozzleOpenVacSuctionDelaytime); + + // //logInfo = GetClassName()+ $"打开{curNozzle.NozzleIndex}号排料吸嘴真空吸"; + // //MessageQueue.Instance.Insert(logInfo); + // if (curTask.FromType == TurnoverType.Turnover) + // { + // /*关闭周转盘真空吸*/ + // //logInfo = GetClassName() + $"关闭周转盘{curTask.FromIndex + 1}号穴位真空吸"; + // //Ops.Off($"周转盘{curTask.FromIndex + 1}号穴位真空吸"); + // //Thread.Sleep(GlobalVar.TurnoverTrayCloseVacSuctionDelaytime); + // //MessageQueue.Instance.Insert(logInfo); + // //VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, curNozzle.FromIndex+1); + // /*打开周转盘真空破*/ + // //logInfo = GetClassName() + $"打开周转盘{curTask.FromIndex + 1}号穴位真空破"; + // //Ops.On($"周转盘{curTask.FromIndex + 1}号穴位真空破"); + // //Thread.Sleep(GlobalVar.TurnoverTrayOpenVacBreakDelaytime); + // //MessageQueue.Instance.Insert(logInfo); + // VacManager.TurnoverTrayVacBreak( EVacOperator.Open,true,curNozzle.FromIndex + 1); + // /*关闭周转盘真空破*/ + // //logInfo = GetClassName() + $"关闭周转盘{curTask.FromIndex + 1}号穴位真空破"; + // //Ops.Off($"周转盘{curTask.FromIndex + 1}号穴位真空破"); + // //Thread.Sleep(GlobalVar.TurnoverTrayCloseVacBreakDelaytime); + // //MessageQueue.Instance.Insert(logInfo); + + // } + // else + // { + // VacManager.DischargeVacSuction(EVacOperator.Open, true, curNozzle.NozzleIndex); + // } + // flowStep = EDischargeFlowStep.取料完成抬起; + // break; + + case EDischargeFlowStep.取料完成抬起: + targetZ = 0; errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"到{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}号穴位取料位下方,tz{curNozzle.NozzleIndex}:{targetZ}"; - MessageQueue.Instance.Insert(logInfo); if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - flowStep = EDischargeFlowStep.等待到取料位下方; + logInfo = GetClassName() + $"取{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}号穴位产品完成抬起,tz{curNozzle.NozzleIndex}:{targetZ}"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.等待取料完成抬起; } else { - //MsgBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); - //AlarmMessageBox.ShowDialog(true,ETipButton.Ok,null,) + //PromptMessageBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); alarmEntity = AlarmCollection.Get($"NozzleZ{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - //else - //{ - // logInfo = GetClassName()+ $"NozzleZ{curNozzle.NozzleIndex} 轴状态未回原,请手动回原后点击确定"; - // MessageQueue.Instance.Warn(logInfo); - // //MsgBox.ShowDialog(AlarmConstID.AxisNotAtHomeAlarm, logInfo, ETipButton.Ok); - // AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴不在原点, $"NozzleZ{curNozzle.NozzleIndex}"); - //} - break; - - case EDischargeFlowStep.等待到取料位下方: - if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - { - if (AxisArrived.LoadXYIsArrived(targetX, targetY)) + break; + case EDischargeFlowStep.等待取料完成抬起: + if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"已运动到{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}号穴位取料位下方,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; + logInfo = GetClassName() + $"取{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}号穴位产品完成已抬起,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; MessageQueue.Instance.Insert(logInfo); if (curTask.FromType == TurnoverType.Turnover) { - VacManager.TurnoverTrayVacBreak(EVacOperator.Open, true, curNozzle.FromIndex + 1); - } - else - { - VacManager.DischargeVacSuction(EVacOperator.Open, true, curNozzle.NozzleIndex); + ///周转盘取料抬起后把真空破关闭,这里关破真空不等待 + VacManager.TurnoverTrayVacBreak(EVacOperator.Close, false, curNozzle.FromIndex + 1); } - flowStep = EDischargeFlowStep.取料完成抬起; - //flowStep = EDischargeFlowStep.开真空; - } - else - { - PrintXYCurrentPos($"轴XY不在目标位置,tx:{targetX},ty:{targetY}"); - flowStep = EDischargeFlowStep.到取料位上方; - } - } - break; - - //case EDischargeFlowStep.开真空: - // /*打开排料吸嘴真空吸*/ - // //Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀"); - // //Thread.Sleep(GlobalVar.LoadNozzleOpenVacSuctionDelaytime); - - // //logInfo = GetClassName()+ $"打开{curNozzle.NozzleIndex}号排料吸嘴真空吸"; - // //MessageQueue.Instance.Insert(logInfo); - // if (curTask.FromType == TurnoverType.Turnover) - // { - // /*关闭周转盘真空吸*/ - // //logInfo = GetClassName() + $"关闭周转盘{curTask.FromIndex + 1}号穴位真空吸"; - // //Ops.Off($"周转盘{curTask.FromIndex + 1}号穴位真空吸"); - // //Thread.Sleep(GlobalVar.TurnoverTrayCloseVacSuctionDelaytime); - // //MessageQueue.Instance.Insert(logInfo); - // //VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, curNozzle.FromIndex+1); - // /*打开周转盘真空破*/ - // //logInfo = GetClassName() + $"打开周转盘{curTask.FromIndex + 1}号穴位真空破"; - // //Ops.On($"周转盘{curTask.FromIndex + 1}号穴位真空破"); - // //Thread.Sleep(GlobalVar.TurnoverTrayOpenVacBreakDelaytime); - // //MessageQueue.Instance.Insert(logInfo); - // VacManager.TurnoverTrayVacBreak( EVacOperator.Open,true,curNozzle.FromIndex + 1); - // /*关闭周转盘真空破*/ - // //logInfo = GetClassName() + $"关闭周转盘{curTask.FromIndex + 1}号穴位真空破"; - // //Ops.Off($"周转盘{curTask.FromIndex + 1}号穴位真空破"); - // //Thread.Sleep(GlobalVar.TurnoverTrayCloseVacBreakDelaytime); - // //MessageQueue.Instance.Insert(logInfo); - - // } - // else - // { - // VacManager.DischargeVacSuction(EVacOperator.Open, true, curNozzle.NozzleIndex); - // } - // flowStep = EDischargeFlowStep.取料完成抬起; - // break; - - case EDischargeFlowStep.取料完成抬起: - targetZ = 0; - errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"取{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}号穴位产品完成抬起,tz{curNozzle.NozzleIndex}:{targetZ}"; - MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.等待取料完成抬起; - } - else - { - //PromptMessageBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); - alarmEntity = AlarmCollection.Get($"NozzleZ{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case EDischargeFlowStep.等待取料完成抬起: - if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - { - logInfo = GetClassName() + $"取{WitchTrayWitchSlot(curNozzle.FromType, curNozzle.FromIndex)}号穴位产品完成已抬起,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; - MessageQueue.Instance.Insert(logInfo); - if (curTask.FromType == TurnoverType.Turnover) - { - ///周转盘取料抬起后把真空破关闭,这里关破真空不等待 - VacManager.TurnoverTrayVacBreak(EVacOperator.Close, false, curNozzle.FromIndex + 1); + flowStep = EDischargeFlowStep.取料完成后真空检测; } - flowStep = EDischargeFlowStep.取料完成后真空检测; - } - break; - case EDischargeFlowStep.取料完成后真空检测: - if (Ops.IsOn($"{curNozzle.NozzleIndex}号吸嘴真空吸检测") || GlobalVar.RunSpace) - { - reFetchNum = 0; - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号真空检测OK"; - MessageQueue.Instance.Insert(logInfo); - GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.Have); - UpdateNozzleStatus(curNozzle, curTask); - undoTaskNum = LoadAndUnloadTask.Instance.GetTaskNum(curTask.taskMode); - if (undoTaskNum > 0 && NozzleManager.GetNozzlesByStatus(ENozzleStatus.IDLE).Count > 0) + break; + case EDischargeFlowStep.取料完成后真空检测: + if (Ops.IsOn($"{curNozzle.NozzleIndex}号吸嘴真空吸检测") || GlobalVar.RunSpace) { - logInfo = GetClassName() + $"还有{undoTaskNum}条任务未执行,并且有空闲吸嘴,继续取料"; + reFetchNum = 0; + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号真空检测OK"; MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.到取料位上方; - } - else - { - flowStep = EDischargeFlowStep.到下相机拍照起始位; - } - } - else - { - if (reFetchNum == 0) - { - //这个时候Z&R回原一次,然后再重新取料 - ZRHomeFlow.Instance.GoHome(curNozzle.NozzleIndex); - } - reFetchNum++; - if (reFetchNum >= GlobalVar.DischargeRetakeNum) - { - DischargeDumpFlow.Instance.Start(curTask.FromType, curNozzle.NozzleIndex, curNozzle.FromIndex); - //alarmInfo = $"排料{curNozzle.NozzleIndex}号吸嘴取{curNozzle.FromIndex+1}号穴位产品{reFetchNum}次失败"; - if (curTask.FromType == TurnoverType.ToBeTested) + GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.Have); + UpdateNozzleStatus(curNozzle, curTask); + undoTaskNum = LoadAndUnloadTask.Instance.GetTaskNum(curTask.taskMode); + if (undoTaskNum > 0 && NozzleManager.GetNozzlesByStatus(ENozzleStatus.IDLE).Count > 0) { - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.料仓tray盘取料报警), curNozzle.NozzleIndex, curNozzle.FromIndex + 1); - alarmEntity = AlarmCollection.Get(AlarmConstID.料仓tray盘取料报警).Transform(curNozzle.NozzleIndex, (curNozzle.FromIndex + 1)); + logInfo = GetClassName() + $"还有{undoTaskNum}条任务未执行,并且有空闲吸嘴,继续取料"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.到取料位上方; } - else if (curTask.FromType == TurnoverType.Turnover) + else { - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料头在周转盘取料失败报警), curNozzle.NozzleIndex, curNozzle.FromIndex + 1); - alarmEntity = AlarmCollection.Get(AlarmConstID.排料头在周转盘取料失败报警).Transform(curNozzle.NozzleIndex, curNozzle.FromIndex + 1); + flowStep = EDischargeFlowStep.到下相机拍照起始位; } - flowStep = EDischargeFlowStep.取料失败报警; } else { - flowStep = EDischargeFlowStep.到取料位下方; - } - } - break; - case EDischargeFlowStep.取料失败报警: - - ETipButton btnText = (ETipButton.Retry | ETipButton.Skip | ETipButton.Yes); - Dictionary buttonText = new Dictionary(); - buttonText.Add(ETipButton.Retry, "重试|Retry"); - buttonText.Add(ETipButton.Skip, "跳过|Skip"); - buttonText.Add(ETipButton.Yes, "移动到安全位|MoveToSafePos"); - if (curTask.FromType == TurnoverType.ToBeTested) - { - buttonText.Add(ETipButton.No, "结束上料|EndInput"); - btnText |= ETipButton.No; - if (!GlobalVar.DisableStockTrayKnock && GlobalVar.EnableDischargeNozzleTakeFailKnock) - { - TrayShake.Shake(ETrayType.Input); - } - } - else if(curTask.FromType== TurnoverType.Turnover) - { - if (!GlobalVar.DisableTurnoverTrayKnock && GlobalVar.EnableDischargeNozzleTakeFailKnock) - { - TrayShake.Shake(ETrayType.Turnover); - } - } - //TestCenterMessageBox.Show(AlarmConstID.TrayTakeFailAlarm, alarmInfo, btnText, buttonText); - //int alarmid = AlarmConstID.排料头在周转盘取料失败报警; - //if (curTask.FromType == TurnoverType.ToBeTested) - //{ - //alarmid = AlarmConstID.料仓tray盘取料报警; - //} - //SchedulingMessageBox box = MsgBox.ShowDialog(alarmid, alarmInfo, btnText, buttonText);// TestCenterMessageBox.WaitResult(AlarmConstID.TrayTakeFailAlarm); - ETipButton button = AlarmMessageBox.ShowDialog(alarmEntity, btnText, buttonText); - //switch (box.Button) - switch (button) - { - case ETipButton.Retry: - logInfo = GetClassName() + $"选择了重试,继续取料"; - MessageQueue.Instance.Insert(logInfo); - if (curTask.FromType == TurnoverType.ToBeTested) + if (reFetchNum == 0) { - //检测料盘是否在上料位,在上料位则继续取料,不在上料位,则通知料仓把料盘送到上料位 - if (!StockManager.Instance.GetStock(ETrayType.Input).HasTray()) - { - logInfo = GetClassName() + $"检测到料盘不在就绪状态,上料盘"; - MessageQueue.Instance.Insert(logInfo); - StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.AfterBacked, null);//.Load(EStockType.Input, EStockTrayLoadMode.AfterBacked); - } + //这个时候Z&R回原一次,然后再重新取料 + ZRHomeFlow.Instance.GoHome(curNozzle.NozzleIndex); } - reFetchNum = 0; - flowStep = EDischargeFlowStep.到取料位上方; - break; - case ETipButton.Skip: - SlotProductHasOrNotResult haveProduct = null; - logInfo = GetClassName() + "选择了跳过"; - MessageQueue.Instance.Insert(logInfo); - if (curTask.FromType == TurnoverType.ToBeTested) + reFetchNum++; + if (reFetchNum >= GlobalVar.DischargeRetakeNum) { - if (!StockManager.Instance.GetStock(ETrayType.Input).HasTray()) + DischargeDumpFlow.Instance.Start(curTask.FromType, curNozzle.NozzleIndex, curNozzle.FromIndex); + //alarmInfo = $"排料{curNozzle.NozzleIndex}号吸嘴取{curNozzle.FromIndex+1}号穴位产品{reFetchNum}次失败"; + if (curTask.FromType == TurnoverType.ToBeTested) { - logInfo = GetClassName() + $"检测到料盘不在上料位"; - MessageQueue.Instance.Insert(logInfo); - StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.AfterBacked, null);//.Load(EStockType.Input, EStockTrayLoadMode.AfterBacked); - logInfo = GetClassName() + $"上料完成,通知相机拍照,检测产品是否已拿走"; - MessageQueue.Instance.Insert(logInfo); + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.料仓tray盘取料报警), curNozzle.NozzleIndex, curNozzle.FromIndex + 1); + alarmEntity = AlarmCollection.Get(AlarmConstID.料仓tray盘取料报警).Transform(curNozzle.NozzleIndex, (curNozzle.FromIndex + 1)); + } + else if (curTask.FromType == TurnoverType.Turnover) + { + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料头在周转盘取料失败报警), curNozzle.NozzleIndex, curNozzle.FromIndex + 1); + alarmEntity = AlarmCollection.Get(AlarmConstID.排料头在周转盘取料失败报警).Transform(curNozzle.NozzleIndex, curNozzle.FromIndex + 1); } - haveProduct = UpCameraCheckFlow.Instance.CheckStockTrayHasProduct(ETrayType.Input, curNozzle.FromIndex + 1, true); + flowStep = EDischargeFlowStep.取料失败报警; } - else if (curTask.FromType == TurnoverType.Turnover) + else { - if (GlobalVar.EnableExceptionHandlingNozzle) - { - //首先把排料吸头移动到安全位 - if (!DischargeModuleGoSafePosFlow.Instance.IsInSafePostion()) - { - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - } - logInfo = GetClassName() + $"通知强力吸头到{ETrayType.Turnover}盘{curTask.FromIndex}穴位取异常料"; - MessageQueue.Instance.Insert(logInfo); - WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, curTask.FromIndex); - WarningSuckerNgFlow.Instance.Wait(); - logInfo = GetClassName() + $"{ETrayType.Turnover}盘{curTask.FromIndex}穴位异常料处理完成"; - MessageQueue.Instance.Insert(logInfo); - } - else - { - haveProduct = UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, curTask.FromIndex + 1); - } + flowStep = EDischargeFlowStep.到取料位下方; + } + } + break; + case EDischargeFlowStep.取料失败报警: + + ETipButton btnText = (ETipButton.Retry | ETipButton.Skip | ETipButton.Yes); + Dictionary buttonText = new Dictionary(); + buttonText.Add(ETipButton.Retry, "重试|Retry"); + buttonText.Add(ETipButton.Skip, "跳过|Skip"); + buttonText.Add(ETipButton.Yes, "移动到安全位|MoveToSafePos"); + if (curTask.FromType == TurnoverType.ToBeTested) + { + buttonText.Add(ETipButton.No, "结束上料|EndInput"); + btnText |= ETipButton.No; + if (!GlobalVar.DisableStockTrayKnock && GlobalVar.EnableDischargeNozzleTakeFailKnock) + { + TrayShake.Shake(ETrayType.Input); } - if (!haveProduct.HasProduct) + } + else if (curTask.FromType == TurnoverType.Turnover) + { + if (!GlobalVar.DisableTurnoverTrayKnock && GlobalVar.EnableDischargeNozzleTakeFailKnock) { - logInfo = GetClassName() + "检测到产品已拿走,流程继续"; + TrayShake.Shake(ETrayType.Turnover); + } + } + //TestCenterMessageBox.Show(AlarmConstID.TrayTakeFailAlarm, alarmInfo, btnText, buttonText); + //int alarmid = AlarmConstID.排料头在周转盘取料失败报警; + //if (curTask.FromType == TurnoverType.ToBeTested) + //{ + //alarmid = AlarmConstID.料仓tray盘取料报警; + //} + //SchedulingMessageBox box = MsgBox.ShowDialog(alarmid, alarmInfo, btnText, buttonText);// TestCenterMessageBox.WaitResult(AlarmConstID.TrayTakeFailAlarm); + ETipButton button = AlarmMessageBox.ShowDialog(alarmEntity, btnText, buttonText); + //switch (box.Button) + switch (button) + { + case ETipButton.Retry: + logInfo = GetClassName() + $"选择了重试,继续取料"; MessageQueue.Instance.Insert(logInfo); + if (curTask.FromType == TurnoverType.ToBeTested) + { + //检测料盘是否在上料位,在上料位则继续取料,不在上料位,则通知料仓把料盘送到上料位 + if (!StockManager.Instance.GetStock(ETrayType.Input).HasTray()) + { + logInfo = GetClassName() + $"检测到料盘不在就绪状态,上料盘"; + MessageQueue.Instance.Insert(logInfo); + StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.AfterBacked, null);//.Load(EStockType.Input, EStockTrayLoadMode.AfterBacked); + } + } reFetchNum = 0; - //执行料仓Tray取料NG时的处理流程,流程处理结束后,流程继续 - if (curTask.FromType == TurnoverType.Turnover) + flowStep = EDischargeFlowStep.到取料位上方; + break; + case ETipButton.Skip: + SlotProductHasOrNotResult haveProduct = null; + logInfo = GetClassName() + "选择了跳过"; + MessageQueue.Instance.Insert(logInfo); + if (curTask.FromType == TurnoverType.ToBeTested) { - TurnoverTrayManager.Instance.Slot(curTask.FromIndex + 1).ClearProduct(); - GlobalTray.TurnoverTray.ChangeStatus(curTask.FromIndex + 1, ESlotStatus.NotHave); - curTask.Dealed = true; + if (!StockManager.Instance.GetStock(ETrayType.Input).HasTray()) + { + logInfo = GetClassName() + $"检测到料盘不在上料位"; + MessageQueue.Instance.Insert(logInfo); + StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.AfterBacked, null);//.Load(EStockType.Input, EStockTrayLoadMode.AfterBacked); + logInfo = GetClassName() + $"上料完成,通知相机拍照,检测产品是否已拿走"; + MessageQueue.Instance.Insert(logInfo); + } + haveProduct = UpCameraCheckFlow.Instance.CheckStockTrayHasProduct(ETrayType.Input, curNozzle.FromIndex + 1, true); } - else if (curTask.FromType == TurnoverType.ToBeTested) + else if (curTask.FromType == TurnoverType.Turnover) { - GlobalTray.InputTray.ChangeStatus(curNozzle.FromIndex + 1, ESlotStatus.NotHave); + if (GlobalVar.EnableExceptionHandlingNozzle) + { + //首先把排料吸头移动到安全位 + if (!DischargeModuleGoSafePosFlow.Instance.IsInSafePostion()) + { + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + } + logInfo = GetClassName() + $"通知强力吸头到{ETrayType.Turnover}盘{curTask.FromIndex}穴位取异常料"; + MessageQueue.Instance.Insert(logInfo); + WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, curTask.FromIndex); + WarningSuckerNgFlow.Instance.Wait(); + logInfo = GetClassName() + $"{ETrayType.Turnover}盘{curTask.FromIndex}穴位异常料处理完成"; + MessageQueue.Instance.Insert(logInfo); + } + else + { + haveProduct = UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, curTask.FromIndex + 1); + } } - undoTaskNum = LoadAndUnloadTask.Instance.GetTaskNum(curTask.taskMode); - if (undoTaskNum > 0 && NozzleManager.GetNozzlesByStatus(ENozzleStatus.IDLE).Count > 0) + if (!haveProduct.HasProduct) { - logInfo = GetClassName() + $"跳过后检测到还有{undoTaskNum}条任务未执行,继续取料"; + logInfo = GetClassName() + "检测到产品已拿走,流程继续"; MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.到取料位上方; + reFetchNum = 0; + //执行料仓Tray取料NG时的处理流程,流程处理结束后,流程继续 + if (curTask.FromType == TurnoverType.Turnover) + { + TurnoverTrayManager.Instance.Slot(curTask.FromIndex + 1).ClearProduct(); + GlobalTray.TurnoverTray.ChangeStatus(curTask.FromIndex + 1, ESlotStatus.NotHave); + curTask.Dealed = true; + } + else if (curTask.FromType == TurnoverType.ToBeTested) + { + GlobalTray.InputTray.ChangeStatus(curNozzle.FromIndex + 1, ESlotStatus.NotHave); + } + undoTaskNum = LoadAndUnloadTask.Instance.GetTaskNum(curTask.taskMode); + if (undoTaskNum > 0 && NozzleManager.GetNozzlesByStatus(ENozzleStatus.IDLE).Count > 0) + { + logInfo = GetClassName() + $"跳过后检测到还有{undoTaskNum}条任务未执行,继续取料"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.到取料位上方; + } + else + { + flowStep = EDischargeFlowStep.到下相机拍照起始位; + } } else { - flowStep = EDischargeFlowStep.到下相机拍照起始位; + alarmInfo = $"检测到{curNozzle.FromIndex + 1}号穴位产品未取出,请处理"; + MessageQueue.Instance.Insert(GetClassName() + alarmInfo); + if (curTask.FromType == TurnoverType.Turnover) + { + alarmEntity = AlarmCollection.Get(AlarmConstID.周转盘产品未取出).Transform(curNozzle.FromIndex + 1); + } + else + { + alarmEntity = AlarmCollection.Get(AlarmConstID.料仓产品未取出).Transform(curNozzle.FromIndex + 1); + } + + flowStep = EDischargeFlowStep.取料失败报警; } - } - else - { - alarmInfo = $"检测到{curNozzle.FromIndex + 1}号穴位产品未取出,请处理"; - MessageQueue.Instance.Insert(GetClassName() + alarmInfo); - if (curTask.FromType == TurnoverType.Turnover) + + break; + case ETipButton.Yes://移动到安全位 + //通知料仓把料盘退回到安全位 + if (curTask.FromType == TurnoverType.ToBeTested) { - alarmEntity = AlarmCollection.Get(AlarmConstID.周转盘产品未取出).Transform(curNozzle.FromIndex + 1); + logInfo = GetClassName() + $"通知料仓把料盘退回到安全位"; + MessageQueue.Instance.Insert(logInfo); + StockManager.Instance.GetStock(ETrayType.Input).Unload(EStockTrayUnLoadMode.Back, null);//.UnLoad(EStockType.Input, EStockTrayUnLoadMode.Back); + //StockManager.Instance.Wait(EStockType.Input); + logInfo = GetClassName() + $"料仓已退回到安全位"; + MessageQueue.Instance.Insert(logInfo); } - else + else if (curTask.FromType == TurnoverType.Turnover) { - alarmEntity = AlarmCollection.Get(AlarmConstID.料仓产品未取出).Transform(curNozzle.FromIndex + 1); + logInfo = GetClassName() + $"通知排料头回安全位"; + MessageQueue.Instance.Insert(logInfo); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + logInfo = GetClassName() + $"排料头已回到安全位"; + MessageQueue.Instance.Insert(logInfo); } - + //alarmInfo = $"排料吸嘴{curNozzle.NozzleIndex}号取{curNozzle.FromIndex+1}号穴位产品失败,请处理"; + alarmEntity = AlarmCollection.Get(AlarmConstID.料仓tray盘取料报警).Transform(curNozzle.NozzleIndex, (curNozzle.FromIndex + 1)); flowStep = EDischargeFlowStep.取料失败报警; - } - - break; - case ETipButton.Yes://移动到安全位 - //通知料仓把料盘退回到安全位 - if (curTask.FromType == TurnoverType.ToBeTested) - { - logInfo = GetClassName() + $"通知料仓把料盘退回到安全位"; - MessageQueue.Instance.Insert(logInfo); - StockManager.Instance.GetStock(ETrayType.Input).Unload(EStockTrayUnLoadMode.Back, null);//.UnLoad(EStockType.Input, EStockTrayUnLoadMode.Back); - //StockManager.Instance.Wait(EStockType.Input); - logInfo = GetClassName() + $"料仓已退回到安全位"; - MessageQueue.Instance.Insert(logInfo); - } - else if (curTask.FromType == TurnoverType.Turnover) - { - logInfo = GetClassName() + $"通知排料头回安全位"; - MessageQueue.Instance.Insert(logInfo); - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - logInfo = GetClassName() + $"排料头已回到安全位"; - MessageQueue.Instance.Insert(logInfo); - } - //alarmInfo = $"排料吸嘴{curNozzle.NozzleIndex}号取{curNozzle.FromIndex+1}号穴位产品失败,请处理"; - alarmEntity = AlarmCollection.Get(AlarmConstID.料仓tray盘取料报警).Transform(curNozzle.NozzleIndex, (curNozzle.FromIndex + 1)); - flowStep = EDischargeFlowStep.取料失败报警; - break; - case ETipButton.No://结束上料 - logInfo = GetClassName() + $"选择了结束上料,通知中控结束上料"; - MessageQueue.Instance.Insert(logInfo); - reFetchNum = 0; - if (!StockManager.Instance.GetStock(ETrayType.Input).HasTray()) - { - logInfo = GetClassName() + $"检测到料盘不在工作位"; + Start(); + break; + case ETipButton.No://结束上料 + logInfo = GetClassName() + $"选择了结束上料,通知中控结束上料"; MessageQueue.Instance.Insert(logInfo); - StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.AfterBacked, null); - logInfo = GetClassName() + $"料盘已运动到工作位"; - MessageQueue.Instance.Insert(logInfo); - } - TestCenter.Instance.EndInput(); - LoadAndUnloadTask.Instance.ClearUndoTask(); - if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count > 0) - { - flowStep = EDischargeFlowStep.到下相机拍照起始位; - } - else - { - if (LoadAndUnloadTask.Instance.GetUnDealedTask().Count > 0) + reFetchNum = 0; + if (!StockManager.Instance.GetStock(ETrayType.Input).HasTray()) { - ScanBarCode(); - StockTrayToTurnoverTray = !StockTrayToTurnoverTray; - flowStep = EDischargeFlowStep.到取料位上方; + logInfo = GetClassName() + $"检测到料盘不在工作位"; + MessageQueue.Instance.Insert(logInfo); + StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.AfterBacked, null); + logInfo = GetClassName() + $"料盘已运动到工作位"; + MessageQueue.Instance.Insert(logInfo); + } + TestCenter.Instance.EndInput(); + LoadAndUnloadTask.Instance.ClearUndoTask(); + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count > 0) + { + flowStep = EDischargeFlowStep.到下相机拍照起始位; } else { - ScanBarCode(); - flowStep = EDischargeFlowStep.任务结束到安全位; + if (LoadAndUnloadTask.Instance.GetUnDealedTask().Count > 0) + { + ScanBarCode(); + StockTrayToTurnoverTray = !StockTrayToTurnoverTray; + flowStep = EDischargeFlowStep.到取料位上方; + } + else + { + ScanBarCode(); + flowStep = EDischargeFlowStep.任务结束到安全位; + } } - } - break; + break; - default: - break; - } - break; - case EDischargeFlowStep.到下相机拍照起始位: - if (XYCanGoTurnoverTray() || GlobalVar.VirtualAxis) - { - if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count > 0) + default: + break; + } + break; + case EDischargeFlowStep.到下相机拍照起始位: + if (XYCanGoTurnoverTray() || GlobalVar.VirtualAxis) { - if (!GlobalVar.VirtualAxis) - { - logInfo = GetClassName() + $"到下相机拍照起始位"; - MessageQueue.Instance.Insert(logInfo); - ImageProcess.ClearAutoTrigger(); - HikCamera.Instance.SetExposure("locationCamera", GlobalVar.FlyGrabExposureTime); - HikCamera.Instance.SetGain("locationCamera", GlobalVar.FlyGrabGain); - } - if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count > 0) { - needGrabNum = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count(); - //targetX = SysConfigParam.GetValue($"Nozzle{needGrabNum}CenterX") - 30; - targetX = SysConfigParam.GetValue($"Nozzle8CenterX") - 30; - targetY = SysConfigParam.GetValue($"Nozzle8CenterY"); - errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + if (!GlobalVar.VirtualAxis) { - errCode = AxisControl.LoadY.MovePos(targetY, GlobalVar.WholeSpeed); + logInfo = GetClassName() + $"到下相机拍照起始位"; + MessageQueue.Instance.Insert(logInfo); + ImageProcess.ClearAutoTrigger(); + HikCamera.Instance.SetExposure("locationCamera", GlobalVar.FlyGrabExposureTime); + HikCamera.Instance.SetGain("locationCamera", GlobalVar.FlyGrabGain); + } + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) + { + needGrabNum = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count(); + //targetX = SysConfigParam.GetValue($"Nozzle{needGrabNum}CenterX") - 30; + targetX = SysConfigParam.GetValue($"Nozzle8CenterX") - 30; + targetY = SysConfigParam.GetValue($"Nozzle8CenterY"); + errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - LogHelper.Debug(GetClassName() + $"到拍照起始位,tx:{targetX},ty:{targetY}"); - flowStep = EDischargeFlowStep.等待到下相机拍照起始位; + errCode = AxisControl.LoadY.MovePos(targetY, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + LogHelper.Debug(GetClassName() + $"到拍照起始位,tx:{targetX},ty:{targetY}"); + flowStep = EDischargeFlowStep.等待到下相机拍照起始位; + } } } - } - else - { - targetX = SysConfigParam.GetValue("Nozzle1CenterX") + 30; - targetY = SysConfigParam.GetValue($"Nozzle1CenterY"); - errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + else { - errCode = AxisControl.LoadY.MovePos(targetY, GlobalVar.WholeSpeed); + targetX = SysConfigParam.GetValue("Nozzle1CenterX") + 30; + targetY = SysConfigParam.GetValue($"Nozzle1CenterY"); + errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - LogHelper.Debug(GetClassName() + $"到拍照起始位,tx:{targetX},ty:{targetY}"); - flowStep = EDischargeFlowStep.等待到下相机拍照起始位; + errCode = AxisControl.LoadY.MovePos(targetY, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + LogHelper.Debug(GetClassName() + $"到拍照起始位,tx:{targetX},ty:{targetY}"); + flowStep = EDischargeFlowStep.等待到下相机拍照起始位; + } + else + { + //PromptMessageBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.LoadY运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } } else { - //PromptMessageBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.LoadY运动异常).Transform(errCode.ToString()); + //PromptMessageBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } - else - { - //PromptMessageBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } + } + else + { + logInfo = GetClassName() + $"检测到排料吸嘴没有需要下料的产品,任务结束回安全位"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.任务结束到安全位; } } else { - logInfo = GetClassName() + $"检测到排料吸嘴没有需要下料的产品,任务结束回安全位"; - MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.任务结束到安全位; + alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.LoadY}", $"{AxisAlias.TurnoverY}"); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.LoadY}", $"{AxisAlias.TurnoverY}"); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case EDischargeFlowStep.等待到下相机拍照起始位: - if (Ops.IsStop("LoadX", "LoadY") || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴已停止运动,"); - if (AxisArrived.LoadXYIsArrived(targetX, targetY)) + break; + case EDischargeFlowStep.等待到下相机拍照起始位: + if (Ops.IsStop("LoadX", "LoadY") || GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"已运动到下相机拍照起始位,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"; - MessageQueue.Instance.Insert(logInfo); - if (!GlobalVar.VirtualAxis) + PrintXYCurrentPos("轴已停止运动,"); + if (AxisArrived.LoadXYIsArrived(targetX, targetY)) { - HikCamera.Instance.SetTrigger("locationCamera", ETriggerMode.Auto); - } + logInfo = GetClassName() + $"已运动到下相机拍照起始位,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"; + MessageQueue.Instance.Insert(logInfo); + if (!GlobalVar.VirtualAxis) + { + HikCamera.Instance.SetTrigger("locationCamera", ETriggerMode.Auto); + } - List grabPoints = new List(); - //获取有几个吸嘴需要拍照 - //needGrabNum = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count(); - if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) - { - for (int i = 8; i >= 1; i--) + List grabPoints = new List(); + //获取有几个吸嘴需要拍照 + //needGrabNum = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count(); + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) + { + for (int i = 8; i >= 1; i--) + { + grabPoints.Add(SysConfigParam.GetValue($"Nozzle{i}CenterX")); + } + } + else { - grabPoints.Add(SysConfigParam.GetValue($"Nozzle{i}CenterX")); + for (int i = 1; i < 8 + 1; i++) + { + grabPoints.Add(SysConfigParam.GetValue($"Nozzle{i}CenterX")); + } } + //LogHelper.Debug(GetClassName()+$"拍照点位:{grabPoints.ToJoinString(",")}"); + errCode = AxisControl.LoadX.SetPosCompare(1, grabPoints.ToArray()); + flowStep = EDischargeFlowStep.到下相机拍照结束位; } else { - for (int i = 1; i < 8 + 1; i++) - { - grabPoints.Add(SysConfigParam.GetValue($"Nozzle{i}CenterX")); - } + PrintXYCurrentPos($"检测到轴不在目标位置,tx:{targetX},ty:{targetY}"); + flowStep = EDischargeFlowStep.到下相机拍照起始位; } - //LogHelper.Debug(GetClassName()+$"拍照点位:{grabPoints.ToJoinString(",")}"); - errCode = AxisControl.LoadX.SetPosCompare(1, grabPoints.ToArray()); - flowStep = EDischargeFlowStep.到下相机拍照结束位; - } - else - { - PrintXYCurrentPos($"检测到轴不在目标位置,tx:{targetX},ty:{targetY}"); - flowStep = EDischargeFlowStep.到下相机拍照起始位; } - } - break; + break; - case EDischargeFlowStep.到下相机拍照结束位: - if (XYCanGoTurnoverTray() || GlobalVar.VirtualAxis) - { - - if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) - { - targetX = SysConfigParam.GetValue($"Nozzle1CenterX") + 10; - } - else + case EDischargeFlowStep.到下相机拍照结束位: + if (XYCanGoTurnoverTray() || GlobalVar.VirtualAxis) { - //targetX = SysConfigParam.GetValue($"Nozzle{needGrabNum}CenterX") - 10; - targetX = SysConfigParam.GetValue($"Nozzle8CenterX") - 10; - } - errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.FlyCameraSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - { - LogHelper.Debug(GetClassName() + $"到下相机拍照结束位,tx:{targetX},ty:{targetY}"); - flowStep = EDischargeFlowStep.等待到下相机拍照结束位; + + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) + { + targetX = SysConfigParam.GetValue($"Nozzle1CenterX") + 10; + } + else + { + //targetX = SysConfigParam.GetValue($"Nozzle{needGrabNum}CenterX") - 10; + targetX = SysConfigParam.GetValue($"Nozzle8CenterX") - 10; + } + errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.FlyCameraSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + LogHelper.Debug(GetClassName() + $"到下相机拍照结束位,tx:{targetX},ty:{targetY}"); + flowStep = EDischargeFlowStep.等待到下相机拍照结束位; + } + else + { + //PromptMessageBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } } else { - //PromptMessageBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.LoadY}", $"{AxisAlias.TurnoverY}"); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.LoadY}", $"{AxisAlias.TurnoverY}"); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case EDischargeFlowStep.等待到下相机拍照结束位: - if (Ops.IsStop("LoadX") || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴已停止运动,"); - if (AxisArrived.LoadXYIsArrived(targetX, targetY)) + break; + case EDischargeFlowStep.等待到下相机拍照结束位: + if (Ops.IsStop("LoadX") || GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"已运动到下相机拍照结束位,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"; - MessageQueue.Instance.Insert(logInfo); - if (!GlobalVar.VirtualAxis) + PrintXYCurrentPos("轴已停止运动,"); + if (AxisArrived.LoadXYIsArrived(targetX, targetY)) { - AxisControl.LoadX.ClearCompare(1); + logInfo = GetClassName() + $"已运动到下相机拍照结束位,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"; + MessageQueue.Instance.Insert(logInfo); + if (!GlobalVar.VirtualAxis) + { + AxisControl.LoadX.ClearCompare(1); + } + //IoManager.Instance.WriteOut("下左相机光源触发", 0); + timeout.Restart(); + flowStep = EDischargeFlowStep.等待相机拍照完成; } - //IoManager.Instance.WriteOut("下左相机光源触发", 0); - timeout.Restart(); - flowStep = EDischargeFlowStep.等待相机拍照完成; - } - else - { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetX},ty:{targetY},"); - flowStep = EDischargeFlowStep.到下相机拍照结束位; - } - } - break; - case EDischargeFlowStep.等待相机拍照完成: - if (timeout.ElapsedMilliseconds < 3000) - { - imgs = ImageProcess.GetAutoImage(); - if ((imgs != null && imgs.Length == 8) || GlobalVar.VirtualAxis) - { - logInfo = GetClassName() + $"相机拍照完成,准备处理照片"; - MessageQueue.Instance.Insert(logInfo); - if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) + else { - imgs = imgs.Reverse().ToArray(); + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetX},ty:{targetY},"); + flowStep = EDischargeFlowStep.到下相机拍照结束位; } - if (GlobalVar.RunSpace) + } + break; + case EDischargeFlowStep.等待相机拍照完成: + if (timeout.ElapsedMilliseconds < 3000) + { + imgs = ImageProcess.GetAutoImage(); + if ((imgs != null && imgs.Length == 8) || GlobalVar.VirtualAxis) { - if (GlobalVar.EnableScanBarCodeByDownCamera) + logInfo = GetClassName() + $"相机拍照完成,准备处理照片"; + MessageQueue.Instance.Insert(logInfo); + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) + { + imgs = imgs.Reverse().ToArray(); + } + if (GlobalVar.RunSpace) { - foreach (Nozzle nl in NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)) + if (GlobalVar.EnableScanBarCodeByDownCamera) { - if (string.IsNullOrEmpty(nl.SN)) + foreach (Nozzle nl in NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)) { - nl.SN = VirtualBarCode.Code;// (nl.FromIndex + 1).ToString().PadLeft(18, '0'); + if (string.IsNullOrEmpty(nl.SN)) + { + nl.SN = VirtualBarCode.Code;// (nl.FromIndex + 1).ToString().PadLeft(18, '0'); + } } } + mrs = new List(); + for (int i = 0; i < needGrabNum; i++) + { + mrs.Add(new MatchResult()); + } + flowStep = EDischargeFlowStep.到放料位上方; } - mrs = new List(); - for (int i = 0; i < needGrabNum; i++) + else { - mrs.Add(new MatchResult()); + //拍照完成 + flowStep = EDischargeFlowStep.等待视觉处理结果; } - flowStep = EDischargeFlowStep.到放料位上方; - } - else - { - //拍照完成 - flowStep = EDischargeFlowStep.等待视觉处理结果; - } + } } - } - else - { - MessageQueue.Instance.Warn("下相机拍照超时,重拍"); - flowStep = EDischargeFlowStep.到下相机拍照起始位; - } - break; - case EDischargeFlowStep.等待视觉处理结果: - if (mrs != null && mrs.Count > 0) - { - mrs.Clear(); - GC.Collect(); - } - mrs = VisionProcess.Instance.MatchDownCam(imgs); - //if (mrs != null && mrs.Count == imgs.Length && (mrs.Where(m=>m.IsOK==true).Count()==imgs.Length || GlobalVar.DownCameraFlyRegrabNum==0)) - int grabNum = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count(); - if (mrs != null && mrs.Count == imgs.Length && (mrs.Where(m => m.IsOK == true).Count() == grabNum || GlobalVar.DownCameraFlyRegrabNum == 0)) - { - logInfo = GetClassName() + $"图片处理完成,准备放料"; - MessageQueue.Instance.Insert(logInfo); - //int count = 0; - //if(GlobalVar.EnableScanBarCodeByDownCamera) - //{ - // foreach (Nozzle nozzle in NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)) - // { - // nozzle.SN = mrs[count].SN; - // count++; - // } - //} - - //int ni = 1; - //foreach (MatchResult item in mrs) - //{ - // NozzleManager.GetNozzle(ni).SN = item.SN; - // ni++; - //} - reGrabCount = 0; - OnMatchResult?.Invoke(mrs); - flowStep = EDischargeFlowStep.到放料位上方; - } - else - { - int ni = 1; - List errCodeList = new List(); - foreach (MatchResult item in mrs) + else { - Nozzle nozzle = NozzleManager.GetNozzle(item.NozzleIndex); - if (nozzle != null && nozzle.Status == ENozzleStatus.ToUnload) - { - if (!item.IsOK) - { - errCodeList.Add(ni); - } - } - - //if (item.IsOK) + MessageQueue.Instance.Warn("下相机拍照超时,重拍"); + flowStep = EDischargeFlowStep.到下相机拍照起始位; + } + break; + case EDischargeFlowStep.等待视觉处理结果: + if (mrs != null && mrs.Count > 0) + { + mrs.Clear(); + GC.Collect(); + } + mrs = VisionProcess.Instance.MatchDownCam(imgs); + //if (mrs != null && mrs.Count == imgs.Length && (mrs.Where(m=>m.IsOK==true).Count()==imgs.Length || GlobalVar.DownCameraFlyRegrabNum==0)) + int grabNum = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count(); + if (mrs != null && mrs.Count == imgs.Length && (mrs.Where(m => m.IsOK == true).Count() == grabNum || GlobalVar.DownCameraFlyRegrabNum == 0)) + { + logInfo = GetClassName() + $"图片处理完成,准备放料"; + MessageQueue.Instance.Insert(logInfo); + //int count = 0; + //if(GlobalVar.EnableScanBarCodeByDownCamera) //{ - // if(GlobalVar.EnableScanBarCodeByDownCamera) + // foreach (Nozzle nozzle in NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)) // { - // NozzleManager.GetNozzle(ni).SN = item.SN; + // nozzle.SN = mrs[count].SN; + // count++; // } //} - //else + + //int ni = 1; + //foreach (MatchResult item in mrs) //{ - // errCodeList.Add(ni); - // if (GlobalVar.EnableScanBarCodeByDownCamera) - // { - // NozzleManager.GetNozzle(ni).SN = null; - // } + // NozzleManager.GetNozzle(ni).SN = item.SN; + // ni++; //} - ni++; - } - OnMatchResult?.Invoke(mrs); - if (reGrabCount < GlobalVar.DownCameraFlyRegrabNum) - { - reGrabCount++; - flowStep = EDischargeFlowStep.到下相机拍照起始位; + reGrabCount = 0; + OnMatchResult?.Invoke(mrs); + flowStep = EDischargeFlowStep.到放料位上方; } else { - if (GlobalVar.LocationFailAutoSkip) + int ni = 1; + List errCodeList = new List(); + foreach (MatchResult item in mrs) { - reGrabCount = 0; - flowStep = EDischargeFlowStep.到放料位上方; + Nozzle nozzle = NozzleManager.GetNozzle(item.NozzleIndex); + if (nozzle != null && nozzle.Status == ENozzleStatus.ToUnload) + { + if (!item.IsOK) + { + errCodeList.Add(ni); + } + } + + //if (item.IsOK) + //{ + // if(GlobalVar.EnableScanBarCodeByDownCamera) + // { + // NozzleManager.GetNozzle(ni).SN = item.SN; + // } + //} + //else + //{ + // errCodeList.Add(ni); + // if (GlobalVar.EnableScanBarCodeByDownCamera) + // { + // NozzleManager.GetNozzle(ni).SN = null; + // } + //} + ni++; + } + OnMatchResult?.Invoke(mrs); + if (reGrabCount < GlobalVar.DownCameraFlyRegrabNum) + { + reGrabCount++; + flowStep = EDischargeFlowStep.到下相机拍照起始位; } else { - reGrabCount = 0; - //alarmInfo = $"{string.Join(",", errCodeList)}号排料吸嘴拍照失败"; - alarmEntity = AlarmCollection.Get(AlarmConstID.下相机拍照定位失败).Transform(errCodeList.ToJoinString(",")); - //DialogResult dr = Msg.ShowQuestion(, System.Windows.Forms.MessageBoxButtons.RetryCancel); - //TestCenterMessageBox.Show(AlarmConstID.DownCameraFlyFailAlarm, alarmInfo, ETipButton.Retry | ETipButton.Cancel); - //box = MsgBox.ShowDialog(AlarmConstID.DownCameraFlyFailAlarm, alarmInfo, ETipButton.Retry | ETipButton.Cancel);// TestCenterMessageBox.WaitResult(AlarmConstID.DownCameraFlyFailAlarm); - ETipButton box = AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Retry | ETipButton.Cancel, null, true); - // if (box.Button == ETipButton.Cancel) - if (box == ETipButton.Cancel) + if (GlobalVar.LocationFailAutoSkip) { + reGrabCount = 0; flowStep = EDischargeFlowStep.到放料位上方; } - //else if (box.Button == ETipButton.Retry) - else if (box == ETipButton.Retry) + else { - Thread.Sleep(500); - flowStep = EDischargeFlowStep.到下相机拍照起始位; + reGrabCount = 0; + //alarmInfo = $"{string.Join(",", errCodeList)}号排料吸嘴拍照失败"; + alarmEntity = AlarmCollection.Get(AlarmConstID.下相机拍照定位失败).Transform(errCodeList.ToJoinString(",")); + //DialogResult dr = Msg.ShowQuestion(, System.Windows.Forms.MessageBoxButtons.RetryCancel); + //TestCenterMessageBox.Show(AlarmConstID.DownCameraFlyFailAlarm, alarmInfo, ETipButton.Retry | ETipButton.Cancel); + //box = MsgBox.ShowDialog(AlarmConstID.DownCameraFlyFailAlarm, alarmInfo, ETipButton.Retry | ETipButton.Cancel);// TestCenterMessageBox.WaitResult(AlarmConstID.DownCameraFlyFailAlarm); + ETipButton box = AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Retry | ETipButton.Cancel, null, true); + // if (box.Button == ETipButton.Cancel) + if (box == ETipButton.Cancel) + { + flowStep = EDischargeFlowStep.到放料位上方; + } + //else if (box.Button == ETipButton.Retry) + else if (box == ETipButton.Retry) + { + Thread.Sleep(500); + flowStep = EDischargeFlowStep.到下相机拍照起始位; + } } } } - } - break; - case EDischargeFlowStep.到放料位上方: - { - bool canGo = false; - if (curNozzle.ToType == TurnoverType.Turnover) - { - canGo = XYCanGoTurnoverTray(); - } - else + break; + case EDischargeFlowStep.到放料位上方: { - canGo = XYCanGoLocalArea(); - } - if (canGo || GlobalVar.VirtualAxis) - { - turnoverOffsetPoint.Reset(); - tray = null; - targetX = 0.0; - targetY = 0.0; - ///获取需要放料的吸嘴 - curSlotPoint = null; - curNozzle = NozzleManager.GetToUnloadNozzle(); - if (curNozzle != null) + bool canGo = false; + if (curNozzle.ToType == TurnoverType.Turnover) { - if (curNozzle.ToType == TurnoverType.Turnover) - { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方"; - MessageQueue.Instance.Insert(logInfo); - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, curNozzle.ToIndex + 1); - turnoverOffsetPoint = TurnoverSlotOffset.GetOffsetPoint(curNozzle.ToIndex + 1); - } - else if (curNozzle.ToType == TurnoverType.ToBeTested) + canGo = XYCanGoTurnoverTray(); + } + else + { + canGo = XYCanGoLocalArea(); + } + if (canGo || GlobalVar.VirtualAxis) + { + turnoverOffsetPoint.Reset(); + tray = null; + targetX = 0.0; + targetY = 0.0; + ///获取需要放料的吸嘴 + curSlotPoint = null; + curNozzle = NozzleManager.GetToUnloadNozzle(); + if (curNozzle != null) { - downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); - if (downSlot != null) + if (curNozzle.ToType == TurnoverType.Turnover) { - curNozzle.ToIndex = downSlot.Index - 1; - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Input, downSlot.Index); logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方"; MessageQueue.Instance.Insert(logInfo); + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, curNozzle.ToIndex + 1); + turnoverOffsetPoint = TurnoverSlotOffset.GetOffsetPoint(curNozzle.ToIndex + 1); } - else + else if (curNozzle.ToType == TurnoverType.ToBeTested) { - LogHelper.Debug($"检测到{ETrayType.Input}无空穴位,准备下料盘"); - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Input).Unload(EStockTrayUnLoadMode.Whole, null); - }); - TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Input, - () => - { - Task.Run(() => + downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); + if (downSlot != null) + { + curNozzle.ToIndex = downSlot.Index - 1; + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Input, downSlot.Index); + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方"; + MessageQueue.Instance.Insert(logInfo); + } + else + { + LogHelper.Debug($"检测到{ETrayType.Input}无空穴位,准备下料盘"); + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Input).Unload(EStockTrayUnLoadMode.Whole, null); + }); + TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Input, + () => { - StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); - }); - }, - null, - () => - { - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.AfterTakeTray, () => { - GlobalTray.GetTray(ETrayType.Input).ChangeStatus(ESlotStatus.NotHave); + Task.Run(() => + { + StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); }); + }, + null, + () => + { + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.AfterTakeTray, () => { + GlobalTray.GetTray(ETrayType.Input).ChangeStatus(ESlotStatus.NotHave); + }); + }); + Thread.Sleep(1000); }); - Thread.Sleep(1000); - }); - StockManager.Instance.GetStock(ETrayType.Input).WaitFinished(); - } - } - else if (curNozzle.ToType == TurnoverType.Passed) - { - if (GlobalVar.InputTrayLoop) - { - downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); - } - else - { - downSlot = GlobalTray.OkTary.GetSlot(ESlotStatus.NotHave); + StockManager.Instance.GetStock(ETrayType.Input).WaitFinished(); + } } - if (downSlot != null) + else if (curNozzle.ToType == TurnoverType.Passed) { - curNozzle.ToIndex = downSlot.Index - 1; if (GlobalVar.InputTrayLoop) { - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Input, downSlot.Index); + downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); + } + else + { + downSlot = GlobalTray.OkTary.GetSlot(ESlotStatus.NotHave); + } + if (downSlot != null) + { + curNozzle.ToIndex = downSlot.Index - 1; + if (GlobalVar.InputTrayLoop) + { + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Input, downSlot.Index); + } + else + { + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Ok, downSlot.Index); + } + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方"; + MessageQueue.Instance.Insert(logInfo); } else { - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Ok, downSlot.Index); - } - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方"; - MessageQueue.Instance.Insert(logInfo); - } - else - { - LogHelper.Debug($"检测到{ETrayType.Ok}无空穴位,准备下料盘"); - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Ok).Unload(EStockTrayUnLoadMode.Whole, null); - }); - TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ok, - () => - { - Task.Run(() => + LogHelper.Debug($"检测到{ETrayType.Ok}无空穴位,准备下料盘"); + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Ok).Unload(EStockTrayUnLoadMode.Whole, null); + }); + TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ok, + () => { - StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); - }); - }, - null, - () => - { - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Ok).Load(EStockTrayLoadMode.AfterTakeTray, null); + Task.Run(() => + { + StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); + }); + }, + null, + () => + { + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Ok).Load(EStockTrayLoadMode.AfterTakeTray, null); + }); + Thread.Sleep(1000); }); - Thread.Sleep(1000); - }); - StockManager.Instance.GetStock(ETrayType.Ok).WaitFinished(); - } - } - else if (curNozzle.ToType == TurnoverType.Failed) - { - if (GlobalVar.InputTrayLoop) - { - downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); - } - else - { - downSlot = GlobalTray.NgTray.GetSlot(ESlotStatus.NotHave); + StockManager.Instance.GetStock(ETrayType.Ok).WaitFinished(); + } } - if (downSlot != null) + else if (curNozzle.ToType == TurnoverType.Failed) { - curNozzle.ToIndex = downSlot.Index - 1; if (GlobalVar.InputTrayLoop) { - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Input, downSlot.Index); + downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); } else { - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Ng, downSlot.Index); + downSlot = GlobalTray.NgTray.GetSlot(ESlotStatus.NotHave); } - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方"; - MessageQueue.Instance.Insert(logInfo); - } - else - { - LogHelper.Debug($"检测到{ETrayType.Ng}无空穴位,准备下料盘"); - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Ng).Unload(EStockTrayUnLoadMode.Whole, null); - }); - TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ng, - () => + if (downSlot != null) + { + curNozzle.ToIndex = downSlot.Index - 1; + if (GlobalVar.InputTrayLoop) { - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); - }); - }, - null, - () => + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Input, downSlot.Index); + } + else { - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Ng).Load(EStockTrayLoadMode.AfterTakeTray, null); - }); - Thread.Sleep(1000); - }); - StockManager.Instance.GetStock(ETrayType.Ng).WaitFinished(); - } - } - else if (curNozzle.ToType == TurnoverType.Multifunction) - { - //如果吸嘴是1,并且最后一列 - downSlot = GlobalTray.MultiTray.GetSlot(ESlotStatus.NotHave); - #region 为了解决第一个吸嘴到不了最后一列的问题 - if (curNozzle.NozzleIndex == 1 && downSlot != null && (downSlot.Column == 7)) - { - if (downSlot.Column == 7) + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Ng, downSlot.Index); + } + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方"; + MessageQueue.Instance.Insert(logInfo); + } + else { - downSlot = GlobalTray.MultiTray.GetSlot(downSlot.Index + 1); + LogHelper.Debug($"检测到{ETrayType.Ng}无空穴位,准备下料盘"); + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Ng).Unload(EStockTrayUnLoadMode.Whole, null); + }); + TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ng, + () => + { + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); + }); + }, + null, + () => + { + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Ng).Load(EStockTrayLoadMode.AfterTakeTray, null); + }); + Thread.Sleep(1000); + }); + StockManager.Instance.GetStock(ETrayType.Ng).WaitFinished(); } } - #endregion - if (downSlot != null) - { - curNozzle.ToIndex = downSlot.Index - 1; - curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Multi, downSlot.Index); - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方,SN={curNozzle.SN}"; - MessageQueue.Instance.Insert(logInfo); - } - else + else if (curNozzle.ToType == TurnoverType.Multifunction) { - LogHelper.Debug($"检测到{ETrayType.Multi}无空穴位,准备下料盘"); - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Multi).Unload(EStockTrayUnLoadMode.Whole, null); - }); - TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Multi, - () => - { - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); - }); - }, - null, - () => + //如果吸嘴是1,并且最后一列 + downSlot = GlobalTray.MultiTray.GetSlot(ESlotStatus.NotHave); + #region 为了解决第一个吸嘴到不了最后一列的问题 + if (curNozzle.NozzleIndex == 1 && downSlot != null && (downSlot.Column == 7)) + { + if (downSlot.Column == 7) { - Task.Run(() => { - StockManager.Instance.GetStock(ETrayType.Multi).Load(EStockTrayLoadMode.AfterTakeTray, null); - }); - Thread.Sleep(1000); + downSlot = GlobalTray.MultiTray.GetSlot(downSlot.Index + 1); + } + } + #endregion + if (downSlot != null) + { + curNozzle.ToIndex = downSlot.Index - 1; + curSlotPoint = TrayPointManager.GetSlotPoint(ETrayType.Multi, downSlot.Index); + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{curNozzle.ToType}盘{curNozzle.ToIndex + 1}号穴位上方,SN={curNozzle.SN}"; + MessageQueue.Instance.Insert(logInfo); + } + else + { + LogHelper.Debug($"检测到{ETrayType.Multi}无空穴位,准备下料盘"); + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Multi).Unload(EStockTrayUnLoadMode.Whole, null); }); - StockManager.Instance.GetStock(ETrayType.Multi).WaitFinished(); + TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Multi, + () => + { + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); + }); + }, + null, + () => + { + Task.Run(() => { + StockManager.Instance.GetStock(ETrayType.Multi).Load(EStockTrayLoadMode.AfterTakeTray, null); + }); + Thread.Sleep(1000); + }); + StockManager.Instance.GetStock(ETrayType.Multi).WaitFinished(); + } } } - } - if (curSlotPoint != null) - { - nozzleDist = TrayPointManager.GetDistToNozzle1(curNozzle.NozzleIndex); - if (mrs != null && mrs.Count > 0 - && mrs.Count >= curNozzle.NozzleIndex - && Math.Abs(mrs[curNozzle.NozzleIndex - 1].OffsetRow) < 3 - && Math.Abs(mrs[curNozzle.NozzleIndex - 1].OffsetCol) < 3) - { - targetX = mrs[curNozzle.NozzleIndex - 1].OffsetCol + curSlotPoint.X + nozzleDist.X + turnoverOffsetPoint.X; - targetY = mrs[curNozzle.NozzleIndex - 1].OffsetRow + curSlotPoint.Y + nozzleDist.Y + turnoverOffsetPoint.Y; - LogHelper.Debug($"{GetClassName()}吸嘴{curNozzle.NozzleIndex},OffsetX:{mrs[curNozzle.NozzleIndex - 1].OffsetCol},OffsetY:{mrs[curNozzle.NozzleIndex - 1].OffsetRow}"); - } - else - { - targetX = curSlotPoint.X + nozzleDist.X + turnoverOffsetPoint.X; - targetY = curSlotPoint.Y + nozzleDist.Y + turnoverOffsetPoint.Y; - LogHelper.Debug($"{GetClassName()}吸嘴{curNozzle.NozzleIndex},OffsetX:0,OffsetY:0"); - } - //在这里保存图片,图片的名称以 时间+穴位定义 - if (curNozzle.ToType == TurnoverType.Turnover) + if (curSlotPoint != null) { - //判断文件夹是否存在 - string dirname = $"d://images/{DateTime.Now.ToString("yyyyMMdd")}/load"; - if (!Directory.Exists(dirname)) + nozzleDist = TrayPointManager.GetDistToNozzle1(curNozzle.NozzleIndex); + if (mrs != null && mrs.Count > 0 + && mrs.Count >= curNozzle.NozzleIndex + && Math.Abs(mrs[curNozzle.NozzleIndex - 1].OffsetRow) < 3 + && Math.Abs(mrs[curNozzle.NozzleIndex - 1].OffsetCol) < 3) { - Directory.CreateDirectory(dirname); + targetX = mrs[curNozzle.NozzleIndex - 1].OffsetCol + curSlotPoint.X + nozzleDist.X + turnoverOffsetPoint.X; + targetY = mrs[curNozzle.NozzleIndex - 1].OffsetRow + curSlotPoint.Y + nozzleDist.Y + turnoverOffsetPoint.Y; + LogHelper.Debug($"{GetClassName()}吸嘴{curNozzle.NozzleIndex},OffsetX:{mrs[curNozzle.NozzleIndex - 1].OffsetCol},OffsetY:{mrs[curNozzle.NozzleIndex - 1].OffsetRow}"); } - if (mrs != null && mrs.Count > 0 && mrs.Count >= curNozzle.NozzleIndex && mrs[curNozzle.NozzleIndex - 1].Himage != null) + else { - HOperatorSet.WriteImage(mrs[curNozzle.NozzleIndex - 1].Himage, "bmp", 0, $"{dirname}//{DateTime.Now.ToString("yyyyMMddHHmmssfff")}_{curNozzle.ToIndex + 1}"); + targetX = curSlotPoint.X + nozzleDist.X + turnoverOffsetPoint.X; + targetY = curSlotPoint.Y + nozzleDist.Y + turnoverOffsetPoint.Y; + LogHelper.Debug($"{GetClassName()}吸嘴{curNozzle.NozzleIndex},OffsetX:0,OffsetY:0"); } - } - else - { - //判断文件夹是否存在 - string dirname = $"d://images/{DateTime.Now.ToString("yyyyMMdd")}/unload"; - if (!Directory.Exists(dirname)) + //在这里保存图片,图片的名称以 时间+穴位定义 + if (curNozzle.ToType == TurnoverType.Turnover) { - Directory.CreateDirectory(dirname); + //判断文件夹是否存在 + string dirname = $"d://images/{DateTime.Now.ToString("yyyyMMdd")}/load"; + if (!Directory.Exists(dirname)) + { + Directory.CreateDirectory(dirname); + } + if (mrs != null && mrs.Count > 0 && mrs.Count >= curNozzle.NozzleIndex && mrs[curNozzle.NozzleIndex - 1].Himage != null) + { + HOperatorSet.WriteImage(mrs[curNozzle.NozzleIndex - 1].Himage, "bmp", 0, $"{dirname}//{DateTime.Now.ToString("yyyyMMddHHmmssfff")}_{curNozzle.ToIndex + 1}"); + } } - if (mrs != null && mrs.Count > 0 && mrs.Count >= curNozzle.NozzleIndex && mrs[curNozzle.NozzleIndex - 1].Himage != null) + else { - //HOperatorSet.WriteImage(mrs[curNozzle.NozzleIndex - 1].Himage, "bmp", 0, $"{dirname}//{DateTime.Now.ToString("yyyyMMddHHmmssfff")}_{curNozzle.FromIndex + 1}"); - if (!string.IsNullOrEmpty(curNozzle.SN)) + //判断文件夹是否存在 + string dirname = $"d://images/{DateTime.Now.ToString("yyyyMMdd")}/unload"; + if (!Directory.Exists(dirname)) { - HOperatorSet.WriteImage(mrs[curNozzle.NozzleIndex - 1].Himage, "bmp", 0, $"{dirname}//{curNozzle.SN}_{curNozzle.FromIndex + 1}"); + Directory.CreateDirectory(dirname); } - else + if (mrs != null && mrs.Count > 0 && mrs.Count >= curNozzle.NozzleIndex && mrs[curNozzle.NozzleIndex - 1].Himage != null) { - HOperatorSet.WriteImage(mrs[curNozzle.NozzleIndex - 1].Himage, "bmp", 0, $"{dirname}//{DateTime.Now.ToString("yyyyMMddHHmmssfff")}_{curNozzle.FromIndex + 1}"); + //HOperatorSet.WriteImage(mrs[curNozzle.NozzleIndex - 1].Himage, "bmp", 0, $"{dirname}//{DateTime.Now.ToString("yyyyMMddHHmmssfff")}_{curNozzle.FromIndex + 1}"); + if (!string.IsNullOrEmpty(curNozzle.SN)) + { + HOperatorSet.WriteImage(mrs[curNozzle.NozzleIndex - 1].Himage, "bmp", 0, $"{dirname}//{curNozzle.SN}_{curNozzle.FromIndex + 1}"); + } + else + { + HOperatorSet.WriteImage(mrs[curNozzle.NozzleIndex - 1].Himage, "bmp", 0, $"{dirname}//{DateTime.Now.ToString("yyyyMMddHHmmssfff")}_{curNozzle.FromIndex + 1}"); + } } } - } - errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - { - errCode = AxisControl.LoadY.MovePos(targetY, GlobalVar.WholeSpeed); + errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - errCode = AxisControl.GetAxis($"NozzleR{curNozzle.NozzleIndex}").MoveOffset((mrs[curNozzle.NozzleIndex - 1].OffsetA) + turnoverOffsetPoint.A, GlobalVar.WholeSpeed); + errCode = AxisControl.LoadY.MovePos(targetY, GlobalVar.WholeSpeed); if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - if (GlobalVar.VirtualAxis) + errCode = AxisControl.GetAxis($"NozzleR{curNozzle.NozzleIndex}").MoveOffset((mrs[curNozzle.NozzleIndex - 1].OffsetA) + turnoverOffsetPoint.A, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"运动到放料位上方 tx:{targetX},ty:{targetY}"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.等待到放料位上方; + } + else + { + //AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴运动异常, $"NozzleR{curNozzle.NozzleIndex}", errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog($"NozzleR{curNozzle.NozzleIndex}", errCode); + + alarmEntity = AlarmCollection.Get($"NozzleR{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - logInfo = GetClassName() + $"运动到放料位上方 tx:{targetX},ty:{targetY}"; - MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.等待到放料位上方; } else { - //AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴运动异常, $"NozzleR{curNozzle.NozzleIndex}", errCode.ToString()); - //MsgBox.ShowAxisAlarmDialog($"NozzleR{curNozzle.NozzleIndex}", errCode); - - alarmEntity = AlarmCollection.Get($"NozzleR{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); + //AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴运动异常, $"{AxisAlias.LoadY}", errCode.ToString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.LoadY运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); - //AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴运动异常, $"{AxisAlias.LoadY}", errCode.ToString()); - alarmEntity = AlarmCollection.Get(AlarmConstID.LoadY运动异常).Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } + } + else + { + alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.LoadY}", $"{AxisAlias.TurnoverY}"); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + } + + + break; + case EDischargeFlowStep.等待到放料位上方: + if (Ops.IsStop("LoadX", "LoadY", $"NozzleR{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) + { + PrintXYCurrentPos("轴xy已停止运动,"); + if (AxisArrived.LoadXYIsArrived(targetX, targetY)) + { + //当放料到tray盘区域时,并且周转再盘已经没有要下料的穴位时,通知周转模组可以运动了 + if (curNozzle.ToType != TurnoverType.Turnover && TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.Tested, ETurnoverTraySlotStatus.Have).Count() == 0) + { + LogHelper.Debug("通知周转模组可以运动"); + TurnoverFlow.Instance.CanMoveFromTestTrayToTurnoverTray(); + } + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号已运动到{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料位上方,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.丢料检测; + } + else + { + PrintXYCurrentPos($"检测到轴不在目标位置,tx:{targetX},ty:{targetY},"); + flowStep = EDischargeFlowStep.到放料位上方; + } + } + break; + case EDischargeFlowStep.丢料检测: + if (!curNozzle.HasProduct() && !GlobalVar.RunSpace) + { + bool exit = false; + while (!exit) + { + //弹框报警 + //alarmInfo = $"{curNozzle.NozzleIndex}吸嘴真空吸异常,可能丢料,请检查吸嘴的状态"; + if (curNozzle.ToType == TurnoverType.Turnover) + { + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料投在周转盘放料时丢料报警), curNozzle.NozzleIndex); + alarmEntity = AlarmCollection.Get(AlarmConstID.排料投在周转盘放料时丢料报警).Transform(curNozzle.NozzleIndex); + } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.料仓tray盘放料时丢料报警), curNozzle.NozzleIndex,curNozzle.ToType.ToString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.料仓tray盘放料时丢料报警).Transform(curNozzle.NozzleIndex, curNozzle.ToType.ToString()); + } + //alarmid = AlarmConstID.料仓tray盘放料时丢料报警; + //if (curNozzle.ToType == TurnoverType.Turnover) + //{ + // //alarmid = AlarmConstID.排料投在周转盘放料时丢料报警; + + //} + //else + //{ + + //} + //TestCenterMessageBox.Show(AlarmConstID.DischargeNozzleLostProductAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //msgBox = MsgBox.ShowDialog(alarmid, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.DischargeNozzleLostProductAlarm); + ETipButton buttonRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (buttonRet) + { + case ETipButton.Skip: + if (!curNozzle.HasProduct()) + { + curNozzle.Reset(); + curNozzle.VacSuction(EIoOperate.Close); + curNozzle.VacBreak(EIoOperate.Open); + curNozzle.VacBreak(EIoOperate.Close); + exit = true; + flowStep = EDischargeFlowStep.放料任务完成; + } + break; + case ETipButton.Yes: + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + // DischargeModuleGoSafePosFlow.Instance.Wait(); + Start(); + break; + default: + break; } } } else { - alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.LoadY}", $"{AxisAlias.TurnoverY}"); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + flowStep = EDischargeFlowStep.到放料位下方; } - } + //if (GlobalVar.RunSpace || GlobalVar.VirtualAxis) + //{ + // flowStep = EDischargeFlowStep.到放料位下方; + //} + //else + //{ - break; - case EDischargeFlowStep.等待到放料位上方: - if (Ops.IsStop("LoadX", "LoadY", $"NozzleR{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴xy已停止运动,"); - if (AxisArrived.LoadXYIsArrived(targetX, targetY)) + // #region 临时屏蔽 + // // //获取所有需要放料的吸嘴,检测真空是否还在,如果真空异常则报警 + // // List lostNozzles = new List(); + // // List toUnloadNozzles = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload); + // // if (toUnloadNozzles.Count > 0) + // // { + + // // foreach (var nozzle in toUnloadNozzles) + // // { + // // if (!nozzle.HasProduct()) + // // { + // // //lostNozzles.Add(nozzle); + // // while (!bSkip) + // // { + + // // } + // // } + // // } + // // if (lostNozzles.Count > 0) + // // { + // // bool bSkip = false; + // // while (!bSkip) + // // { + // // //弹框报警 + // // alarmInfo = $"检测到{lostNozzles.Select(ln => ln.NozzleIndex).ToJoinString()}吸嘴真空吸异常,可能丢料,请检查吸嘴的状态"; + // // TestCenterMessageBox.Show(AlarmConstID.DischargeNozzleLostProductAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + // // msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.DischargeNozzleLostProductAlarm); + // // switch (msgBox.Button) + // // { + // // case ETipButton.Skip: + // // bSkip = true; + // // lostNozzles.ForEach(ln => ln.Reset()); + // // break; + // // case ETipButton.Yes: + // // DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + // // break; + // // default: + // // break; + // // } + // // } + // // } + // // else + // // { + // // if (curNozzle.Status == ENozzleStatus.ToUnload) + // // { + // // flowStep = EDischargeFlowStep.到放料位下方; + // // } + // // else + // // { + // // flowStep = EDischargeFlowStep.放料任务完成; + // // } + // // } + // // } + // // else + // // { + // // flowStep = EDischargeFlowStep.放料任务完成; + // // } + // #endregion + //} + break; + //case EDischargeFlowStep.到放料位下方: + // DischargeDumpFlow.Instance.Start(curNozzle.ToType, curNozzle.NozzleIndex, curNozzle.ToIndex); + // flowStep = EDischargeFlowStep.等待放料完成抬起; + // break; + case EDischargeFlowStep.到放料位下方: + + if (curNozzle.ToType == TurnoverType.Turnover) { - //当放料到tray盘区域时,并且周转再盘已经没有要下料的穴位时,通知周转模组可以运动了 - if (curNozzle.ToType != TurnoverType.Turnover && TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.Tested, ETurnoverTraySlotStatus.Have).Count() == 0) - { - LogHelper.Debug("通知周转模组可以运动"); - TurnoverFlow.Instance.CanMoveFromTestTrayToTurnoverTray(); - } - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号已运动到{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料位上方,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"; + targetZ = SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"); + /*提前打开周转盘真空吸*/ + VacManager.TurnoverTrayVacSuction(EVacOperator.Open, false, curNozzle.ToIndex + 1); + } + else + { + targetZ = SysConfigParam.GetValue($"TrayNozzle{curNozzle.NozzleIndex}TakeHeight") + GlobalVar.DischargeNozzleDumpStockTrayOffsetHeight; + } + errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料位下方,tz{curNozzle.NozzleIndex}:{targetZ}"; MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.丢料检测; + VirtualAxisSleep(); + flowStep = EDischargeFlowStep.等待到放料位下方; } else { - PrintXYCurrentPos($"检测到轴不在目标位置,tx:{targetX},ty:{targetY},"); - flowStep = EDischargeFlowStep.到放料位上方; + //PromptMessageBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); + alarmEntity = AlarmCollection.Get($"NozzleZ{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - break; - case EDischargeFlowStep.丢料检测: - if (!curNozzle.HasProduct() && !GlobalVar.RunSpace) - { - bool exit = false; - while (!exit) + break; + case EDischargeFlowStep.等待到放料位下方: + if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) { - //弹框报警 - //alarmInfo = $"{curNozzle.NozzleIndex}吸嘴真空吸异常,可能丢料,请检查吸嘴的状态"; - if (curNozzle.ToType == TurnoverType.Turnover) + if (AxisArrived.LoadXYIsArrived(targetX, targetY)) { - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料投在周转盘放料时丢料报警), curNozzle.NozzleIndex); - alarmEntity = AlarmCollection.Get(AlarmConstID.排料投在周转盘放料时丢料报警).Transform(curNozzle.NozzleIndex); + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号已运动到{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料位上方,cx: {Ops.GetCurPosition(AxisControl.LoadX)} ,cy: {Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; + MessageQueue.Instance.Insert(logInfo); + if (curNozzle.ToType == TurnoverType.Turnover) + { + /*关闭排料吸嘴真空吸*/ + //logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸"; + //MessageQueue.Instance.Insert(logInfo); + //Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀");//关闭真空 + //Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); + VacManager.DischargeVacSuction(EVacOperator.Close, true, curNozzle.NozzleIndex); + /*打开排料吸嘴真空破*/ + //logInfo = GetClassName() + $"打开{curNozzle.NozzleIndex}号排料吸嘴真空破"; + //MessageQueue.Instance.Insert(logInfo); + //Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); + //Thread.Sleep(GlobalVar.LoadNozzleOpenVacBreakDelaytime); + VacManager.DischargeVacBreak(EVacOperator.Open, true, curNozzle.NozzleIndex); + flowStep = EDischargeFlowStep.到放料关破真空位; + } + else + { + GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.NotHave); + /*关闭排料吸嘴真空吸*/ + //logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸"; + //MessageQueue.Instance.Insert(logInfo); + //Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀"); + //Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); + VacManager.DischargeVacSuction(EVacOperator.Close, true, curNozzle.NozzleIndex); + /*打开排料吸嘴真空破*/ + //logInfo = GetClassName() + $"打开{curNozzle.NozzleIndex}号排料吸嘴真空破"; + //MessageQueue.Instance.Insert(logInfo); + //Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); + //Thread.Sleep(GlobalVar.LoadNozzleOpenVacBreakDelaytime); + VacManager.DischargeVacBreak(EVacOperator.Open, true, curNozzle.NozzleIndex); + /*关闭排料吸嘴真空破*/ + //logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空破"; + //MessageQueue.Instance.Insert(logInfo); + //Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); + //Thread.Sleep(GlobalVar.LoadNozzleCloseVacBreakDelaytime); + VacManager.DischargeVacBreak(EVacOperator.Close, false, curNozzle.NozzleIndex); + flowStep = EDischargeFlowStep.放料完成抬起; + } } else { - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.料仓tray盘放料时丢料报警), curNozzle.NozzleIndex,curNozzle.ToType.ToString()); - alarmEntity = AlarmCollection.Get(AlarmConstID.料仓tray盘放料时丢料报警).Transform(curNozzle.NozzleIndex, curNozzle.ToType.ToString()); - } - //alarmid = AlarmConstID.料仓tray盘放料时丢料报警; - //if (curNozzle.ToType == TurnoverType.Turnover) - //{ - // //alarmid = AlarmConstID.排料投在周转盘放料时丢料报警; - - //} - //else - //{ - - //} - //TestCenterMessageBox.Show(AlarmConstID.DischargeNozzleLostProductAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //msgBox = MsgBox.ShowDialog(alarmid, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.DischargeNozzleLostProductAlarm); - ETipButton buttonRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (buttonRet) - { - case ETipButton.Skip: - if (!curNozzle.HasProduct()) - { - curNozzle.Reset(); - curNozzle.VacSuction(EIoOperate.Close); - curNozzle.VacBreak(EIoOperate.Open); - curNozzle.VacBreak(EIoOperate.Close); - exit = true; - flowStep = EDischargeFlowStep.放料任务完成; - } - break; - case ETipButton.Yes: - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - DischargeModuleGoSafePosFlow.Instance.Wait(); - break; - default: - break; + PrintXYCurrentPos($"检测到轴不在目标位置,tx:{targetX},ty:{targetY},"); + flowStep = EDischargeFlowStep.到放料位上方; } } - } - else - { - flowStep = EDischargeFlowStep.到放料位下方; - } - - //if (GlobalVar.RunSpace || GlobalVar.VirtualAxis) - //{ - // flowStep = EDischargeFlowStep.到放料位下方; - //} - //else - //{ - - // #region 临时屏蔽 - // // //获取所有需要放料的吸嘴,检测真空是否还在,如果真空异常则报警 - // // List lostNozzles = new List(); - // // List toUnloadNozzles = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload); - // // if (toUnloadNozzles.Count > 0) - // // { - - // // foreach (var nozzle in toUnloadNozzles) - // // { - // // if (!nozzle.HasProduct()) - // // { - // // //lostNozzles.Add(nozzle); - // // while (!bSkip) - // // { - - // // } - // // } - // // } - // // if (lostNozzles.Count > 0) - // // { - // // bool bSkip = false; - // // while (!bSkip) - // // { - // // //弹框报警 - // // alarmInfo = $"检测到{lostNozzles.Select(ln => ln.NozzleIndex).ToJoinString()}吸嘴真空吸异常,可能丢料,请检查吸嘴的状态"; - // // TestCenterMessageBox.Show(AlarmConstID.DischargeNozzleLostProductAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - // // msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.DischargeNozzleLostProductAlarm); - // // switch (msgBox.Button) - // // { - // // case ETipButton.Skip: - // // bSkip = true; - // // lostNozzles.ForEach(ln => ln.Reset()); - // // break; - // // case ETipButton.Yes: - // // DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - // // break; - // // default: - // // break; - // // } - // // } - // // } - // // else - // // { - // // if (curNozzle.Status == ENozzleStatus.ToUnload) - // // { - // // flowStep = EDischargeFlowStep.到放料位下方; - // // } - // // else - // // { - // // flowStep = EDischargeFlowStep.放料任务完成; - // // } - // // } - // // } - // // else - // // { - // // flowStep = EDischargeFlowStep.放料任务完成; - // // } - // #endregion - //} - break; - //case EDischargeFlowStep.到放料位下方: - // DischargeDumpFlow.Instance.Start(curNozzle.ToType, curNozzle.NozzleIndex, curNozzle.ToIndex); - // flowStep = EDischargeFlowStep.等待放料完成抬起; - // break; - case EDischargeFlowStep.到放料位下方: - - if (curNozzle.ToType == TurnoverType.Turnover) - { - targetZ = SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"); - /*提前打开周转盘真空吸*/ - VacManager.TurnoverTrayVacSuction(EVacOperator.Open, false, curNozzle.ToIndex + 1); - } - else - { - targetZ = SysConfigParam.GetValue($"TrayNozzle{curNozzle.NozzleIndex}TakeHeight") + GlobalVar.DischargeNozzleDumpStockTrayOffsetHeight; - } - errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号到{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料位下方,tz{curNozzle.NozzleIndex}:{targetZ}"; - MessageQueue.Instance.Insert(logInfo); - VirtualAxisSleep(); - flowStep = EDischargeFlowStep.等待到放料位下方; - } - else - { - //PromptMessageBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); - alarmEntity = AlarmCollection.Get($"NozzleZ{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case EDischargeFlowStep.等待到放料位下方: - if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - { - if (AxisArrived.LoadXYIsArrived(targetX, targetY)) + break; + case EDischargeFlowStep.到放料关破真空位: + targetZ = SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight") + GlobalVar.DischargeNozzleDumpTurnoverTrayOffset; + errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号已运动到{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料位上方,cx: {Ops.GetCurPosition(AxisControl.LoadX)} ,cy: {Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号周转盘放料完成,准备抬起{GlobalVar.DischargeNozzleDumpTurnoverTrayOffset}mm后关闭破真空,tz{curNozzle.NozzleIndex}:{targetZ}"; MessageQueue.Instance.Insert(logInfo); - if (curNozzle.ToType == TurnoverType.Turnover) - { - /*关闭排料吸嘴真空吸*/ - //logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸"; - //MessageQueue.Instance.Insert(logInfo); - //Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀");//关闭真空 - //Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); - VacManager.DischargeVacSuction(EVacOperator.Close, true, curNozzle.NozzleIndex); - /*打开排料吸嘴真空破*/ - //logInfo = GetClassName() + $"打开{curNozzle.NozzleIndex}号排料吸嘴真空破"; - //MessageQueue.Instance.Insert(logInfo); - //Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); - //Thread.Sleep(GlobalVar.LoadNozzleOpenVacBreakDelaytime); - VacManager.DischargeVacBreak(EVacOperator.Open, true, curNozzle.NozzleIndex); - flowStep = EDischargeFlowStep.到放料关破真空位; - } - else - { - GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.NotHave); - /*关闭排料吸嘴真空吸*/ - //logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸"; - //MessageQueue.Instance.Insert(logInfo); - //Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀"); - //Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); - VacManager.DischargeVacSuction(EVacOperator.Close, true, curNozzle.NozzleIndex); - /*打开排料吸嘴真空破*/ - //logInfo = GetClassName() + $"打开{curNozzle.NozzleIndex}号排料吸嘴真空破"; - //MessageQueue.Instance.Insert(logInfo); - //Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); - //Thread.Sleep(GlobalVar.LoadNozzleOpenVacBreakDelaytime); - VacManager.DischargeVacBreak(EVacOperator.Open, true, curNozzle.NozzleIndex); - /*关闭排料吸嘴真空破*/ - //logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空破"; - //MessageQueue.Instance.Insert(logInfo); - //Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); - //Thread.Sleep(GlobalVar.LoadNozzleCloseVacBreakDelaytime); - VacManager.DischargeVacBreak(EVacOperator.Close, false, curNozzle.NozzleIndex); - flowStep = EDischargeFlowStep.放料完成抬起; - } + flowStep = EDischargeFlowStep.等待到放料关破真空位; } else { - PrintXYCurrentPos($"检测到轴不在目标位置,tx:{targetX},ty:{targetY},"); - flowStep = EDischargeFlowStep.到放料位上方; + PromptMessageBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); } - } - break; - case EDischargeFlowStep.到放料关破真空位: - targetZ = SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight") + GlobalVar.DischargeNozzleDumpTurnoverTrayOffset; - errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号周转盘放料完成,准备抬起{GlobalVar.DischargeNozzleDumpTurnoverTrayOffset}mm后关闭破真空,tz{curNozzle.NozzleIndex}:{targetZ}"; - MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.等待到放料关破真空位; - } - else - { - PromptMessageBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); - } - break; - case EDischargeFlowStep.等待到放料关破真空位: - if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - { - logInfo = GetClassName() + $"已运动到放料关破真空位,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; - MessageQueue.Instance.Insert(logInfo); - /*关闭排料吸嘴真空破*/ - //Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); - //Thread.Sleep(GlobalVar.LoadNozzleCloseVacBreakDelaytime); - VacManager.DischargeVacBreak(EVacOperator.Close, false, curNozzle.NozzleIndex); - logInfo = GetClassName() + $"关闭排料{curNozzle.NozzleIndex}号吸嘴真空破"; - MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.放料完成抬起; - } - break; - case EDischargeFlowStep.放料完成抬起: - targetZ = 0; - errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料完成抬起,tz{curNozzle.NozzleIndex}:{targetZ}"; - MessageQueue.Instance.Insert(logInfo); - if (GlobalVar.VirtualAxis) + break; + case EDischargeFlowStep.等待到放料关破真空位: + if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + logInfo = GetClassName() + $"已运动到放料关破真空位,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; + MessageQueue.Instance.Insert(logInfo); + /*关闭排料吸嘴真空破*/ + //Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); + //Thread.Sleep(GlobalVar.LoadNozzleCloseVacBreakDelaytime); + VacManager.DischargeVacBreak(EVacOperator.Close, false, curNozzle.NozzleIndex); + logInfo = GetClassName() + $"关闭排料{curNozzle.NozzleIndex}号吸嘴真空破"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.放料完成抬起; } - flowStep = EDischargeFlowStep.等待放料完成抬起; - } - else - { - //PromptMessageBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); - alarmEntity = AlarmCollection.Get($"NozzleZ{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case EDischargeFlowStep.等待放料完成抬起: - if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料完成已起位,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; - MessageQueue.Instance.Insert(logInfo); - if (curNozzle.ToType == TurnoverType.Turnover) + break; + case EDischargeFlowStep.放料完成抬起: + targetZ = 0; + errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetZ, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) { - flowStep = EDischargeFlowStep.放料真空检测; + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料完成抬起,tz{curNozzle.NozzleIndex}:{targetZ}"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + flowStep = EDischargeFlowStep.等待放料完成抬起; } else { - flowStep = EDischargeFlowStep.粘料检测; - } - - } - break; - case EDischargeFlowStep.放料真空检测: - if (curNozzle.ToType == TurnoverType.Turnover) - { - if (Ops.IsOn($"周转盘{curNozzle.ToIndex + 1}号穴位真空吸检测") || GlobalVar.RunSpace) + //PromptMessageBox.ShowAxisAlarmDialog($"NozzleZ{curNozzle.NozzleIndex}", errCode); + alarmEntity = AlarmCollection.Get($"NozzleZ{curNozzle.NozzleIndex}运动异常").Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + break; + case EDischargeFlowStep.等待放料完成抬起: + if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) { - - logInfo = GetClassName() + $"周转盘{curNozzle.ToIndex + 1}号穴位真空吸检测OK"; + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料完成已起位,cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)},cz{curNozzle.NozzleIndex}:{Ops.GetCurPosition($"NozzleZ{curNozzle.NozzleIndex}")}"; MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.放料任务完成; + if (curNozzle.ToType == TurnoverType.Turnover) + { + flowStep = EDischargeFlowStep.放料真空检测; + } + else + { + flowStep = EDischargeFlowStep.粘料检测; + } + } - else + break; + case EDischargeFlowStep.放料真空检测: + if (curNozzle.ToType == TurnoverType.Turnover) { - //打开真空吸 - curNozzle.VacSuction(EIoOperate.Open); - //如果粘料 - if (curNozzle.HasProduct()) + if (Ops.IsOn($"周转盘{curNozzle.ToIndex + 1}号穴位真空吸检测") || GlobalVar.RunSpace) { - bool skip = false; - while (!skip) - { - //粘料报警,提示用户粘料,移动到安全位,或者点击跳过 - //alarmInfo = $"排料{curNozzle.NozzleIndex}号吸嘴可能粘料,请查看吸嘴状态后处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料头粘料报警), curNozzle.NozzleIndex); - alarmEntity = AlarmCollection.Get(AlarmConstID.排料头粘料报警).Transform(curNozzle.NozzleIndex); - MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); - //TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //msgBox = MsgBox.ShowDialog(AlarmConstID.排料头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) - { - case ETipButton.Skip: - logInfo = GetClassName() + "选择了跳过按钮"; - MessageQueue.Instance.Insert(logInfo); - if (!curNozzle.HasProduct()) - { - curNozzle.VacSuction(EIoOperate.Close); - curNozzle.Reset(); - skip = true; - flowStep = EDischargeFlowStep.放料任务完成; - } - break; - case ETipButton.Yes: - logInfo = GetClassName() + "选择了移动到安全位按钮"; - MessageQueue.Instance.Insert(logInfo); - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - break; - } - } + logInfo = GetClassName() + $"周转盘{curNozzle.ToIndex + 1}号穴位真空吸检测OK"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.放料任务完成; } else { - //如果没有粘料,说明产品放下去了,这个时候用相机检测产品是否在穴位种 - VisionResult vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(curNozzle.ToIndex + 1, true, true, false); - //VisionResult vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); - if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr)) + //打开真空吸 + curNozzle.VacSuction(EIoOperate.Open); + //如果粘料 + if (curNozzle.HasProduct()) { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号SN={curNozzle.SN}放{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}"; - MessageQueue.Instance.Insert(logInfo); - curNozzle.VacSuction(EIoOperate.Close); - flowStep = EDischargeFlowStep.放料任务完成; + bool skip = false; + while (!skip) + { + //粘料报警,提示用户粘料,移动到安全位,或者点击跳过 + //alarmInfo = $"排料{curNozzle.NozzleIndex}号吸嘴可能粘料,请查看吸嘴状态后处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料头粘料报警), curNozzle.NozzleIndex); + alarmEntity = AlarmCollection.Get(AlarmConstID.排料头粘料报警).Transform(curNozzle.NozzleIndex); + MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); + //TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //msgBox = MsgBox.ShowDialog(AlarmConstID.排料头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Skip: + logInfo = GetClassName() + "选择了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + if (!curNozzle.HasProduct()) + { + curNozzle.VacSuction(EIoOperate.Close); + curNozzle.Reset(); + skip = true; + flowStep = EDischargeFlowStep.放料任务完成; + } + break; + case ETipButton.Yes: + logInfo = GetClassName() + "选择了移动到安全位按钮"; + MessageQueue.Instance.Insert(logInfo); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + Start(); + break; + } + } + } else { - //异常处理 - bool exit = false; - Dictionary buttons = new Dictionary() + //如果没有粘料,说明产品放下去了,这个时候用相机检测产品是否在穴位种 + VisionResult vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(curNozzle.ToIndex + 1, true, true, false); + //VisionResult vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); + if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr)) + { + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号SN={curNozzle.SN}放{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}"; + MessageQueue.Instance.Insert(logInfo); + curNozzle.VacSuction(EIoOperate.Close); + flowStep = EDischargeFlowStep.放料任务完成; + } + else + { + //异常处理 + bool exit = false; + Dictionary buttons = new Dictionary() { { ETipButton.Retry,"重拍|Regrab" }, {ETipButton.Skip,"跳过|Skip" }, {ETipButton.Yes,"移动到安全位|MoveToSafePos" } }; - while (!exit) - { - //alarmInfo = $"周转盘{curNozzle.ToIndex + 1}号穴位真空吸异常"; - alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料头放料到周转盘后周转盘真空吸报警), curNozzle.NozzleIndex, curNozzle.ToIndex + 1); - MessageQueue.Instance.Warn(GetClassName() + alarmInfo); - //TestCenterMessageBox.Show(AlarmConstID.TurnoverDumpFailAlarm, alarmInfo, ETipButton.Retry | ETipButton.Skip | ETipButton.Yes, buttons); - msgBox = PromptMessageBox.ShowDialog(AlarmConstID.排料头放料到周转盘后周转盘真空吸报警, alarmInfo, ETipButton.Retry | ETipButton.Skip | ETipButton.Yes, buttons);// TestCenterMessageBox.WaitResult(AlarmConstID.TurnoverDumpFailAlarm); - if (msgBox != null) + while (!exit) { - switch (msgBox.Button) + //alarmInfo = $"周转盘{curNozzle.ToIndex + 1}号穴位真空吸异常"; + alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料头放料到周转盘后周转盘真空吸报警), curNozzle.NozzleIndex, curNozzle.ToIndex + 1); + MessageQueue.Instance.Warn(GetClassName() + alarmInfo); + //TestCenterMessageBox.Show(AlarmConstID.TurnoverDumpFailAlarm, alarmInfo, ETipButton.Retry | ETipButton.Skip | ETipButton.Yes, buttons); + msgBox = PromptMessageBox.ShowDialog(AlarmConstID.排料头放料到周转盘后周转盘真空吸报警, alarmInfo, ETipButton.Retry | ETipButton.Skip | ETipButton.Yes, buttons);// TestCenterMessageBox.WaitResult(AlarmConstID.TurnoverDumpFailAlarm); + if (msgBox != null) { - case ETipButton.Retry://重拍 - logInfo = GetClassName() + $"选择了重拍"; - MessageQueue.Instance.Insert(logInfo); - vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(curNozzle.ToIndex + 1, true, true, true); - //vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); - if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr)) - { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号SN={curNozzle.SN}放{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}"; + switch (msgBox.Button) + { + case ETipButton.Retry://重拍 + logInfo = GetClassName() + $"选择了重拍"; MessageQueue.Instance.Insert(logInfo); - curNozzle.VacSuction(EIoOperate.Close); - exit = true; - flowStep = EDischargeFlowStep.放料任务完成; - } - break; - case ETipButton.Skip://跳过 - logInfo = GetClassName() + $"选择了跳过"; - MessageQueue.Instance.Insert(logInfo); - if (GlobalVar.EnableExceptionHandlingNozzle) - { - //排料轴先回到安全位,等待异常处理吸嘴过来处理这颗异常料 - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, curNozzle.ToIndex + 1); - VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, curNozzle.ToIndex + 1); - curNozzle.Reset(); - flowStep = EDischargeFlowStep.放料任务完成; - exit = true; - } - else - { - if (!UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, curNozzle.ToIndex + 1).HasProduct) + vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(curNozzle.ToIndex + 1, true, true, true); + //vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); + if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr)) + { + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号SN={curNozzle.SN}放{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}"; + MessageQueue.Instance.Insert(logInfo); + curNozzle.VacSuction(EIoOperate.Close); + exit = true; + flowStep = EDischargeFlowStep.放料任务完成; + } + break; + case ETipButton.Skip://跳过 + logInfo = GetClassName() + $"选择了跳过"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.EnableExceptionHandlingNozzle) { + //排料轴先回到安全位,等待异常处理吸嘴过来处理这颗异常料 + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, curNozzle.ToIndex + 1); VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, curNozzle.ToIndex + 1); curNozzle.Reset(); flowStep = EDischargeFlowStep.放料任务完成; exit = true; } - } - break; - case ETipButton.Yes://移动到安全位 - logInfo = GetClassName() + $"选择了移动到安全位"; - MessageQueue.Instance.Insert(logInfo); - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - DischargeModuleGoSafePosFlow.Instance.Wait(); - break; - default: - break; + else + { + if (!UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, curNozzle.ToIndex + 1).HasProduct) + { + VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, curNozzle.ToIndex + 1); + curNozzle.Reset(); + flowStep = EDischargeFlowStep.放料任务完成; + exit = true; + } + } + break; + case ETipButton.Yes://移动到安全位 + logInfo = GetClassName() + $"选择了移动到安全位"; + MessageQueue.Instance.Insert(logInfo); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + //DischargeModuleGoSafePosFlow.Instance.Wait(); + Start(); + break; + default: + break; + } } } } } } } - } - break; - case EDischargeFlowStep.粘料检测: - //打开真空吸 - curNozzle.VacSuction(EIoOperate.Open); - if (curNozzle.HasProduct()) - { - bool skip = false; - while (!skip) - { - //粘料报警,提示用户粘料,移动到安全位,或者点击跳过 - //alarmInfo = $"排料{curNozzle.NozzleIndex}号吸嘴可能粘料,请查看吸嘴状态后处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料头粘料报警), curNozzle.NozzleIndex); - alarmEntity = AlarmCollection.Get(AlarmConstID.排料头粘料报警).Transform(curNozzle.NozzleIndex); - MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); - //TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //msgBox = MsgBox.ShowDialog(AlarmConstID.排料头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) - { - case ETipButton.Skip: - logInfo = GetClassName() + "选择了跳过按钮"; - MessageQueue.Instance.Insert(logInfo); - if (!curNozzle.HasProduct()) - { - curNozzle.VacSuction(EIoOperate.Close); - curNozzle.Reset(); - skip = true; - flowStep = EDischargeFlowStep.放料任务完成; - } - break; - case ETipButton.Yes: - logInfo = GetClassName() + "选择了移动到安全位按钮"; - MessageQueue.Instance.Insert(logInfo); - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - break; - } - } - } - else - { - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号SN={curNozzle.SN}放{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}"; - MessageQueue.Instance.Insert(logInfo); - curNozzle.VacSuction(EIoOperate.Close); - flowStep = EDischargeFlowStep.放料任务完成; - } - break; - - case EDischargeFlowStep.放料任务完成: - - //AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").Home(); - //MessageQueue.Instance.Insert($"{curNozzle.NozzleIndex}号排料吸嘴回原"); - //Ops.HomeAndGoStartPos($"NozzleR{NozzleIndex}"); - if (curNozzle.Status == ENozzleStatus.ToUnload) - { - GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.NotHave); - logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料任务完成"; - MessageQueue.Instance.Insert(logInfo); - if (curNozzle.ToType == TurnoverType.Turnover) + break; + case EDischargeFlowStep.粘料检测: + //打开真空吸 + curNozzle.VacSuction(EIoOperate.Open); + if (curNozzle.HasProduct()) { - int count = NozzleManager.GetNozzlesCountByToTray(TurnoverType.Turnover); - if (count - 1 == 0) + bool skip = false; + while (!skip) { - if (!GlobalVar.DisableTurnoverTrayKnock && GlobalVar.EnableDischargeNozzlePutToTurnoverTrayKnock) + //粘料报警,提示用户粘料,移动到安全位,或者点击跳过 + //alarmInfo = $"排料{curNozzle.NozzleIndex}号吸嘴可能粘料,请查看吸嘴状态后处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.排料头粘料报警), curNozzle.NozzleIndex); + alarmEntity = AlarmCollection.Get(AlarmConstID.排料头粘料报警).Transform(curNozzle.NozzleIndex); + MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); + //TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //msgBox = MsgBox.ShowDialog(AlarmConstID.排料头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) { - TrayShake.ShakeAsync(ETrayType.Turnover); + case ETipButton.Skip: + logInfo = GetClassName() + "选择了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + if (!curNozzle.HasProduct()) + { + curNozzle.VacSuction(EIoOperate.Close); + curNozzle.Reset(); + skip = true; + flowStep = EDischargeFlowStep.放料任务完成; + } + break; + case ETipButton.Yes: + logInfo = GetClassName() + "选择了移动到安全位按钮"; + MessageQueue.Instance.Insert(logInfo); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + Start(); + break; } } - - GlobalTray.TurnoverTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); - TurnoverTrayManager.Instance.Slot(curNozzle.ToIndex + 1).AddProduct(curNozzle); - } - else if (curNozzle.ToType == TurnoverType.ToBeTested) + else { - curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Input).GetFloor(); - GlobalTray.InputTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); - TrayStatusManager.Fill(ETrayType.Input, curNozzle.ToIndex + 1); + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号SN={curNozzle.SN}放{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}"; + MessageQueue.Instance.Insert(logInfo); + curNozzle.VacSuction(EIoOperate.Close); + flowStep = EDischargeFlowStep.放料任务完成; } - else if (curNozzle.ToType == TurnoverType.Passed) + break; + + case EDischargeFlowStep.放料任务完成: + + //AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").Home(); + //MessageQueue.Instance.Insert($"{curNozzle.NozzleIndex}号排料吸嘴回原"); + //Ops.HomeAndGoStartPos($"NozzleR{NozzleIndex}"); + if (curNozzle.Status == ENozzleStatus.ToUnload) { - //在这里查看所有的吸嘴还有没有要放到passed盘的,如果没有了就敲击 - int count = NozzleManager.GetNozzlesCountByToTray(TurnoverType.Passed); - if(count-1==0) + GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.NotHave); + logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料任务完成"; + MessageQueue.Instance.Insert(logInfo); + if (curNozzle.ToType == TurnoverType.Turnover) { - if(!GlobalVar.DisableStockTrayKnock && GlobalVar.EnablePutToStockKnock) + int count = NozzleManager.GetNozzlesCountByToTray(TurnoverType.Turnover); + if (count - 1 == 0) { - TrayShake.ShakeAsync(ETrayType.Ok); + if (!GlobalVar.DisableTurnoverTrayKnock && GlobalVar.EnableDischargeNozzlePutToTurnoverTrayKnock) + { + TrayShake.ShakeAsync(ETrayType.Turnover); + } } + + GlobalTray.TurnoverTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); + TurnoverTrayManager.Instance.Slot(curNozzle.ToIndex + 1).AddProduct(curNozzle); + } - if (GlobalVar.InputTrayLoop) + else if (curNozzle.ToType == TurnoverType.ToBeTested) { curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Input).GetFloor(); GlobalTray.InputTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); TrayStatusManager.Fill(ETrayType.Input, curNozzle.ToIndex + 1); } - else - { - curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Ok).GetFloor(); - GlobalTray.OkTary.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); - TrayStatusManager.Fill(ETrayType.Ok, curNozzle.ToIndex + 1); - } - } - else if (curNozzle.ToType == TurnoverType.Failed) - { - int count = NozzleManager.GetNozzlesCountByToTray(TurnoverType.Failed); - if (count - 1 == 0) + else if (curNozzle.ToType == TurnoverType.Passed) { - if (!GlobalVar.DisableStockTrayKnock && GlobalVar.EnablePutToStockKnock) + //在这里查看所有的吸嘴还有没有要放到passed盘的,如果没有了就敲击 + int count = NozzleManager.GetNozzlesCountByToTray(TurnoverType.Passed); + if (count - 1 == 0) { - TrayShake.ShakeAsync(ETrayType.Ng); + if (!GlobalVar.DisableStockTrayKnock && GlobalVar.EnablePutToStockKnock) + { + TrayShake.ShakeAsync(ETrayType.Ok); + } + } + if (GlobalVar.InputTrayLoop) + { + curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Input).GetFloor(); + GlobalTray.InputTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); + TrayStatusManager.Fill(ETrayType.Input, curNozzle.ToIndex + 1); + } + else + { + curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Ok).GetFloor(); + GlobalTray.OkTary.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); + TrayStatusManager.Fill(ETrayType.Ok, curNozzle.ToIndex + 1); } } - if (GlobalVar.InputTrayLoop) - { - curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Input).GetFloor(); - GlobalTray.InputTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); - TrayStatusManager.Fill(ETrayType.Input, curNozzle.ToIndex + 1); - } - else + else if (curNozzle.ToType == TurnoverType.Failed) { - curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Ng).GetFloor(); - GlobalTray.NgTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); - TrayStatusManager.Fill(ETrayType.Ng, curNozzle.ToIndex + 1); + int count = NozzleManager.GetNozzlesCountByToTray(TurnoverType.Failed); + if (count - 1 == 0) + { + if (!GlobalVar.DisableStockTrayKnock && GlobalVar.EnablePutToStockKnock) + { + TrayShake.ShakeAsync(ETrayType.Ng); + } + } + if (GlobalVar.InputTrayLoop) + { + curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Input).GetFloor(); + GlobalTray.InputTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); + TrayStatusManager.Fill(ETrayType.Input, curNozzle.ToIndex + 1); + } + else + { + curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Ng).GetFloor(); + GlobalTray.NgTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); + TrayStatusManager.Fill(ETrayType.Ng, curNozzle.ToIndex + 1); + } } - } - else if (curNozzle.ToType == TurnoverType.Multifunction) - { - int count = NozzleManager.GetNozzlesCountByToTray(TurnoverType.Multifunction); - if (count - 1 == 0) + else if (curNozzle.ToType == TurnoverType.Multifunction) { - if (!GlobalVar.DisableStockTrayKnock && GlobalVar.EnablePutToStockKnock) + int count = NozzleManager.GetNozzlesCountByToTray(TurnoverType.Multifunction); + if (count - 1 == 0) { - TrayShake.ShakeAsync(ETrayType.Multi); + if (!GlobalVar.DisableStockTrayKnock && GlobalVar.EnablePutToStockKnock) + { + TrayShake.ShakeAsync(ETrayType.Multi); + } } + curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Multi).GetFloor(); + GlobalTray.MultiTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); + TrayStatusManager.Fill(ETrayType.Multi, curNozzle.ToIndex + 1); } - curNozzle.ToFloor = StockManager.Instance.GetStock(ETrayType.Multi).GetFloor(); - GlobalTray.MultiTray.ChangeStatus(curNozzle.ToIndex + 1, ESlotStatus.Have); - TrayStatusManager.Fill(ETrayType.Multi, curNozzle.ToIndex + 1); - } - LoadAndUnloadTask.Instance.AddTurnoverResult(curNozzle); - - } - curNozzle.Reset(); - if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count > 0) - { - flowStep = EDischargeFlowStep.到放料位上方; - } - else - { - //release memory - //foreach (var item in mrs) - //{ - // item.Dispose(); - //} - //mrs.Clear(); - if (mrs != null && mrs.Count > 0) - { - Array.Clear(imgs, 0, imgs.Length); - mrs.Clear(); - GC.Collect(); - } + LoadAndUnloadTask.Instance.AddTurnoverResult(curNozzle); - //GC.Collect(); - if (curNozzle.ToType == TurnoverType.Turnover) - { - ScanBarCode(); } - - if (LoadAndUnloadTask.Instance.GetUnDealedTask().Count > 0) + curNozzle.Reset(); + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload).Count > 0) { - StockTrayToTurnoverTray = !StockTrayToTurnoverTray; - flowStep = EDischargeFlowStep.到取料位上方; + flowStep = EDischargeFlowStep.到放料位上方; } else { - flowStep = EDischargeFlowStep.任务结束到安全位; - } - } - break; - - case EDischargeFlowStep.任务结束到安全位: - //检测一下是否需要换盘 - { - #region 通知中控排料任务结束 - if (curNozzle.ToType != TurnoverType.Turnover && !GlobalVar.CleanOut) - { - if (TestCenter.Instance.LoadResult()) + //release memory + //foreach (var item in mrs) + //{ + // item.Dispose(); + //} + //mrs.Clear(); + if (mrs != null && mrs.Count > 0) { - logInfo = GetClassName() + $"通知中控任务完成"; - MessageQueue.Instance.Insert(logInfo); - LoadAndUnloadTask.Instance.Clear(); - logInfo = GetClassName() + $"任务完成,清除任务"; - MessageQueue.Instance.Insert(logInfo); - MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); + Array.Clear(imgs, 0, imgs.Length); + mrs.Clear(); + GC.Collect(); } - } - #endregion + //GC.Collect(); + if (curNozzle.ToType == TurnoverType.Turnover) + { + ScanBarCode(); + } - TraySlot slot = GlobalTray.InputTray.GetSlot(ESlotStatus.Have); - if (slot != null) - { - targetX = SysConfigParam.GetValue("LoadXStartPos"); - targetY = SysConfigParam.GetValue("LoadYStartPos"); - errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + if (LoadAndUnloadTask.Instance.GetUnDealedTask().Count > 0) { - errCode = AxisControl.LoadY.MovePos(targetY, GlobalVar.WholeSpeed); - if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"排料任务结束到安全位,tx:{targetX},ty:{targetY}"; - MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.等待任务结束到安全位; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.LoadY运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } + StockTrayToTurnoverTray = !StockTrayToTurnoverTray; + flowStep = EDischargeFlowStep.到取料位上方; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + flowStep = EDischargeFlowStep.任务结束到安全位; } } - else + break; + + case EDischargeFlowStep.任务结束到安全位: + //检测一下是否需要换盘 { - if (Ops.IsOn("2号料仓缺盘光电检测")) + #region 通知中控排料任务结束 + if (curNozzle.ToType != TurnoverType.Turnover && !GlobalVar.CleanOut) { - logInfo = GetClassName() + $"{curTask.FromType.ToString()}盘无料,准备切换料盘"; - MessageQueue.Instance.Insert(logInfo); - TakeTrayFlow.Instance.Take(ETrayType.Input, ETrayType.Empty1, - () => - { - Task.Run(() => - { - StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.Whole, null); - }); - }, null, - () => - { - Task.Run(() => - { - StockManager.Instance.GetStock(ETrayType.Empty1).Unload(EStockTrayUnLoadMode.Whole, null); - }); - }); - StockManager.Instance.GetStock(ETrayType.Input).WaitFinished(); + if (TestCenter.Instance.LoadResult()) + { + logInfo = GetClassName() + $"通知中控任务完成"; + MessageQueue.Instance.Insert(logInfo); + LoadAndUnloadTask.Instance.Clear(); + logInfo = GetClassName() + $"任务完成,清除任务"; + MessageQueue.Instance.Insert(logInfo); + MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); + } } - else + + #endregion + + TraySlot slot = GlobalTray.InputTray.GetSlot(ESlotStatus.Have); + if (slot != null) { targetX = SysConfigParam.GetValue("LoadXStartPos"); targetY = SysConfigParam.GetValue("LoadYStartPos"); @@ -2111,7 +2083,6 @@ namespace Rs.MotionPlat.Flow else { //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); - //AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴运动异常, $"{AxisAlias.LoadY}", errCode.ToString()); alarmEntity = AlarmCollection.Get(AlarmConstID.LoadY运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } @@ -2119,43 +2090,113 @@ namespace Rs.MotionPlat.Flow else { //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); - //AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴运动异常, $"{AxisAlias.LoadX}", errCode.ToString()); alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } - flowStep = EDischargeFlowStep.等待任务结束到安全位; + else + { + if (Ops.IsOn("2号料仓缺盘光电检测")) + { + logInfo = GetClassName() + $"{curTask.FromType.ToString()}盘无料,准备切换料盘"; + MessageQueue.Instance.Insert(logInfo); + TakeTrayFlow.Instance.Take(ETrayType.Input, ETrayType.Empty1, + () => + { + Task.Run(() => + { + StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.Whole, null); + }); + }, null, + () => + { + Task.Run(() => + { + StockManager.Instance.GetStock(ETrayType.Empty1).Unload(EStockTrayUnLoadMode.Whole, null); + }); + }); + StockManager.Instance.GetStock(ETrayType.Input).WaitFinished(); + } + else + { + targetX = SysConfigParam.GetValue("LoadXStartPos"); + targetY = SysConfigParam.GetValue("LoadYStartPos"); + errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + errCode = AxisControl.LoadY.MovePos(targetY, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"排料任务结束到安全位,tx:{targetX},ty:{targetY}"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.等待任务结束到安全位; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode); + //AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴运动异常, $"{AxisAlias.LoadY}", errCode.ToString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.LoadY运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode); + //AlarmMessageBox.ShowDialog(true, ETipButton.Ok, null, AlarmConstID.轴运动异常, $"{AxisAlias.LoadX}", errCode.ToString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.LoadX运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + } + flowStep = EDischargeFlowStep.等待任务结束到安全位; + } } - } - break; - case EDischargeFlowStep.等待任务结束到安全位: - if (Ops.IsStop("LoadX", "LoadY") || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴XY已停止运动,"); - if (curNozzle.ToType == TurnoverType.Turnover) + break; + case EDischargeFlowStep.等待任务结束到安全位: + if (Ops.IsStop("LoadX", "LoadY") || GlobalVar.VirtualAxis) { - if (TestCenter.Instance.LoadResult()) + PrintXYCurrentPos("轴XY已停止运动,"); + if (curNozzle.ToType == TurnoverType.Turnover) { - logInfo = GetClassName() + $"通知中控任务完成"; - MessageQueue.Instance.Insert(logInfo); - LoadAndUnloadTask.Instance.Clear(); - logInfo = GetClassName() + $"任务完成,清除任务"; - MessageQueue.Instance.Insert(logInfo); - MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); + if (TestCenter.Instance.LoadResult()) + { + logInfo = GetClassName() + $"通知中控任务完成"; + MessageQueue.Instance.Insert(logInfo); + LoadAndUnloadTask.Instance.Clear(); + logInfo = GetClassName() + $"任务完成,清除任务"; + MessageQueue.Instance.Insert(logInfo); + MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); + } + TurnoverFlow.Instance.CanMoveFromTestTrayToTurnoverTray(); } - TurnoverFlow.Instance.CanMoveFromTestTrayToTurnoverTray(); + logInfo = GetClassName() + $"任务结束已回到安全位"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.等待任务; } - logInfo = GetClassName() + $"任务结束已回到安全位"; - MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.等待任务; - } - break; - default: - break; + break; + default: + break; + } } + } + public void Start() + { + stop = false; + } + public void Stop() + { + stop = true; + } + private string GetClassName() + { + return "DischargeFlow_"; + } /// /// 判断排料轴是否可以干其他的活 /// @@ -2567,6 +2608,14 @@ namespace Rs.MotionPlat.Flow LogHelper.Debug(GetClassName() + $"{prefixLog}当前位置:cx:{Ops.GetCurPosition(AxisControl.LoadX)},cy:{Ops.GetCurPosition(AxisControl.LoadY)}"); } + public void VirtualAxisSleep() + { + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + } + ///// ///// 检测XY是否在目标位置上 ///// diff --git a/Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs b/Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs index f1a5a4f..bfaad92 100644 --- a/Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs +++ b/Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs @@ -113,8 +113,10 @@ namespace Rs.MotionPlat.Flow /// /// 周转流程 /// - public class TurnoverFlow : BaseFlow + public class TurnoverFlow { + + private Task mainTask; /// /// 周转盘取料是否完成 /// @@ -170,7 +172,22 @@ namespace Rs.MotionPlat.Flow double targetTurnoverY = 0.0; double targetTurnoverZ = 0.0; double targetPressZ = 0.0; + string logInfo = string.Empty; + string alarmInfo = string.Empty; Stopwatch timeStatistics = new Stopwatch(); + bool stop = true; + bool run = true; + + public void Init() + { + mainTask = new Task(Run); + mainTask.Start(); + } + + public void Deinit() + { + run = false; + } /// /// 可以下料到周转盘 /// @@ -189,1686 +206,1108 @@ namespace Rs.MotionPlat.Flow /// 获取未执行的任务 /// private List undealTasks = new List(); - public override void Run() + public void Run() { - switch (Step) + while (run) { - case ETurnoverFlowStep.等待任务: - if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestLoad) > 0) - { - turnoverTakeFinishe = false; - FlowStatus = EFlowStatus.Running; - retakeNum = 0; - logInfo = GetClassName() + $"接收到测试工位上料任务"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.周转盘取料前真空检测; - } - else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestUnload) > 0)//测试下料任务一般不会在这里触发,只有上次异常结束打开软件时,中控会发过来下料任务 - { - FlowStatus = EFlowStatus.Running; - retakeNum = 0; - logInfo = GetClassName() + $"接收到测试工位下料任务"; - MessageQueue.Instance.Insert(logInfo); - if (GlobalVar.CleanOut == true && GlobalVar.TurnoverNozzleHasProduct) + if(stop || !GlobalVar.DeviceIsAuto) + { + Thread.Sleep(10); + continue; + } + switch (Step) + { + case ETurnoverFlowStep.等待任务: + if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestLoad) > 0) { - Step = ETurnoverFlowStep.到周转盘放料位上方; + turnoverTakeFinishe = false; + FlowStatus = EFlowStatus.Running; + retakeNum = 0; + logInfo = GetClassName() + $"接收到测试工位上料任务"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.周转盘取料前真空检测; } - else + else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestUnload) > 0)//测试下料任务一般不会在这里触发,只有上次异常结束打开软件时,中控会发过来下料任务 { - Step = ETurnoverFlowStep.测试完成抬起1; + FlowStatus = EFlowStatus.Running; + retakeNum = 0; + logInfo = GetClassName() + $"接收到测试工位下料任务"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.CleanOut == true && GlobalVar.TurnoverNozzleHasProduct) + { + Step = ETurnoverFlowStep.到周转盘放料位上方; + } + else + { + Step = ETurnoverFlowStep.测试完成抬起1; + } + //Step = ETurnoverFlowStep.到测试取料位上方; } - //Step = ETurnoverFlowStep.到测试取料位上方; - } - break; - case ETurnoverFlowStep.周转盘取料前真空检测: - { - if (GlobalVar.PreTakeTurnoverTrayProductCheckVac) + break; + case ETurnoverFlowStep.周转盘取料前真空检测: { - ActionStart(); - List hasProductSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); - if (hasProductSlots != null && hasProductSlots.Count > 0) + if (GlobalVar.PreTakeTurnoverTrayProductCheckVac) { - bool needGoSafePos = false; - foreach (var slot in hasProductSlots) + ActionStart(); + List hasProductSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); + if (hasProductSlots != null && hasProductSlots.Count > 0) { - if (slot.HasVac() || GlobalVar.VirtualAxis || GlobalVar.RunSpace) - { - LogHelper.Debug(GetClassName() + $"周转盘{slot.Index}穴位真空吸正常"); - } - else + bool needGoSafePos = false; + foreach (var slot in hasProductSlots) { - //1 退到安全位 - LogHelper.Debug(GetClassName() + $"通知周转模组回到安全位"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - //2 排料轴上相机过来检测 - LogHelper.Debug(GetClassName() + $"等待排料模组IDLE"); - DischargeFlow.Instance.WaitCanMove(); - LogHelper.Debug(GetClassName() + $"上相机到周转盘{slot.Index}号穴位定位检测"); - VisionResult vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false); - //VisionResult vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); - needGoSafePos = true; - if (!UpCameraScanBarCodeFlow.Instance.CheckResult(vr))//如果不在穴位中,就弹框报警 + if (slot.HasVac() || GlobalVar.VirtualAxis || GlobalVar.RunSpace) { - LogHelper.Debug(GetClassName() + "检测到产品不在穴位中"); - bool exit = false; - while (!exit) + LogHelper.Debug(GetClassName() + $"周转盘{slot.Index}穴位真空吸正常"); + } + else + { + //1 退到安全位 + LogHelper.Debug(GetClassName() + $"通知周转模组回到安全位"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + //2 排料轴上相机过来检测 + LogHelper.Debug(GetClassName() + $"等待排料模组IDLE"); + DischargeFlow.Instance.WaitCanMove(); + LogHelper.Debug(GetClassName() + $"上相机到周转盘{slot.Index}号穴位定位检测"); + VisionResult vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false); + //VisionResult vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); + needGoSafePos = true; + if (!UpCameraScanBarCodeFlow.Instance.CheckResult(vr))//如果不在穴位中,就弹框报警 { - try + LogHelper.Debug(GetClassName() + "检测到产品不在穴位中"); + bool exit = false; + while (!exit) { - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警).Transform(slot.Index); - LogHelper.Debug(GetClassName() + alarmEntity.CN); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - switch (btnRet) + try { - case ETipButton.Retry: - logInfo = GetClassName() + "选择了重试"; - MessageQueue.Instance.Insert(logInfo); - vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false); - if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr)) - { - exit = true; - } - break; - case ETipButton.Skip: - logInfo = GetClassName() + "选择了跳过"; - MessageQueue.Instance.Insert(logInfo); - //检测穴位中还是否有料 - if (!UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, slot.Index, true).HasProduct) - { - GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); - slot.ClearProduct(); - exit = true; - } - break; - case ETipButton.Yes: - logInfo = GetClassName() + "选择了移动到安全位"; - MessageQueue.Instance.Insert(logInfo); - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - break; - default: - break; + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警).Transform(slot.Index); + LogHelper.Debug(GetClassName() + alarmEntity.CN); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + switch (btnRet) + { + case ETipButton.Retry: + logInfo = GetClassName() + "选择了重试"; + MessageQueue.Instance.Insert(logInfo); + vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false); + if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr)) + { + exit = true; + } + break; + case ETipButton.Skip: + logInfo = GetClassName() + "选择了跳过"; + MessageQueue.Instance.Insert(logInfo); + //检测穴位中还是否有料 + if (!UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, slot.Index, true).HasProduct) + { + GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); + slot.ClearProduct(); + exit = true; + } + break; + case ETipButton.Yes: + logInfo = GetClassName() + "选择了移动到安全位"; + MessageQueue.Instance.Insert(logInfo); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + Start(); + break; + default: + break; + } + } + catch (Exception ex) + { + Msg.ShowError(ex.Message); } - } - catch (Exception ex) - { - Msg.ShowError(ex.Message); } } + else + { + LogHelper.Debug(GetClassName() + "检测到产品在穴位中"); + } } - else - { - LogHelper.Debug(GetClassName() + "检测到产品在穴位中"); - } + } + //排料轴回安全位 + if (needGoSafePos) + { + DischargeFlow.Instance.WaitCanMove(); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); } } - //排料轴回安全位 - if (needGoSafePos) + hasProductSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); + if (hasProductSlots != null && hasProductSlots.Count > 0) { - DischargeFlow.Instance.WaitCanMove(); - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + Step = ETurnoverFlowStep.到周转盘取料位上方; } - } - hasProductSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); - if (hasProductSlots != null && hasProductSlots.Count > 0) - { - Step = ETurnoverFlowStep.到周转盘取料位上方; + else + { + //周转盘已经没有产品要取了 + Step = ETurnoverFlowStep.到测试放料位上方; + } + ActionEnd("周转盘取料前真空检测"); } else { - //周转盘已经没有产品要取了 - Step = ETurnoverFlowStep.到测试放料位上方; + Step = ETurnoverFlowStep.到周转盘取料位上方; } - ActionEnd("周转盘取料前真空检测"); - } - else - { - Step = ETurnoverFlowStep.到周转盘取料位上方; } - } - break; - case ETurnoverFlowStep.到周转盘取料位上方: - if (CanGoTurnoverTrayPos()) - { - targetTurnoverX = SysConfigParam.GetValue("TurnoverTakeX"); - errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + break; + case ETurnoverFlowStep.到周转盘取料位上方: + if (CanGoTurnoverTrayPos()) { - targetTurnoverY = SysConfigParam.GetValue("TurnoverTakeY"); - errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + targetTurnoverX = SysConfigParam.GetValue("TurnoverTakeX"); + errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - ActionStart(); - logInfo = GetClassName() + $"到周转盘取料位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; - MessageQueue.Instance.Insert(logInfo); - if(GlobalVar.EnableIndexTimeStatistics) + targetTurnoverY = SysConfigParam.GetValue("TurnoverTakeY"); + errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + ActionStart(); + logInfo = GetClassName() + $"到周转盘取料位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.EnableIndexTimeStatistics) + { + timeStatistics.Restart(); + } + Step = ETurnoverFlowStep.等待运动到周转盘取料位上方; + } + else { - timeStatistics.Restart(); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - Step = ETurnoverFlowStep.等待运动到周转盘取料位上方; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); + //Msg.ShowError("turnovery axis move is unsafe"); + alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.TurnoverY}", $"{AxisAlias.LoadY}"); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - //Msg.ShowError("turnovery axis move is unsafe"); - alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.TurnoverY}", $"{AxisAlias.LoadY}"); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待运动到周转盘取料位上方: - if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴xy已停止运动,"); - //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待运动到周转盘取料位上方: + if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"已运动到周转盘取料位上方,cx:{Ops.GetCurPosition(AxisControl.TurnoverX)},cy:{Ops.GetCurPosition(AxisControl.TurnoverY)}"; - MessageQueue.Instance.Insert(logInfo); - if (retakeNum <= GlobalVar.TurnoverRetakeNum) + PrintXYCurrentPos("轴xy已停止运动,"); + //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - ActionEnd("运动到周转盘取料位上方"); - Step = ETurnoverFlowStep.到周转盘下方取料位1; - //Step = ETurnoverFlowStep.周转盘取料前真空检测; + logInfo = GetClassName() + $"已运动到周转盘取料位上方,cx:{Ops.GetCurPosition(AxisControl.TurnoverX)},cy:{Ops.GetCurPosition(AxisControl.TurnoverY)}"; + MessageQueue.Instance.Insert(logInfo); + if (retakeNum <= GlobalVar.TurnoverRetakeNum) + { + ActionEnd("运动到周转盘取料位上方"); + Step = ETurnoverFlowStep.到周转盘下方取料位1; + //Step = ETurnoverFlowStep.周转盘取料前真空检测; + } + else + { + undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); + TurnoverDumpFlow.Instance.Dump(ETrayType.Turnover, undealTasks.Select(t => ((t.FromIndex + 1) > 8 ? (t.FromIndex + 1) - 8 : (t.FromIndex + 1))).ToList()); + TurnoverDumpFlow.Instance.Wait(); + Step = ETurnoverFlowStep.取料异常报警; + } } else { - undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); - TurnoverDumpFlow.Instance.Dump(ETrayType.Turnover, undealTasks.Select(t => ((t.FromIndex + 1) > 8 ? (t.FromIndex + 1) - 8 : (t.FromIndex + 1))).ToList()); - TurnoverDumpFlow.Instance.Wait(); - Step = ETurnoverFlowStep.取料异常报警; + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY},"); + Step = ETurnoverFlowStep.到周转盘取料位上方; } } - else + break; + case ETurnoverFlowStep.取料异常报警: + if (!GlobalVar.DisableTurnoverTrayKnock && GlobalVar.EnableTurnoverNozzleTakeFailKnock) { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY},"); - Step = ETurnoverFlowStep.到周转盘取料位上方; - } - } - break; - case ETurnoverFlowStep.取料异常报警: - if(!GlobalVar.DisableTurnoverTrayKnock && GlobalVar.EnableTurnoverNozzleTakeFailKnock) - { - TrayShake.Shake(ETrayType.Turnover); - } - //查询周转盘中待测穴位中有料的穴位 - List untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); - if (untestSlots != null && untestSlots.Count > 0) - { - bool exit = false; - while (!exit) - { - //alarmInfo = GetClassName() + $"周转盘{string.Join(",", untestSlots.Select(s => s.Index))}号穴位产品未取出,请处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在周转盘取料失败报警), untestSlots.Select(s => (s.Index>8?s.Index-8:s.Index)).ToJoinString(), untestSlots.Select(s => s.Index).ToJoinString()); - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在周转盘取料失败报警).Transform(untestSlots.Select(s => (s.Index > 8 ? s.Index - 8 : s.Index)).ToJoinString(), untestSlots.Select(s => s.Index).ToJoinString()); - //TestCenterMessageBox.Show(AlarmConstID.TurnoverTakeFailAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), - //MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - //msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头在周转盘取料失败报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(),MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.TurnoverTakeFailAlarm); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) + TrayShake.Shake(ETrayType.Turnover); + } + //查询周转盘中待测穴位中有料的穴位 + List untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); + if (untestSlots != null && untestSlots.Count > 0) + { + bool exit = false; + while (!exit) { - case ETipButton.Retry: - logInfo = $"选择了重试"; - MessageQueue.Instance.Insert(logInfo); - retakeNum = 0; - exit = true; - //Step = ETurnoverFlowStep.到周转盘取料位上方; - Step = ETurnoverFlowStep.周转盘取料前真空检测; - break; - case ETipButton.Skip: - retakeNum = 0; - logInfo = GetClassName() + $"选择了跳过"; - MessageQueue.Instance.Insert(logInfo); - if (GlobalVar.EnableExceptionHandlingNozzle) - { - foreach (TurnoverTraySlot slot in untestSlots) - { - WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, slot.Index); - slot.ClearProduct(); - VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index > 8 ? slot.Index - 8 : slot.Index); - GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); - } + //alarmInfo = GetClassName() + $"周转盘{string.Join(",", untestSlots.Select(s => s.Index))}号穴位产品未取出,请处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在周转盘取料失败报警), untestSlots.Select(s => (s.Index>8?s.Index-8:s.Index)).ToJoinString(), untestSlots.Select(s => s.Index).ToJoinString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在周转盘取料失败报警).Transform(untestSlots.Select(s => (s.Index > 8 ? s.Index - 8 : s.Index)).ToJoinString(), untestSlots.Select(s => s.Index).ToJoinString()); + //TestCenterMessageBox.Show(AlarmConstID.TurnoverTakeFailAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), + //MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头在周转盘取料失败报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(),MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.TurnoverTakeFailAlarm); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Retry: + logInfo = $"选择了重试"; + MessageQueue.Instance.Insert(logInfo); + retakeNum = 0; exit = true; - Step = ETurnoverFlowStep.到测试放料位上方; - } - else - { - untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); - foreach (TurnoverTraySlot slot in untestSlots) + //Step = ETurnoverFlowStep.到周转盘取料位上方; + Step = ETurnoverFlowStep.周转盘取料前真空检测; + break; + case ETipButton.Skip: + retakeNum = 0; + logInfo = GetClassName() + $"选择了跳过"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.EnableExceptionHandlingNozzle) { - TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Turnover, slot.Index); - if (!heightResult.HasProduct) + foreach (TurnoverTraySlot slot in untestSlots) { - VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index); + WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, slot.Index); slot.ClearProduct(); + VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index > 8 ? slot.Index - 8 : slot.Index); GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); } - } - untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); - if (untestSlots == null || untestSlots.Count == 0) - { exit = true; Step = ETurnoverFlowStep.到测试放料位上方; } - } - break; - case ETipButton.Yes: - logInfo = $"选择了移动到安全位"; - MessageQueue.Instance.Insert(logInfo); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TurnoverTray); - break; - default: - break; + else + { + untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); + foreach (TurnoverTraySlot slot in untestSlots) + { + TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Turnover, slot.Index); + if (!heightResult.HasProduct) + { + VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index); + slot.ClearProduct(); + GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); + } + } + untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); + if (untestSlots == null || untestSlots.Count == 0) + { + exit = true; + Step = ETurnoverFlowStep.到测试放料位上方; + } + } + break; + case ETipButton.Yes: + logInfo = $"选择了移动到安全位"; + MessageQueue.Instance.Insert(logInfo); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TurnoverTray); + Start(); + break; + default: + break; + } } } - } - break; + break; - case ETurnoverFlowStep.到周转盘下方取料位1: - if (GlobalVar.TurnoverTrayTakeEnableTwoSpeed) - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ") + GlobalVar.TurnoverTrayTakeOneSpeedOffsetHeight; - } - else - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ"); - } - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - ActionStart(); - undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); - /*提前打开周转吸嘴真空吸*/ - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, false, undealTasks.Select(t => t.ToIndex + 1).ToArray()); - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"到周转盘下方取料位1,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待运动到周转盘下方取料位1; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - - case ETurnoverFlowStep.等待运动到周转盘下方取料位1: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - logInfo = GetClassName() + $"已运动到周转盘下方取料位1 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.到周转盘下方取料位2; - } - else - { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.到周转盘下方取料位1; - } - } - else + case ETurnoverFlowStep.到周转盘下方取料位1: + if (GlobalVar.TurnoverTrayTakeEnableTwoSpeed) { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY},"); - Step = ETurnoverFlowStep.到周转盘取料位上方; - } - } - break; - case ETurnoverFlowStep.到周转盘下方取料位2: - targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.TurnoverTrayTakeOneSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"到周转盘下方取料位2,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待运动到周转盘下方取料位2; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待运动到周转盘下方取料位2: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); - //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - ActionEnd("到周转盘取料位下方"); - ActionStart(); - logInfo = GetClassName() + $"已运动到周转盘下方取料位2 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}"; - MessageQueue.Instance.Insert(logInfo); - undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); - /*关闭周转盘真空吸*/ - VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, undealTasks.Select(t => t.FromIndex + 1).ToArray()); - /*打开周转盘真空破*/ - VacManager.TurnoverTrayVacBreak(EVacOperator.Open, true, undealTasks.Select(t => t.FromIndex + 1).ToArray()); - ActionEnd("关闭周转盘真空吸-打开周转盘真空破"); - Step = ETurnoverFlowStep.周转盘取料完成抬起1; - } - else - { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.到周转盘下方取料位2; - } + targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ") + GlobalVar.TurnoverTrayTakeOneSpeedOffsetHeight; } else { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY},"); - Step = ETurnoverFlowStep.到周转盘取料位上方; + targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ"); } - } - break; - case ETurnoverFlowStep.周转盘取料完成抬起1: - if (GlobalVar.TurnoverTrayTakeEnableTwoSpeed) - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ") + GlobalVar.TurnoverTrayTakeOneSpeedOffsetHeight; - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.TurnoverTrayTakeOneSpeed); - } - else - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - } - - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - ActionStart(); - logInfo = GetClassName() + $"到周转盘取料破真空位,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待周转盘取料完成抬起1; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待周转盘取料完成抬起1: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - logInfo = $"已到周转盘取料破真空位"; - MessageQueue.Instance.Insert(logInfo); + ActionStart(); undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); - /*关闭周转盘真空破*/ - VacManager.TurnoverTrayVacBreak(EVacOperator.Close, false, undealTasks.Select(t => t.FromIndex + 1).ToArray()); - Step = ETurnoverFlowStep.周转盘取料完成抬起2; - } - else - { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.周转盘取料完成抬起1; - } - } - break; - case ETurnoverFlowStep.周转盘取料完成抬起2: - targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"周转盘取料完成抬起,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待周转盘取料完成抬起2; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待周转盘取料完成抬起2: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - ActionEnd("取料完成抬起"); - logInfo = GetClassName() + $"周转盘取料完成已抬起"; + /*提前打开周转吸嘴真空吸*/ + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, false, undealTasks.Select(t => t.ToIndex + 1).ToArray()); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到周转盘下方取料位1,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.周转盘取料完成真空检测; + Step = ETurnoverFlowStep.等待运动到周转盘下方取料位1; } else { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.周转盘取料完成抬起2; - } - } - break; - case ETurnoverFlowStep.周转盘取料完成真空检测: - ActionStart(); - undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); - foreach (TurnoverInfo task in undealTasks) - { - if (Ops.IsOn($"周转{task.ToIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace) - { - GlobalTray.TurnoverNozzle.ChangeStatus(task.ToIndex + 1, ESlotStatus.Have); - //如果真空检测OK,带料产品已经吸上了 - TransitNozzleManager.Instance.Nozzle(task.ToIndex + 1).AddProduct(task); - TurnoverTrayManager.Instance.Slot(task.FromIndex + 1).ClearProduct(); - //slot.ClearProduct(); - GlobalTray.TurnoverTray.ChangeStatus(task.FromIndex + 1, ESlotStatus.NotHave); - task.Dealed = true; + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - else + break; + + case ETurnoverFlowStep.等待运动到周转盘下方取料位1: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { - MessageQueue.Instance.Warn($"周转{task.ToIndex + 1}号吸嘴真空吸检测异常"); - } - } - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - if (hasProductNozzles.Count > 0) - { - logInfo = GetClassName() + $"周转吸头{hasProductNozzles.Select(n => n.NozzleIndex).ToJoinString()}真空检测OK"; - MessageQueue.Instance.Insert(logInfo); - undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); - if (undealTasks.Count > 0) - { - TurnoverDumpFlow.Instance.Dump(ETrayType.Turnover, undealTasks.Select(t => ((t.FromIndex + 1) > 8 ? (t.FromIndex + 1 - 8) : (t.FromIndex + 1))).ToList()); - TurnoverDumpFlow.Instance.Wait(); - } - Step = ETurnoverFlowStep.到测试放料位上方; - } - else - { - retakeNum++; - //Step = ETurnoverFlowStep.到周转盘取料位上方; - Step = ETurnoverFlowStep.周转盘取料前真空检测; - } - ActionEnd("周转盘取料完成真空检测"); - break; - case ETurnoverFlowStep.到测试放料位上方: - if (turnoverTrayToTestTrayNum == 1 && GlobalVar.SocketHasProductCheck) - { - List hasProductsSlots = SocketVacCheck.HasProductSlots(); - if (hasProductsSlots != null && hasProductsSlots.Count > 0) - { - while (true) - { - alarmEntity = AlarmCollection.Get(AlarmConstID.测试穴位有产品待取出).Transform(hasProductsSlots.ToJoinString()); - LogHelper.Debug(alarmEntity.CN); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Retry, null); - //再次检测 - SocketVacCheck.Check(); - hasProductsSlots = SocketVacCheck.HasProductSlots(); - if (hasProductsSlots == null || hasProductsSlots.Count == 0) + PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - break; + logInfo = GetClassName() + $"已运动到周转盘下方取料位1 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.到周转盘下方取料位2; + } + else + { + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.到周转盘下方取料位1; } } + else + { + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY},"); + Step = ETurnoverFlowStep.到周转盘取料位上方; + } } - else - { - LogHelper.Debug(GetClassName() + "Socket 1-16 无产品"); - } - } - turnoverTrayToTestTrayNum++; - targetTurnoverX = SysConfigParam.GetValue("PressTakeX"); - errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - targetTurnoverY = SysConfigParam.GetValue("PressTakeY"); - errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + break; + case ETurnoverFlowStep.到周转盘下方取料位2: + targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.TurnoverTrayTakeOneSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - ActionStart(); - logInfo = GetClassName() + $"到测试放料位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; + logInfo = GetClassName() + $"到周转盘下方取料位2,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待运动到测试放料位上方; + Step = ETurnoverFlowStep.等待运动到周转盘下方取料位2; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - - break; - case ETurnoverFlowStep.等待运动到测试放料位上方: - if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴xy已停止运动,"); - //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待运动到周转盘下方取料位2: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { - //LogHelper.Debug(GetClassName()+ $"turnoverxy in target curx={Ops.GetCurPosition(AxisControl.TurnoverX)}, x={targetTurnoverX},cury={Ops.GetCurPosition(AxisControl.TurnoverY)},y={targetTurnoverY}"); - ActionEnd("到治具放料位上方"); - if (turnoverTakeFinishe == false && TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have).Count() == 0) + PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); + //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - turnoverTakeFinishe = true; - //在这里处理中控发过来的任务 - //如果有下料任务,先处理下料任务,再处理上料任务 - - #region 下料任务 - if (hasUnloadFlag) + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - hasUnloadFlag = false; - while (true) - { - if (LoadAndUnloadTask.Instance.TestUnloadTaskArrived) - { - LoadAndUnloadTask.Instance.TestUnloadTaskArrived = false; - MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null }); - logInfo = GetClassName() + "通知中控产品全部已从治具中取出,状态变成NotReady"; - MessageQueue.Instance.Insert(logInfo); - unloadOk = true; - TestCenter.Instance.LoadTestUnLoadResult(); - LoadAndUnloadTask.Instance.Clear(1); - MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); - break; - } - } + ActionEnd("到周转盘取料位下方"); + ActionStart(); + logInfo = GetClassName() + $"已运动到周转盘下方取料位2 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}"; + MessageQueue.Instance.Insert(logInfo); + undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); + /*关闭周转盘真空吸*/ + VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, undealTasks.Select(t => t.FromIndex + 1).ToArray()); + /*打开周转盘真空破*/ + VacManager.TurnoverTrayVacBreak(EVacOperator.Open, true, undealTasks.Select(t => t.FromIndex + 1).ToArray()); + ActionEnd("关闭周转盘真空吸-打开周转盘真空破"); + Step = ETurnoverFlowStep.周转盘取料完成抬起1; } - #endregion - #region 上料任务 - while (true) + else { - if (LoadAndUnloadTask.Instance.TestloadTaskArrived) - { - LoadAndUnloadTask.Instance.TestloadTaskArrived = false; - string reportStr = LoadAndUnloadTask.Instance.GetTestLoadString(); - TestCenter.Instance.Send(reportStr, Encoding.ASCII); - LoadAndUnloadTask.Instance.Clear(1); - MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); - MessageQueue.Instance.Insert("通知中控周转载盘产品已取走,可以继续排料"); - break; - } + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.到周转盘下方取料位2; } - #endregion } - Step = ETurnoverFlowStep.测试位上料丢料检测; + else + { + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY},"); + Step = ETurnoverFlowStep.到周转盘取料位上方; + } + } + break; + case ETurnoverFlowStep.周转盘取料完成抬起1: + if (GlobalVar.TurnoverTrayTakeEnableTwoSpeed) + { + targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ") + GlobalVar.TurnoverTrayTakeOneSpeedOffsetHeight; + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.TurnoverTrayTakeOneSpeed); } else { - PrintXYCurrentPos($"检测到轴xy不在目标位,tx:{targetTurnoverX},ty:{targetTurnoverY},"); - Step = ETurnoverFlowStep.到测试放料位上方; + targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); } - } - break; - case ETurnoverFlowStep.测试位上料丢料检测: - if (GlobalVar.VirtualAxis || GlobalVar.RunSpace) - { - Step = ETurnoverFlowStep.到测试放料位下方1; - } - else - { - ActionStart(); - if (TransitNozzleManager.Instance.GetHasProductNozzles().Count > 0) + + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - loseSlots.Clear(); - //检测是否丢料 - foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles()) - { - if (!nozzle.HasVacSignal()) - { - loseSlots.Add(nozzle.NozzleIndex); - } - } - if (loseSlots.Count > 0) - { - bool exit = false; - while (!exit) - { - //alarmInfo = $"周转{loseSlots.ToJoinString()}号吸嘴真空异常丢料,请处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在测试治具放料时丢料报警), loseSlots.ToJoinString()); - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在测试治具放料时丢料报警).Transform(loseSlots.ToJoinString()); - LogHelper.Debug(GetClassName() + alarmEntity.CN); - //TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - // msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头在测试治具放料时丢料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) - { - case ETipButton.Skip: - logInfo = GetClassName() + $"点击了跳过按钮"; - MessageQueue.Instance.Insert(logInfo); - exit = true; - List hasProducts = TransitNozzleManager.Instance.GetHasProductNozzles(); - //把吸嘴的真空吸关闭 - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, false, loseSlots.ToArray()); - //打开周转吸嘴的真空破 - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Open, true, loseSlots.ToArray()); - //关闭周转吸嘴的真空破 - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Close, false, loseSlots.ToArray()); - foreach (int nozzleIndex in loseSlots) - { - TransitNozzleManager.Instance.Nozzle(nozzleIndex).Clear(); - } - Step = ETurnoverFlowStep.到测试放料位上方; - break; - case ETipButton.Yes: - logInfo = GetClassName() + $"点击了移动到安全位按钮"; - MessageQueue.Instance.Insert(logInfo); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle); - break; - default: - break; - } - } - } - else + if (GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"已运动到测试放料位上方"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.到测试放料位下方1; + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } + ActionStart(); + logInfo = GetClassName() + $"到周转盘取料破真空位,tturnoverz:{targetTurnoverZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待周转盘取料完成抬起1; } else { - if (!turnoverTakeFinishe) + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + break; + case ETurnoverFlowStep.等待周转盘取料完成抬起1: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + { + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - //Step = ETurnoverFlowStep.到周转盘取料位上方; - Step = ETurnoverFlowStep.周转盘取料前真空检测; - retakeNum++; + logInfo = $"已到周转盘取料破真空位"; + MessageQueue.Instance.Insert(logInfo); + undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); + /*关闭周转盘真空破*/ + VacManager.TurnoverTrayVacBreak(EVacOperator.Close, false, undealTasks.Select(t => t.FromIndex + 1).ToArray()); + Step = ETurnoverFlowStep.周转盘取料完成抬起2; } else { - if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0) - { - Step = ETurnoverFlowStep.到测试保压位上方; - } - else - { - Step = ETurnoverFlowStep.通知中控开始测试; - } + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.周转盘取料完成抬起1; } } - ActionEnd("治具上方丢料检测"); - } - - break; - case ETurnoverFlowStep.到测试放料位下方1: - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - if (GlobalVar.SocketTrayDumpEnableTwoSpeed) - { - targetTurnoverZ = SysConfigParam.GetValue("PressDumpZ") + GlobalVar.SocketTrayPressOneSpeedOffsetHeight; - } - else - { - targetTurnoverZ = SysConfigParam.GetValue("PressDumpZ"); - } + break; + case ETurnoverFlowStep.周转盘取料完成抬起2: + targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - ActionStart(); - //获取需要放料的吸嘴 - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - /*打开测试穴位真空吸*/ - VacManager.TestTrayVacSuction(EVacOperator.Open, false, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - logInfo = GetClassName() + $"到测试放料位下方1,tturnoverz:{targetTurnoverZ}"; + logInfo = GetClassName() + $"周转盘取料完成抬起,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待运动到到测试放料位下方1; + Step = ETurnoverFlowStep.等待周转盘取料完成抬起2; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);'' + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试放料位上方; - } - break; - case ETurnoverFlowStep.等待运动到到测试放料位下方1: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待周转盘取料完成抬起2: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { + //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - logInfo = GetClassName() + $"已运动到到测试放料位下方1 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}"; + ActionEnd("取料完成抬起"); + logInfo = GetClassName() + $"周转盘取料完成已抬起"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.到测试放料位下方2; + Step = ETurnoverFlowStep.周转盘取料完成真空检测; } else { - PrintTurnoverZCurrentPos($"检测到轴turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.到测试放料位下方1; + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.周转盘取料完成抬起2; } } - else - { - PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试放料位上方; - } - } - break; - case ETurnoverFlowStep.到测试放料位下方2: - targetTurnoverZ = SysConfigParam.GetValue("PressDumpZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.SocketTrayDumpOneSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"到测试放料位下方2,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待运动到到测试放料位下方2; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待运动到到测试放料位下方2: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.周转盘取料完成真空检测: + ActionStart(); + undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); + foreach (TurnoverInfo task in undealTasks) { - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) + if (Ops.IsOn($"周转{task.ToIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace) { - ActionEnd("到治具放料位下方"); - ActionStart(); - //获取需要放料的吸嘴 - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - //TrayStatusManager.UpdateMultiSlotAsync("TurnoverNozzle", hasProductNozzles.Select(n => n.NozzleIndex).ToArray(), 0); - logInfo = GetClassName() + $"已运动到到测试放料位下方2 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}"; - MessageQueue.Instance.Insert(logInfo); - /*打开测试穴位真空吸*/ - //VacManager.TestTrayVacSuction(EVacOperator.Open, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); - /*关闭周转吸头真空吸*/ - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); - /*打开周转吸头真空破*/ - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); - /*关闭周转吸头真空破*/ - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); - //在这里更新产品状态 - //TransitNozzleManager.Instance.Transi - ActionEnd("关闭周转吸头真空吸-打开周转吸头真空破-关闭周转吸头真空破"); - Step = ETurnoverFlowStep.测试位放料完成抬起1; + GlobalTray.TurnoverNozzle.ChangeStatus(task.ToIndex + 1, ESlotStatus.Have); + //如果真空检测OK,带料产品已经吸上了 + TransitNozzleManager.Instance.Nozzle(task.ToIndex + 1).AddProduct(task); + TurnoverTrayManager.Instance.Slot(task.FromIndex + 1).ClearProduct(); + //slot.ClearProduct(); + GlobalTray.TurnoverTray.ChangeStatus(task.FromIndex + 1, ESlotStatus.NotHave); + task.Dealed = true; } else { - PrintTurnoverZCurrentPos($"检测到轴turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.到测试放料位下方2; + MessageQueue.Instance.Warn($"周转{task.ToIndex + 1}号吸嘴真空吸检测异常"); } } - else - { - PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试放料位上方; - } - } - break; - case ETurnoverFlowStep.测试位放料完成抬起1: - if (GlobalVar.SocketTrayDumpEnableTwoSpeed) - { - targetTurnoverZ = SysConfigParam.GetValue("PressDumpZ") + GlobalVar.SocketTrayDumpOneSpeedOffsetHeight; - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.SocketTrayDumpOneSpeed); - } - else - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - } - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - ActionStart(); - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"测试位放料完成抬起1,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待测试位放料完成抬起1; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待测试位放料完成抬起1: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - //获取需要放料的吸嘴 - //hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - /*关闭周转吸头真空破*/ - //VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); - - logInfo = GetClassName() + $"测试位放料完成抬起完成1"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.测试位放料完成抬起2; - } - else + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + if (hasProductNozzles.Count > 0) { - PrintTurnoverZCurrentPos($"检测到轴turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.测试位放料完成抬起1; - } - } - break; - case ETurnoverFlowStep.测试位放料完成抬起2: - targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"测试位放料完成抬起2,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待测试位放料完成抬起2; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待测试位放料完成抬起2: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - //if (Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - ActionEnd("放料完成后抬起"); - //获取需要放料的吸嘴 - //hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - /*关闭周转吸头真空破*/ - //VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); - - logInfo = GetClassName() + $"测试位放料完成抬起完成2,cz:{Ops.GetCurPosition(AxisControl.TurnoverZ)}"; + logInfo = GetClassName() + $"周转吸头{hasProductNozzles.Select(n => n.NozzleIndex).ToJoinString()}真空检测OK"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.测试位放料完成粘料检测; + undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal); + if (undealTasks.Count > 0) + { + TurnoverDumpFlow.Instance.Dump(ETrayType.Turnover, undealTasks.Select(t => ((t.FromIndex + 1) > 8 ? (t.FromIndex + 1 - 8) : (t.FromIndex + 1))).ToList()); + TurnoverDumpFlow.Instance.Wait(); + } + Step = ETurnoverFlowStep.到测试放料位上方; } else { - PrintTurnoverZCurrentPos($"检测到轴turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.测试位放料完成抬起2; - } - } - break; - case ETurnoverFlowStep.测试位放料完成粘料检测: - ActionStart(); - masticSlots.Clear(); - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - //打开吸嘴的真空吸 - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); - foreach (var nozzle in hasProductNozzles) - { - //nozzle.OpenVac(); - if (nozzle.HasVacSignal() && !GlobalVar.RunSpace) - { - logInfo = $"周转{nozzle.NozzleIndex}号吸嘴粘料"; - MessageQueue.Instance.Insert(logInfo); - masticSlots.Add(nozzle.NozzleIndex); + retakeNum++; + //Step = ETurnoverFlowStep.到周转盘取料位上方; + Step = ETurnoverFlowStep.周转盘取料前真空检测; } - else + ActionEnd("周转盘取料完成真空检测"); + break; + case ETurnoverFlowStep.到测试放料位上方: + if (turnoverTrayToTestTrayNum == 1 && GlobalVar.SocketHasProductCheck) { - logInfo = $"周转{nozzle.NozzleIndex}号吸嘴无粘料"; - MessageQueue.Instance.Insert(logInfo); - // nozzle.CloseVac(); - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, nozzle.NozzleIndex); - } - } - if (masticSlots.Count > 0) - { - //粘料报警 - //alarmInfo = $"周转吸头{masticSlots.ToJoinString()}号吸嘴真空异常粘料,请手工处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转头粘料报警), masticSlots.ToJoinString()); - alarmEntity = AlarmCollection.Get(AlarmConstID.周转头粘料报警).Transform(masticSlots.ToJoinString()); - //TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //msgBox = MsgBox.ShowDialog(AlarmConstID.周转头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) - { - case ETipButton.Skip: - logInfo = GetClassName() + $"点击了跳过按钮"; - MessageQueue.Instance.Insert(logInfo); - foreach (int nozzleIndex in masticSlots) + List hasProductsSlots = SocketVacCheck.HasProductSlots(); + if (hasProductsSlots != null && hasProductsSlots.Count > 0) + { + while (true) { - TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(nozzleIndex); - if (!nozzle.HasVacSignal()) + alarmEntity = AlarmCollection.Get(AlarmConstID.测试穴位有产品待取出).Transform(hasProductsSlots.ToJoinString()); + LogHelper.Debug(alarmEntity.CN); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Retry, null); + //再次检测 + SocketVacCheck.Check(); + hasProductsSlots = SocketVacCheck.HasProductSlots(); + if (hasProductsSlots == null || hasProductsSlots.Count == 0) { - //nozzle.CloseVac(); - //nozzle.OpenBreak(); - //nozzle.CloseBreak(); - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, nozzle.NozzleIndex); - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Open, true, nozzle.NozzleIndex); - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, nozzle.NozzleIndex); - nozzle.Clear(); + break; } } - break; - case ETipButton.Yes: - MessageQueue.Instance.Insert(GetClassName() + $"点击了移动到安全位按钮"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle); - break; - default: - break; - } - } - else - { - Step = ETurnoverFlowStep.测试位放料完成真空检测; - } - ActionEnd("治具放料完成粘料检测"); - break; - case ETurnoverFlowStep.测试位放料完成真空检测: - /*检测逻辑(光纤优先原则) - 1 先用光纤检测是否叠料,如果光纤跌料,则报警,如果光纤检测没有叠料,再用真空检测 - 2 真空检测正常则继续,真空检测异常,报真空报警 - */ - ActionStart(); - foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles()) - { - //先检测光纤 - if (GlobalVar.EnableTestFixtureFiberCheck)//如果启用光纤 - { - if (Ops.IsOff($"测试{nozzle.NozzleIndex}号穴位光纤检测") || GlobalVar.RunSpace) - { - //如果出现光纤异常,先用压头压一下 - if (!GlobalVar.RunSpace && GlobalVar.FiberWarningToPressInSocket) - { - FiberWarningPressFlow.Instance.Press(); + } + else + { + LogHelper.Debug(GetClassName() + "Socket 1-16 无产品"); + } + } + turnoverTrayToTestTrayNum++; + targetTurnoverX = SysConfigParam.GetValue("PressTakeX"); + errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + targetTurnoverY = SysConfigParam.GetValue("PressTakeY"); + errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } + ActionStart(); + logInfo = GetClassName() + $"到测试放料位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待运动到测试放料位上方; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } - //压一下之后如果还出现异常,则报警 - if (Ops.IsOff($"测试{nozzle.NozzleIndex}号穴位光纤检测")) + break; + case ETurnoverFlowStep.等待运动到测试放料位上方: + if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + { + PrintXYCurrentPos("轴xy已停止运动,"); + //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + //LogHelper.Debug(GetClassName()+ $"turnoverxy in target curx={Ops.GetCurPosition(AxisControl.TurnoverX)}, x={targetTurnoverX},cury={Ops.GetCurPosition(AxisControl.TurnoverY)},y={targetTurnoverY}"); + ActionEnd("到治具放料位上方"); + if (turnoverTakeFinishe == false && TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have).Count() == 0) { - bool exit = false; - while (!exit) + turnoverTakeFinishe = true; + //在这里处理中控发过来的任务 + //如果有下料任务,先处理下料任务,再处理上料任务 + + #region 下料任务 + if (hasUnloadFlag) { - // alarmInfo = $"测试治具{nozzle.NozzleIndex}号穴位光纤异常,有可能叠料,请处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头放料到测试治具后测试治具光纤报警), nozzle.NozzleIndex) ; - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具光纤报警).Transform(nozzle.NozzleIndex); - MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); - //TestCenterMessageBox.Show(AlarmConstID.TextFixtureFiberAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - //msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头放料到测试治具后测试治具光纤报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.TextFixtureFiberAlarm); - if (GlobalVar.ShowRetrayButtonInSocket) + hasUnloadFlag = false; + while (true) { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) + if (LoadAndUnloadTask.Instance.TestUnloadTaskArrived) { - case ETipButton.Retry: - VacManager.TestTrayVacSuction(EVacOperator.Open, true, nozzle.NozzleIndex); - if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位光纤检测") || GlobalVar.RunSpace) - { - exit = true; - } - break; - case ETipButton.Skip: - //镭射头过来复检,有产品则继续报警 - TestHeightResult heightReulst = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex); - if (!heightReulst.HasProduct) - { - VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); - nozzle.Clear(); - exit = true; - } - break; - case ETipButton.Yes://移动到安全位 - VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); - if (nozzle.NozzleIndex < 9) - { - LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}光钎异常"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - } - else - { - LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}光钎异常"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); - } - break; + LoadAndUnloadTask.Instance.TestUnloadTaskArrived = false; + MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null }); + logInfo = GetClassName() + "通知中控产品全部已从治具中取出,状态变成NotReady"; + MessageQueue.Instance.Insert(logInfo); + unloadOk = true; + TestCenter.Instance.LoadTestUnLoadResult(); + LoadAndUnloadTask.Instance.Clear(1); + MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); + break; } } - else + } + #endregion + #region 上料任务 + while (true) + { + if (LoadAndUnloadTask.Instance.TestloadTaskArrived) { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - switch (btnRet) - { - case ETipButton.Skip: - //镭射头过来复检,有产品则继续报警 - TestHeightResult heightReulst = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex); - if (!heightReulst.HasProduct) - { - VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); - nozzle.Clear(); - exit = true; - } - break; - case ETipButton.Yes://移动到安全位 - VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); - if (nozzle.NozzleIndex < 9) - { - LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}光钎异常"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - } - else - { - LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}光钎异常"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); - } - break; - } + LoadAndUnloadTask.Instance.TestloadTaskArrived = false; + string reportStr = LoadAndUnloadTask.Instance.GetTestLoadString(); + TestCenter.Instance.Send(reportStr, Encoding.ASCII); + LoadAndUnloadTask.Instance.Clear(1); + MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); + MessageQueue.Instance.Insert("通知中控周转载盘产品已取走,可以继续排料"); + break; } } + #endregion } + Step = ETurnoverFlowStep.测试位上料丢料检测; } - } - if (nozzle.IsHasProduct) - { - if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位真空吸检测") || GlobalVar.RunSpace || GlobalVar.DisableFixtureVacuumCheck) + else { - GlobalTray.TurnoverNozzle.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.NotHave); - GlobalTray.TestTray.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.Have); - TestTrayManager.Instance.Slot(nozzle.NozzleIndex).AddProduct(nozzle); - nozzle.Clear(); + PrintXYCurrentPos($"检测到轴xy不在目标位,tx:{targetTurnoverX},ty:{targetTurnoverY},"); + Step = ETurnoverFlowStep.到测试放料位上方; } - else + } + break; + case ETurnoverFlowStep.测试位上料丢料检测: + if (GlobalVar.VirtualAxis || GlobalVar.RunSpace) + { + Step = ETurnoverFlowStep.到测试放料位下方1; + } + else + { + ActionStart(); + if (TransitNozzleManager.Instance.GetHasProductNozzles().Count > 0) { - bool exit = false; - while (!exit) + loseSlots.Clear(); + //检测是否丢料 + foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles()) { - // alarmInfo = $"测试治具{nozzle.NozzleIndex}号真空吸异常"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警), nozzle.NozzleIndex); - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警).Transform(nozzle.NozzleIndex); - MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); - //TestCenterMessageBox.Show(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - // msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警); - if (GlobalVar.ShowRetrayButtonInSocket) + if (!nozzle.HasVacSignal()) + { + loseSlots.Add(nozzle.NozzleIndex); + } + } + if (loseSlots.Count > 0) + { + bool exit = false; + while (!exit) { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //alarmInfo = $"周转{loseSlots.ToJoinString()}号吸嘴真空异常丢料,请处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在测试治具放料时丢料报警), loseSlots.ToJoinString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在测试治具放料时丢料报警).Transform(loseSlots.ToJoinString()); + LogHelper.Debug(GetClassName() + alarmEntity.CN); + //TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + // msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头在测试治具放料时丢料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); //switch (msgBox.Button) switch (btnRet) { - case ETipButton.Retry: - VacManager.TestTrayVacSuction(EVacOperator.Open, true, nozzle.NozzleIndex); - if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位真空吸检测")) - { - GlobalTray.TestTray.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.Have); - TestTrayManager.Instance.Slot(nozzle.NozzleIndex).AddProduct(nozzle); - nozzle.Clear(); - exit = true; - } - break; case ETipButton.Skip: - //镭射头过来复检,有产品则继续报警, - TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex); - if (!heightResult.HasProduct) + logInfo = GetClassName() + $"点击了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + exit = true; + List hasProducts = TransitNozzleManager.Instance.GetHasProductNozzles(); + //把吸嘴的真空吸关闭 + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, false, loseSlots.ToArray()); + //打开周转吸嘴的真空破 + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Open, true, loseSlots.ToArray()); + //关闭周转吸嘴的真空破 + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Close, false, loseSlots.ToArray()); + foreach (int nozzleIndex in loseSlots) { - nozzle.Clear(); - exit = true; + TransitNozzleManager.Instance.Nozzle(nozzleIndex).Clear(); } + Step = ETurnoverFlowStep.到测试放料位上方; break; - case ETipButton.Yes://移动到安全位 - VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); - if (nozzle.NozzleIndex < 9) - { - LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}真空异常"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - } - else - { - LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}真空异常"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); - } + case ETipButton.Yes: + logInfo = GetClassName() + $"点击了移动到安全位按钮"; + MessageQueue.Instance.Insert(logInfo); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle); + Start(); + break; + default: break; } } + } + else + { + logInfo = GetClassName() + $"已运动到测试放料位上方"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.到测试放料位下方1; + } + } + else + { + if (!turnoverTakeFinishe) + { + //Step = ETurnoverFlowStep.到周转盘取料位上方; + Step = ETurnoverFlowStep.周转盘取料前真空检测; + retakeNum++; + } + else + { + if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0) + { + Step = ETurnoverFlowStep.到测试保压位上方; + } else { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - switch (btnRet) - { - case ETipButton.Skip: - //镭射头过来复检,有产品则继续报警, - TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex); - if (!heightResult.HasProduct) - { - nozzle.Clear(); - exit = true; - } - break; - case ETipButton.Yes://移动到安全位 - VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); - if (nozzle.NozzleIndex < 9) - { - LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}真空异常"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - } - else - { - LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}真空异常"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); - } - break; - } + Step = ETurnoverFlowStep.通知中控开始测试; } } } + ActionEnd("治具上方丢料检测"); } - } - if (!turnoverTakeFinishe) - { - //Step = ETurnoverFlowStep.到周转盘取料位上方; - Step = ETurnoverFlowStep.周转盘取料前真空检测; - } - else - { - Step = ETurnoverFlowStep.到测试保压位上方; - } - ActionEnd("治具放料完成光钎和真空检测"); - break; - case ETurnoverFlowStep.到测试保压位上方: - targetTurnoverX = SysConfigParam.GetValue("PressTakeX"); - errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - targetTurnoverY = SysConfigParam.GetValue("PressY"); - errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + break; + case ETurnoverFlowStep.到测试放料位下方1: + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - ActionStart(); - turnoverTrayToTestTrayNum = 1; - if (GlobalVar.VirtualAxis) + if (GlobalVar.SocketTrayDumpEnableTwoSpeed) { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + targetTurnoverZ = SysConfigParam.GetValue("PressDumpZ") + GlobalVar.SocketTrayPressOneSpeedOffsetHeight; } - logInfo = GetClassName() + $"到测试保压位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到测试保压位上方; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform($"{AxisAlias.TurnoverY}", errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform($"{AxisAlias.TurnoverX}", errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待到测试保压位上方: - if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴xy已停止运动,"); - //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - ActionEnd("到治具保压位上方"); - if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0) + else { - logInfo = GetClassName() + $"已运动到测试保压位上方,cx:{Ops.GetCurPosition(AxisControl.TurnoverX)},cy:{Ops.GetCurPosition(AxisControl.TurnoverY)}"; + targetTurnoverZ = SysConfigParam.GetValue("PressDumpZ"); + } + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + ActionStart(); + //获取需要放料的吸嘴 + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + /*打开测试穴位真空吸*/ + VacManager.TestTrayVacSuction(EVacOperator.Open, false, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到测试放料位下方1,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.到测试保压位下方1; + Step = ETurnoverFlowStep.等待运动到到测试放料位下方1; } else { - logInfo = GetClassName() + $"检测到测试治具中无产品需要测试"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.通知中控开始测试; + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);'' + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } else { - PrintXYCurrentPos($"检测轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试保压位上方; + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试放料位上方; } - } - break; - case ETurnoverFlowStep.到测试保压位下方1: - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - targetPressZ = SysConfigParam.GetValue("PressZ"); - if (GlobalVar.SocketTrayPressEnableTwoSpeed) + break; + case ETurnoverFlowStep.等待运动到到测试放料位下方1: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { - targetPressZ = targetPressZ + GlobalVar.SocketTrayPressOneSpeedOffsetHeight; + PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) + { + logInfo = GetClassName() + $"已运动到到测试放料位下方1 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.到测试放料位下方2; + } + else + { + PrintTurnoverZCurrentPos($"检测到轴turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.到测试放料位下方1; + } + } + else + { + PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试放料位上方; + } } - errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed); + break; + case ETurnoverFlowStep.到测试放料位下方2: + targetTurnoverZ = SysConfigParam.GetValue("PressDumpZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.SocketTrayDumpOneSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - ActionStart(); if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - logInfo = GetClassName() + $"到测试保压位下方1,tpressz:{targetPressZ}"; + logInfo = GetClassName() + $"到测试放料位下方2,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到测试保压位下方1; + Step = ETurnoverFlowStep.等待运动到到测试放料位下方2; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - PrintXYCurrentPos($"检测轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试保压位上方; - } - break; - case ETurnoverFlowStep.等待到测试保压位下方1: - if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis) - { - PrintPressZCurrentPos("轴pressz已停止运动,"); - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待运动到到测试放料位下方2: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { - if (AxisArrived.PressZIsInTargetPos(targetPressZ)) + //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - logInfo = GetClassName() + $"已到测试保压位下方1 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.到测试保压位下方2; + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) + { + ActionEnd("到治具放料位下方"); + ActionStart(); + //获取需要放料的吸嘴 + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + //TrayStatusManager.UpdateMultiSlotAsync("TurnoverNozzle", hasProductNozzles.Select(n => n.NozzleIndex).ToArray(), 0); + logInfo = GetClassName() + $"已运动到到测试放料位下方2 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}"; + MessageQueue.Instance.Insert(logInfo); + /*打开测试穴位真空吸*/ + //VacManager.TestTrayVacSuction(EVacOperator.Open, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + /*关闭周转吸头真空吸*/ + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + /*打开周转吸头真空破*/ + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + /*关闭周转吸头真空破*/ + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + //在这里更新产品状态 + //TransitNozzleManager.Instance.Transi + ActionEnd("关闭周转吸头真空吸-打开周转吸头真空破-关闭周转吸头真空破"); + Step = ETurnoverFlowStep.测试位放料完成抬起1; + } + else + { + PrintTurnoverZCurrentPos($"检测到轴turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.到测试放料位下方2; + } } else { - PrintPressZCurrentPos($"检测到轴pressz不在目标位置,tpressz:{targetPressZ}"); - Step = ETurnoverFlowStep.到测试保压位下方1; + PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试放料位上方; } } + break; + case ETurnoverFlowStep.测试位放料完成抬起1: + if (GlobalVar.SocketTrayDumpEnableTwoSpeed) + { + targetTurnoverZ = SysConfigParam.GetValue("PressDumpZ") + GlobalVar.SocketTrayDumpOneSpeedOffsetHeight; + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.SocketTrayDumpOneSpeed); + } else { - PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试保压位上方; + targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); } - } - break; - - case ETurnoverFlowStep.到测试保压位下方2: - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - targetPressZ = SysConfigParam.GetValue("PressZ"); - errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.SocketTrayPressOneSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { + ActionStart(); if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - logInfo = GetClassName() + $"到测试保压位下方2,tpressz:{targetPressZ}"; + logInfo = GetClassName() + $"测试位放料完成抬起1,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到测试保压位下方2; + Step = ETurnoverFlowStep.等待测试位放料完成抬起1; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - Step = ETurnoverFlowStep.到测试保压位上方; - } - break; - case ETurnoverFlowStep.等待到测试保压位下方2: - if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis) - { - PrintPressZCurrentPos("轴pressz已停止运动"); - //Thread.Sleep(100); - //if(Ops.IsArrived(AxisControl.PressZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待测试位放料完成抬起1: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { - if (AxisArrived.PressZIsInTargetPos(targetPressZ)) + //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - ActionEnd("到治具保压位下方"); - logInfo = GetClassName() + $"已到测试保压位下方2 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}"; + //获取需要放料的吸嘴 + //hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + /*关闭周转吸头真空破*/ + //VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + + logInfo = GetClassName() + $"测试位放料完成抬起完成1"; MessageQueue.Instance.Insert(logInfo); - /*关闭测试穴位真空吸*/ - List willTestSlot = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - VacManager.TestTrayVacSuction(EVacOperator.Close, false, willTestSlot.Select(s => s.Index).ToArray()); - Step = ETurnoverFlowStep.通知中控开始测试; + Step = ETurnoverFlowStep.测试位放料完成抬起2; } else { - PrintPressZCurrentPos($"检测到轴pressz不在目标位置,tpressz:{targetPressZ}"); - Step = ETurnoverFlowStep.到测试保压位下方2; + PrintTurnoverZCurrentPos($"检测到轴turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.测试位放料完成抬起1; } } - else - { - PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试保压位上方; - } - } - break; - case ETurnoverFlowStep.通知中控开始测试: - HashSet needTestSlot = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Select(s => s.Index - 1).ToHashSet(); - if (needTestSlot != null && needTestSlot.Count > 0) - { - MachineManage.Instance.TestStatus = ETestStatus.Testing; - loadOk = true; - MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.Ready, ReadySites = needTestSlot }); - logInfo = GetClassName() + $"通知中控测试位就绪,可以开始测试{needTestSlot.ToJoinString()}"; - MessageQueue.Instance.Insert(logInfo); - //Thread.Sleep(1000 * 30); - Step = ETurnoverFlowStep.等待测试完成; - } - else - { - logInfo = GetClassName() + $"检测到没有需要测试的产品,流程结束"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待任务; - } - break; - /*---------------------------------------------准备下料---------------------------------------------------------------------------------*/ - case ETurnoverFlowStep.等待测试完成: - //if(MachineManage.Instance.tes) - if (MachineManage.Instance.TestStatus == ETestStatus.Finished && TransitModuleSafePosFlow.Instance.Finished()) - { - hasUnloadFlag = true; - //测试完成后,重新打开真空吸 - List tested = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - VacManager.TestTrayVacSuction(EVacOperator.Open, true, tested.Select(s => s.Index).ToArray()); - //测试完成后先判断中控的任务有没有下发过来,如果已经过来了就直接用,如果没有过来就自己生成任务 - if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestUnload) <= 0) - { - LoadAndUnloadTask.Instance.CreateTestUnLoadTask(); - } - Step = ETurnoverFlowStep.测试完成抬起1; - } - break; - - - case ETurnoverFlowStep.测试完成抬起1: - if (Math.Abs(Ops.GetCurPosition(AxisAlias.PressZ) - (SysConfigParam.GetValue("PressZ") + GlobalVar.SocketTrayPressOneSpeedOffsetHeight)) > 1) - { - Step = ETurnoverFlowStep.测试完成抬起2; - } - else - { - if (GlobalVar.SocketTrayPressEnableTwoSpeed) - { - targetPressZ = SysConfigParam.GetValue("PressZ") + GlobalVar.SocketTrayPressOneSpeedOffsetHeight; - errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.SocketTrayPressOneSpeed); - } - else - { - targetPressZ = SysConfigParam.GetValue("PressSafeZ"); - errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed); - } + break; + case ETurnoverFlowStep.测试位放料完成抬起2: + targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - ActionStart(); if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - logInfo = GetClassName() + $"测试完成准备抬起,tpressz:{targetPressZ}"; + logInfo = GetClassName() + $"测试位放料完成抬起2,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待测试完成抬起1; + Step = ETurnoverFlowStep.等待测试位放料完成抬起2; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform($"{AxisAlias.PressZ}", errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - break; - case ETurnoverFlowStep.等待测试完成抬起1: - if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis) - { - PrintPressZCurrentPos("轴pressz已停止运动,"); - if (AxisArrived.PressZIsInTargetPos(targetPressZ)) + break; + case ETurnoverFlowStep.等待测试位放料完成抬起2: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"测试完成已抬起 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.测试完成抬起2; + //if (Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) + { + ActionEnd("放料完成后抬起"); + //获取需要放料的吸嘴 + //hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + /*关闭周转吸头真空破*/ + //VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + + logInfo = GetClassName() + $"测试位放料完成抬起完成2,cz:{Ops.GetCurPosition(AxisControl.TurnoverZ)}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.测试位放料完成粘料检测; + } + else + { + PrintTurnoverZCurrentPos($"检测到轴turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.测试位放料完成抬起2; + } } - else + break; + case ETurnoverFlowStep.测试位放料完成粘料检测: + ActionStart(); + masticSlots.Clear(); + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + //打开吸嘴的真空吸 + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + foreach (var nozzle in hasProductNozzles) { - PrintPressZCurrentPos($"检测到轴pressz不在目标位置,tpressz:{targetPressZ}"); - Step = ETurnoverFlowStep.测试完成抬起1; + //nozzle.OpenVac(); + if (nozzle.HasVacSignal() && !GlobalVar.RunSpace) + { + logInfo = $"周转{nozzle.NozzleIndex}号吸嘴粘料"; + MessageQueue.Instance.Insert(logInfo); + masticSlots.Add(nozzle.NozzleIndex); + } + else + { + logInfo = $"周转{nozzle.NozzleIndex}号吸嘴无粘料"; + MessageQueue.Instance.Insert(logInfo); + // nozzle.CloseVac(); + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, nozzle.NozzleIndex); + } } - } - break; - case ETurnoverFlowStep.测试完成抬起2: - targetPressZ = SysConfigParam.GetValue("PressSafeZ"); - errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"测试完成抬起安全位,tpressz:{targetPressZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待测试完成抬起2; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待测试完成抬起2: - if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis) - { - //AxisControl.PressZ.Get_Target_Position(out double pos); - //double tpos = Ops.GetCurPosition(AxisControl.PressZ); - //AxisControl.PressZ.IsArrived(out bool isArrived); - //Thread.Sleep(100); - //if (Ops.IsArrived(AxisAlias.PressZ) || GlobalVar.VirtualAxis) - if (AxisArrived.PressZIsInTargetPos(targetPressZ)) - { - ActionEnd("测试完成抬起"); - retakeNum = 0; - logInfo = GetClassName() + $"测试完成已抬起到安全位 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}"; - MessageQueue.Instance.Insert(logInfo); - //Step = ETurnoverFlowStep.到测试取料位上方; - Step = ETurnoverFlowStep.测试完成光纤检测; + if (masticSlots.Count > 0) + { + //粘料报警 + //alarmInfo = $"周转吸头{masticSlots.ToJoinString()}号吸嘴真空异常粘料,请手工处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转头粘料报警), masticSlots.ToJoinString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.周转头粘料报警).Transform(masticSlots.ToJoinString()); + //TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //msgBox = MsgBox.ShowDialog(AlarmConstID.周转头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Skip: + logInfo = GetClassName() + $"点击了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + foreach (int nozzleIndex in masticSlots) + { + TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(nozzleIndex); + if (!nozzle.HasVacSignal()) + { + //nozzle.CloseVac(); + //nozzle.OpenBreak(); + //nozzle.CloseBreak(); + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, nozzle.NozzleIndex); + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Open, true, nozzle.NozzleIndex); + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, nozzle.NozzleIndex); + nozzle.Clear(); + } + } + break; + case ETipButton.Yes: + MessageQueue.Instance.Insert(GetClassName() + $"点击了移动到安全位按钮"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle); + Start(); + break; + default: + break; + } } else { - PrintPressZCurrentPos($"检测到轴pressz不在目标位置,tpressz:{targetPressZ}"); - Step = ETurnoverFlowStep.测试完成抬起2; + Step = ETurnoverFlowStep.测试位放料完成真空检测; } - } - break; - case ETurnoverFlowStep.测试完成光纤检测: - { - if (GlobalVar.PreTakeSocketTrayProductCheckVac) + ActionEnd("治具放料完成粘料检测"); + break; + case ETurnoverFlowStep.测试位放料完成真空检测: + /*检测逻辑(光纤优先原则) + 1 先用光纤检测是否叠料,如果光纤跌料,则报警,如果光纤检测没有叠料,再用真空检测 + 2 真空检测正常则继续,真空检测异常,报真空报警 + */ + ActionStart(); + foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles()) { - ActionStart(); - List hasProductSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - if (hasProductSlots != null && hasProductSlots.Count > 0) + //先检测光纤 + if (GlobalVar.EnableTestFixtureFiberCheck)//如果启用光纤 { - foreach (var slot in hasProductSlots) + if (Ops.IsOff($"测试{nozzle.NozzleIndex}号穴位光纤检测") || GlobalVar.RunSpace) { - //先检测光纤 - if (GlobalVar.EnableTestFixtureFiberCheck)//如果启用光纤 + //如果出现光纤异常,先用压头压一下 + if (!GlobalVar.RunSpace && GlobalVar.FiberWarningToPressInSocket) { - if (Ops.IsOff($"测试{slot.Index}号穴位光纤检测") || GlobalVar.RunSpace) - { - //如果出现光纤异常,先用压头压一下 - if (!GlobalVar.RunSpace && GlobalVar.FiberWarningToPressInSocket) - { - FiberWarningPressFlow.Instance.Press(); - } + FiberWarningPressFlow.Instance.Press(); + } - //压一下之后如果还出现异常,则报警 - if (Ops.IsOff($"测试{slot.Index}号穴位光纤检测")) + //压一下之后如果还出现异常,则报警 + if (Ops.IsOff($"测试{nozzle.NozzleIndex}号穴位光纤检测")) + { + bool exit = false; + while (!exit) + { + // alarmInfo = $"测试治具{nozzle.NozzleIndex}号穴位光纤异常,有可能叠料,请处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头放料到测试治具后测试治具光纤报警), nozzle.NozzleIndex) ; + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具光纤报警).Transform(nozzle.NozzleIndex); + MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); + //TestCenterMessageBox.Show(AlarmConstID.TextFixtureFiberAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头放料到测试治具后测试治具光纤报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.TextFixtureFiberAlarm); + if (GlobalVar.ShowRetrayButtonInSocket) { - bool exit = false; - while (!exit) + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) { - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具光纤报警).Transform(slot.Index); - MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); - if (GlobalVar.ShowRetrayButtonInSocket) - { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - switch (btnRet) + case ETipButton.Retry: + VacManager.TestTrayVacSuction(EVacOperator.Open, true, nozzle.NozzleIndex); + if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位光纤检测") || GlobalVar.RunSpace) { - case ETipButton.Retry: - VacManager.TestTrayVacSuction(EVacOperator.Open, true, slot.Index); - if (Ops.IsOn($"测试{slot.Index}号穴位光纤检测") || GlobalVar.RunSpace) - { - exit = true; - } - break; - case ETipButton.Skip: - //镭射头过来复检,有产品则继续报警 - TestHeightResult heightReulst = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); - if (!heightReulst.HasProduct) - { - VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); - slot.ClearProduct(); - GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); - exit = true; - } - break; - case ETipButton.Yes://移动到安全位 - VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); - if (slot.Index < 9) - { - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - } - else - { - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); - } - break; + exit = true; } - } - else - { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - switch (btnRet) - { - case ETipButton.Skip: - //镭射头过来复检,有产品则继续报警 - TestHeightResult heightReulst = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); - if (!heightReulst.HasProduct) - { - VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); - slot.ClearProduct(); - GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); - exit = true; - } - break; - case ETipButton.Yes://移动到安全位 - VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); - if (slot.Index < 9) - { - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - } - else - { - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); - } - break; - } - } - } - } - } - } - if (Ops.IsOn($"测试{slot.Index}号穴位真空吸检测") || GlobalVar.RunSpace || GlobalVar.DisableFixtureVacuumCheck) - { - MessageQueue.Instance.Insert($"测试{slot.Index}号穴位真空吸检测OK"); - } - else - { - MessageQueue.Instance.Insert($"测试{slot.Index}号穴位真空吸检测NG"); - bool exit = false; - while (!exit) - { - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警).Transform(slot.Index); - MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); - if (GlobalVar.ShowRetrayButtonInSocket) - { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - switch (btnRet) - { - case ETipButton.Retry: - VacManager.TestTrayVacSuction(EVacOperator.Open, true, slot.Index); - if (Ops.IsOn($"测试{slot.Index}号穴位真空吸检测")) + break; + case ETipButton.Skip: + //镭射头过来复检,有产品则继续报警 + TestHeightResult heightReulst = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex); + if (!heightReulst.HasProduct) { + VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); + nozzle.Clear(); exit = true; } break; - case ETipButton.Skip: - //镭射头过来复检,有产品则继续报警, - TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); - if (!heightResult.HasProduct) + case ETipButton.Yes://移动到安全位 + VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); + if (nozzle.NozzleIndex < 9) { - GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); - slot.ClearProduct(); - exit = true; + LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}光钎异常"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); } - break; - case ETipButton.Yes://移动到安全位 - VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + else + { + LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}光钎异常"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); + } + Start(); break; } } @@ -1878,18 +1317,28 @@ namespace Rs.MotionPlat.Flow switch (btnRet) { case ETipButton.Skip: - //镭射头过来复检,有产品则继续报警, - TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); - if (!heightResult.HasProduct) + //镭射头过来复检,有产品则继续报警 + TestHeightResult heightReulst = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex); + if (!heightReulst.HasProduct) { - GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); - slot.ClearProduct(); + VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); + nozzle.Clear(); exit = true; } break; case ETipButton.Yes://移动到安全位 - VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); + if (nozzle.NozzleIndex < 9) + { + LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}光钎异常"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + } + else + { + LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}光钎异常"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); + } + Start(); break; } } @@ -1897,286 +1346,1000 @@ namespace Rs.MotionPlat.Flow } } } - hasProductSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - if (hasProductSlots != null && hasProductSlots.Count > 0) - { - Step = ETurnoverFlowStep.到测试取料位上方; - } - else + if (nozzle.IsHasProduct) { - Step = ETurnoverFlowStep.周转盘放料前丢料检测; - //Step = ETurnoverFlowStep.到测试取料位上方; + if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位真空吸检测") || GlobalVar.RunSpace || GlobalVar.DisableFixtureVacuumCheck) + { + GlobalTray.TurnoverNozzle.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.NotHave); + GlobalTray.TestTray.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.Have); + TestTrayManager.Instance.Slot(nozzle.NozzleIndex).AddProduct(nozzle); + nozzle.Clear(); + } + else + { + bool exit = false; + while (!exit) + { + // alarmInfo = $"测试治具{nozzle.NozzleIndex}号真空吸异常"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警), nozzle.NozzleIndex); + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警).Transform(nozzle.NozzleIndex); + MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); + //TestCenterMessageBox.Show(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + // msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警); + if (GlobalVar.ShowRetrayButtonInSocket) + { + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Retry: + VacManager.TestTrayVacSuction(EVacOperator.Open, true, nozzle.NozzleIndex); + if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位真空吸检测")) + { + GlobalTray.TestTray.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.Have); + TestTrayManager.Instance.Slot(nozzle.NozzleIndex).AddProduct(nozzle); + nozzle.Clear(); + exit = true; + } + break; + case ETipButton.Skip: + //镭射头过来复检,有产品则继续报警, + TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex); + if (!heightResult.HasProduct) + { + nozzle.Clear(); + exit = true; + } + break; + case ETipButton.Yes://移动到安全位 + VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); + if (nozzle.NozzleIndex < 9) + { + LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}真空异常"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + } + else + { + LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}真空异常"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); + } + Start(); + break; + } + } + else + { + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + switch (btnRet) + { + case ETipButton.Skip: + //镭射头过来复检,有产品则继续报警, + TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex); + if (!heightResult.HasProduct) + { + nozzle.Clear(); + exit = true; + } + break; + case ETipButton.Yes://移动到安全位 + VacManager.TestTrayVacSuction(EVacOperator.Close, true, nozzle.NozzleIndex); + if (nozzle.NozzleIndex < 9) + { + LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}真空异常"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + } + else + { + LogHelper.Debug($"治具穴位{nozzle.NozzleIndex}真空异常"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); + } + Start(); + break; + } + } + } + } } - ActionEnd("测试完成光纤检测"); + + } + if (!turnoverTakeFinishe) + { + //Step = ETurnoverFlowStep.到周转盘取料位上方; + Step = ETurnoverFlowStep.周转盘取料前真空检测; } else { - Step = ETurnoverFlowStep.到测试取料位上方; + Step = ETurnoverFlowStep.到测试保压位上方; } - } - break; - //case ETurnoverFlowStep.测试完成到治具取料位上方: - // targetPos = SysConfigParam.GetValue("PressTakeX"); - // errCode = AxisControl.TurnoverX.MovePos(targetPos, GlobalVar.WholeSpeed); - // if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - // { - // targetPos = SysConfigParam.GetValue("PressTakeY"); - // errCode = AxisControl.TurnoverY.MovePos(targetPos, GlobalVar.WholeSpeed); - // if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - // { - // if (GlobalVar.VirtualAxis) - // { - // Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - // } - // logInfo = GetClassName() + $"测试完成到治具取料位上方"; - // MessageQueue.Instance.Insert(logInfo); - // Step = ETurnoverFlowStep.等待测试完成到治具取料位上方; - // } - // else - // { - // MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); - // } - // } - // else - // { - // MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); - // } - // break; - //case ETurnoverFlowStep.等待测试完成到治具取料位上方: - // if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - // { - // if(Ops.IsArrived(AxisControl.TurnoverX,AxisControl.TurnoverY)) - // { - // logInfo = GetClassName() + $"已运动到治具取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}"; - // MessageQueue.Instance.Insert(logInfo); - // Step = ETurnoverFlowStep.等待任务; - // } - // } - // break; - //-----------------------------------------------测试位下料--------------------------------------------------------------------------------------------------------- - - case ETurnoverFlowStep.到测试取料位上方: - targetTurnoverX = SysConfigParam.GetValue("PressTakeX"); - errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - targetTurnoverY = SysConfigParam.GetValue("PressTakeY"); - errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + ActionEnd("治具放料完成光钎和真空检测"); + break; + case ETurnoverFlowStep.到测试保压位上方: + targetTurnoverX = SysConfigParam.GetValue("PressTakeX"); + errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - ActionStart(); - if (GlobalVar.VirtualAxis) + targetTurnoverY = SysConfigParam.GetValue("PressY"); + errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + ActionStart(); + turnoverTrayToTestTrayNum = 1; + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到测试保压位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到测试保压位上方; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform($"{AxisAlias.TurnoverY}", errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - logInfo = GetClassName() + $"到测试取料位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到测试取料位上方; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform($"{AxisAlias.TurnoverX}", errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待到测试取料位上方: - if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴xy已停止运功,"); - //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + break; + case ETurnoverFlowStep.等待到测试保压位上方: + if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + { + PrintXYCurrentPos("轴xy已停止运动,"); + //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + ActionEnd("到治具保压位上方"); + if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0) + { + logInfo = GetClassName() + $"已运动到测试保压位上方,cx:{Ops.GetCurPosition(AxisControl.TurnoverX)},cy:{Ops.GetCurPosition(AxisControl.TurnoverY)}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.到测试保压位下方1; + } + else + { + logInfo = GetClassName() + $"检测到测试治具中无产品需要测试"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.通知中控开始测试; + } + } + else + { + PrintXYCurrentPos($"检测轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试保压位上方; + } + } + break; + case ETurnoverFlowStep.到测试保压位下方1: if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - ActionEnd("到治具取料位上方"); - logInfo = GetClassName() + $"已运动到测试取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}"; - MessageQueue.Instance.Insert(logInfo); - if (retakeNum <= GlobalVar.TurnoverRetakeNumInSocket) + targetPressZ = SysConfigParam.GetValue("PressZ"); + if (GlobalVar.SocketTrayPressEnableTwoSpeed) + { + targetPressZ = targetPressZ + GlobalVar.SocketTrayPressOneSpeedOffsetHeight; + } + errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - Step = ETurnoverFlowStep.到测试取料位下方1; + ActionStart(); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到测试保压位下方1,tpressz:{targetPressZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到测试保压位下方1; } else { - LogHelper.Debug(GetClassName() + $"失败次数已达上限{retakeNum},报警"); - // undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); - //TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList()); - //TurnoverDumpFlow.Instance.Wait(); - Step = ETurnoverFlowStep.测试治具取料失败报警; + //MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } else { - PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试取料位上方; + PrintXYCurrentPos($"检测轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试保压位上方; } - } - break; - case ETurnoverFlowStep.测试治具取料失败报警: - //取三次之后还没有取起来的产品,这个时候需要弹框报警提示是否继续还是跳过 - //获取还未执行完的任务 - List testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - if (testedSlots != null && testedSlots.Count > 0) - { - if (GlobalVar.TakeFailToSlotInSocket) + break; + case ETurnoverFlowStep.等待到测试保压位下方1: + if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis) { - undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); - if (TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList())) + PrintPressZCurrentPos("轴pressz已停止运动,"); + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - TurnoverDumpFlow.Instance.Wait(); + if (AxisArrived.PressZIsInTargetPos(targetPressZ)) + { + logInfo = GetClassName() + $"已到测试保压位下方1 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.到测试保压位下方2; + } + else + { + PrintPressZCurrentPos($"检测到轴pressz不在目标位置,tpressz:{targetPressZ}"); + Step = ETurnoverFlowStep.到测试保压位下方1; + } + } + else + { + PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试保压位上方; } } - bool exit = false; - while (!exit) + break; + + case ETurnoverFlowStep.到测试保压位下方2: + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - //alarmInfo = GetClassName() + $"测试治具{testedSlots.Select(s => s.Index).ToJoinString()}号穴位取料失败"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在测试治具取料失败报警), testedSlots.Select(s => s.Index).ToJoinString()); - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在测试治具取料失败报警).Transform(testedSlots.Select(s => s.Index).ToJoinString()); - LogHelper.Debug(GetClassName() + alarmEntity.CN); - //TestCenterMessageBox.Show(AlarmConstID.周转吸头在测试治具取料失败报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - //msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头在测试治具取料失败报警); - if (GlobalVar.ShowRetrayButtonInSocket) + targetPressZ = SysConfigParam.GetValue("PressZ"); + errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.SocketTrayPressOneSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) + if (GlobalVar.VirtualAxis) { - case ETipButton.Retry: - logInfo = GetClassName() + $"选择了重试按钮"; - MessageQueue.Instance.Insert(logInfo); - retakeNum = 0; - exit = true; - //Step = ETurnoverFlowStep.到测试取料位上方; - Step = ETurnoverFlowStep.测试完成光纤检测; - break; - case ETipButton.Skip: - retakeNum = 0; - logInfo = GetClassName() + $"选择了跳过按钮"; - MessageQueue.Instance.Insert(logInfo); - testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - foreach (TestTraySlot slot in testedSlots) - { - TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); - if (!heightResult.HasProduct) - { - logInfo = GetClassName() + $"镭射头检测{slot.Index}号穴位无产品"; - MessageQueue.Instance.Insert(logInfo); - TurnoverInfo ti = LoadAndUnloadTask.Instance.GetTestUnloadTask(slot.Index); - if (ti != null) - { - ti.Dealed = true; - } - slot.ClearProduct(); - GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); - } - } - testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - if (testedSlots == null || testedSlots.Count == 0) - { - - exit = true; - Step = ETurnoverFlowStep.上报中控任务完成; - } - break; - case ETipButton.Yes://移动到安全位 - logInfo = GetClassName() + $"选择了移动到安全位按钮"; - MessageQueue.Instance.Insert(logInfo); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketTakeFail); - //if (testedSlots.Select(ts => (ts.Index >= 9 && ts.Index <= 16)).Count() > 0) - //{ - // TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); - //} - //else - //{ - // TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - //} - break; - default: - break; + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } + logInfo = GetClassName() + $"到测试保压位下方2,tpressz:{targetPressZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到测试保压位下方2; } else { - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) + //MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + } + else + { + Step = ETurnoverFlowStep.到测试保压位上方; + } + break; + case ETurnoverFlowStep.等待到测试保压位下方2: + if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis) + { + PrintPressZCurrentPos("轴pressz已停止运动"); + //Thread.Sleep(100); + //if(Ops.IsArrived(AxisControl.PressZ) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + if (AxisArrived.PressZIsInTargetPos(targetPressZ)) { - case ETipButton.Skip: - retakeNum = 0; - logInfo = GetClassName() + $"选择了跳过按钮"; - MessageQueue.Instance.Insert(logInfo); - testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - foreach (TestTraySlot slot in testedSlots) - { - TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); - if (!heightResult.HasProduct) - { - logInfo = GetClassName() + $"镭射头检测{slot.Index}号穴位无产品"; - MessageQueue.Instance.Insert(logInfo); - TurnoverInfo ti = LoadAndUnloadTask.Instance.GetTestUnloadTask(slot.Index); - if (ti != null) - { - ti.Dealed = true; - } - slot.ClearProduct(); - GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); - } - } - testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); - if (testedSlots == null || testedSlots.Count == 0) - { - - exit = true; - Step = ETurnoverFlowStep.上报中控任务完成; - } - break; - case ETipButton.Yes://移动到安全位 - logInfo = GetClassName() + $"选择了移动到安全位按钮"; - MessageQueue.Instance.Insert(logInfo); - if (testedSlots.Select(ts => (ts.Index >= 9 && ts.Index <= 16)).Count() > 0) - { - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); - } - else - { - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - } - break; - default: - break; + ActionEnd("到治具保压位下方"); + logInfo = GetClassName() + $"已到测试保压位下方2 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}"; + MessageQueue.Instance.Insert(logInfo); + /*关闭测试穴位真空吸*/ + List willTestSlot = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + VacManager.TestTrayVacSuction(EVacOperator.Close, false, willTestSlot.Select(s => s.Index).ToArray()); + Step = ETurnoverFlowStep.通知中控开始测试; } + else + { + PrintPressZCurrentPos($"检测到轴pressz不在目标位置,tpressz:{targetPressZ}"); + Step = ETurnoverFlowStep.到测试保压位下方2; + } + } + else + { + PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试保压位上方; + } + } + break; + case ETurnoverFlowStep.通知中控开始测试: + HashSet needTestSlot = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Select(s => s.Index - 1).ToHashSet(); + if (needTestSlot != null && needTestSlot.Count > 0) + { + MachineManage.Instance.TestStatus = ETestStatus.Testing; + loadOk = true; + MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.Ready, ReadySites = needTestSlot }); + logInfo = GetClassName() + $"通知中控测试位就绪,可以开始测试{needTestSlot.ToJoinString()}"; + MessageQueue.Instance.Insert(logInfo); + //Thread.Sleep(1000 * 30); + Step = ETurnoverFlowStep.等待测试完成; + } + else + { + logInfo = GetClassName() + $"检测到没有需要测试的产品,流程结束"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待任务; + } + break; + /*---------------------------------------------准备下料---------------------------------------------------------------------------------*/ + case ETurnoverFlowStep.等待测试完成: + //if(MachineManage.Instance.tes) + if (MachineManage.Instance.TestStatus == ETestStatus.Finished && TransitModuleSafePosFlow.Instance.Finished()) + { + hasUnloadFlag = true; + //测试完成后,重新打开真空吸 + List tested = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + VacManager.TestTrayVacSuction(EVacOperator.Open, true, tested.Select(s => s.Index).ToArray()); + //测试完成后先判断中控的任务有没有下发过来,如果已经过来了就直接用,如果没有过来就自己生成任务 + if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestUnload) <= 0) + { + LoadAndUnloadTask.Instance.CreateTestUnLoadTask(); + } + Step = ETurnoverFlowStep.测试完成抬起1; + } + break; + + + case ETurnoverFlowStep.测试完成抬起1: + if (Math.Abs(Ops.GetCurPosition(AxisAlias.PressZ) - (SysConfigParam.GetValue("PressZ") + GlobalVar.SocketTrayPressOneSpeedOffsetHeight)) > 1) + { + Step = ETurnoverFlowStep.测试完成抬起2; + } + else + { + if (GlobalVar.SocketTrayPressEnableTwoSpeed) + { + targetPressZ = SysConfigParam.GetValue("PressZ") + GlobalVar.SocketTrayPressOneSpeedOffsetHeight; + errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.SocketTrayPressOneSpeed); + } + else + { + targetPressZ = SysConfigParam.GetValue("PressSafeZ"); + errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed); + } + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + ActionStart(); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"测试完成准备抬起,tpressz:{targetPressZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待测试完成抬起1; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform($"{AxisAlias.PressZ}", errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + } + break; + case ETurnoverFlowStep.等待测试完成抬起1: + if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis) + { + PrintPressZCurrentPos("轴pressz已停止运动,"); + if (AxisArrived.PressZIsInTargetPos(targetPressZ)) + { + logInfo = GetClassName() + $"测试完成已抬起 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.测试完成抬起2; + } + else + { + PrintPressZCurrentPos($"检测到轴pressz不在目标位置,tpressz:{targetPressZ}"); + Step = ETurnoverFlowStep.测试完成抬起1; + } + } + break; + case ETurnoverFlowStep.测试完成抬起2: + targetPressZ = SysConfigParam.GetValue("PressSafeZ"); + errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"测试完成抬起安全位,tpressz:{targetPressZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待测试完成抬起2; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + break; + case ETurnoverFlowStep.等待测试完成抬起2: + if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis) + { + //AxisControl.PressZ.Get_Target_Position(out double pos); + //double tpos = Ops.GetCurPosition(AxisControl.PressZ); + //AxisControl.PressZ.IsArrived(out bool isArrived); + //Thread.Sleep(100); + //if (Ops.IsArrived(AxisAlias.PressZ) || GlobalVar.VirtualAxis) + if (AxisArrived.PressZIsInTargetPos(targetPressZ)) + { + ActionEnd("测试完成抬起"); + retakeNum = 0; + logInfo = GetClassName() + $"测试完成已抬起到安全位 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}"; + MessageQueue.Instance.Insert(logInfo); + //Step = ETurnoverFlowStep.到测试取料位上方; + Step = ETurnoverFlowStep.测试完成光纤检测; + } + else + { + PrintPressZCurrentPos($"检测到轴pressz不在目标位置,tpressz:{targetPressZ}"); + Step = ETurnoverFlowStep.测试完成抬起2; + } + } + break; + case ETurnoverFlowStep.测试完成光纤检测: + { + if (GlobalVar.PreTakeSocketTrayProductCheckVac) + { + ActionStart(); + List hasProductSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + if (hasProductSlots != null && hasProductSlots.Count > 0) + { + foreach (var slot in hasProductSlots) + { + //先检测光纤 + if (GlobalVar.EnableTestFixtureFiberCheck)//如果启用光纤 + { + if (Ops.IsOff($"测试{slot.Index}号穴位光纤检测") || GlobalVar.RunSpace) + { + //如果出现光纤异常,先用压头压一下 + if (!GlobalVar.RunSpace && GlobalVar.FiberWarningToPressInSocket) + { + FiberWarningPressFlow.Instance.Press(); + } + + //压一下之后如果还出现异常,则报警 + if (Ops.IsOff($"测试{slot.Index}号穴位光纤检测")) + { + bool exit = false; + while (!exit) + { + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具光纤报警).Transform(slot.Index); + MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); + if (GlobalVar.ShowRetrayButtonInSocket) + { + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + switch (btnRet) + { + case ETipButton.Retry: + VacManager.TestTrayVacSuction(EVacOperator.Open, true, slot.Index); + if (Ops.IsOn($"测试{slot.Index}号穴位光纤检测") || GlobalVar.RunSpace) + { + exit = true; + } + break; + case ETipButton.Skip: + //镭射头过来复检,有产品则继续报警 + TestHeightResult heightReulst = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); + if (!heightReulst.HasProduct) + { + VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); + slot.ClearProduct(); + GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); + exit = true; + } + break; + case ETipButton.Yes://移动到安全位 + VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); + if (slot.Index < 9) + { + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + } + else + { + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); + } + Start(); + break; + } + } + else + { + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + switch (btnRet) + { + case ETipButton.Skip: + //镭射头过来复检,有产品则继续报警 + TestHeightResult heightReulst = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); + if (!heightReulst.HasProduct) + { + VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); + slot.ClearProduct(); + GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); + exit = true; + } + break; + case ETipButton.Yes://移动到安全位 + VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); + if (slot.Index < 9) + { + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + } + else + { + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); + } + Start(); + break; + } + } + } + } + } + } + if (Ops.IsOn($"测试{slot.Index}号穴位真空吸检测") || GlobalVar.RunSpace || GlobalVar.DisableFixtureVacuumCheck) + { + MessageQueue.Instance.Insert($"测试{slot.Index}号穴位真空吸检测OK"); + } + else + { + MessageQueue.Instance.Insert($"测试{slot.Index}号穴位真空吸检测NG"); + bool exit = false; + while (!exit) + { + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警).Transform(slot.Index); + MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); + if (GlobalVar.ShowRetrayButtonInSocket) + { + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + switch (btnRet) + { + case ETipButton.Retry: + VacManager.TestTrayVacSuction(EVacOperator.Open, true, slot.Index); + if (Ops.IsOn($"测试{slot.Index}号穴位真空吸检测")) + { + exit = true; + } + break; + case ETipButton.Skip: + //镭射头过来复检,有产品则继续报警, + TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); + if (!heightResult.HasProduct) + { + GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); + slot.ClearProduct(); + exit = true; + } + break; + case ETipButton.Yes://移动到安全位 + VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + Start(); + break; + } + } + else + { + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + switch (btnRet) + { + case ETipButton.Skip: + //镭射头过来复检,有产品则继续报警, + TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); + if (!heightResult.HasProduct) + { + GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); + slot.ClearProduct(); + exit = true; + } + break; + case ETipButton.Yes://移动到安全位 + VacManager.TestTrayVacSuction(EVacOperator.Close, true, slot.Index); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + Start(); + break; + } + } + } + } + } + } + hasProductSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + if (hasProductSlots != null && hasProductSlots.Count > 0) + { + Step = ETurnoverFlowStep.到测试取料位上方; + } + else + { + Step = ETurnoverFlowStep.周转盘放料前丢料检测; + //Step = ETurnoverFlowStep.到测试取料位上方; + } + ActionEnd("测试完成光纤检测"); + } + else + { + Step = ETurnoverFlowStep.到测试取料位上方; + } + } + break; + //case ETurnoverFlowStep.测试完成到治具取料位上方: + // targetPos = SysConfigParam.GetValue("PressTakeX"); + // errCode = AxisControl.TurnoverX.MovePos(targetPos, GlobalVar.WholeSpeed); + // if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + // { + // targetPos = SysConfigParam.GetValue("PressTakeY"); + // errCode = AxisControl.TurnoverY.MovePos(targetPos, GlobalVar.WholeSpeed); + // if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + // { + // if (GlobalVar.VirtualAxis) + // { + // Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + // } + // logInfo = GetClassName() + $"测试完成到治具取料位上方"; + // MessageQueue.Instance.Insert(logInfo); + // Step = ETurnoverFlowStep.等待测试完成到治具取料位上方; + // } + // else + // { + // MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); + // } + // } + // else + // { + // MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); + // } + // break; + //case ETurnoverFlowStep.等待测试完成到治具取料位上方: + // if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + // { + // if(Ops.IsArrived(AxisControl.TurnoverX,AxisControl.TurnoverY)) + // { + // logInfo = GetClassName() + $"已运动到治具取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}"; + // MessageQueue.Instance.Insert(logInfo); + // Step = ETurnoverFlowStep.等待任务; + // } + // } + // break; + //-----------------------------------------------测试位下料--------------------------------------------------------------------------------------------------------- + + case ETurnoverFlowStep.到测试取料位上方: + targetTurnoverX = SysConfigParam.GetValue("PressTakeX"); + errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + targetTurnoverY = SysConfigParam.GetValue("PressTakeY"); + errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + ActionStart(); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到测试取料位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到测试取料位上方; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + break; + case ETurnoverFlowStep.等待到测试取料位上方: + if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + { + PrintXYCurrentPos("轴xy已停止运功,"); + //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + ActionEnd("到治具取料位上方"); + logInfo = GetClassName() + $"已运动到测试取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}"; + MessageQueue.Instance.Insert(logInfo); + if (retakeNum <= GlobalVar.TurnoverRetakeNumInSocket) + { + Step = ETurnoverFlowStep.到测试取料位下方1; + } + else + { + LogHelper.Debug(GetClassName() + $"失败次数已达上限{retakeNum},报警"); + // undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); + //TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList()); + //TurnoverDumpFlow.Instance.Wait(); + Step = ETurnoverFlowStep.测试治具取料失败报警; + } + } + else + { + PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试取料位上方; + } + } + break; + case ETurnoverFlowStep.测试治具取料失败报警: + //取三次之后还没有取起来的产品,这个时候需要弹框报警提示是否继续还是跳过 + //获取还未执行完的任务 + List testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + if (testedSlots != null && testedSlots.Count > 0) + { + if (GlobalVar.TakeFailToSlotInSocket) + { + undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); + if (TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList())) + { + TurnoverDumpFlow.Instance.Wait(); + } + } + bool exit = false; + while (!exit) + { + //alarmInfo = GetClassName() + $"测试治具{testedSlots.Select(s => s.Index).ToJoinString()}号穴位取料失败"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在测试治具取料失败报警), testedSlots.Select(s => s.Index).ToJoinString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在测试治具取料失败报警).Transform(testedSlots.Select(s => s.Index).ToJoinString()); + LogHelper.Debug(GetClassName() + alarmEntity.CN); + //TestCenterMessageBox.Show(AlarmConstID.周转吸头在测试治具取料失败报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头在测试治具取料失败报警); + if (GlobalVar.ShowRetrayButtonInSocket) + { + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Retry: + logInfo = GetClassName() + $"选择了重试按钮"; + MessageQueue.Instance.Insert(logInfo); + retakeNum = 0; + exit = true; + //Step = ETurnoverFlowStep.到测试取料位上方; + Step = ETurnoverFlowStep.测试完成光纤检测; + break; + case ETipButton.Skip: + retakeNum = 0; + logInfo = GetClassName() + $"选择了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + foreach (TestTraySlot slot in testedSlots) + { + TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); + if (!heightResult.HasProduct) + { + logInfo = GetClassName() + $"镭射头检测{slot.Index}号穴位无产品"; + MessageQueue.Instance.Insert(logInfo); + TurnoverInfo ti = LoadAndUnloadTask.Instance.GetTestUnloadTask(slot.Index); + if (ti != null) + { + ti.Dealed = true; + } + slot.ClearProduct(); + GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); + } + } + testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + if (testedSlots == null || testedSlots.Count == 0) + { + + exit = true; + Step = ETurnoverFlowStep.上报中控任务完成; + } + break; + case ETipButton.Yes://移动到安全位 + logInfo = GetClassName() + $"选择了移动到安全位按钮"; + MessageQueue.Instance.Insert(logInfo); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketTakeFail); + Start(); + //if (testedSlots.Select(ts => (ts.Index >= 9 && ts.Index <= 16)).Count() > 0) + //{ + // TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); + //} + //else + //{ + // TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + //} + break; + default: + break; + } + } + else + { + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Skip: + retakeNum = 0; + logInfo = GetClassName() + $"选择了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + foreach (TestTraySlot slot in testedSlots) + { + TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index); + if (!heightResult.HasProduct) + { + logInfo = GetClassName() + $"镭射头检测{slot.Index}号穴位无产品"; + MessageQueue.Instance.Insert(logInfo); + TurnoverInfo ti = LoadAndUnloadTask.Instance.GetTestUnloadTask(slot.Index); + if (ti != null) + { + ti.Dealed = true; + } + slot.ClearProduct(); + GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave); + } + } + testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have); + if (testedSlots == null || testedSlots.Count == 0) + { + + exit = true; + Step = ETurnoverFlowStep.上报中控任务完成; + } + break; + case ETipButton.Yes://移动到安全位 + logInfo = GetClassName() + $"选择了移动到安全位按钮"; + MessageQueue.Instance.Insert(logInfo); + if (testedSlots.Select(ts => (ts.Index >= 9 && ts.Index <= 16)).Count() > 0) + { + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen); + } + else + { + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + } + Start(); + break; + default: + break; + } + } + } + + } + break; + case ETurnoverFlowStep.到测试取料位下方1: + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + targetTurnoverZ = SysConfigParam.GetValue("PressTakeZ"); + if (GlobalVar.SocketTrayTakeEnableTwoSpeed) + { + targetTurnoverZ = targetTurnoverZ + GlobalVar.SocketTrayTakeOneSpeedOffsetHeight; + } + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + ActionStart(); + undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); + /*提前打开周转吸头真空吸*/ + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Open, false, undealTasks.Select(t => t.FromIndex + 1).ToArray()); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到测试取料位下方1,tturnoverz:{targetTurnoverZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到测试取料位下方1; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + } + else + { + PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试取料位上方; + } + break; + case ETurnoverFlowStep.等待到测试取料位下方1: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + { + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) + { + logInfo = GetClassName() + $"已运动到到测试取料位下方1"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.到测试取料位下方2; + } + else + { + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.到测试取料位下方1; + } + } + else + { + PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试取料位上方; + } + } + break; + case ETurnoverFlowStep.到测试取料位下方2: + //if(AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX,targetTurnoverY)) + { + targetTurnoverZ = SysConfigParam.GetValue("PressTakeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.SocketTrayTakeOneSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到测试取料位下方2,tturnoverz:{targetTurnoverZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到测试取料位下方2; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } + //else + //{ + // Step = ETurnoverFlowStep.到测试取料位上方; + //} + break; - } - break; - case ETurnoverFlowStep.到测试取料位下方1: - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - targetTurnoverZ = SysConfigParam.GetValue("PressTakeZ"); + case ETurnoverFlowStep.等待到测试取料位下方2: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + { + PrintTurnoverZCurrentPos("轴turnoverz已经停止运动,"); + //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) + { + ActionEnd("到治具取料位下方"); + ActionStart(); + logInfo = GetClassName() + $"已运动到测试取料位下方2 TurnoverZ at:{Ops.GetCurPosition("TurnoverZ")}"; + MessageQueue.Instance.Insert(logInfo); + //int[] indexes = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Select(s=>s.Index).ToArray(); + undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); + /*打开周转吸头真空吸*/ + //VacManager.TransitNozzleVacSuction(EVacOperator.Open, true, indexes); + /*关闭测试穴位真空吸*/ + VacManager.TestTrayVacSuction(EVacOperator.Close, true, undealTasks.Select(t => t.FromIndex + 1).ToArray()); + /*打开测试穴位真空破*/ + VacManager.TestTrayVacBreak(EVacOperator.Open, true, undealTasks.Select(t => t.FromIndex + 1).ToArray()); + ActionEnd("关闭测试穴位真空吸-打开测试穴位真空破"); + Step = ETurnoverFlowStep.测试位取料完成抬起1; + } + else + { + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.到测试取料位下方2; + } + } + else + { + PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到测试取料位上方; + } + } + break; + case ETurnoverFlowStep.测试位取料完成抬起1: if (GlobalVar.SocketTrayTakeEnableTwoSpeed) { - targetTurnoverZ = targetTurnoverZ + GlobalVar.SocketTrayTakeOneSpeedOffsetHeight; + targetTurnoverZ = SysConfigParam.GetValue("PressTakeZ") + GlobalVar.SocketTrayTakeOneSpeedOffsetHeight; + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.SocketTrayTakeOneSpeed); } - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); + else + { + targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); + } + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { ActionStart(); - undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); - /*提前打开周转吸头真空吸*/ - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Open, false, undealTasks.Select(t => t.FromIndex + 1).ToArray()); + logInfo = GetClassName() + $"到测试破关真空位,tturnoverz:{targetTurnoverZ}"; + MessageQueue.Instance.Insert(logInfo); if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - logInfo = GetClassName() + $"到测试取料位下方1,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到测试取料位下方1; + Step = ETurnoverFlowStep.等待测试位取料完成抬起1; } else { @@ -2184,51 +2347,39 @@ namespace Rs.MotionPlat.Flow alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试取料位上方; - } - break; - case ETurnoverFlowStep.等待到测试取料位下方1: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待测试位取料完成抬起1: + if (Ops.IsStop(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis) { + PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - logInfo = GetClassName() + $"已运动到到测试取料位下方1"; + logInfo = GetClassName() + $"已运动到测试关破真空位"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.到测试取料位下方2; + undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); + /*关闭测试穴位真空破*/ + VacManager.TestTrayVacBreak(EVacOperator.Close, false, undealTasks.Select(t => t.FromIndex + 1).ToArray()); + Step = ETurnoverFlowStep.测试位取料完成抬起2; } else { PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.到测试取料位下方1; + Step = ETurnoverFlowStep.测试位取料完成抬起1; } } - else - { - PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试取料位上方; - } - } - break; - case ETurnoverFlowStep.到测试取料位下方2: - //if(AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX,targetTurnoverY)) - { - targetTurnoverZ = SysConfigParam.GetValue("PressTakeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.SocketTrayTakeOneSpeed); + break; + case ETurnoverFlowStep.测试位取料完成抬起2: + targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - logInfo = GetClassName() + $"到测试取料位下方2,tturnoverz:{targetTurnoverZ}"; + logInfo = GetClassName() + $"测试位取料完成抬起,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到测试取料位下方2; + Step = ETurnoverFlowStep.等待测试位取料完成抬起2; } else { @@ -2236,897 +2387,801 @@ namespace Rs.MotionPlat.Flow alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - //else - //{ - // Step = ETurnoverFlowStep.到测试取料位上方; - //} - break; - - case ETurnoverFlowStep.等待到测试取料位下方2: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - PrintTurnoverZCurrentPos("轴turnoverz已经停止运动,"); - //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待测试位取料完成抬起2: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { + //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - ActionEnd("到治具取料位下方"); - ActionStart(); - logInfo = GetClassName() + $"已运动到测试取料位下方2 TurnoverZ at:{Ops.GetCurPosition("TurnoverZ")}"; + ActionEnd("治具取料完成抬起"); + logInfo = GetClassName() + $"测试位取料完成已抬起"; MessageQueue.Instance.Insert(logInfo); - //int[] indexes = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Select(s=>s.Index).ToArray(); - undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); - /*打开周转吸头真空吸*/ - //VacManager.TransitNozzleVacSuction(EVacOperator.Open, true, indexes); - /*关闭测试穴位真空吸*/ - VacManager.TestTrayVacSuction(EVacOperator.Close, true, undealTasks.Select(t => t.FromIndex + 1).ToArray()); - /*打开测试穴位真空破*/ - VacManager.TestTrayVacBreak(EVacOperator.Open, true, undealTasks.Select(t => t.FromIndex + 1).ToArray()); - ActionEnd("关闭测试穴位真空吸-打开测试穴位真空破"); - Step = ETurnoverFlowStep.测试位取料完成抬起1; + Step = ETurnoverFlowStep.测试位取料完成后真空检测; } else { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.到测试取料位下方2; + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.测试位取料完成抬起2; } } - else + break; + case ETurnoverFlowStep.测试位取料完成后真空检测: + /* + 测试位取料完成真空检测,只要有吸嘴上有产品,就先把产品放到周转盘中 + */ + ActionStart(); + undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); + if (undealTasks != null && undealTasks.Count > 0) { - PrintXYCurrentPos($"检测到轴xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到测试取料位上方; + foreach (TurnoverInfo task in undealTasks) + { + TestTraySlot testSlot = TestTrayManager.Instance.Slot(task.FromIndex + 1); + if (Ops.IsOn($"周转{task.FromIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace) + { + GlobalTray.TurnoverNozzle.ChangeStatus(task.FromIndex + 1, ESlotStatus.Have); + logInfo = $"周转{task.FromIndex + 1}号吸嘴真空吸检测OK"; + MessageQueue.Instance.Insert(logInfo); + testSlot.ClearProduct(); + task.Dealed = true; + TransitNozzleManager.Instance.Nozzle(task.FromIndex + 1).AddProduct(task); + GlobalTray.TestTray.ChangeStatus(task.FromIndex + 1, ESlotStatus.NotHave); + } + else + { + logInfo = $"周转{task.FromIndex + 1}号吸嘴真空吸检测异常"; + MessageQueue.Instance.Insert(logInfo); + } + } } - } - break; - case ETurnoverFlowStep.测试位取料完成抬起1: - if (GlobalVar.SocketTrayTakeEnableTwoSpeed) - { - targetTurnoverZ = SysConfigParam.GetValue("PressTakeZ") + GlobalVar.SocketTrayTakeOneSpeedOffsetHeight; - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.SocketTrayTakeOneSpeed); - } - else - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - } + if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count == 0) + { - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - ActionStart(); - logInfo = GetClassName() + $"到测试破关真空位,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - Step = ETurnoverFlowStep.等待测试位取料完成抬起1; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待测试位取料完成抬起1: - if (Ops.IsStop(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis) - { - PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - logInfo = GetClassName() + $"已运动到测试关破真空位"; - MessageQueue.Instance.Insert(logInfo); - undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); - /*关闭测试穴位真空破*/ - VacManager.TestTrayVacBreak(EVacOperator.Close, false, undealTasks.Select(t => t.FromIndex + 1).ToArray()); - Step = ETurnoverFlowStep.测试位取料完成抬起2; + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + if (hasProductNozzles.Count > 0 || GlobalVar.RunSpace || GlobalVar.VirtualAxis) + { + //Step = ETurnoverFlowStep.到周转盘放料位上方; + Step = ETurnoverFlowStep.等待排料离开周转盘; + } + else + { + Step = ETurnoverFlowStep.上报中控任务完成; + } } else { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.测试位取料完成抬起1; - } - } - break; - case ETurnoverFlowStep.测试位取料完成抬起2: - targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"测试位取料完成抬起,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待测试位取料完成抬起2; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待测试位取料完成抬起2: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - ActionEnd("治具取料完成抬起"); - logInfo = GetClassName() + $"测试位取料完成已抬起"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.测试位取料完成后真空检测; + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + if (hasProductNozzles.Count > 0 || GlobalVar.RunSpace || GlobalVar.VirtualAxis) + { + undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); + if (undealTasks.Count > 0) + { + TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList()); + TurnoverDumpFlow.Instance.Wait(); + } + //Step = ETurnoverFlowStep.到周转盘放料位上方; + Step = ETurnoverFlowStep.等待排料离开周转盘; + } + else + { + retakeNum++; + //Step = ETurnoverFlowStep.到测试取料位上方; + Step = ETurnoverFlowStep.测试完成光纤检测; + } } - else + ActionEnd("测试位取料完成后真空检测"); + break; + case ETurnoverFlowStep.等待排料离开周转盘: + if (bTakeFlag || GlobalVar.CleanOut) { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.测试位取料完成抬起2; - } - } - break; - case ETurnoverFlowStep.测试位取料完成后真空检测: - /* - 测试位取料完成真空检测,只要有吸嘴上有产品,就先把产品放到周转盘中 - */ - ActionStart(); - undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); - if (undealTasks != null && undealTasks.Count > 0) - { - foreach (TurnoverInfo task in undealTasks) + Step = ETurnoverFlowStep.到周转盘放料位上方; + } + break; + case ETurnoverFlowStep.到周转盘放料位上方: + if (CanGoTurnoverTrayPos()) { - TestTraySlot testSlot = TestTrayManager.Instance.Slot(task.FromIndex + 1); - if (Ops.IsOn($"周转{task.FromIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace) + targetTurnoverX = SysConfigParam.GetValue("TurnoverDumpX"); + errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - GlobalTray.TurnoverNozzle.ChangeStatus(task.FromIndex + 1, ESlotStatus.Have); - logInfo = $"周转{task.FromIndex + 1}号吸嘴真空吸检测OK"; - MessageQueue.Instance.Insert(logInfo); - testSlot.ClearProduct(); - task.Dealed = true; - TransitNozzleManager.Instance.Nozzle(task.FromIndex + 1).AddProduct(task); - GlobalTray.TestTray.ChangeStatus(task.FromIndex + 1, ESlotStatus.NotHave); + targetTurnoverY = SysConfigParam.GetValue("TurnoverDumpY"); + errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + ActionStart(); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到周转盘放料位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到周转盘放料位上方; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } } else { - logInfo = $"周转{task.FromIndex + 1}号吸嘴真空吸检测异常"; - MessageQueue.Instance.Insert(logInfo); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } - } - if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count == 0) - { - - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - if (hasProductNozzles.Count > 0 || GlobalVar.RunSpace || GlobalVar.VirtualAxis) + else { - //Step = ETurnoverFlowStep.到周转盘放料位上方; - Step = ETurnoverFlowStep.等待排料离开周转盘; + Msg.ShowError("turnovery axis move is unsafe"); } - else + + break; + case ETurnoverFlowStep.等待到周转盘放料位上方: + if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) { - Step = ETurnoverFlowStep.上报中控任务完成; + PrintXYCurrentPos("轴xy已停止运动,"); + //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + ActionEnd("到周转盘放料位上方"); + logInfo = GetClassName() + $"已运动到周转盘放料位上方"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.周转盘放料前丢料检测; + } + else + { + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到周转盘放料位上方; + } } - } - else - { - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - if (hasProductNozzles.Count > 0 || GlobalVar.RunSpace || GlobalVar.VirtualAxis) + break; + case ETurnoverFlowStep.周转盘放料前丢料检测: + if (!GlobalVar.RunSpace) { - undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal); - if (undealTasks.Count > 0) + ActionStart(); + loseSlots.Clear(); + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + if (hasProductNozzles != null && hasProductNozzles.Count > 0) { - TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList()); - TurnoverDumpFlow.Instance.Wait(); + foreach (var nozzle in hasProductNozzles.ToArray()) + { + if (!nozzle.HasVacSignal()) + { + loseSlots.Add(nozzle.NozzleIndex); + } + } + if (loseSlots.Count > 0) + { + bool exit = false; + while (!exit) + { + //alarmInfo = $"周转{loseSlots.ToJoinString()}号吸嘴真空异常丢料,请处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在周转盘放料时丢料报警), loseSlots.ToJoinString()) ; + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在周转盘放料时丢料报警).Transform(loseSlots.ToJoinString()); + LogHelper.Debug(GetClassName() + alarmEntity.CN); + //TestCenterMessageBox.Show(AlarmConstID.周转吸头在周转盘放料时丢料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头在周转盘放料时丢料报警); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Skip: + logInfo = GetClassName() + $"点击了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + foreach (var slotIndex in loseSlots) + { + TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(slotIndex); + ////关闭吸嘴的真空吸 + //nozzle.CloseVac(); + ////打开吸嘴的真空破 + //nozzle.OpenBreak(); + ////关闭吸嘴的真空破 + //nozzle.CloseBreak(); + + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, nozzle.ToIndex); + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, true, nozzle.NozzleIndex); + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, nozzle.NozzleIndex); + //清空吸嘴上的产品 + nozzle.Clear(); + } + exit = true; + //循环退出,重新检测一下粘料 + Step = ETurnoverFlowStep.到周转盘放料位上方; + break; + case ETipButton.Yes: + logInfo = GetClassName() + $"点击了移动到安全位按钮"; + MessageQueue.Instance.Insert(logInfo); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle); + Start(); + break; + default: + break; + } + } + } + else + { + Step = ETurnoverFlowStep.到周转盘放料位下方1; + } + } + else + { + //这里再次判断治具中是否还有产品未取出,如果都已取出,则到安全位,如果还有产品,则到治具位上放取料 + if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0) + { + //Step = ETurnoverFlowStep.到测试取料位上方; + Step = ETurnoverFlowStep.测试完成光纤检测; + } + else + { + Step = ETurnoverFlowStep.到安全位; + } } - //Step = ETurnoverFlowStep.到周转盘放料位上方; - Step = ETurnoverFlowStep.等待排料离开周转盘; + ActionEnd("周转盘放料前丢料检测"); } else { - retakeNum++; - //Step = ETurnoverFlowStep.到测试取料位上方; - Step = ETurnoverFlowStep.测试完成光纤检测; + Step = ETurnoverFlowStep.到周转盘放料位下方1; } - } - ActionEnd("测试位取料完成后真空检测"); - break; - case ETurnoverFlowStep.等待排料离开周转盘: - if (bTakeFlag || GlobalVar.CleanOut) - { - Step = ETurnoverFlowStep.到周转盘放料位上方; - } - break; - case ETurnoverFlowStep.到周转盘放料位上方: - if (CanGoTurnoverTrayPos()) - { - targetTurnoverX = SysConfigParam.GetValue("TurnoverDumpX"); - errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + break; + case ETurnoverFlowStep.到周转盘放料位下方1: + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - targetTurnoverY = SysConfigParam.GetValue("TurnoverDumpY"); - errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ"); + if (GlobalVar.TurnoverTrayDumpEnableTwoSpeed) + { + targetTurnoverZ += GlobalVar.TurnoverTrayDumpOneSpeedOffsetHeight; + } + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { ActionStart(); + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + /*提前打开周转盘真空吸*/ + VacManager.TurnoverTrayVacSuction(EVacOperator.Open, false, hasProductNozzles.Select(n => n.ToIndex + 1).ToArray()); if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - logInfo = GetClassName() + $"到周转盘放料位上方,tx:{targetTurnoverX},ty:{targetTurnoverY}"; + logInfo = GetClassName() + $"到周转盘放料位下方1,tturnoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到周转盘放料位上方; + Step = ETurnoverFlowStep.等待到周转盘放料位下方1; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - } - else - { - Msg.ShowError("turnovery axis move is unsafe"); - } - - break; - case ETurnoverFlowStep.等待到周转盘放料位上方: - if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - { - PrintXYCurrentPos("轴xy已停止运动,"); - //if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - ActionEnd("到周转盘放料位上方"); - logInfo = GetClassName() + $"已运动到周转盘放料位上方"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.周转盘放料前丢料检测; - } - else - { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); Step = ETurnoverFlowStep.到周转盘放料位上方; } - } - break; - case ETurnoverFlowStep.周转盘放料前丢料检测: - if (!GlobalVar.RunSpace) - { - ActionStart(); - loseSlots.Clear(); - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - if (hasProductNozzles != null && hasProductNozzles.Count > 0) + break; + case ETurnoverFlowStep.等待到周转盘放料位下方1: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { - foreach (var nozzle in hasProductNozzles.ToArray()) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - if (!nozzle.HasVacSignal()) + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - loseSlots.Add(nozzle.NozzleIndex); + logInfo = GetClassName() + $"已运动到周转盘放料位下方1"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.到周转盘放料位下方2; } - } - if (loseSlots.Count > 0) - { - bool exit = false; - while (!exit) + else { - //alarmInfo = $"周转{loseSlots.ToJoinString()}号吸嘴真空异常丢料,请处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在周转盘放料时丢料报警), loseSlots.ToJoinString()) ; - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在周转盘放料时丢料报警).Transform(loseSlots.ToJoinString()); - LogHelper.Debug(GetClassName() + alarmEntity.CN); - //TestCenterMessageBox.Show(AlarmConstID.周转吸头在周转盘放料时丢料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头在周转盘放料时丢料报警); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) - { - case ETipButton.Skip: - logInfo = GetClassName() + $"点击了跳过按钮"; - MessageQueue.Instance.Insert(logInfo); - foreach (var slotIndex in loseSlots) - { - TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(slotIndex); - ////关闭吸嘴的真空吸 - //nozzle.CloseVac(); - ////打开吸嘴的真空破 - //nozzle.OpenBreak(); - ////关闭吸嘴的真空破 - //nozzle.CloseBreak(); - - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, nozzle.ToIndex); - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, true, nozzle.NozzleIndex); - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, nozzle.NozzleIndex); - //清空吸嘴上的产品 - nozzle.Clear(); - } - exit = true; - //循环退出,重新检测一下粘料 - Step = ETurnoverFlowStep.到周转盘放料位上方; - break; - case ETipButton.Yes: - logInfo = GetClassName() + $"点击了移动到安全位按钮"; - MessageQueue.Instance.Insert(logInfo); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle); - break; - default: - break; - } + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.到周转盘放料位下方1; } } else { - Step = ETurnoverFlowStep.到周转盘放料位下方1; + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到周转盘放料位上方; } } + break; + + case ETurnoverFlowStep.到周转盘放料位下方2: + targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.TurnoverTrayDumpOneSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"到周转盘放料位下方2,tturnoverz:{targetTurnoverZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到周转盘放料位下方2; + } else { - //这里再次判断治具中是否还有产品未取出,如果都已取出,则到安全位,如果还有产品,则到治具位上放取料 - if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0) + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); + } + break; + case ETurnoverFlowStep.等待到周转盘放料位下方2: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + { + PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); + //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) { - //Step = ETurnoverFlowStep.到测试取料位上方; - Step = ETurnoverFlowStep.测试完成光纤检测; + if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) + { + ActionEnd("到周转盘放料位下方"); + ActionStart(); + foreach (TransitNozzle nozzle in hasProductNozzles) + { + GlobalTray.TurnoverNozzle.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.NotHave); + } + logInfo = GetClassName() + $"已运动到周转盘放料位下方2"; + MessageQueue.Instance.Insert(logInfo); + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + //TrayStatusManager.UpdateMultiSlotAsync("TurnoverNozzle", hasProductNozzles.Select(n => n.NozzleIndex).ToArray(), 0); + /*关闭周转吸头真空吸*/ + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray()); + /*打开周转吸头真空破*/ + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray()); + /*关闭周转吸头真空破*/ + VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray()); + ActionEnd("关闭周转吸头真空吸-打开周转吸头真空破-关闭周转吸头真空破"); + Step = ETurnoverFlowStep.周转盘放料完成抬起1; + } + else + { + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.到周转盘放料位下方2; + } } else { - Step = ETurnoverFlowStep.到安全位; + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到周转盘放料位上方; } } - ActionEnd("周转盘放料前丢料检测"); - } - else - { - Step = ETurnoverFlowStep.到周转盘放料位下方1; - } - break; - case ETurnoverFlowStep.到周转盘放料位下方1: - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ"); + break; + + case ETurnoverFlowStep.周转盘放料完成抬起1: if (GlobalVar.TurnoverTrayDumpEnableTwoSpeed) { - targetTurnoverZ += GlobalVar.TurnoverTrayDumpOneSpeedOffsetHeight; + targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ") + GlobalVar.TurnoverTrayDumpOneSpeedOffsetHeight; + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.TurnoverTrayDumpOneSpeed); } - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); + else + { + targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); + } + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { ActionStart(); - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - /*提前打开周转盘真空吸*/ - VacManager.TurnoverTrayVacSuction(EVacOperator.Open, false, hasProductNozzles.Select(n => n.ToIndex + 1).ToArray()); if (GlobalVar.VirtualAxis) { Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } - logInfo = GetClassName() + $"到周转盘放料位下方1,tturnoverz:{targetTurnoverZ}"; + logInfo = GetClassName() + $"周转盘放料完成准备抬起1,ttunoverz:{targetTurnoverZ}"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到周转盘放料位下方1; + Step = ETurnoverFlowStep.等待周转盘放料完成抬起1; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + // MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - else - { - Step = ETurnoverFlowStep.到周转盘放料位上方; - } - break; - case ETurnoverFlowStep.等待到周转盘放料位下方1: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待周转盘放料完成抬起1: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { + PrintTurnoverZCurrentPos($"轴turnoverz已停止运动"); if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - logInfo = GetClassName() + $"已运动到周转盘放料位下方1"; + //hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + /*关闭周转吸头真空破*/ + //VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray()); + logInfo = GetClassName() + $"周转盘放料完成已抬起1"; MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.到周转盘放料位下方2; + Step = ETurnoverFlowStep.周转盘放料完成抬起2; } else { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.到周转盘放料位下方1; + PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); + Step = ETurnoverFlowStep.周转盘放料完成抬起1; + } + } + break; + case ETurnoverFlowStep.周转盘放料完成抬起2: + targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); + errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + { + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); } + logInfo = GetClassName() + $"周转盘放料完成准备抬起2,tturnoverz:{targetTurnoverZ}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待周转盘放料完成抬起2; } else { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到周转盘放料位上方; + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - } - break; - - case ETurnoverFlowStep.到周转盘放料位下方2: - targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.TurnoverTrayDumpOneSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"到周转盘放料位下方2,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到周转盘放料位下方2; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待到周转盘放料位下方2: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - PrintTurnoverZCurrentPos("轴turnoverz已停止运动,"); - //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待周转盘放料完成抬起2: + if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { + //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) { - ActionEnd("到周转盘放料位下方"); - ActionStart(); - foreach (TransitNozzle nozzle in hasProductNozzles) + ActionEnd("周转盘放料完成抬起"); + if (!GlobalVar.DisableTurnoverTrayKnock && GlobalVar.EnableTurnoverNozzlePutToTurnoverTrayKnock) { - GlobalTray.TurnoverNozzle.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.NotHave); + TrayShake.ShakeAsync(ETrayType.Turnover); } - logInfo = GetClassName() + $"已运动到周转盘放料位下方2"; + logInfo = GetClassName() + $"周转盘放料完成已抬起2"; MessageQueue.Instance.Insert(logInfo); - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - //TrayStatusManager.UpdateMultiSlotAsync("TurnoverNozzle", hasProductNozzles.Select(n => n.NozzleIndex).ToArray(), 0); - /*关闭周转吸头真空吸*/ - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray()); - /*打开周转吸头真空破*/ - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray()); - /*关闭周转吸头真空破*/ - VacManager.TransitNozzleVacBreak(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray()); - ActionEnd("关闭周转吸头真空吸-打开周转吸头真空破-关闭周转吸头真空破"); - Step = ETurnoverFlowStep.周转盘放料完成抬起1; + Step = ETurnoverFlowStep.周转盘放料完成粘料检测; } else { PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.到周转盘放料位下方2; + Step = ETurnoverFlowStep.周转盘放料完成抬起2; } } - else - { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到周转盘放料位上方; - } - } - break; - - case ETurnoverFlowStep.周转盘放料完成抬起1: - if (GlobalVar.TurnoverTrayDumpEnableTwoSpeed) - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ") + GlobalVar.TurnoverTrayDumpOneSpeedOffsetHeight; - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.TurnoverTrayDumpOneSpeed); - } - else - { - targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - } - - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { + break; + case ETurnoverFlowStep.周转盘放料完成粘料检测: ActionStart(); - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"周转盘放料完成准备抬起1,ttunoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待周转盘放料完成抬起1; - } - else - { - // MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待周转盘放料完成抬起1: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - PrintTurnoverZCurrentPos($"轴turnoverz已停止运动"); - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - //hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - /*关闭周转吸头真空破*/ - //VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray()); - logInfo = GetClassName() + $"周转盘放料完成已抬起1"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.周转盘放料完成抬起2; - } - else - { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.周转盘放料完成抬起1; - } - } - break; - case ETurnoverFlowStep.周转盘放料完成抬起2: - targetTurnoverZ = SysConfigParam.GetValue("TurnoverSafeZ"); - errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) - { - if (GlobalVar.VirtualAxis) - { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - } - logInfo = GetClassName() + $"周转盘放料完成准备抬起2,tturnoverz:{targetTurnoverZ}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待周转盘放料完成抬起2; - } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } - break; - case ETurnoverFlowStep.等待周转盘放料完成抬起2: - if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - { - //if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ)) - { - ActionEnd("周转盘放料完成抬起"); - if(!GlobalVar.DisableTurnoverTrayKnock && GlobalVar.EnableTurnoverNozzlePutToTurnoverTrayKnock) - { - TrayShake.ShakeAsync(ETrayType.Turnover); - } - logInfo = GetClassName() + $"周转盘放料完成已抬起2"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.周转盘放料完成粘料检测; - } - else - { - PrintTurnoverZCurrentPos($"检测到turnoverz不在目标位置,tturnoverz:{targetTurnoverZ}"); - Step = ETurnoverFlowStep.周转盘放料完成抬起2; - } - } - break; - case ETurnoverFlowStep.周转盘放料完成粘料检测: - ActionStart(); - masticSlots.Clear(); - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); - foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles()) - { - //nozzle.OpenVac(); - if (nozzle.HasVacSignal() && !GlobalVar.RunSpace) - { - logInfo = $"周转{nozzle.NozzleIndex}号吸嘴粘料"; - MessageQueue.Instance.Warn(logInfo); - masticSlots.Add(nozzle.NozzleIndex); - } - else + masticSlots.Clear(); + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray()); + foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles()) { - logInfo = $"周转{nozzle.NozzleIndex}号吸嘴无粘料"; - MessageQueue.Instance.Insert(logInfo); - //nozzle.CloseVac(); - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, nozzle.NozzleIndex); + //nozzle.OpenVac(); + if (nozzle.HasVacSignal() && !GlobalVar.RunSpace) + { + logInfo = $"周转{nozzle.NozzleIndex}号吸嘴粘料"; + MessageQueue.Instance.Warn(logInfo); + masticSlots.Add(nozzle.NozzleIndex); + } + else + { + logInfo = $"周转{nozzle.NozzleIndex}号吸嘴无粘料"; + MessageQueue.Instance.Insert(logInfo); + //nozzle.CloseVac(); + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.Socket, EVacOperator.Close, true, nozzle.NozzleIndex); + } } - } - if (masticSlots.Count > 0) - { - //粘料报警 - bool exit = false; - while (!exit) + if (masticSlots.Count > 0) { - //alarmInfo = $"周转{masticSlots.ToJoinString()}号吸嘴真空异常粘料,请手工处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转头粘料报警), masticSlots.ToJoinString()); - alarmEntity = AlarmCollection.Get(AlarmConstID.周转头粘料报警).Transform(masticSlots.ToJoinString()); - MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); - //TestCenterMessageBox.Show(AlarmConstID.周转头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转头粘料报警); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) + //粘料报警 + bool exit = false; + while (!exit) { - case ETipButton.Skip: - logInfo = GetClassName() + "点击了跳过按钮"; - MessageQueue.Instance.Insert(logInfo); - foreach (int nozzleIndex in masticSlots.ToArray()) - { - TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(nozzleIndex); - if (!nozzle.HasVacSignal()) + //alarmInfo = $"周转{masticSlots.ToJoinString()}号吸嘴真空异常粘料,请手工处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转头粘料报警), masticSlots.ToJoinString()); + alarmEntity = AlarmCollection.Get(AlarmConstID.周转头粘料报警).Transform(masticSlots.ToJoinString()); + MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN); + //TestCenterMessageBox.Show(AlarmConstID.周转头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转头粘料报警); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Skip: + logInfo = GetClassName() + "点击了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + foreach (int nozzleIndex in masticSlots.ToArray()) { - //nozzle.CloseVac(); - //nozzle.OpenBreak(); - //nozzle.CloseBreak(); - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, nozzle.NozzleIndex); - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, true, nozzle.NozzleIndex); - VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, nozzle.NozzleIndex); - nozzle.Clear(); - masticSlots.Remove(nozzleIndex); + TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(nozzleIndex); + if (!nozzle.HasVacSignal()) + { + //nozzle.CloseVac(); + //nozzle.OpenBreak(); + //nozzle.CloseBreak(); + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, nozzle.NozzleIndex); + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Open, true, nozzle.NozzleIndex); + VacManager.TransitNozzleVacSuction(ETurnoverNozzlePosition.TurnoverTray, EVacOperator.Close, true, nozzle.NozzleIndex); + nozzle.Clear(); + masticSlots.Remove(nozzleIndex); + } } - } - if (masticSlots.Count == 0) - { - exit = true; - } - break; - case ETipButton.Yes: - logInfo = GetClassName() + "点击了移动到安全位按钮"; - MessageQueue.Instance.Insert(logInfo); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle); - break; - default: - break; + if (masticSlots.Count == 0) + { + exit = true; + } + break; + case ETipButton.Yes: + logInfo = GetClassName() + "点击了移动到安全位按钮"; + MessageQueue.Instance.Insert(logInfo); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle); + Start(); + break; + default: + break; + } } - } - } - else - { - Step = ETurnoverFlowStep.周转盘放料完成后真空检测; - } - ActionEnd("周转盘放料完成粘料检测"); - break; - case ETurnoverFlowStep.周转盘放料完成后真空检测: - ActionStart(); - hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); - if (hasProductNozzles != null && hasProductNozzles.Count > 0) - { - bool needGoSafePos = false; - foreach (var nozzle in hasProductNozzles) + } + else { - TurnoverTraySlot slot = TurnoverTrayManager.Instance.Slot(nozzle.ToIndex + 1); - //GlobalTray.TurnoverTray.ChangeStatus(nozzle.ToIndex, ESlotStatus.Have); - //TurnoverTrayManager.Instance.Slot(nozzle.ToIndex).AddProduct(nozzle.SN, nozzle.NozzleIndex, TurnoverType.Turnover, nozzle.NozzleIndex); - if (slot.HasVac() || GlobalVar.VirtualAxis || GlobalVar.RunSpace) - { - LogHelper.Debug(GetClassName() + $"周转盘{slot.Index}穴位真空吸正常"); - slot.AddProduct(nozzle); - GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have); - slot.VacException = false; - nozzle.Clear(); - } - else + Step = ETurnoverFlowStep.周转盘放料完成后真空检测; + } + ActionEnd("周转盘放料完成粘料检测"); + break; + case ETurnoverFlowStep.周转盘放料完成后真空检测: + ActionStart(); + hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles(); + if (hasProductNozzles != null && hasProductNozzles.Count > 0) + { + bool needGoSafePos = false; + foreach (var nozzle in hasProductNozzles) { - //1 退到安全位 - LogHelper.Debug(GetClassName() + $"通知周转模组回到安全位"); - TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); - //2 排料轴上相机过来检测 - LogHelper.Debug(GetClassName() + $"等待排料模组IDLE"); - DischargeFlow.Instance.WaitCanMove(); - LogHelper.Debug(GetClassName() + $"上相机到周转盘{slot.Index}号穴位定位检测"); - VisionResult vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false); - //VisionResult vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); - needGoSafePos = true; - if (!UpCameraScanBarCodeFlow.Instance.CheckResult(vr))//如果不在穴位中,就弹框报警 + TurnoverTraySlot slot = TurnoverTrayManager.Instance.Slot(nozzle.ToIndex + 1); + //GlobalTray.TurnoverTray.ChangeStatus(nozzle.ToIndex, ESlotStatus.Have); + //TurnoverTrayManager.Instance.Slot(nozzle.ToIndex).AddProduct(nozzle.SN, nozzle.NozzleIndex, TurnoverType.Turnover, nozzle.NozzleIndex); + if (slot.HasVac() || GlobalVar.VirtualAxis || GlobalVar.RunSpace) { - LogHelper.Debug(GetClassName() + "检测到产品不在穴位中"); - bool exit = false; - while (!exit) + LogHelper.Debug(GetClassName() + $"周转盘{slot.Index}穴位真空吸正常"); + slot.AddProduct(nozzle); + GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have); + slot.VacException = false; + nozzle.Clear(); + } + else + { + //1 退到安全位 + LogHelper.Debug(GetClassName() + $"通知周转模组回到安全位"); + TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket); + //2 排料轴上相机过来检测 + LogHelper.Debug(GetClassName() + $"等待排料模组IDLE"); + DischargeFlow.Instance.WaitCanMove(); + LogHelper.Debug(GetClassName() + $"上相机到周转盘{slot.Index}号穴位定位检测"); + VisionResult vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false); + //VisionResult vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); + needGoSafePos = true; + if (!UpCameraScanBarCodeFlow.Instance.CheckResult(vr))//如果不在穴位中,就弹框报警 { - try + LogHelper.Debug(GetClassName() + "检测到产品不在穴位中"); + bool exit = false; + while (!exit) { - //alarmInfo = $"周转盘{slot.Index}号穴位真空吸异常,请选择处理"; - //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警), slot.Index); - alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警).Transform(slot.Index); - LogHelper.Debug(GetClassName() + alarmEntity.CN); - //msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); - //switch (msgBox.Button) - switch (btnRet) + try { - case ETipButton.Retry: - logInfo = GetClassName() + "选择了重试"; - MessageQueue.Instance.Insert(logInfo); - vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false); - //vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); - if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr)) - { - slot.AddProduct(nozzle); - GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have); - slot.VacException = false; - nozzle.Clear(); - exit = true; - } - break; - case ETipButton.Skip: - logInfo = GetClassName() + "选择了跳过"; - MessageQueue.Instance.Insert(logInfo); - if (GlobalVar.EnableExceptionHandlingNozzle)//启用大力吸嘴 - { - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, slot.Index); - nozzle.Clear(); - VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index); - exit = true; - } - else - { - //检测穴位中还是否有料 - if (!UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, slot.Index, true).HasProduct) + //alarmInfo = $"周转盘{slot.Index}号穴位真空吸异常,请选择处理"; + //alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警), slot.Index); + alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警).Transform(slot.Index); + LogHelper.Debug(GetClassName() + alarmEntity.CN); + //msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText()); + //switch (msgBox.Button) + switch (btnRet) + { + case ETipButton.Retry: + logInfo = GetClassName() + "选择了重试"; + MessageQueue.Instance.Insert(logInfo); + vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false); + //vr = UpCameraScanBarCodeFlow.Instance.WaitSingle(); + if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr)) + { + slot.AddProduct(nozzle); + GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have); + slot.VacException = false; + nozzle.Clear(); + exit = true; + } + break; + case ETipButton.Skip: + logInfo = GetClassName() + "选择了跳过"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.EnableExceptionHandlingNozzle)//启用大力吸嘴 { + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, slot.Index); nozzle.Clear(); VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index); exit = true; } - } + else + { + //检测穴位中还是否有料 + if (!UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, slot.Index, true).HasProduct) + { + nozzle.Clear(); + VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index); + exit = true; + } + } - break; - case ETipButton.Yes: - logInfo = GetClassName() + "选择了移动到安全位"; - MessageQueue.Instance.Insert(logInfo); - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); - break; - default: - break; + break; + case ETipButton.Yes: + logInfo = GetClassName() + "选择了移动到安全位"; + MessageQueue.Instance.Insert(logInfo); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + Start(); + break; + default: + break; + } + } + catch (Exception ex) + { + Msg.ShowError(ex.Message); } - } - catch (Exception ex) - { - Msg.ShowError(ex.Message); } } - } - else - { - LogHelper.Debug(GetClassName() + "检测到产品在穴位中"); - slot.AddProduct(nozzle); - GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have); - slot.VacException = false; - nozzle.Clear(); + else + { + LogHelper.Debug(GetClassName() + "检测到产品在穴位中"); + slot.AddProduct(nozzle); + GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have); + slot.VacException = false; + nozzle.Clear(); + } } } + //排料轴回安全位 + if (needGoSafePos) + { + DischargeFlow.Instance.WaitCanMove(); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + } } - //排料轴回安全位 - if (needGoSafePos) + + //检测治具盘中是否还有待取的料,如果有继续取,如果没有回安全位 + if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0) { - DischargeFlow.Instance.WaitCanMove(); - DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + retakeNum++; + //Step = ETurnoverFlowStep.到测试取料位上方; + Step = ETurnoverFlowStep.测试完成光纤检测; } - } - - //检测治具盘中是否还有待取的料,如果有继续取,如果没有回安全位 - if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0) - { - retakeNum++; - //Step = ETurnoverFlowStep.到测试取料位上方; - Step = ETurnoverFlowStep.测试完成光纤检测; - } - else - { - Step = ETurnoverFlowStep.到安全位; - } - ActionEnd("周转盘放料完成后真空检测"); - break; - case ETurnoverFlowStep.周转盘放料真空异常处理: - { - if (GlobalVar.EnableExceptionHandlingNozzle) - { - List vacExceptionSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.Tested, ETurnoverTraySlotStatus.VacException); - if (vacExceptionSlots != null && vacExceptionSlots.Count > 0) + else + { + Step = ETurnoverFlowStep.到安全位; + } + ActionEnd("周转盘放料完成后真空检测"); + break; + case ETurnoverFlowStep.周转盘放料真空异常处理: + { + if (GlobalVar.EnableExceptionHandlingNozzle) { - - foreach (TurnoverTraySlot slot in vacExceptionSlots) + List vacExceptionSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.Tested, ETurnoverTraySlotStatus.VacException); + if (vacExceptionSlots != null && vacExceptionSlots.Count > 0) { - //通知大力吸嘴过来取料,如果取成功了,就把当前穴位的产品删除 - } + foreach (TurnoverTraySlot slot in vacExceptionSlots) + { + //通知大力吸嘴过来取料,如果取成功了,就把当前穴位的产品删除 + } + + } } - } - } - break; - case ETurnoverFlowStep.到安全位: - { - MachineManage.Instance.TestStatus = ETestStatus.Idle; - //这里判断周转载盘还有没有待测的产品,如果有就不动,如果没有就退到安全位 - List hasProductSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); - if (hasProductSlots.Count > 0) - { - //这个时候可以开始检测治具中是否有料了 - SocketVacCheck.CheckAsync(); - logInfo = GetClassName() + $"周转盘{hasProductSlots.Select(s => s.Index).ToJoinString()}穴位中有待测产品,就地等待周转盘取料指令"; - MessageQueue.Instance.Insert(logInfo); - //Step = ETurnoverFlowStep.上报中控任务完成; - //如果周转盘有上料的穴位,这是自动生成上料任务 - LoadAndUnloadTask.Instance.CreateTestLoadTask(); - turnoverTakeFinishe = false; - //Step = ETurnoverFlowStep.到周转盘取料位上方; - Step = ETurnoverFlowStep.周转盘取料前真空检测; } - else + break; + case ETurnoverFlowStep.到安全位: { - targetTurnoverX = SysConfigParam.GetValue("PressTakeX"); - errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); - if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) + MachineManage.Instance.TestStatus = ETestStatus.Idle; + //这里判断周转载盘还有没有待测的产品,如果有就不动,如果没有就退到安全位 + List hasProductSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); + if (hasProductSlots.Count > 0) { - targetTurnoverY = SysConfigParam.GetValue("PressTakeY"); - errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + //这个时候可以开始检测治具中是否有料了 + SocketVacCheck.CheckAsync(); + logInfo = GetClassName() + $"周转盘{hasProductSlots.Select(s => s.Index).ToJoinString()}穴位中有待测产品,就地等待周转盘取料指令"; + MessageQueue.Instance.Insert(logInfo); + //Step = ETurnoverFlowStep.上报中控任务完成; + //如果周转盘有上料的穴位,这是自动生成上料任务 + LoadAndUnloadTask.Instance.CreateTestLoadTask(); + turnoverTakeFinishe = false; + //Step = ETurnoverFlowStep.到周转盘取料位上方; + Step = ETurnoverFlowStep.周转盘取料前真空检测; + } + else + { + targetTurnoverX = SysConfigParam.GetValue("PressTakeX"); + errCode = AxisControl.TurnoverX.MovePos(targetTurnoverX, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - if (GlobalVar.VirtualAxis) + targetTurnoverY = SysConfigParam.GetValue("PressTakeY"); + errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed); + if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { - Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + logInfo = GetClassName() + $"周转吸头下料完成到安全位,tx:{targetTurnoverX},ty:{targetTurnoverY}"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.等待到安全位; + } + else + { + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } - logInfo = GetClassName() + $"周转吸头下料完成到安全位,tx:{targetTurnoverX},ty:{targetTurnoverY}"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.等待到安全位; } else { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString()); + //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); + alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } } - else - { - //MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode); - alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverX运动异常).Transform(errCode.ToString()); - AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); - } } - } - break; - case ETurnoverFlowStep.等待到安全位: - if (Ops.IsStop("TurnoverX", "TurnoverY") || GlobalVar.VirtualAxis) - { - //if(Ops.IsArrived(AxisControl.TurnoverX,AxisControl.TurnoverY) || GlobalVar.VirtualAxis) - if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + break; + case ETurnoverFlowStep.等待到安全位: + if (Ops.IsStop("TurnoverX", "TurnoverY") || GlobalVar.VirtualAxis) { - logInfo = GetClassName() + $"已运动到安全位,任务结束"; - MessageQueue.Instance.Insert(logInfo); - Step = ETurnoverFlowStep.上报中控任务完成; + //if(Ops.IsArrived(AxisControl.TurnoverX,AxisControl.TurnoverY) || GlobalVar.VirtualAxis) + if (AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX, targetTurnoverY)) + { + logInfo = GetClassName() + $"已运动到安全位,任务结束"; + MessageQueue.Instance.Insert(logInfo); + Step = ETurnoverFlowStep.上报中控任务完成; + } + else + { + PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); + Step = ETurnoverFlowStep.到安全位; + } } - else + break; + case ETurnoverFlowStep.上报中控任务完成: + if (GlobalVar.CleanOut) { - PrintXYCurrentPos($"检测到xy不在目标位置,tx:{targetTurnoverX},ty:{targetTurnoverY}"); - Step = ETurnoverFlowStep.到安全位; - } - } - break; - case ETurnoverFlowStep.上报中控任务完成: - if (GlobalVar.CleanOut) - { - unloadOk = true; - MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null }); - LoadAndUnloadTask.Instance.Clear(1); - Step = ETurnoverFlowStep.等待任务; - } - else - { - if (LoadAndUnloadTask.Instance.TestUnloadTaskArrived) - { - hasUnloadFlag = false; - LoadAndUnloadTask.Instance.TestUnloadTaskArrived = false; - MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null }); - logInfo = GetClassName() + "通知中控产品全部已从治具中取出,状态变成NotReady"; - MessageQueue.Instance.Insert(logInfo); unloadOk = true; - TestCenter.Instance.LoadTestUnLoadResult(); + MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null }); LoadAndUnloadTask.Instance.Clear(1); - MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); Step = ETurnoverFlowStep.等待任务; } - } + else + { + if (LoadAndUnloadTask.Instance.TestUnloadTaskArrived) + { + hasUnloadFlag = false; + LoadAndUnloadTask.Instance.TestUnloadTaskArrived = false; + MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null }); + logInfo = GetClassName() + "通知中控产品全部已从治具中取出,状态变成NotReady"; + MessageQueue.Instance.Insert(logInfo); + unloadOk = true; + TestCenter.Instance.LoadTestUnLoadResult(); + LoadAndUnloadTask.Instance.Clear(1); + MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting); + Step = ETurnoverFlowStep.等待任务; + } + } - break; + break; + } } + } + public void Start() + { + stop = false; + } + public void Stop() + { + stop = true; + } + public string GetClassName() + { + return "TurnoverFlow_"; + } public bool LoadFinished() { return loadOk; diff --git a/Rs.SkyLine/Flow/SafePosFlow/DischargeModuleGoSafePosFlow.cs b/Rs.SkyLine/Flow/SafePosFlow/DischargeModuleGoSafePosFlow.cs index 1bd03fc..e8202b2 100644 --- a/Rs.SkyLine/Flow/SafePosFlow/DischargeModuleGoSafePosFlow.cs +++ b/Rs.SkyLine/Flow/SafePosFlow/DischargeModuleGoSafePosFlow.cs @@ -60,11 +60,11 @@ namespace Rs.MotionPlat.Flow.SafePosFlow step = EDischargeModuleGoSafePosFlowStep.到安全位; while (true && !finished) { - if (MachineManage.Instance.MachineStatus == EMachineStatus.Stop) - { - Thread.Sleep(10); - continue; - } + //if (MachineManage.Instance.MachineStatus == EMachineStatus.Stop) + //{ + // Thread.Sleep(10); + // continue; + //} switch (step) { case EDischargeModuleGoSafePosFlowStep.到安全位: diff --git a/Rs.SkyLine/Flow/SafePosFlow/TransitModuleSafePosFlow.cs b/Rs.SkyLine/Flow/SafePosFlow/TransitModuleSafePosFlow.cs index 6fd767a..d8aa3ef 100644 --- a/Rs.SkyLine/Flow/SafePosFlow/TransitModuleSafePosFlow.cs +++ b/Rs.SkyLine/Flow/SafePosFlow/TransitModuleSafePosFlow.cs @@ -78,11 +78,11 @@ namespace Rs.MotionPlat.Flow.SafePosFlow } while (!finished) { - if (MachineManage.Instance.MachineStatus == EMachineStatus.Stop) - { - Thread.Sleep(10); - continue; - } + //if (MachineManage.Instance.MachineStatus == EMachineStatus.Stop) + //{ + // Thread.Sleep(10); + // continue; + //} switch (step) { case ETransitModuleSafePosFlowStep.抬起Z轴: diff --git a/Rs.SkyLine/Properties/AssemblyInfo.cs b/Rs.SkyLine/Properties/AssemblyInfo.cs index 029445a..ecd6b66 100644 --- a/Rs.SkyLine/Properties/AssemblyInfo.cs +++ b/Rs.SkyLine/Properties/AssemblyInfo.cs @@ -31,6 +31,6 @@ using System.Runtime.InteropServices; // //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //通过使用 "*",如下所示: - [assembly: AssemblyVersion("3.20.24.13")] + [assembly: AssemblyVersion("3.20.24.14")] //[assembly: AssemblyVersion("1.0.0.0")] //[assembly: AssemblyFileVersion("1.0.0.0")]