增加周转盘扫码后检测二维码是否有重码功能

develop
lhiven 10 months ago
parent 7bb09d71b2
commit 58df3e224f

@ -419,9 +419,14 @@ namespace Rs.MotionPlat.Flow
/// <summary> /// <summary>
/// 料盘未放下报警 /// 料盘未放下报警
/// </summary> /// </summary>
public const int = 1096; public const int = 1096;
/// <summary>
/// 二维码重码报警
/// </summary>
public const int = 1097;
@ -654,5 +659,6 @@ namespace Rs.MotionPlat.Flow
/// 扫码失败报警 /// 扫码失败报警
/// </summary> /// </summary>
public const int ScanBarCodeFailAlarm = 58; public const int ScanBarCodeFailAlarm = 58;
} }
} }

@ -181,6 +181,15 @@ namespace Rs.MotionPlat.Flow
turnoverResult.Add(turnoverInfo); turnoverResult.Add(turnoverInfo);
} }
/// <summary>
/// 移除掉重码的任务
/// </summary>
/// <param name="slotIndex"></param>
public void RemoveRepeatSnTask(int slotIndex)
{
turnoverResult = turnoverResult.Where(t => t.ToIndex != slotIndex).ToList();
}
public void CopyBarcodeToTask(int slotIndex,string sn) public void CopyBarcodeToTask(int slotIndex,string sn)
{ {
TurnoverInfo ti = turnoverResult.Where(r => r.ToIndex == slotIndex && r.ToType == TurnoverType.Turnover).First(); TurnoverInfo ti = turnoverResult.Where(r => r.ToIndex == slotIndex && r.ToType == TurnoverType.Turnover).First();

@ -2361,6 +2361,10 @@ namespace Rs.MotionPlat.Flow
public void ScanBarCode() public void ScanBarCode()
{ {
//需要检测的穴位
List<TurnoverTraySlot> checkSlots = new List<TurnoverTraySlot>();
int reScanNum = 0;
bool exitScan = false;
SchedulingMessageBox box = new SchedulingMessageBox(); SchedulingMessageBox box = new SchedulingMessageBox();
if (GlobalVar.RunSpace) if (GlobalVar.RunSpace)
{ {
@ -2390,243 +2394,307 @@ namespace Rs.MotionPlat.Flow
} }
else else
{ {
//没有需要给周转盘上料的任务后,就开始上相机扫码 while(!exitScan)
//判断周转盘第一行有没有产品,如果有产品则拍第一行 {
if (TurnoverTrayManager.Instance.HasProduct(ETrayRow.One)) checkSlots.Clear();
{ reScanNum++;
//找拍照起点和终点 //没有需要给周转盘上料的任务后,就开始上相机扫码
SlotPoint grabStartPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 1); //判断周转盘第一行有没有产品,如果有产品则拍第一行
SlotPoint grabEndPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 8); if (TurnoverTrayManager.Instance.HasProduct(ETrayRow.One))
List<VisionResult> result = UpCameraScanBarCodeFlow.Instance.ScanMulti(1, false);
//List<VisionResult> result = UpCameraScanBarCodeFlow.Instance.Wait();
foreach (var vr in result)
{ {
if (TurnoverTrayManager.Instance.Slot(vr.SlotIndex).IsHasProduct) //找拍照起点和终点
SlotPoint grabStartPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 1);
SlotPoint grabEndPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 8);
List<VisionResult> result = UpCameraScanBarCodeFlow.Instance.ScanMulti(1, false);
//List<VisionResult> 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, VirtualBarCode.Code);
//复制二维码
LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vr.SN);
TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vr.SN;
} }
else else
{ {
int failNum = 1; if (vr.ScanBarCodeOK)
while (true)
{ {
if (failNum < 4) OnShowGrabResult?.Invoke(vr, true);
{ //复制二维码
//如果扫码失败再重扫一次 LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vr.SN);
VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.ScanSingle(vr.SlotIndex, true, false, true); TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vr.SN;
//VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.WaitSingle(); checkSlots.Add(TurnoverTrayManager.Instance.Slot(vr.SlotIndex));
if (vrsigle.ScanBarCodeOK) }
{ else
OnShowGrabResult?.Invoke(vrsigle, true); {
LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vrsigle.SN); int failNum = 1;
TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vrsigle.SN; while (true)
break;
}
else
{
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) if (failNum < 4)
{ {
LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, ""); //如果扫码失败再重扫一次
TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.ScanSingle(vr.SlotIndex, true, false, true);
break; //VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.WaitSingle();
} if (vrsigle.ScanBarCodeOK)
else
{
alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.), vr.SlotIndex);
Dictionary<ETipButton, string> buttonTexts = new Dictionary<ETipButton, string>() {
{ ETipButton.Retry,"重试|Retry"},
{ ETipButton.Cancel,"自动移走|Auto remove"}
};
box = PromptMessageBox.ShowDialog(AlarmConstID., alarmInfo, ETipButton.Retry | ETipButton.Cancel, buttonTexts);
if (box.Button == ETipButton.Retry)
{ {
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, ""); LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, "");
TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = "";
break; break;
} }
else
{
alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.), vr.SlotIndex);
Dictionary<ETipButton, string> buttonTexts = new Dictionary<ETipButton, string>() {
{ 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 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) //判断周转盘第三行有没有产品,如果有产品则拍第三行
{ if (TurnoverTrayManager.Instance.HasProduct(ETrayRow.Three))
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<VisionResult> result = UpCameraScanBarCodeFlow.Instance.ScanMulti(24, true);
// List<VisionResult> result = UpCameraScanBarCodeFlow.Instance.Wait();
foreach (var vr in result)
{ {
if (TurnoverTrayManager.Instance.Slot(vr.SlotIndex).IsHasProduct) //找拍照起点和终点
SlotPoint grabStartPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 17);
SlotPoint grabEndPoint = TrayPointManager.GetSlotPoint(ETrayType.Turnover, 24);
List<VisionResult> result = UpCameraScanBarCodeFlow.Instance.ScanMulti(24, true);
// List<VisionResult> result = UpCameraScanBarCodeFlow.Instance.Wait();
foreach (var vr in result)
{ {
if (TurnoverTrayManager.Instance.Slot(vr.SlotIndex).IsHasProduct)
if (vr.SearchModelOK)//定位成功
{ {
if (!GlobalVar.EnableScanBarCodeByDownCamera)
if (vr.SearchModelOK)//定位成功
{ {
if (GlobalVar.RunSpace) if (!GlobalVar.EnableScanBarCodeByDownCamera)
{ {
LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, VirtualBarCode.Code); if (GlobalVar.RunSpace)
}
else
{
if (vr.ScanBarCodeOK)
{ {
OnShowGrabResult?.Invoke(vr, true); LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, VirtualBarCode.Code);
//复制二维码
LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vr.SN);
TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vr.SN;
} }
else else
{ {
int failNum = 1; if (vr.ScanBarCodeOK)
while (true)
{ {
if (failNum < 4) OnShowGrabResult?.Invoke(vr, true);
{ //复制二维码
LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vr.SN);
//如果扫码失败再重扫一次 TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = vr.SN;
VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.ScanSingle(vr.SlotIndex, true, false, true); checkSlots.Add(TurnoverTrayManager.Instance.Slot(vr.SlotIndex));
//VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.WaitSingle(); }
if (vrsigle.ScanBarCodeOK) else
{ {
OnShowGrabResult?.Invoke(vrsigle, true); int failNum = 1;
LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, vrsigle.SN); while (true)
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
{ {
//box = MsgBox.ShowDialog(AlarmConstID.ScanBarCodeFailAlarm, $"{vr.SlotIndex}穴位扫码失败", ETipButton.Retry | ETipButton.Skip); if (failNum < 4)
if (GlobalVar.ScanBarcodeFailAutoSkip)
{ {
LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, "");
TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; //如果扫码失败再重扫一次
break; VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.ScanSingle(vr.SlotIndex, true, false, true);
} //VisionResult vrsigle = UpCameraScanBarCodeFlow.Instance.WaitSingle();
else if (vrsigle.ScanBarCodeOK)
{
alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.), vr.SlotIndex);
Dictionary<ETipButton, string> buttonTexts = new Dictionary<ETipButton, string>()
{
{ ETipButton.Retry,"重试|Retry"},
{ ETipButton.Cancel,"自动移走|Auto remove"}
};
box = PromptMessageBox.ShowDialog(AlarmConstID., alarmInfo, ETipButton.Retry | ETipButton.Cancel, buttonTexts);
if (box.Button == ETipButton.Retry)
{ {
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, ""); LoadAndUnloadTask.Instance.CopyBarcodeToTask(vr.SlotIndex - 1, "");
TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = ""; TurnoverTrayManager.Instance.Slot(vr.SlotIndex).SN = "";
break; break;
} }
else
{
alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.), vr.SlotIndex);
Dictionary<ETipButton, string> buttonTexts = new Dictionary<ETipButton, string>()
{
{ 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 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<int> slots = new List<int>();
List<string> repeatMsg = new List<string>();
//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 else
{ {
OnShowGrabResult?.Invoke(vr, false); exitScan = true;
} }
//vr.Dispose();
} }
if (result != null && result.Count > 0) else
{ {
result.Clear(); exitScan = true;
GC.Collect();
} }
//OnUpCameraGrabResult?.Invoke(result);
} }
} }
} }
} }
} }
} }
/// <summary> /// <summary>

@ -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: AssemblyVersion("1.0.0.0")]
//[assembly: AssemblyFileVersion("1.0.0.0")] //[assembly: AssemblyFileVersion("1.0.0.0")]

@ -471,7 +471,7 @@ namespace Rs.MotionPlat
TurnoverTrayManager.Instance.Slot(4).SN = "3"; TurnoverTrayManager.Instance.Slot(4).SN = "3";
TurnoverTrayManager.Instance.Slot(5).SN = "4"; TurnoverTrayManager.Instance.Slot(5).SN = "4";
TurnoverTrayManager.Instance.Slot(6).SN = "5"; TurnoverTrayManager.Instance.Slot(6).SN = "5";
TurnoverTrayManager.Instance.Slot(7).SN = "6"; TurnoverTrayManager.Instance.Slot(7).SN = "2";
TurnoverTrayManager.Instance.Slot(8).SN = "7"; TurnoverTrayManager.Instance.Slot(8).SN = "7";
List<TurnoverTraySlot> slotList= new List<TurnoverTraySlot>(); List<TurnoverTraySlot> slotList= new List<TurnoverTraySlot>();
@ -487,8 +487,13 @@ namespace Rs.MotionPlat
var gb = slotList.GroupBy(s => s.SN).Where(aa=>aa.Count()>=2).ToList(); var gb = slotList.GroupBy(s => s.SN).Where(aa=>aa.Count()>=2).ToList();
List<string> repeatMsg = new List<string>();
foreach (var item in gb)
{
string repeatSnSlot = string.Join(" eq ", item.Select(s => s.Index));
repeatMsg.Add(repeatSnSlot);
}
string msg = string.Join(",", repeatMsg);
} }
} }
} }

Loading…
Cancel
Save