using ChoiceTech.Halcon.Control; using HalconDotNet; using Rs.Camera; using Rs.Controls; using Rs.DataAccess; using Rs.Framework; using Rs.Motion.Base; using Rs.MotionPlat.AuxiliaryEquipment; using Rs.MotionPlat.Commom; using Rs.MotionPlat.Entitys.Trays; using Rs.MotionPlat.Flow; using Rs.MotionPlat.Flow.Camera; using Rs.MotionPlat.Flow.SafePosFlow; using Rs.MotionPlat.Flow.SubFlow; using Rs.MotionPlat.SysConfig; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static Rs.MotionPlat.Commom.SchedulingMessageBox; namespace Rs.MotionPlat { public partial class FormMain : BaseForm { HObject defaultImage = new HObject(); public FormMain() { InitializeComponent(); } private void Instance_OnMatchResult(List obj) { int i = 1; foreach (MatchResult matchResult in obj) { HWindow_Final hwin = null; if (i == 9) return; switch (i) { case 1: hwin = himgNozzle1; break; case 5: hwin = himgNozzle5; break; default: break; } if (hwin != null) { hwin.ClearWindow(); hwin.HobjectToHimage(matchResult.Himage); if (matchResult.IsOK) { hwin.DispObj(matchResult.ContourXld, "green"); string OffsetCol = matchResult.OffsetCol.ToString("0.000"); string OffsetRow = matchResult.OffsetRow.ToString("0.000"); string OffsetA = matchResult.OffsetA.ToString("0.000"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"X:{OffsetCol}", 200, 20, "green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"Y:{OffsetRow}", 400, 20, "green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"R:{OffsetA}", 600, 20, "green"); } else { HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, "NG", 20, 20, "red"); } i++; } } } private void Instance_OnUpCameraGrabResult(List obj) { foreach (VisionResult matchResult in obj) { HWindow_Final hwin = null; switch (matchResult.SlotIndex) { case 1: hwin = hwin_turnoverSlot1; break; case 2: hwin = hwin_turnoverSlot2; break; case 3: hwin = hwin_turnoverSlot3; break; case 4: hwin = hwin_turnoverSlot4; break; case 5: hwin = hwin_turnoverSlot5; break; case 6: hwin = hwin_turnoverSlot6; break; case 7: hwin = hwin_turnoverSlot7; break; case 8: hwin = hwin_turnoverSlot8; break; case 9: hwin = hwin_turnoverSlot9; break; case 10: hwin = hwin_turnoverSlot10; break; case 11: hwin = hwin_turnoverSlot11; break; case 12: hwin = hwin_turnoverSlot12; break; case 13: hwin = hwin_turnoverSlot13; break; case 14: hwin = hwin_turnoverSlot14; break; case 15: hwin = hwin_turnoverSlot15; break; case 16: hwin = hwin_turnoverSlot16; break; case 17: hwin = hwin_turnoverSlot17; break; case 18: hwin = hwin_turnoverSlot18; break; case 19: hwin = hwin_turnoverSlot19; break; case 20: hwin = hwin_turnoverSlot20; break; case 21: hwin = hwin_turnoverSlot21; break; case 22: hwin = hwin_turnoverSlot22; break; case 23: hwin = hwin_turnoverSlot23; break; case 24: hwin = hwin_turnoverSlot24; break; case 25: hwin = hwin_turnoverSlot25; break; case 26: hwin = hwin_turnoverSlot26; break; case 27: hwin = hwin_turnoverSlot27; break; case 28: hwin = hwin_turnoverSlot28; break; case 29: hwin = hwin_turnoverSlot29; break; case 30: hwin = hwin_turnoverSlot30; break; case 31: hwin = hwin_turnoverSlot31; break; case 32: hwin = hwin_turnoverSlot32; break; default: break; } if (hwin != null) { hwin.ClearWindow(); if (matchResult.SearchModelOK) { hwin.HobjectToHimage(matchResult.SourceImage); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, matchResult.SN, 20, 20, "green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"x:{matchResult.OffsetX}", 200, 20, "green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"y:{matchResult.OffsetY}", 400, 20, "green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"r:{matchResult.OffsetR}", 600, 20, "green"); } else { hwin.ClearWindow(); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, "NG", 20, 20, "red"); } } } } private void timer1_Tick(object sender, EventArgs e) { //获取运行信息 while (MessageQueue.Instance.HaveMessage()) { MessageItem runInfo = MessageQueue.Instance.GetMessage(); if (runInfo != null) { while (dgv_runinfo.Rows.Count > 500) { dgv_runinfo.Rows.RemoveAt(dgv_runinfo.Rows.Count - 1); } dgv_runinfo.Rows.Insert(0, runInfo.Time, runInfo.Content); } MessageItem errorInfo = MessageQueue.Instance.GetWarn(); if (errorInfo != null) { while (dgv_errinfo.Rows.Count > 500) { dgv_errinfo.Rows.RemoveAt(dgv_errinfo.Rows.Count - 1); } dgv_errinfo.Rows.Insert(0, errorInfo.Time, errorInfo.Content); } } if(MachineManage.Instance.MachineStatus== EMachineStatus.Working) { if (btnWholeHome.Visible == true) btnWholeHome.Visible = false; } else { if (btnWholeHome.Visible == false) btnWholeHome.Visible = true; } } private void FormMain_Load(object sender, EventArgs e) { SqliteHelper db = new SqliteHelper(); string querySql = "select * from NormalTray"; DataTable dt = db.GetDataTable(querySql); //if (dt != null && dt.Rows.Count > 0) //{ // DataRow dr = dt.AsEnumerable().Where(r => r.Field("TrayName") == "Empty1").First(); // if (dr != null) // { // trayMulti.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); // trayMulti.RowNum = int.Parse(dr["RowNum"].ToString()); // } // dr = dt.AsEnumerable().Where(r => r.Field("TrayName") == "Input").First(); // if (dr != null) // { // //trayInput.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); // //trayInput.RowNum = int.Parse(dr["RowNum"].ToString()); // } // dr = dt.AsEnumerable().Where(r => r.Field("TrayName") == "Ok").First(); // if (dr != null) // { // trayInput1.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); // trayInput1.RowNum = int.Parse(dr["RowNum"].ToString()); // } // dr = dt.AsEnumerable().Where(r => r.Field("TrayName") == "Ng").First(); // if (dr != null) // { // trayInput2.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); // trayInput2.RowNum = int.Parse(dr["RowNum"].ToString()); // } // dr = dt.AsEnumerable().Where(r => r.Field("TrayName") == "Multi").First(); // if (dr != null) // { // trayInput3.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); // trayInput3.RowNum = int.Parse(dr["RowNum"].ToString()); // } // dr = dt.AsEnumerable().Where(r => r.Field("TrayName") == "Empty2").First(); // if (dr != null) // { // trayReject.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); // trayReject.RowNum = int.Parse(dr["RowNum"].ToString()); // } //} timer1.Interval = 500; timer1.Enabled = true; DischargeFlow.Instance.OnMatchResult += Instance_OnMatchResult; DischargeFlow.Instance.OnUpCameraGrabResult += Instance_OnUpCameraGrabResult; DischargeFlow.Instance.OnShowGrabResult += Instance_OnShowGrabResult; UpCameraCheckFlow.Instance.OnStockTrayHasOrNotResult += Instance_OnStockTrayProductHasOrNotResult; UpCameraCheckFlow.Instance.OnTurnTrayHasOrNotResult += Instance_OnTurnoverTrayProductHasOrNotResult; UpCameraScanBarCodeFlow.Instance.OnTurnoverTrayProductLocateResult += Instance_OnTurnoverTrayProductLocateResult; trayTurnover.ItemName = "Turnover"; trayInput1.ItemName = "Input1"; trayInput2.ItemName = "Input2"; trayInput3.ItemName = "Input3"; trayReject.ItemName = "Reject"; trayGood1.ItemName = "Good1"; trayGood2.ItemName = "Good2"; trayGood3.ItemName = "Good3"; trayMulti.ItemName = "Multi"; trayInput1.InitSlotStatus = ESlotStatus.Have; trayInput2.InitSlotStatus = ESlotStatus.Have; trayInput3.InitSlotStatus = ESlotStatus.Have; trayReject.InitSlotStatus = ESlotStatus.NotHave; trayGood1.InitSlotStatus = ESlotStatus.NotHave; trayGood2.InitSlotStatus = ESlotStatus.NotHave; trayGood3.InitSlotStatus = ESlotStatus.NotHave; trayMulti.InitSlotStatus = ESlotStatus.NotHave; GlobalTray.Input1Tray= trayInput1; GlobalTray.Input2Tray= trayInput2; GlobalTray.Input3Tray= trayInput3; GlobalTray.RejectTray= trayReject; GlobalTray.Good1Tray= trayGood1; GlobalTray.Good2Tray= trayGood2; GlobalTray.Good3Tray= trayGood3; GlobalTray.MultiTray= trayMulti; GlobalTray.TurnoverTray = trayTurnover; GlobalTray.TestTray = trayTest; GlobalTray.DischargeNozzle= trayDischargeNozzle; GlobalTray.TurnoverNozzle= trayTurnoverNozzle; //StockManager.Instance.Start(); //LoadStockStatus(); HOperatorSet.ReadImage(out defaultImage, "default.bmp"); } /// /// 周转盘产品定位结果 /// /// 定位结果 /// 定位是否OK private void Instance_OnTurnoverTrayProductLocateResult(VisionResult arg1, bool isOK) { if(arg1!=null) { hWindow_Final3.ClearWindow(); hWindow_Final3.HobjectToHimage(arg1.SourceImage); if(isOK) { //HalconTool.DispMessage(hWindow_Final3.hWindowControl.HalconWindow, isOK ? "OK" : "NG", 20, 20, "green"); //HalconTool.DispMessage(hWindow_Final3.hWindowControl.HalconWindow, $"X:{arg1.OffsetX.ToString("0.000")}", 200, 20, "green"); //HalconTool.DispMessage(hWindow_Final3.hWindowControl.HalconWindow, $"Y:{arg1.OffsetY.ToString("0.000")}", 400, 20, "green"); //HalconTool.DispMessage(hWindow_Final3.hWindowControl.HalconWindow, $"R:{arg1.OffsetR.ToString("0.000")}", 600, 20, "green"); } else { //HalconTool.DispMessage(hWindow_Final3.hWindowControl.HalconWindow, isOK ? "OK" : "NG", 20, 20, "red"); //HalconTool.DispMessage(hWindow_Final3.hWindowControl.HalconWindow, $"X:{arg1.OffsetX.ToString("0.000")}", 200, 20, "red"); //HalconTool.DispMessage(hWindow_Final3.hWindowControl.HalconWindow, $"Y:{arg1.OffsetY.ToString("0.000")}", 400, 20, "red"); //HalconTool.DispMessage(hWindow_Final3.hWindowControl.HalconWindow, $"R:{arg1.OffsetR.ToString("0.000")}", 600, 20, "red"); } } } private void Instance_OnTurnoverTrayProductHasOrNotResult(SlotProductHasOrNotResult obj) { if(obj !=null) { hwin_turnoverTrayHasOrNot.ClearWindow(); hwin_turnoverTrayHasOrNot.HobjectToHimage(obj.SourceImage); if(obj.HasProduct) { //h//win_turnoverTrayHasOrNot.DispObj(obj.SearchRegion,"green"); } else { //hwin_turnoverTrayHasOrNot.DispObj(obj.SearchRegion,"red"); } } } private void Instance_OnStockTrayProductHasOrNotResult(SlotProductHasOrNotResult obj) { if (obj != null) { hWindow_Final4.ClearWindow(); hWindow_Final4.HobjectToHimage(obj.SourceImage); if(obj.HasProduct) { //hWindow_Final4.DispObj(obj.SearchRegion,"green"); } else { //hWindow_Final4.DispObj(obj.SearchRegion,"red"); } } } private void Instance_OnShowGrabResult(VisionResult matchResult, bool arg2) { HWindow_Final hwin = null; switch (matchResult.SlotIndex) { case 1: hwin = hwin_turnoverSlot1; break; case 2: hwin = hwin_turnoverSlot2; break; case 3: hwin = hwin_turnoverSlot3; break; case 4: hwin = hwin_turnoverSlot4; break; case 5: hwin = hwin_turnoverSlot5; break; case 6: hwin = hwin_turnoverSlot6; break; case 7: hwin = hwin_turnoverSlot7; break; case 8: hwin = hwin_turnoverSlot8; break; case 9: hwin = hwin_turnoverSlot9; break; case 10: hwin = hwin_turnoverSlot10; break; case 11: hwin = hwin_turnoverSlot11; break; case 12: hwin = hwin_turnoverSlot12; break; case 13: hwin = hwin_turnoverSlot13; break; case 14: hwin = hwin_turnoverSlot14; break; case 15: hwin = hwin_turnoverSlot15; break; case 16: hwin = hwin_turnoverSlot16; break; case 17: hwin = hwin_turnoverSlot17; break; case 18: hwin = hwin_turnoverSlot18; break; case 19: hwin = hwin_turnoverSlot19; break; case 20: hwin = hwin_turnoverSlot20; break; case 21: hwin = hwin_turnoverSlot21; break; case 22: hwin = hwin_turnoverSlot22; break; case 23: hwin = hwin_turnoverSlot23; break; case 24: hwin = hwin_turnoverSlot24; break; case 25: hwin = hwin_turnoverSlot25; break; case 26: hwin = hwin_turnoverSlot26; break; case 27: hwin = hwin_turnoverSlot27; break; case 28: hwin = hwin_turnoverSlot28; break; case 29: hwin = hwin_turnoverSlot29; break; case 30: hwin = hwin_turnoverSlot30; break; case 31: hwin = hwin_turnoverSlot31; break; case 32: hwin = hwin_turnoverSlot32; break; default: break; } if (hwin != null) { hwin.ClearWindow(); if (arg2) { if (matchResult.ScanBarCodeOK) { string SN = matchResult.SN; hwin.HobjectToHimage(matchResult.SourceImage); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"sn:{SN}", 20, 20, "green"); } else { hwin.HobjectToHimage(matchResult.SourceImage); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, "NG", 20, 20, "red"); } } else { //加载默认图片 hwin.HobjectToHimage(defaultImage); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, "no product", 20, 20, "red"); } } } private void btnWholeHome_Load(object sender, EventArgs e) { Ops.GoHome(); } private void btnSpaceRun_BtnClick(object sender, EventArgs e) { //SpaceTest.Instance.Start(); if (MachineManage.Instance.MachineStatus== EMachineStatus.Homed || MachineManage.Instance.MachineStatus == EMachineStatus.Stop) { //MachineManage.Instance.RunStatus = Commom.ERunStatus.Started; ////WorkFlow.Instance.Start(); //TurnoverFlow.Instance.Start(); //TakeTrayFlow.Instance.Start(); Ops.Start(); //TakeTrayFlow.Instance.Start(); //StockManager.Instance.Start(); //WorkEnvironment.Instance.Ready(); //TakeDumpTest.Instance.Start(); } else { MessageQueue.Instance.Warn($"device {MachineManage.Instance.MachineStatus} status,cann't start!"); } } private void btnStop_BtnClick(object sender, EventArgs e) { Ops.Stop(); //TakeDumpTest.Instance.Stop(); //LoadAndUnloadTest.Instance.Stop(); //TakeTrayTest.Instance.Stop(); //TurnoverFlow.Instance.Stop(); //TakeTrayFlow.Instance.Stop(); ////ZRTest.Instance.Stop(); ////CameraTriggerTest.Instance.Stop(); ////SpaceTest.Instance.Stop(); //WorkFlow.Instance.Stop(); //MachineManage.Instance.MachineStatus = EMachineStatus.Stop; } private void LoadStockStatus() { //StringBuilder msg = new StringBuilder(); //if (StockManager.Instance.HasTray(ETrayType.Input)) //{ // msg.Append(ETrayType.Input.ToString()).Append(","); //} //if (StockManager.Instance.HasTray(ETrayType.Ok)) //{ // msg.Append(ETrayType.Ok.ToString()).Append(","); //} //if (StockManager.Instance.HasTray(ETrayType.Ng)) //{ // msg.Append(ETrayType.Ng.ToString()).Append(","); //} //if (StockManager.Instance.HasTray(ETrayType.Multi)) //{ // msg.Append(ETrayType.Multi.ToString()).Append(","); //} //if(msg.Length > 0) //{ // Task.Run(() => { // Msg.ShowInfo("Stock " + msg.ToString().TrimEnd(new char[] { ',' }) + " has tray,please check products status"); // }); //} //if (StockManager.Instance.HasTray(ETrayType.Empty1)) //{ // StockManager.Instance.GetStock(ETrayType.Empty1).ChangeStatus(EStockTrayStatus.Loaded); //} //else //{ // GlobalTray.GetTray(ETrayType.Empty1).Status = EStockTrayStatus.Empty.ToString(); //} //if (StockManager.Instance.HasTray(ETrayType.Input)) //{ // StockManager.Instance.GetStock(ETrayType.Input).ChangeStatus(EStockTrayStatus.Loaded,false); // TrayStatusManager.Init(ETrayType.Input); // //GlobalTray.InputTray.ChangeStatus() //} //else //{ // // GlobalTray.GetTray(ETrayType.Input).Status = EStockTrayStatus.Empty.ToString(); //} //if (StockManager.Instance.HasTray(ETrayType.Ok)) //{ // StockManager.Instance.GetStock(ETrayType.Ok).ChangeStatus(EStockTrayStatus.Loaded, false); // TrayStatusManager.Init(ETrayType.Ok); //} //else //{ // GlobalTray.GetTray(ETrayType.Ok).Status = EStockTrayStatus.Empty.ToString(); //} //if (StockManager.Instance.HasTray(ETrayType.Ng)) //{ // StockManager.Instance.GetStock(ETrayType.Ng).ChangeStatus(EStockTrayStatus.Loaded, false); // TrayStatusManager.Init(ETrayType.Ng); //} //else //{ // GlobalTray.GetTray(ETrayType.Ng).Status = EStockTrayStatus.Empty.ToString(); //} //if (StockManager.Instance.HasTray(ETrayType.Multi)) //{ // StockManager.Instance.GetStock(ETrayType.Multi).ChangeStatus(EStockTrayStatus.Loaded, false); // TrayStatusManager.Init(ETrayType.Multi); //} //else //{ // GlobalTray.GetTray(ETrayType.Multi).Status = EStockTrayStatus.Empty.ToString(); //} //if (StockManager.Instance.HasTray(ETrayType.Empty2)) //{ // StockManager.Instance.GetStock(ETrayType.Empty2).ChangeStatus(EStockTrayStatus.Loaded); //} //else //{ // GlobalTray.GetTray(ETrayType.Empty2).Status = EStockTrayStatus.Empty.ToString(); //} //TrayStatusManager.InitDischargeNozzle(); //TrayStatusManager.InitTrunoverTray(); //TrayStatusManager.InitTurnoverNozzle(); //TrayStatusManager.InitFixtureTray(); } private void button1_Click(object sender, EventArgs e) { PromptMessageBox.ShowDialog(111, "取料失败!! \r\n周转吸嘴取治具{}号穴位的物料时失败 \r\nPickup fail !!\r\nNozzle of tester from site{} socket\r\nPickup fail !!\r\nSite{} socket 으로부터 Unit을 pickup할때 pickup fail이 발생하였습니다.", ETipButton.Yes); } /// /// 治具盘画盘后事件 /// /// private void trayTest_DrawTrayAfterEvent(RsTray obj, ESlotStatus status, List opSlots) { //TestTrayManager.Instance.ResetStatus(); //List slots = obj.GetSlots(ESlotStatus.Have); LogHelper.Debug($"手动画盘设置{opSlots.Select(s=>s.Index).ToJoinString()}{status}"); foreach (TraySlot slot in opSlots) { int slotIndex = slot.Index; if(status== ESlotStatus.Have) { TestTrayManager.Instance.Slot(slotIndex).IsHasProduct = true; } else { TestTrayManager.Instance.Slot(slotIndex).ResetStatus(); } } } /// /// 周转盘画盘后事件 /// /// private void trayTurnover_DrawTrayAfterEvent(RsTray obj, ESlotStatus status, List opSlots) { //TurnoverTrayManager.Instance.ResetStatus(); //List slots = obj.GetSlots(ESlotStatus.Have); LogHelper.Debug($"手动画盘设置{opSlots.Select(s => s.Index).ToJoinString()}{status}"); foreach (TraySlot slot in opSlots) { int slotIndex = slot.Index; if (status == ESlotStatus.Have) { TurnoverTrayManager.Instance.Slot(slotIndex).IsHasProduct = true; } else { TurnoverTrayManager.Instance.Slot(slotIndex).ResetStatus(); } } } /// /// 周转吸嘴画盘后事件 /// /// private void trayTurnoverNozzle_DrawTrayAfterEvent(RsTray obj, ESlotStatus status, List opSlots) { //TransitNozzleManager.Instance.ResetStatus(); //List slots = obj.GetSlots(ESlotStatus.Have); LogHelper.Debug($"手动画盘设置{opSlots.Select(s => s.Index).ToJoinString()}{status}"); foreach (TraySlot slot in opSlots) { int slotIndex = slot.Index; if(status== ESlotStatus.Have) { TransitNozzleManager.Instance.Nozzle(slotIndex).FromType = TurnoverType.Turnover; TransitNozzleManager.Instance.Nozzle(slotIndex).FromIndex = slotIndex - 1; TransitNozzleManager.Instance.Nozzle(slotIndex).ToType = TurnoverType.Multifunction; TransitNozzleManager.Instance.Nozzle(slotIndex).ToIndex = (slotIndex <= 8 ? slotIndex + 8 : slotIndex + 16) - 1; TransitNozzleManager.Instance.Nozzle(slotIndex).IsHasProduct = true; } else { TransitNozzleManager.Instance.Nozzle(slotIndex).ResetStaus(); } } } /// /// 排料吸嘴画盘后事件 /// /// private void trayDischargeNozzle_DrawTrayAfterEvent(RsTray obj, ESlotStatus status, List opSlots) { //NozzleManager.GetAllNozzles().ForEach((n) => { n.ResetStatus(); }); //List slots = obj.GetSlots(ESlotStatus.Have); LogHelper.Debug($"手动画盘设置{opSlots.Select(s => s.Index).ToJoinString()}{status}"); foreach (TraySlot slot in opSlots) { int slotIndex = slot.Index; if (status == ESlotStatus.Have) { Nozzle nozzle = NozzleManager.GetNozzle(slotIndex); if (nozzle != null) { NozzleManager.GetNozzle(slotIndex).FromType = TurnoverType.Turnover; nozzle.FromIndex = slotIndex - 1; NozzleManager.GetNozzle(slotIndex).ToType = TurnoverType.Multifunction; nozzle.ToIndex = 0; NozzleManager.GetNozzle(slotIndex).Status = ENozzleStatus.ToUnload; } } else { NozzleManager.GetNozzle(slotIndex).ResetStatus(); } } } } }