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);
}
}
}