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.Commom; using Rs.MotionPlat.Flow; using Rs.MotionPlat.Flow.Space; 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; namespace Rs.MotionPlat { public partial class FormMain : BaseForm { IAxis axis = null; HWindow winHandle = null; HObject hImage = null; HObject hmodelImage = null; HTuple h1; HTuple modelID; HObject final_Region = new HObject(); BindingList runInfoList = new BindingList(); BindingList errorInfoList = new BindingList(); public FormMain() { InitializeComponent(); //CameraTriggerTest.Instance.OnMatchResult += Instance_OnMatchResult; //this.tabControlEx1.TabPages.RemoveAt(1); //HikCamera.Instance.AutoGrabOkEvent += Instance_GrabOkEvent; } 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 2: hwin = himgNozzle2; break; case 3: hwin = himgNozzle3; break; case 4: hwin = himgNozzle4; break; case 5: hwin = himgNozzle5; break; case 6: hwin = himgNozzle6; break; case 7: hwin = himgNozzle7; break; case 8: hwin = himgNozzle8; break; default: break; } if (hwin != null) { hwin.HobjectToHimage(matchResult.Himage); if(matchResult.IsOK) { hwin.DispObj(matchResult.ContourXld, "green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, matchResult.SN,20,20,"green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"x:{matchResult.OffsetRow}", 200, 20, "green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"y:{matchResult.OffsetCol}", 400, 20, "green"); HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"r:{matchResult.OffsetA}", 600, 20, "green"); } else { HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, "NG", 20, 20, "red"); } i++; } } } static int num = 0; private void Instance_CameraOkEvent1(HObject[] obj,List mrs) { if (obj[0]!=null) { hwin_vac1.HobjectToHimage(obj[0]); if (mrs!=null && mrs[0] != null) { MessageQueue.Instance.Insert($"cam1 R:{mrs[0].Row.ToString("0.000")},C:{mrs[0].Col.ToString("0.000")},A:{mrs[0].Angle.ToString("0.000")},S:{mrs[0].Score.ToString("0.000")}"); hwin_vac1.DispObj(mrs[0].ContourXld, "green"); } } if (obj[1]!=null) { hwin_vac2.HobjectToHimage(obj[1]); if (mrs != null && mrs[1]!=null) { MessageQueue.Instance.Insert($"cam2 R:{mrs[1].Row.ToString("0.000")},C:{mrs[1].Col.ToString("0.000")},A:{mrs[1].Angle.ToString("0.000")},S:{mrs[1].Score.ToString("0.000")}"); hwin_vac2.DispObj(mrs[1].ContourXld, "green"); } } //if (obj[2] != null) //{ // hwin_vac3.HobjectToHimage(obj[2]); // if (mrs != null && mrs[2] != null) // { // MessageQueue.Instance.Insert($"cam3 R:{mrs[2].Row.ToString("0.000")},C:{mrs[2].Col.ToString("0.000")},A:{mrs[2].Angle.ToString("0.000")},S:{mrs[2].Score.ToString("0.000")}"); // hwin_vac3.DispObj(mrs[2].ContourXld, "green"); // } //} //if (obj[3] != null) //{ // hwin_vac4.HobjectToHimage(obj[3]); // if (mrs != null && mrs[3] != null) // { // MessageQueue.Instance.Insert($"cam4 R:{mrs[3].Row.ToString("0.000")},C:{mrs[3].Col.ToString("0.000")},A:{mrs[3].Angle.ToString("0.000")},S:{mrs[3].Score.ToString("0.000")}"); // hwin_vac4.DispObj(mrs[3].ContourXld, "green"); // } //} //if (obj[4] != null) //{ // hwin_vac5.HobjectToHimage(obj[4]); // if (mrs != null && mrs[4] != null) // { // MessageQueue.Instance.Insert($"cam5 R:{mrs[4].Row.ToString("0.000")},C:{mrs[4].Col.ToString("0.000")},A:{mrs[4].Angle.ToString("0.000")},S:{mrs[4].Score.ToString("0.000")}"); // hwin_vac5.DispObj(mrs[1].ContourXld, "green"); // } //} //if (obj[5] != null) //{ // hwin_vac6.HobjectToHimage(obj[5]); // if (mrs != null && mrs[5] != null) // { // MessageQueue.Instance.Insert($"cam6 R:{mrs[5].Row.ToString("0.000")},C:{mrs[5].Col.ToString("0.000")},A:{mrs[5].Angle.ToString("0.000")},S:{mrs[5].Score.ToString("0.000")}"); // hwin_vac6.DispObj(mrs[5].ContourXld, "green"); // } //} //if (obj[6] != null) //{ // hwin_vac7.HobjectToHimage(obj[6]); // if (mrs != null && mrs[6] != null) // { // MessageQueue.Instance.Insert($"cam7 R:{mrs[6].Row.ToString("0.000")},C:{mrs[6].Col.ToString("0.000")} ,A: {mrs[6].Angle.ToString("0.000")} ,S: {mrs[6].Score.ToString("0.000")}"); // hwin_vac7.DispObj(mrs[6].ContourXld, "green"); // } //} //if (obj[7] != null) //{ // hwin_vac8.HobjectToHimage(obj[7]); // if (mrs != null && mrs[7] != null) // { // MessageQueue.Instance.Insert($"cam8 R:{mrs[7].Row.ToString("0.000")},C:{mrs[7].Col.ToString("0.000")} ,A: {mrs[7].Angle.ToString("0.000")} ,S: {mrs[7].Score.ToString("0.000")}"); // hwin_vac8.DispObj(mrs[7].ContourXld, "green"); // } //} } ProductModel pm; private void LoadModel() { string dirPath = Path.Combine("Recipe",GlobalVar.CurRecipe, "料盘1"); pm = new ProductModel(); HOperatorSet.ReadRegion(out HObject region, Path.Combine(dirPath, "search.reg")); pm.SearchRegion = region; } Stopwatch time = new Stopwatch(); private void Instance_CameraOkEvent(int index,HObject obj) { time.Restart(); hwin_vac1.HobjectToHimage(obj); string m_savePath = Path.Combine(GlobalVar.CurRecipe, "料盘1"); string filePath = Path.Combine(m_savePath, "model.shm"); HOperatorSet.ReadShapeModel(filePath, out HTuple modelID); HOperatorSet.ReadRegion(out HObject searchRegion, Path.Combine(m_savePath + "\\search.reg")); if (searchRegion.IsInitialized()) { hImage = obj; pm.SearchRegion = searchRegion; HOperatorSet.ReduceDomain(obj, pm.SearchRegion, out HObject searchImg); HOperatorSet.GetShapeModelContours(out HObject modelContours, modelID, 1); HOperatorSet.FindShapeModel(searchImg, modelID, AngleTool.Deg2Rad(-10), AngleTool.Deg2Rad(20), new HTuple(0.3), 1, 0.5, "least_squares", 0, 0.9, out HTuple row, out HTuple column, out HTuple angle, out HTuple score); if (score != null && score.Length > 0) { int len = score.Length; for (int i = 0; i < len; i++) { HOperatorSet.VectorAngleToRigid(0, 0, 0, row[i].D, column[i].D, angle[i].D, out HTuple homMat2D); HOperatorSet.AffineTransContourXld(modelContours, out HObject contoursAffineTrans, homMat2D); hwin_vac1.DispObj(contoursAffineTrans, "green"); //matchResultRow = row.DArr[i]; //matchResultColumn = column.DArr[i]; //matchResultAngle = angle.DArr[i]; //matchResultScore = score.DArr[i]; HOperatorSet.GenCrossContourXld(out HObject cross, row.DArr[i], column.DArr[i], 100, 0); hwin_vac1.DispObj(cross, "red"); File.AppendAllText("d:\\test.csv",$"{index},{row.DArr[i]},{column.DArr[i]}\r\n"); } } HOperatorSet.GetImageSize(obj, out HTuple imgWidth, out HTuple imgHeight); HOperatorSet.GenCrossContourXld(out HObject camCenter, imgHeight / 2, imgWidth / 2, Math.Max(imgHeight, imgWidth), 0); hwin_vac1.DispObj(camCenter, "green"); time.Stop(); MessageQueue.Instance.Insert($"image process time:{time.ElapsedMilliseconds}"); } } bool cameraFinished = false; int testNum = 0; int speed = 50; static int i = 0; private void Instance_GrabOkEvent(int arg1, HalconDotNet.HObject arg2) { lock(this) { hwin_vac1.HobjectToHimage(arg2); HOperatorSet.WriteImage(arg2, "bmp", 0, "d://temp//" + (i++).ToString()); } //hImage = arg2; //HOperatorSet.FindShapeModel(hImage, modelID, -0.39, 0.79, 0.5, 1, 0.5, "least_squares", 0, 0.9, out HTuple row, out HTuple column, out HTuple angle, out HTuple score); //if (score.Length>0) //{ // Invoke(new Action(() => { // textBox1.Text = score.DArr[0].ToString("0.000"); // textBox2.Text = row.DArr[0].ToString("0.000"); // textBox3.Text = column.DArr[0].ToString("0.000"); // string msg = $"{testNum},{speed},{textBox2.Text},{textBox3.Text},{textBox1.Text}\r\n"; // File.AppendAllText("log.txt", msg); // MessageQueue.Instance.Insert(msg); // })); //} //else //{ // string msg = $"{testNum},{speed},丢步\r\n"; // File.AppendAllText("log.txt", msg); // MessageQueue.Instance.Warn("未找到"); //} //cameraFinished = true; } 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) { trayEmpty1.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); trayEmpty1.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) { trayOk.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); trayOk.RowNum = int.Parse(dr["RowNum"].ToString()); } dr = dt.AsEnumerable().Where(r => r.Field("TrayName") == "NG").First(); if (dr != null) { trayNg.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); trayNg.RowNum = int.Parse(dr["RowNum"].ToString()); } dr = dt.AsEnumerable().Where(r => r.Field("TrayName") == "Multi").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") == "Empty2").First(); if (dr != null) { trayEmpty2.ColumnNum = int.Parse(dr["ColumnNum"].ToString()); trayEmpty2.RowNum = int.Parse(dr["RowNum"].ToString()); } } winHandle = hwin_vac1.hWindowControl.HalconWindow; h1 = hwin_vac1.HWindowHalconID; HOperatorSet.GenEmptyObj(out final_Region); HOperatorSet.GenEmptyObj(out hmodelImage); modelID = new HTuple(); HOperatorSet.ReadShapeModel("Model/model.shm", out modelID); LoadModel(); WorkFlow.Instance.OnMatchResult += Instance_OnMatchResult; SpaceFlow.Instance.CameraOkEvent += Instance_CameraOkEvent1; RsTray turnoverTray = new RsTray() { OffsetX = -40, OffsetY = 18, OffsetYEven = 42, SinglePoint = true, RowNum = 4, ColumnNum = 8, }; turnoverTray.ItemName = "中转盘"; //turnoverTray.Init(); GlobalTray.TurnoverTray = turnoverTray; //dgv_runinfo.DataSource = runInfoList; //dgv_errinfo.DataSource = errorInfoList; timer1.Interval = 500; timer1.Enabled = true; HObject img = new HObject(); //HOperatorSet.CloseWindow(hWindow_Final1.HWindowHalconID); //HOperatorSet.OpenWindow(0, 0, hWindow_Final1.Width, hWindow_Final1.Height, winHandle,"visible", "", out h1); //HOperatorSet.openwi string filepath = @"C:\Users\Administrator\MVS\Data\22.bmp"; if(File.Exists(filepath)) { HOperatorSet.ReadImage(out HObject image, filepath); hwin_vac1.HobjectToHimage(image); //hSmartWindowControl1.HalconWindow.SetDraw("margin"); } trayEmpty1.ItemName = "Empty1"; //trayEmpty1.Init(); trayInput.ItemName = "Input"; //trayInput.Init(); trayOk.ItemName = "Ok"; //trayOk.Init(); trayNg.ItemName = "Ng"; //trayNg.Init(); //okTray1.ItemName = "料盘5"; //okTray1.Init(); //okTray2.ItemName = "料盘6"; //okTray2.Init(); //okTray3.ItemName = "料盘7"; //okTray3.Init(); //ngTray.ItemName = "料盘8"; //ngTray.Init(); GlobalTray.Empty1Tray = trayEmpty1; GlobalTray.InputTray = trayInput; GlobalTray.OkTary= trayOk; GlobalTray.NgTray= trayNg; GlobalTray.MultiTray = trayMulti; GlobalTray.Empty2Tray = trayEmpty2; GlobalTray.TurnoverTray = trayTurnover; tabControlEx1.TabPages.RemoveAt(1); } private void btnWholeHome_Load(object sender, EventArgs e) { if (MachineManage.Instance.MachineStatus == EMachineStatus.Homed || MachineManage.Instance.MachineStatus == EMachineStatus.NotInit || MachineManage.Instance.MachineStatus == EMachineStatus.NotHomed ) { HomeFlow.Instance.StartGoHome(); } else { MessageQueue.Instance.Warn($"device state {MachineManage.Instance.MachineStatus} cann't home!"); } } 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; MachineManage.Instance.RunState = ERunState.Waiting; WorkFlow.Instance.Start(); TurnoverFlow.Instance.Start(); TakeTrayFlow.Instance.Start(); //TakeTrayFlow.Instance.Start(); //StockManager.Instance.Start(); //WorkEnvironment.Instance.Ready(); //TakeDumpTest.Instance.Start(); } } private void btnStop_BtnClick(object sender, EventArgs e) { WorkFlow.Instance.Stop(); TurnoverFlow.Instance.Stop(); TakeTrayFlow.Instance.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; } } }