diff --git a/Rs.SkyLine/Flow/AlarmConstID.cs b/Rs.SkyLine/Flow/AlarmConstID.cs index bb07f17..91dd810 100644 --- a/Rs.SkyLine/Flow/AlarmConstID.cs +++ b/Rs.SkyLine/Flow/AlarmConstID.cs @@ -419,9 +419,14 @@ namespace Rs.MotionPlat.Flow /// /// 料盘未放下报警 /// - public const int 料盘未放下报警 = 1096; + public const int 料盘未放下报警 = 1096; + /// + /// 二维码重码报警 + /// + public const int 二维码重码报警 = 1097; + @@ -654,5 +659,6 @@ namespace Rs.MotionPlat.Flow /// 扫码失败报警 /// public const int ScanBarCodeFailAlarm = 58; + } } diff --git a/Rs.SkyLine/Flow/LoadAndUnloadTask.cs b/Rs.SkyLine/Flow/LoadAndUnloadTask.cs index 15a0c80..0469e71 100644 --- a/Rs.SkyLine/Flow/LoadAndUnloadTask.cs +++ b/Rs.SkyLine/Flow/LoadAndUnloadTask.cs @@ -181,6 +181,15 @@ namespace Rs.MotionPlat.Flow turnoverResult.Add(turnoverInfo); } + /// + /// 移除掉重码的任务 + /// + /// + public void RemoveRepeatSnTask(int slotIndex) + { + turnoverResult = turnoverResult.Where(t => t.ToIndex != slotIndex).ToList(); + } + public void CopyBarcodeToTask(int slotIndex,string sn) { TurnoverInfo ti = turnoverResult.Where(r => r.ToIndex == slotIndex && r.ToType == TurnoverType.Turnover).First(); diff --git a/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs b/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs index 52331cf..9376c78 100644 --- a/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs +++ b/Rs.SkyLine/Flow/NormalFlow/DischargeFlow.cs @@ -2361,6 +2361,10 @@ namespace Rs.MotionPlat.Flow public void ScanBarCode() { + //需要检测的穴位 + List checkSlots = new List(); + int reScanNum = 0; + bool exitScan = false; SchedulingMessageBox box = new SchedulingMessageBox(); if (GlobalVar.RunSpace) { @@ -2390,243 +2394,307 @@ namespace Rs.MotionPlat.Flow } else { - //没有需要给周转盘上料的任务后,就开始上相机扫码 - //判断周转盘第一行有没有产品,如果有产品则拍第一行 - if (TurnoverTrayManager.Instance.HasProduct(ETrayRow.One)) - { - //找拍照起点和终点 - SlotPoint grabStartPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 1); - SlotPoint grabEndPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 8); - List result = UpCameraScanBarCodeFlow.Instance.ScanMulti(1, false); - //List result = UpCameraScanBarCodeFlow.Instance.Wait(); - foreach (var vr in result) + while(!exitScan) + { + checkSlots.Clear(); + reScanNum++; + //没有需要给周转盘上料的任务后,就开始上相机扫码 + //判断周转盘第一行有没有产品,如果有产品则拍第一行 + if (TurnoverTrayManager.Instance.HasProduct(ETrayRow.One)) { - if (TurnoverTrayManager.Instance.Slot(vr.SlotIndex).IsHasProduct) + //找拍照起点和终点 + SlotPoint grabStartPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 1); + SlotPoint grabEndPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 8); + List result = UpCameraScanBarCodeFlow.Instance.ScanMulti(1, false); + //List result = UpCameraScanBarCodeFlow.Instance.Wait(); + foreach (var vr in result) { - if (vr.SearchModelOK)//定位成功 + if (TurnoverTrayManager.Instance.Slot(vr.SlotIndex).IsHasProduct) { - if (!GlobalVar.EnableScanBarCodeByDownCamera) + if (vr.SearchModelOK)//定位成功 { - if (GlobalVar.RunSpace) - { - LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, VirtualBarCode.Code); - } - else + if (!GlobalVar.EnableScanBarCodeByDownCamera) { - if (vr.ScanBarCodeOK) + if (GlobalVar.RunSpace) { - OnShowGrabResult?.Invoke(vr, true); - //复制二维码 - LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vr.SN); - TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vr.SN; + LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, VirtualBarCode.Code); } else { - int failNum = 1; - while (true) + if (vr.ScanBarCodeOK) { - if (failNum < 4) - { - //如果扫码失败再重扫一次 - VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.ScanSingle(vr.SlotIndex, true, false, true); - //VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.WaitSingle(); - if (vrsigle.ScanBarCodeOK) - { - OnShowGrabResult?.Invoke(vrsigle, true); - LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vrsigle.SN); - TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vrsigle.SN; - break; - } - else - { - failNum++; - OnShowGrabResult?.Invoke(vrsigle, true); - //复制二维码 - //LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); - Thread.Sleep(500); - } - if (vrsigle != null) - { - vrsigle = null; - GC.Collect(); - } - } - else + OnShowGrabResult?.Invoke(vr, true); + //复制二维码 + LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vr.SN); + TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vr.SN; + checkSlots.Add(TurnoverTrayManager.Instance.Slot(vr.SlotIndex)); + } + else + { + int failNum = 1; + while (true) { - if (GlobalVar.ScanBarcodeFailAutoSkip) + if (failNum < 4) { - LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); - TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; - break; - } - else - { - alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.扫码失败), vr.SlotIndex); - Dictionary buttonTexts = new Dictionary() { - { ETipButton.Retry,"重试|Retry"}, - { ETipButton.Cancel,"自动移走|Auto remove"} - }; - box = PromptMessageBox.ShowDialog(AlarmConstID.扫码失败, alarmInfo, ETipButton.Retry | ETipButton.Cancel, buttonTexts); - if (box.Button == ETipButton.Retry) + //如果扫码失败再重扫一次 + VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.ScanSingle(vr.SlotIndex, true, false, true); + //VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.WaitSingle(); + if (vrsigle.ScanBarCodeOK) { - failNum = 1; + OnShowGrabResult?.Invoke(vrsigle, true); + LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vrsigle.SN); + TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vrsigle.SN; + checkSlots.Add(TurnoverTrayManager.Instance.Slot(vr.SlotIndex)); + break; } - else if (box.Button == ETipButton.Cancel) + else { - //OnShowGrabResult?.Invoke(vrsigle, true); + failNum++; + OnShowGrabResult?.Invoke(vrsigle, true); //复制二维码 + //LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); + Thread.Sleep(500); + } + if (vrsigle != null) + { + vrsigle = null; + GC.Collect(); + } + } + else + { + if (GlobalVar.ScanBarcodeFailAutoSkip) + { LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; break; } + else + { + alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.扫码失败), vr.SlotIndex); + Dictionary buttonTexts = new Dictionary() { + { ETipButton.Retry,"重试|Retry"}, + { ETipButton.Cancel,"自动移走|Auto remove"} + }; + box = PromptMessageBox.ShowDialog(AlarmConstID.扫码失败, alarmInfo, ETipButton.Retry | ETipButton.Cancel, buttonTexts); + if (box.Button == ETipButton.Retry) + { + failNum = 1; + } + else if (box.Button == ETipButton.Cancel) + { + //OnShowGrabResult?.Invoke(vrsigle, true); + //复制二维码 + LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); + TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; + break; + } + } } } } } } } + else + { + //定位失败,或者超出指定范围 + } } else { - //定位失败,或者超出指定范围 + OnShowGrabResult?.Invoke(vr, false); } + //vr.Dispose(); } - else + if (result != null && result.Count > 0) { - OnShowGrabResult?.Invoke(vr, false); + result.Clear(); + GC.Collect(); } - //vr.Dispose(); + //OnUpCameraGrabResult?.Invoke(result); } - if (result != null && result.Count > 0) - { - result.Clear(); - GC.Collect(); - } - //OnUpCameraGrabResult?.Invoke(result); - } - //判断周转盘第三行有没有产品,如果有产品则拍第三行 - if (TurnoverTrayManager.Instance.HasProduct(ETrayRow.Three)) - { - //找拍照起点和终点 - SlotPoint grabStartPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 17); - SlotPoint grabEndPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 24); - List result = UpCameraScanBarCodeFlow.Instance.ScanMulti(24, true); - // List result = UpCameraScanBarCodeFlow.Instance.Wait(); - foreach (var vr in result) + //判断周转盘第三行有没有产品,如果有产品则拍第三行 + if (TurnoverTrayManager.Instance.HasProduct(ETrayRow.Three)) { - if (TurnoverTrayManager.Instance.Slot(vr.SlotIndex).IsHasProduct) + //找拍照起点和终点 + SlotPoint grabStartPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 17); + SlotPoint grabEndPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 24); + List result = UpCameraScanBarCodeFlow.Instance.ScanMulti(24, true); + // List result = UpCameraScanBarCodeFlow.Instance.Wait(); + foreach (var vr in result) { - - if (vr.SearchModelOK)//定位成功 + if (TurnoverTrayManager.Instance.Slot(vr.SlotIndex).IsHasProduct) { - if (!GlobalVar.EnableScanBarCodeByDownCamera) + + if (vr.SearchModelOK)//定位成功 { - if (GlobalVar.RunSpace) + if (!GlobalVar.EnableScanBarCodeByDownCamera) { - LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, VirtualBarCode.Code); - } - else - { - if (vr.ScanBarCodeOK) + if (GlobalVar.RunSpace) { - OnShowGrabResult?.Invoke(vr, true); - //复制二维码 - LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vr.SN); - TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vr.SN; + LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, VirtualBarCode.Code); } else { - int failNum = 1; - while (true) + if (vr.ScanBarCodeOK) { - if (failNum < 4) - { - - //如果扫码失败再重扫一次 - VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.ScanSingle(vr.SlotIndex, true, false, true); - //VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.WaitSingle(); - if (vrsigle.ScanBarCodeOK) - { - OnShowGrabResult?.Invoke(vrsigle, true); - LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vrsigle.SN); - TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vrsigle.SN; - break; - } - else - { - failNum++; - OnShowGrabResult?.Invoke(vrsigle, true); - //复制二维码 - //LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); - Thread.Sleep(500); - } - if (vrsigle != null) - { - vrsigle = null; - GC.Collect(); - } - } - else + OnShowGrabResult?.Invoke(vr, true); + //复制二维码 + LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vr.SN); + TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vr.SN; + checkSlots.Add(TurnoverTrayManager.Instance.Slot(vr.SlotIndex)); + } + else + { + int failNum = 1; + while (true) { - //box = MsgBox.ShowDialog(AlarmConstID.ScanBarCodeFailAlarm, $"{vr.SlotIndex}穴位扫码失败", ETipButton.Retry | ETipButton.Skip); - if (GlobalVar.ScanBarcodeFailAutoSkip) + if (failNum < 4) { - LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); - TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; - break; - } - else - { - alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.扫码失败), vr.SlotIndex); - Dictionary buttonTexts = new Dictionary() - { - { ETipButton.Retry,"重试|Retry"}, - { ETipButton.Cancel,"自动移走|Auto remove"} - }; - box = PromptMessageBox.ShowDialog(AlarmConstID.扫码失败, alarmInfo, ETipButton.Retry | ETipButton.Cancel, buttonTexts); - if (box.Button == ETipButton.Retry) + + //如果扫码失败再重扫一次 + VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.ScanSingle(vr.SlotIndex, true, false, true); + //VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.WaitSingle(); + if (vrsigle.ScanBarCodeOK) { - failNum = 1; + OnShowGrabResult?.Invoke(vrsigle, true); + LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vrsigle.SN); + TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vrsigle.SN; + checkSlots.Add(TurnoverTrayManager.Instance.Slot(vr.SlotIndex)); + break; } - else if (box.Button == ETipButton.Cancel) + else { - //OnShowGrabResult?.Invoke(vrsigle, true); + failNum++; + OnShowGrabResult?.Invoke(vrsigle, true); //复制二维码 + //LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); + Thread.Sleep(500); + } + if (vrsigle != null) + { + vrsigle = null; + GC.Collect(); + } + } + else + { + //box = MsgBox.ShowDialog(AlarmConstID.ScanBarCodeFailAlarm, $"{vr.SlotIndex}穴位扫码失败", ETipButton.Retry | ETipButton.Skip); + if (GlobalVar.ScanBarcodeFailAutoSkip) + { LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; break; } + else + { + alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.扫码失败), vr.SlotIndex); + Dictionary buttonTexts = new Dictionary() + { + { ETipButton.Retry,"重试|Retry"}, + { ETipButton.Cancel,"自动移走|Auto remove"} + }; + box = PromptMessageBox.ShowDialog(AlarmConstID.扫码失败, alarmInfo, ETipButton.Retry | ETipButton.Cancel, buttonTexts); + if (box.Button == ETipButton.Retry) + { + failNum = 1; + } + else if (box.Button == ETipButton.Cancel) + { + //OnShowGrabResult?.Invoke(vrsigle, true); + //复制二维码 + LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); + TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; + break; + } + } } } } } } } + else + { + //定位失败,或者超出指定范围 + } } else { - //定位失败,或者超出指定范围 + OnShowGrabResult?.Invoke(vr, false); + } + //vr.Dispose(); + } + if (result != null && result.Count > 0) + { + result.Clear(); + GC.Collect(); + } + //OnUpCameraGrabResult?.Invoke(result); + + } + if(checkSlots!=null && checkSlots.Count>0) + { + var repeatList = checkSlots.GroupBy(s => s.SN).Where(k => k.Count() >= 2).ToList(); + if (repeatList != null && repeatList.Count > 0) + { + if (reScanNum >= 3) + { + List slots = new List(); + List repeatMsg = new List(); + //here need alarm and after take products out from tray point + foreach (var item in repeatList) + { + string repeatSnSlot = string.Join(" eq ", item.Select(s => s.Index)); + repeatMsg.Add(repeatSnSlot); + foreach (var rslot in item) + { + slots.Add(rslot.Index); + } + } + string msg = string.Join(",", repeatMsg); + alarmInfo = GetClassName() + msg; + MessageQueue.Instance.Warn(alarmInfo); + alarmEntity = AlarmCollection.Get(AlarmConstID.二维码重码报警).Transform(msg); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Retry, null, true); + //judge product taked away use upcamea + foreach (var item in slots) + { + while (true) + { + SlotProductHasOrNotResult haveProduct = UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, item); + if (haveProduct.HasProduct) + { + alarmEntity = AlarmCollection.Get(AlarmConstID.周转盘产品未取出).Transform(item); + AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Retry, null); + } + else + { + LoadAndUnloadTask.Instance.RemoveRepeatSnTask(item-1); + TurnoverTrayManager.Instance.Slot(item).ClearProduct(); + GlobalTray.TurnoverTray.ChangeStatus(item, ESlotStatus.NotHave); + break; + } + } + } + reScanNum = 0; } } else { - OnShowGrabResult?.Invoke(vr, false); + exitScan = true; } - //vr.Dispose(); } - if (result != null && result.Count > 0) + else { - result.Clear(); - GC.Collect(); + exitScan = true; } - //OnUpCameraGrabResult?.Invoke(result); - } } } } } - } /// diff --git a/Rs.SkyLine/Properties/AssemblyInfo.cs b/Rs.SkyLine/Properties/AssemblyInfo.cs index c74c9d9..d29ac7e 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.44")] + [assembly: AssemblyVersion("3.20.24.45")] //[assembly: AssemblyVersion("1.0.0.0")] //[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Rs.SkyLine/TestFrm.cs b/Rs.SkyLine/TestFrm.cs index c9addea..87cdd94 100644 --- a/Rs.SkyLine/TestFrm.cs +++ b/Rs.SkyLine/TestFrm.cs @@ -471,7 +471,7 @@ namespace Rs.MotionPlat TurnoverTrayManager.Instance.Slot(4).SN = "3"; TurnoverTrayManager.Instance.Slot(5).SN = "4"; TurnoverTrayManager.Instance.Slot(6).SN = "5"; - TurnoverTrayManager.Instance.Slot(7).SN = "6"; + TurnoverTrayManager.Instance.Slot(7).SN = "2"; TurnoverTrayManager.Instance.Slot(8).SN = "7"; List slotList= new List(); @@ -487,8 +487,13 @@ namespace Rs.MotionPlat var gb = slotList.GroupBy(s => s.SN).Where(aa=>aa.Count()>=2).ToList(); - - + List repeatMsg = new List(); + foreach (var item in gb) + { + string repeatSnSlot = string.Join(" eq ", item.Select(s => s.Index)); + repeatMsg.Add(repeatSnSlot); + } + string msg = string.Join(",", repeatMsg); } } }