From 37bc0300e400dc41fa6d5ed6af303ef17d4cc1d5 Mon Sep 17 00:00:00 2001 From: lhiven Date: Sun, 26 Nov 2023 14:47:12 +0900 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E7=9B=B8=E6=9C=BA?= =?UTF-8?q?=E6=89=AB=E7=A0=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Rs.SkyLine/Commom/Enums.cs | 9 + Rs.SkyLine/Commom/GlobalVar.cs | 44 +++ Rs.SkyLine/Commom/NozzleCollection.cs | 43 +++ Rs.SkyLine/Flow/AlarmConstID.cs | 12 +- Rs.SkyLine/Flow/LoadAndUnloadTask.cs | 12 + .../NgFlow/TransitModuleTackinessCheck.cs | 4 +- Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs | 333 +++++++++++------- Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs | 16 +- .../Flow/SubFlow/UpCameraScanBarCodeFlow.cs | 89 +++++ Rs.SkyLine/Rs.SkyLine.csproj | 1 + 10 files changed, 423 insertions(+), 140 deletions(-) create mode 100644 Rs.SkyLine/Flow/SubFlow/UpCameraScanBarCodeFlow.cs diff --git a/Rs.SkyLine/Commom/Enums.cs b/Rs.SkyLine/Commom/Enums.cs index 55572fd..2a48b05 100644 --- a/Rs.SkyLine/Commom/Enums.cs +++ b/Rs.SkyLine/Commom/Enums.cs @@ -21,4 +21,13 @@ namespace Rs.MotionPlat.Commom Test, Warning } + + /// + /// IO操作 + /// + public enum EIoOperate + { + Open, + Close + } } diff --git a/Rs.SkyLine/Commom/GlobalVar.cs b/Rs.SkyLine/Commom/GlobalVar.cs index 51db801..0b42ae6 100644 --- a/Rs.SkyLine/Commom/GlobalVar.cs +++ b/Rs.SkyLine/Commom/GlobalVar.cs @@ -452,5 +452,49 @@ namespace Rs.Framework return SysConfigParam.GetValue (nameof(EnableTestFixtureFiberCheck)); } } + + /// + /// 排料吸嘴放料仓偏移 + /// + public static double DischargeNozzleDumpStockTrayOffset + { + get + { + return SysConfigParam.GetValue(nameof(DischargeNozzleDumpStockTrayOffset)); + } + } + + /// + /// 排料吸嘴放周转盘偏移 + /// + public static double DischargeNozzleDumpTurnoverTrayOffset + { + get + { + return SysConfigParam.GetValue(nameof(DischargeNozzleDumpTurnoverTrayOffset)); + } + } + + /// + /// 周转吸嘴放周转盘偏移 + /// + public static double TurnoverNozzleDumpStockTrayOffset + { + get + { + return SysConfigParam.GetValue(nameof(TurnoverNozzleDumpStockTrayOffset)); + } + } + + /// + /// 周转吸嘴放治具盘偏移 + /// + public static double TurnoverNozzleDumpTurnoverTrayOffset + { + get + { + return SysConfigParam.GetValue(nameof(TurnoverNozzleDumpTurnoverTrayOffset)); + } + } } } diff --git a/Rs.SkyLine/Commom/NozzleCollection.cs b/Rs.SkyLine/Commom/NozzleCollection.cs index 98ccd52..1224702 100644 --- a/Rs.SkyLine/Commom/NozzleCollection.cs +++ b/Rs.SkyLine/Commom/NozzleCollection.cs @@ -7,6 +7,7 @@ using System.Data; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace Rs.MotionPlat.Commom @@ -73,6 +74,7 @@ namespace Rs.MotionPlat.Commom public bool Reset() { this.Status = ENozzleStatus.IDLE; + this.SN = ""; //this.FromType = TurnoverType.Unknown; //this.FromFloor = 0; //this.FromIndex = 0; @@ -82,6 +84,47 @@ namespace Rs.MotionPlat.Commom return Update(); } + + /// + /// 真空吸操作 + /// + public void VacSuction( EIoOperate op) + { + if(op== EIoOperate.Open) + { + Ops.On($"{NozzleIndex}号排料吸嘴真空吸"); + Thread.Sleep(GlobalVar.LoadNozzleOpenVacSuctionDelaytime); + } + else + { + Ops.Off($"{NozzleIndex}号排料吸嘴真空吸"); + Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); + } + } + + /// + /// 真空破操作 + /// + public void VacBreak(EIoOperate op) + { + if (op == EIoOperate.Open) + { + Ops.On($"{NozzleIndex}号排料吸嘴真空破"); + } + else + { + Ops.Off($"{NozzleIndex}号排料吸嘴真空破"); + } + } + + /// + /// 通过真空吸判断吸嘴是否有产品 + /// + /// + public bool HasProduct() + { + return Ops.IsOn($"{NozzleIndex}号排料吸嘴真空吸"); + } } public static class NozzleManager diff --git a/Rs.SkyLine/Flow/AlarmConstID.cs b/Rs.SkyLine/Flow/AlarmConstID.cs index fa5d1a5..21444b1 100644 --- a/Rs.SkyLine/Flow/AlarmConstID.cs +++ b/Rs.SkyLine/Flow/AlarmConstID.cs @@ -85,14 +85,14 @@ namespace Rs.MotionPlat.Flow public const int StockLoadAlarm = 15; /// - /// 周转吸嘴粘料报警 + ///吸嘴粘料报警 /// - public const int TransitNozzleTackinessAlarm = 16; + public const int NozzleTackinessAlarm = 16; /// - /// 测试位上方丢料报警 + /// 吸嘴丢料报警 /// - public const int TestPosLoseMaterialAlarm = 17; + public const int NozzlesLoseMaterialAlarm = 17; /// /// 周转吸头取料失败报警 @@ -111,6 +111,8 @@ namespace Rs.MotionPlat.Flow /// /// 料仓缺料盘报警 /// - public const int StockLackTrayAlarm = 20; + public const int StockLackTrayAlarm = 21; + + } } diff --git a/Rs.SkyLine/Flow/LoadAndUnloadTask.cs b/Rs.SkyLine/Flow/LoadAndUnloadTask.cs index cd6297f..0a551bd 100644 --- a/Rs.SkyLine/Flow/LoadAndUnloadTask.cs +++ b/Rs.SkyLine/Flow/LoadAndUnloadTask.cs @@ -139,6 +139,18 @@ namespace Rs.MotionPlat.Flow tilist.AddRange(changeTaskList.Where(tr => tr.Dealed == false)); return tilist; } + + /// + /// 获取还没有执行的放到周转盘的任务 + /// + /// + public List GetUndealedLoadToTurnoverTask() + { + List tilist = new List(); + tilist.AddRange(loadTaskList.Where(tr => tr.Dealed == false)); + tilist.AddRange(changeTaskList.Where(tr => tr.Dealed == false)); + return tilist; + } /// /// 清除未执行的任务 /// diff --git a/Rs.SkyLine/Flow/NgFlow/TransitModuleTackinessCheck.cs b/Rs.SkyLine/Flow/NgFlow/TransitModuleTackinessCheck.cs index 4e99e44..68ec899 100644 --- a/Rs.SkyLine/Flow/NgFlow/TransitModuleTackinessCheck.cs +++ b/Rs.SkyLine/Flow/NgFlow/TransitModuleTackinessCheck.cs @@ -42,8 +42,8 @@ namespace Rs.MotionPlat.Flow.NgFlow //弹框粘料报警 alarmInfo = $"周转吸嘴{string.Join(",", ngNozzle)}号粘料,请移动到安全位后手动处理"; LogHelper.Debug(alarmInfo); - TestCenterMessageBox.Show(AlarmConstID.TransitNozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.TransitNozzleTackinessAlarm); + TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); switch (msgBox.Button) { case ETipButton.Skip: diff --git a/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs b/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs index 8d555c6..568e4a8 100644 --- a/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs +++ b/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs @@ -14,6 +14,7 @@ using Rs.MotionPlat.Flow.SubFlow; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.Eventing.Reader; using System.IO; using System.Linq; using System.Text; @@ -44,6 +45,7 @@ namespace Rs.MotionPlat.Flow 等待视觉处理结果, 到放料位上方, 等待到放料位上方, + 丢料检测, 到放料位下方, 等待到放料位下方, 到放料关破真空位, @@ -52,6 +54,7 @@ namespace Rs.MotionPlat.Flow 放料完成抬起, 等待放料完成抬起, 放料真空检测, + 粘料检测, 周转盘放料真空报警, 放料任务完成, 任务结束到安全位, @@ -566,7 +569,7 @@ namespace Rs.MotionPlat.Flow if (XYCanMove() || GlobalVar.VirtualAxis) { StockTrayToTurnoverTray = !StockTrayToTurnoverTray; - logInfo = $"{nameof(DischargeFlow)}-到下相机拍照起始位"; + logInfo = GetClassName() + $"到下相机拍照起始位"; MessageQueue.Instance.Insert(logInfo); if(!GlobalVar.VirtualAxis) { @@ -593,7 +596,7 @@ namespace Rs.MotionPlat.Flow case EDischargeFlowStep.等待到下相机拍照起始位: if (Ops.IsStop("LoadX", "LoadY") || GlobalVar.VirtualAxis) { - logInfo = $"{nameof(DischargeFlow)}-已运动到下相机拍照起始位"; + logInfo = GetClassName() + $"已运动到下相机拍照起始位"; MessageQueue.Instance.Insert(logInfo); if (!GlobalVar.VirtualAxis) { @@ -633,7 +636,7 @@ namespace Rs.MotionPlat.Flow case EDischargeFlowStep.到下相机拍照结束位: if (XYCanMove() || GlobalVar.VirtualAxis) { - logInfo = $"{nameof(DischargeFlow)}-到下相机拍照结束位"; + logInfo = GetClassName() + $"到下相机拍照结束位"; MessageQueue.Instance.Insert(logInfo); IoManager.Instance.WriteOut("下左相机光源触发", 1); Thread.Sleep(50); @@ -659,7 +662,7 @@ namespace Rs.MotionPlat.Flow case EDischargeFlowStep.等待到下相机拍照结束位: if (Ops.IsStop("LoadX") || GlobalVar.VirtualAxis) { - logInfo = $"{nameof(DischargeFlow)}-已运动到下相机拍照结束位"; + logInfo = GetClassName() + $"已运动到下相机拍照结束位"; MessageQueue.Instance.Insert(logInfo); if(!GlobalVar.VirtualAxis) { @@ -673,7 +676,7 @@ namespace Rs.MotionPlat.Flow imgs = ImageProcess.GetAutoImage(); if ((imgs != null && imgs.Length == needGrabNum)|| GlobalVar.VirtualAxis) { - logInfo = $"{nameof(DischargeFlow)}-相机拍照完成,准备处理照片"; + logInfo = GetClassName() + $"相机拍照完成,准备处理照片"; MessageQueue.Instance.Insert(logInfo); if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) { @@ -707,7 +710,7 @@ namespace Rs.MotionPlat.Flow mrs = VisionProcess.Instance.MatchDownCam(imgs); if (mrs != null && mrs.Count == imgs.Length && (mrs.Where(m=>m.IsOK==true).Count()==imgs.Length || GlobalVar.DownCameraFlyRegrabNum==0)) { - logInfo = $"{nameof(DischargeFlow)}-图片处理完成,准备放料"; + logInfo = GetClassName() + $"图片处理完成,准备放料"; MessageQueue.Instance.Insert(logInfo); int count = 0; foreach (Nozzle nozzle in NozzleManager.GetNozzlesByStatus( ENozzleStatus.ToUnload)) @@ -751,7 +754,7 @@ namespace Rs.MotionPlat.Flow else { reGrabCount = 0; - alarmInfo = $"【{string.Join(",", errCodeList)}】号排料吸嘴拍照失败"; + alarmInfo = $"{string.Join(",", errCodeList)}号排料吸嘴拍照失败"; //DialogResult dr = Msg.ShowQuestion(, System.Windows.Forms.MessageBoxButtons.RetryCancel); TestCenterMessageBox.Show(AlarmConstID.DownCameraFlyFailAlarm, alarmInfo, ETipButton.Retry | ETipButton.Cancel); box = TestCenterMessageBox.WaitResult(AlarmConstID.DownCameraFlyFailAlarm); @@ -781,24 +784,24 @@ namespace Rs.MotionPlat.Flow { if (curNozzle.ToType == TurnoverType.Turnover) { - logInfo = $"{nameof(DischargeFlow)}-{curNozzle.NozzleIndex}号排料吸嘴到周转盘{curNozzle.ToIndex + 1}号穴位上方"; + logInfo = GetClassName() + $"号排料吸嘴到周转盘{curNozzle.ToIndex + 1}号穴位上方"; MessageQueue.Instance.Insert(logInfo); curSlotPoint = TrayPointManager.GetSlotPoint( EStockType.Turnover, curNozzle.ToIndex + 1); turnoverOffsetPoint = TurnoverSlotOffset.GetOffsetPoint(curNozzle.ToIndex + 1); } else if (curNozzle.ToType == TurnoverType.ToBeTested) { - downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); - if (downSlot != null) - { - curSlotPoint = TrayPointManager.GetSlotPoint( EStockType.Input, downSlot.Index); - logInfo = $"{nameof(DischargeFlow)}-{curNozzle.NozzleIndex}号排料吸嘴到input盘{downSlot.Index}号穴位上方"; - MessageQueue.Instance.Insert(logInfo); - } - else - { + //downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); + //if (downSlot != null) + //{ + // curSlotPoint = TrayPointManager.GetSlotPoint( EStockType.Input, downSlot.Index); + // logInfo = $"{nameof(DischargeFlow)}-{curNozzle.NozzleIndex}号排料吸嘴到input盘{downSlot.Index}号穴位上方"; + // MessageQueue.Instance.Insert(logInfo); + //} + //else + //{ - } + //} } else if (curNozzle.ToType == TurnoverType.Passed) { @@ -918,120 +921,192 @@ namespace Rs.MotionPlat.Flow { logInfo = $"{nameof(DischargeFlow)}-{curNozzle.NozzleIndex}号排料吸嘴已运动到放料位上方"; MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.丢料检测; + } + break; + case EDischargeFlowStep.丢料检测: + //获取所有需要放料的吸嘴,检测真空是否还在,如果真空异常则报警 + List lostNozzles = new List(); + List toUnloadNozzles = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload); + foreach (var nozzle in toUnloadNozzles) + { + if(!Ops.IsOn("")) + { + lostNozzles.Add(nozzle); + } + } + if(lostNozzles.Count>0) + { + //弹框报警 + alarmInfo = $"{lostNozzles.Select(ln=>ln.NozzleIndex).ToJoinString()}丢料报警"; + //TestCenterMessageBox.Show(1, alarmInfo,); + msgBox = TestCenterMessageBox.WaitResult(1); + switch (msgBox.Button) + { + case ETipButton.Skip: + lostNozzles.ForEach(ln => ln.Reset()); + break; + case ETipButton.Yes: + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + break; + default: + break; + } + } + else + { flowStep = EDischargeFlowStep.到放料位下方; } break; + //case EDischargeFlowStep.到放料位下方: + // DischargeDumpFlow.Instance.Start(curNozzle.ToType, curNozzle.NozzleIndex, curNozzle.ToIndex); + // flowStep = EDischargeFlowStep.等待放料完成抬起; + // break; case EDischargeFlowStep.到放料位下方: - DischargeDumpFlow.Instance.Start(curNozzle.ToType, curNozzle.NozzleIndex, curNozzle.ToIndex); - flowStep = EDischargeFlowStep.等待放料完成抬起; + + if (curNozzle.ToType == TurnoverType.Turnover) + { + targetPos = SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"); + } + else + { + targetPos = SysConfigParam.GetValue($"TrayNozzle{curNozzle.NozzleIndex}TakeHeight") + GlobalVar.DischargeNozzleDumpStockTrayOffset; + } + errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetPos, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + logInfo = GetClassName() + $"{curNozzle.NozzleIndex}号排料吸嘴到放料位下方"; + MessageQueue.Instance.Insert(logInfo); + VirtualAxisSleep(); + flowStep = EDischargeFlowStep.等待到放料位下方; + } + else + { + MoveFailAlarm($"NozzleZ{curNozzle.NozzleIndex}", errCode); + } + break; + case EDischargeFlowStep.等待到放料位下方: + if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) + { + logInfo = GetClassName()+ $"{curNozzle.NozzleIndex}号排料吸嘴已运动到放料位下方"; + MessageQueue.Instance.Insert(logInfo); + if (curNozzle.ToType == TurnoverType.Turnover) + { + /*打开周转盘真空吸*/ + logInfo = GetClassName() + $"打开周转盘{curNozzle.ToIndex + 1}号穴位真空吸"; + MessageQueue.Instance.Insert(logInfo); + Ops.On($"周转盘{curNozzle.ToIndex + 1}号穴位真空吸"); + Thread.Sleep(GlobalVar.TurnoverTrayOpenVacSuctionDelaytime); + /*关闭排料吸嘴真空吸*/ + logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸"; + MessageQueue.Instance.Insert(logInfo); + Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀");//关闭真空 + Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); + /*打开排料吸嘴真空破*/ + logInfo = GetClassName() + $"打开{curNozzle.NozzleIndex}号排料吸嘴真空破"; + MessageQueue.Instance.Insert(logInfo); + Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); + Thread.Sleep(GlobalVar.LoadNozzleOpenVacBreakDelaytime); + flowStep = EDischargeFlowStep.到放料关破真空位; + } + else + { + /*关闭排料吸嘴真空吸*/ + logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸"; + MessageQueue.Instance.Insert(logInfo); + Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀"); + Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); + /*关闭排料吸嘴真空吸*/ + logInfo = GetClassName() + $"打开{curNozzle.NozzleIndex}号排料吸嘴真空破"; + MessageQueue.Instance.Insert(logInfo); + Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); + Thread.Sleep(GlobalVar.LoadNozzleOpenVacBreakDelaytime); + /*关闭排料吸嘴真空吸*/ + logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空破"; + MessageQueue.Instance.Insert(logInfo); + Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); + Thread.Sleep(GlobalVar.LoadNozzleCloseVacBreakDelaytime); + flowStep = EDischargeFlowStep.放料完成抬起; + } + } + break; + case EDischargeFlowStep.到放料关破真空位: + targetPos = SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight")+GlobalVar.DischargeNozzleDumpTurnoverTrayOffset; + errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetPos, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + logInfo = GetClassName() + $"{curNozzle.NozzleIndex}号排料吸嘴周转盘放料完成,准备抬起{GlobalVar.DischargeNozzleDumpTurnoverTrayOffset}mm后关闭破真空"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.等待到放料关破真空位; + } + else + { + MoveFailAlarm($"NozzleZ{curNozzle.NozzleIndex}", errCode); + } + break; + case EDischargeFlowStep.等待到放料关破真空位: + if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) + { + /*关闭排料吸嘴真空破*/ + Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); + Thread.Sleep(GlobalVar.LoadNozzleCloseVacBreakDelaytime); + logInfo = GetClassName() + $"{curNozzle.NozzleIndex}号排料吸嘴抬起{GlobalVar.DischargeNozzleDumpTurnoverTrayOffset}mm后关闭破真空"; + MessageQueue.Instance.Insert(logInfo); + flowStep = EDischargeFlowStep.放料完成抬起; + } + break; + case EDischargeFlowStep.放料完成抬起: + errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed); + if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) + { + logInfo = GetClassName() + $"{curNozzle.NozzleIndex}号排料吸嘴放料完成抬起"; + MessageQueue.Instance.Insert(logInfo); + if (GlobalVar.VirtualAxis) + { + Thread.Sleep(GlobalVar.VirtualAxisMoveTime); + } + flowStep = EDischargeFlowStep.等待放料完成抬起; + } + else + { + MoveFailAlarm($"NozzleZ{curNozzle.NozzleIndex}", errCode); + } break; - //case EWorkFlowStep.到放料位下方: - // logInfo = $"【{curNozzle.NozzleIndex}】号排料吸嘴到放料位下方"; - // MessageQueue.Instance.Insert(logInfo); - // if (curNozzle.ToType == TurnoverType.Turnover) - // { - // targetPos = SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"); - // } - // else - // { - // targetPos = SysConfigParam.GetValue($"TrayNozzle{curNozzle.NozzleIndex}TakeHeight") + 1; - // } - // errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetPos, GlobalVar.WholeSpeed); - // if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - // { - // VirtualAxisSleep(); - // flowStep = EWorkFlowStep.等待到放料位下方; - // } - // else - // { - // MoveFailAlarm($"NozzleZ{curNozzle.NozzleIndex}", errCode); - // } - // break; - //case EWorkFlowStep.等待到放料位下方: - // if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - // { - // logInfo = $"【{curNozzle.NozzleIndex}】号排料吸嘴已运动到放料位下方"; - // MessageQueue.Instance.Insert(logInfo); - // if (curNozzle.ToType== TurnoverType.Turnover) - // { - // /*打开周转盘真空吸*/ - // MessageQueue.Instance.Insert($"打开周转盘{curNozzle.ToIndex + 1}号穴位真空吸"); - // Ops.On($"周转盘{curNozzle.ToIndex + 1}号穴位真空吸"); - // Thread.Sleep(GlobalVar.TurnoverTrayOpenVacSuctionDelaytime); - // /*关闭排料吸嘴真空吸*/ - // MessageQueue.Instance.Insert($"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸"); - // Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀");//关闭真空 - // Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); - // /*打开排料吸嘴真空破*/ - // MessageQueue.Instance.Insert($"打开{curNozzle.NozzleIndex}号排料吸嘴真空破"); - // Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); - // Thread.Sleep(GlobalVar.LoadNozzleOpenVacBreakDelaytime); - // flowStep = EWorkFlowStep.到放料关破真空位; - // } - // else - // { - // /*关闭排料吸嘴真空吸*/ - // MessageQueue.Instance.Insert($"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸"); - // Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀"); - // Thread.Sleep(GlobalVar.LoadNozzleCloseVacSuctionDelaytime); - // /*关闭排料吸嘴真空吸*/ - // MessageQueue.Instance.Insert($"打开{curNozzle.NozzleIndex}号排料吸嘴真空破"); - // Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); - // Thread.Sleep(GlobalVar.LoadNozzleOpenVacBreakDelaytime); - // /*关闭排料吸嘴真空吸*/ - // MessageQueue.Instance.Insert($"关闭{curNozzle.NozzleIndex}号排料吸嘴真空破"); - // Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); - // Thread.Sleep(GlobalVar.LoadNozzleCloseVacBreakDelaytime); - // flowStep = EWorkFlowStep.放料完成抬起; - // } - // } - // break; - //case EWorkFlowStep.到放料关破真空位: - // targetPos = SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"); - // errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(targetPos + 1, GlobalVar.WholeSpeed); - // if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - // { - // MessageQueue.Instance.Insert($"{curNozzle.NozzleIndex}号排料吸嘴周转盘放料完成,准备微微抬起"); - // flowStep = EWorkFlowStep.等待到放料关破真空位; - // } - // else - // { - // MoveFailAlarm($"NozzleZ{curNozzle.NozzleIndex}", errCode); - // } - // break; - //case EWorkFlowStep.等待到放料关破真空位: - // if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) - // { - // /*关闭排料吸嘴真空破*/ - // Ops.Off($"{curNozzle.NozzleIndex}号吸嘴真空破电磁阀"); - // Thread.Sleep(GlobalVar.LoadNozzleCloseVacBreakDelaytime); - // MessageQueue.Instance.Insert($"{curNozzle.NozzleIndex}号排料吸嘴微微抬起后关闭破真空"); - // flowStep = EWorkFlowStep.放料完成抬起; - // } - // break; - //case EWorkFlowStep.放料完成抬起: - // errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed); - // if (errCode == ErrorCode.Ok || GlobalVar.VirtualAxis) - // { - // if (GlobalVar.VirtualAxis) - // { - // Thread.Sleep(GlobalVar.VirtualAxisMoveTime); - // } - // logInfo = $"{curNozzle.NozzleIndex}号排料吸嘴放料完成抬起"; - // MessageQueue.Instance.Insert(logInfo); - // flowStep = EWorkFlowStep.等待放料完成抬起; - // } - // else - // { - // MoveFailAlarm($"NozzleZ{curNozzle.NozzleIndex}", errCode); - // } - // break; case EDischargeFlowStep.等待放料完成抬起: if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}") || GlobalVar.VirtualAxis) { - logInfo = $"{nameof(DischargeFlow)}-{curNozzle.NozzleIndex}号排料吸嘴放料完成已起位,准备真空检测"; + logInfo = GetClassName()+$"{curNozzle.NozzleIndex}号排料吸嘴放料完成已起位,准备真空检测"; MessageQueue.Instance.Insert(logInfo); - flowStep = EDischargeFlowStep.放料真空检测; + flowStep = EDischargeFlowStep.粘料检测; + } + break; + case EDischargeFlowStep.粘料检测: + curNozzle.VacSuction(EIoOperate.Open); + if(curNozzle.HasProduct()) + { + //粘料报警,提示用户粘料,移动到安全位,或者点击跳过 + alarmInfo = $"{curNozzle.NozzleIndex}号吸嘴可能粘料,请查看吸嘴状态后处理"; + TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); + switch (msgBox.Button) + { + case ETipButton.Skip: + logInfo =GetClassName()+ "选择了跳过按钮"; + MessageQueue.Instance.Insert(logInfo); + break; + case ETipButton.Yes: + logInfo = GetClassName() + "选择了移动到安全位按钮"; + MessageQueue.Instance.Insert(logInfo); + DischargeModuleGoSafePosFlow.Instance.GoSafePostion(); + TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm); + break; + } + } + else + { + curNozzle.VacSuction(EIoOperate.Close); + flowStep = EDischargeFlowStep.放料任务完成; } break; case EDischargeFlowStep.放料真空检测: @@ -1114,7 +1189,7 @@ namespace Rs.MotionPlat.Flow } break; case EDischargeFlowStep.放料任务完成: - logInfo = $"{nameof(DischargeFlow)}-放料任务完成"; + logInfo = GetClassName()+ $"{curNozzle.ToType}盘放料任务完成"; MessageQueue.Instance.Insert(logInfo); //AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").Home(); //MessageQueue.Instance.Insert($"{curNozzle.NozzleIndex}号排料吸嘴回原"); @@ -1156,6 +1231,14 @@ namespace Rs.MotionPlat.Flow } else { + if(curNozzle.ToType== TurnoverType.Turnover) + { + if (LoadAndUnloadTask.Instance.GetUndealedLoadToTurnoverTask().Count == 0) + { + //没有需要给周转盘上料的任务后,就开始上相机扫码 + } + } + if (LoadAndUnloadTask.Instance.GetUnDealedTask().Count > 0) { flowStep = EDischargeFlowStep.到取料位上方; @@ -1406,6 +1489,6 @@ namespace Rs.MotionPlat.Flow { return flowStep.ToString(); } - + } } diff --git a/Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs b/Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs index bc311ae..2ab44af 100644 --- a/Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs +++ b/Rs.SkyLine/Flow/NormalFlow/TurnoverFlow.cs @@ -465,8 +465,8 @@ namespace Rs.MotionPlat.Flow if (loseSlots.Count > 0) { alarmInfo = $"周转{string.Join(",", loseSlots)}号吸嘴真空异常丢料,请处理"; - TestCenterMessageBox.Show(AlarmConstID.TestPosLoseMaterialAlarm, alarmInfo,MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.TestPosLoseMaterialAlarm); + TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo,MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm); switch (msgBox.Button) { case ETipButton.Skip: @@ -599,8 +599,8 @@ namespace Rs.MotionPlat.Flow { //粘料报警 alarmInfo = $"周转{string.Join(",", loseSlots)}号吸嘴真空异常粘料,请手工处理"; - TestCenterMessageBox.Show(AlarmConstID.TestPosLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.TestPosLoseMaterialAlarm); + TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm); switch (msgBox.Button) { case ETipButton.Skip: @@ -1076,8 +1076,8 @@ namespace Rs.MotionPlat.Flow if (loseSlots.Count > 0) { alarmInfo = $"周转{string.Join(",", loseSlots)}号吸嘴真空异常丢料,请处理"; - TestCenterMessageBox.Show(AlarmConstID.TestPosLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.TestPosLoseMaterialAlarm); + TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm); switch (msgBox.Button) { case ETipButton.Skip: @@ -1223,8 +1223,8 @@ namespace Rs.MotionPlat.Flow { //粘料报警 alarmInfo = $"周转{string.Join(",", loseSlots)}号吸嘴真空异常粘料,请手工处理"; - TestCenterMessageBox.Show(AlarmConstID.TestPosLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); - msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.TestPosLoseMaterialAlarm); + TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText()); + msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm); switch (msgBox.Button) { case ETipButton.Skip: diff --git a/Rs.SkyLine/Flow/SubFlow/UpCameraScanBarCodeFlow.cs b/Rs.SkyLine/Flow/SubFlow/UpCameraScanBarCodeFlow.cs new file mode 100644 index 0000000..d6ec76f --- /dev/null +++ b/Rs.SkyLine/Flow/SubFlow/UpCameraScanBarCodeFlow.cs @@ -0,0 +1,89 @@ +using Rs.Framework; +using Rs.MotionPlat.Commom; +using Rs.MotionPlat.Entitys.Trays; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Rs.MotionPlat.Flow.SubFlow +{ + + enum EUpCameraScanBarCodeFlowStep + { + 到扫码起始位, + 到扫码结束位, + 等待扫码结束, + 拍照结果处理, + 到扫码位上方, + 等待运动到扫码位上方, + 定点扫码, + 定点扫码结果处理 + } + + /// + /// 上相机扫码流程 + /// + public class UpCameraScanBarCodeFlow + { + private UpCameraScanBarCodeFlow() { } + private static UpCameraScanBarCodeFlow instance; + public static UpCameraScanBarCodeFlow Instance + { + get + { + if(instance == null) + instance = new UpCameraScanBarCodeFlow(); + return instance; + } + } + + private EUpCameraScanBarCodeFlowStep step = EUpCameraScanBarCodeFlowStep.到扫码起始位; + + /// + /// 开始扫码,先把所有的穴位全部扫一遍,扫不到的最后再定点扫码, + /// 如果定位失败的穴位,即便没有扫到码,也不再扫码 + /// + public void Scan() + { + int row = 1; + List slots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have); + + slots.Where(s => s.Index > GlobalTray.TurnoverTray.ColumnNum).ToList(); + while(true) + { + if(row==1) + { + slots.Where(s => s.Index <= GlobalTray.TurnoverTray.ColumnNum).ToList(); + } + if(MachineManage.Instance.MachineStatus == EMachineStatus.Stop) + { + Thread.Sleep(10); + continue; + } + switch (step) + { + case EUpCameraScanBarCodeFlowStep.到扫码起始位: + break; + case EUpCameraScanBarCodeFlowStep.到扫码结束位: + break; + case EUpCameraScanBarCodeFlowStep.等待扫码结束: + break; + case EUpCameraScanBarCodeFlowStep.拍照结果处理: + break; + case EUpCameraScanBarCodeFlowStep.到扫码位上方: + break; + case EUpCameraScanBarCodeFlowStep.等待运动到扫码位上方: + break; + case EUpCameraScanBarCodeFlowStep.定点扫码: + break; + case EUpCameraScanBarCodeFlowStep.定点扫码结果处理: + break; + } + } + + } + } +} diff --git a/Rs.SkyLine/Rs.SkyLine.csproj b/Rs.SkyLine/Rs.SkyLine.csproj index 48fe450..852b079 100644 --- a/Rs.SkyLine/Rs.SkyLine.csproj +++ b/Rs.SkyLine/Rs.SkyLine.csproj @@ -184,6 +184,7 @@ +