private async void button1_Click_1(object sender, EventArgs e) { HObject _image = HardWareManager.Instance.Cmaera.SnapShot(); VisionManager.Instance.ShapeModle.BackImage = _image.Clone(); //DelegateControls.Instance. ModleFindResult result = VisionManager.Instance.ShapeModle.FindSimple(); // return; if (result != null) { HTuple hommate2d; HOperatorSet.VectorAngleToRigid(0, 0, 0, result.Row, result.Column, result.Angle, out hommate2d); HOperatorSet.AffineTransContourXld(result.ModleRegion, out HObject hObject, hommate2d); RegionX regionX = new RegionX(hObject, "green"); DelegateControls.Instance.DelegateHdisplay("FormMain_hDisplay1", _image, new List <HalWindow.RegionX>() { regionX }); HTuple calibratedata = VisionManager.Instance.Calibrate.CalibrateData; HTuple _x = new HTuple(); HTuple _y = new HTuple(); HOperatorSet.AffineTransPoint2d(calibratedata, result.Row, result.Column, out HTuple x, out HTuple y); HOperatorSet.AffineTransPoint2d(calibratedata, 1024, 1536, out _x, out _y); double ox = -x + _x + VisionManager.Instance.Calibrate.ToolOffsetX; double oy = -y + _y + VisionManager.Instance.Calibrate.ToolOffsetY; RobotPos robotPos = await HardWareManager.Instance.YaskawaRobot.GetRobotCPoint(); double x1 = ox + robotPos.Y; double x2 = oy + robotPos.Z; } }
private async Task <RobotPos> GetHolePoint(HObject image) { try { DelegateControls.Instance.DelegateHdisplay("FormMain_hDisplay1", image, null); HOperatorSet.Threshold(image, out HObject region1, 0, 100); HOperatorSet.Connection(region1, out HObject connectionregion); HOperatorSet.OpeningCircle(connectionregion, out HObject regionopening, 7.5); HOperatorSet.SelectShape(regionopening, out HObject selectedregion, "area", "and", 9000, 79999); HOperatorSet.SelectShape(selectedregion, out selectedregion, "circularity", "and", 0.4, 1); HOperatorSet.FillUp(selectedregion, out HObject regionfillup); HOperatorSet.Union1(regionfillup, out HObject regionunion); HOperatorSet.ReduceDomain(image, regionunion, out HObject imagereduced); HOperatorSet.MinMaxGray(regionunion, imagereduced, 0, out HTuple min, out HTuple max, out HTuple range);//20191128 HOperatorSet.Threshold(imagereduced, out HObject region2, 0, min + 5); HOperatorSet.ErosionCircle(region2, out HObject erosionregion, 2.5); HOperatorSet.Connection(erosionregion, out HObject connectionregion2); HOperatorSet.CountObj(connectionregion2, out HTuple number); HOperatorSet.SelectShape(connectionregion2, out HObject selectregiion2, "area", "and", 2000, 6500); HOperatorSet.CountObj(selectregiion2, out number); HOperatorSet.SelectShape(selectregiion2, out HObject selectregiion3, "circularity", "and", 0.3, 1); HOperatorSet.SelectShape(selectregiion3, out HObject selectregiion4, "outer_radius", "and", 25, 50); HOperatorSet.AreaCenter(selectregiion4, out HTuple area, out HTuple r, out HTuple c); HOperatorSet.ShapeTrans(selectregiion4, out HObject regiiontrans, "outer_circle"); RegionX regionX = new RegionX(regiiontrans, "green"); DelegateControls.Instance.DelegateHdisplay("FormMain_hDisplay1", image, new List <HalWindow.RegionX>() { regionX }); HTuple _x = new HTuple(); HTuple _y = new HTuple(); VisionManager.Instance.Calibrate.GetRobotpoint(r, c, ref _x, ref _y); lengthY = _x + Param.Instance.HMakeUp; lengthX = _y + Param.Instance.VMakeUp; RobotPos robotPos = await HardWareManager.Instance.YaskawaRobot.GetRobotCPoint(); // RobotPos robotPos = new RobotPos(); robotPos.Y += _x; robotPos.Z += _y; return(robotPos); } catch (Exception ex) { HOperatorSet.WriteImage(image, "bmp", 0, AppDomain.CurrentDomain.BaseDirectory + "Images\\Ng.bmp"); throw new Exception("GetHolePoint exception:第二次取像未找到螺丝孔位置"); } }
/// <summary> /// 获取机器人工具中心位置信息 /// </summary> /// <returns></returns> public async Task <RobotPos> GetRobotCPoint() { string rtn; try { await ConnectRobot(); SendString("CONNECT Robot_access\r\n"); rtn = await WaitRobotFedback(); if (!rtn.Contains("OK")) { NetClient.DisConnect(); throw new Exception(""); } SendString("HOSTCTRL_REQUEST RPOSC 4\r"); rtn = await WaitRobotFedback(); if (!rtn.Contains("OK")) { NetClient.DisConnect(); throw new Exception(""); } SendString("1,0\r"); rtn = await WaitRobotFedback(); NetClient.DisConnect(); if (!rtn.EndsWith("0\r\0")) { throw new Exception(" error Get position info "); } string[] data = rtn.Split(','); RobotPos robotPos = new RobotPos(); robotPos.X = double.Parse(data[0]); robotPos.Y = double.Parse(data[1]); robotPos.Z = double.Parse(data[2]); return(robotPos); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); return(null); } }
private async void btn_GetRobPos_Click(object sender, EventArgs e) { DataGridViewRow dataGridViewRow = null; if (dGV_RobotPos.SelectedRows.Count == 0) { MessageBox.Show("请选择一行来更新点位数据"); return; } dataGridViewRow = dGV_RobotPos.SelectedRows[0]; RobotPos robotPos = await Robot.GetRobotCPoint(); if (robotPos == null) { return; } dataGridViewRow.Cells[1].Value = robotPos.X; dataGridViewRow.Cells[2].Value = robotPos.Y; }
private async void MainProc() { Step = MainStep.CheckInPlace; float verticalOffset = 0; double angle = 0; float instance1 = 0; float instance2 = 0; float instance3 = 0; RobotPos robotPos1 = new RobotPos(); RobotPos robotPos2 = new RobotPos(); while (!tokenSource.IsCancellationRequested) { try { switch (Step) { case MainStep.CheckInPlace: bool isInPlace = await HardWareManager.Instance.XinJiePlc.ReadM(100); if (!isInPlace) { break; } DelegateControls.Instance.DelegateTextbox("FormMain_txt_hRanging", null); DelegateControls.Instance.DelegateTextbox("FormMain_txt_vRanging1", null); DelegateControls.Instance.DelegateTextbox("FormMain_txt_vRanging2", null); DelegateControls.Instance.DelegateTextbox("FormMain_txt_vRanging3", null); DelegateControls.Instance.DelegateTextbox("FormMain_txt_hOffset", null); DelegateControls.Instance.DelegateTextbox("FormMain_txt_vOffset", null); DelegateControls.Instance.DelegateTextbox("FormMain_instanceScrew", null); DelegateControls.Instance.DelegateTextbox("FormMain_productType", null); verticalOffset = await HardWareManager.Instance.XinJiePlc.ReadD(510); //读取横向偏移量 if (Math.Abs(verticalOffset) > 80) { DelegateControls.Instance.DelegateRichTextBoxZd("FormMain_RichTextBoxZd", "水平方向偏移超限", Color.Red); break; } DelegateControls.Instance.DelegateTextbox("FormMain_txt_hRanging", verticalOffset.ToString()); HardWareManager.Instance.XinJiePlc.SetM(101, true); // await HardWareManager.Instance.YaskawaRobot.SetRobotPoint(100, $"0,{verticalOffset} ,0,0,0,0"); DelegateControls.Instance.DelegateRichTextBoxZd("FormMain_RichTextBoxZd", "水平测距完成"); Step = MainStep.GetAngleInstance; break; case MainStep.GetAngleInstance: bool getInstance = await HardWareManager.Instance.XinJiePlc.ReadM(110); if (!getInstance) { break; } instance1 = await HardWareManager.Instance.XinJiePlc.ReadD(500); instance2 = await HardWareManager.Instance.XinJiePlc.ReadD(502); HardWareManager.Instance.XinJiePlc.SetM(111, true); instance1 = -instance1; instance2 = -instance2; DelegateControls.Instance.DelegateTextbox("FormMain_txt_vRanging1", instance1.ToString()); DelegateControls.Instance.DelegateTextbox("FormMain_txt_vRanging2", instance2.ToString()); await HardWareManager.Instance.YaskawaRobot.SetRobotPoint(13, $"{instance1},{verticalOffset},0,0,0,{0}"); Thread.Sleep(300); await HardWareManager.Instance.YaskawaRobot.SetRobotPoint(14, $"{instance1},{verticalOffset},0,0,0,{0}"); Thread.Sleep(300); await HardWareManager.Instance.YaskawaRobot.SetRobotPoint(15, $"{instance2},{verticalOffset},0,0,0,{0}"); Thread.Sleep(300); await HardWareManager.Instance.YaskawaRobot.SetTypeBData(3, "1"); DelegateControls.Instance.DelegateRichTextBoxZd("FormMain_RichTextBoxZd", "垂直测距完成"); Step = MainStep.GetHolePoint2; break; case MainStep.GetInstance://获取两个差距值,用来计算角度 //bool getInstance1 = await HardWareManager.Instance.XinJiePlc.ReadM(120); //if (!getInstance1) // break; //instance3 = await HardWareManager.Instance.XinJiePlc.ReadD(504); //instance3 = -instance3; //HardWareManager.Instance.XinJiePlc.SetM(121, true); //DelegateControls.Instance.DelegateTextbox("FormMain_txt_vRanging3", instance3.ToString()); //Step = MainStep.GetHolePoint2; break; case MainStep.GetHolePoint1: string rtn = await HardWareManager.Instance.YaskawaRobot.GetTypeBData(1); if (rtn != "2\r\0") { break; } bool getInstance1 = await HardWareManager.Instance.XinJiePlc.ReadM(120); if (!getInstance1) { break; } instance3 = await HardWareManager.Instance.XinJiePlc.ReadD(504); // instance3 = -instance3; HardWareManager.Instance.XinJiePlc.SetM(121, true); DelegateControls.Instance.DelegateTextbox("FormMain_txt_vRanging3", instance3.ToString()); HObject _image = HardWareManager.Instance.Cmaera.SnapShot(); robotPos1 = await GetHolePoint(_image); // length = 700 - length; await HardWareManager.Instance.YaskawaRobot.SetRobotPoint(100, $"{-lengthX},{-lengthY},{instance3},0,0,{0}"); DelegateControls.Instance.DelegateTextbox("FormMain_txt_hOffset", (lengthY).ToString()); DelegateControls.Instance.DelegateTextbox("FormMain_txt_vOffset", (lengthX).ToString()); await HardWareManager.Instance.YaskawaRobot.SetTypeBData(2, "2"); DelegateControls.Instance.DelegateTextbox("FormMain_instanceScrew", Math.Abs(robotPos1.Y - robotPos2.Y).ToString()); if ((robotPos1.Y - robotPos2.Y) < Param.Instance.InstanceMax + Param.Instance.InstanceOffset && (robotPos1.Y - robotPos2.Y) > Param.Instance.InstanceMax - Param.Instance.InstanceOffset) { DelegateControls.Instance.DelegateTextbox("FormMain_productType", "大号产品"); await HardWareManager.Instance.YaskawaRobot.SetTypeBData(5, "3"); } else if (Math.Abs(robotPos1.Y - robotPos2.Y) < Param.Instance.InstanceLittle + Param.Instance.InstanceOffset && (robotPos1.Y - robotPos2.Y) > Param.Instance.InstanceLittle - Param.Instance.InstanceOffset) { DelegateControls.Instance.DelegateTextbox("FormMain_productType", "小号产品"); await HardWareManager.Instance.YaskawaRobot.SetTypeBData(5, "1"); } else if (Math.Abs(robotPos1.Y - robotPos2.Y) < Param.Instance.InstanceMiddle + Param.Instance.InstanceOffset && (robotPos1.Y - robotPos2.Y) > Param.Instance.InstanceMiddle - Param.Instance.InstanceOffset) { DelegateControls.Instance.DelegateTextbox("FormMain_productType", "中号产品"); await HardWareManager.Instance.YaskawaRobot.SetTypeBData(5, "2"); } else { throw new Exception("螺丝孔位置 无法匹配产品"); } DelegateControls.Instance.DelegateRichTextBoxZd("FormMain_RichTextBoxZd", "第二次拍照完成"); Step = MainStep.CheckInPlace; break; case MainStep.GetHolePoint2: rtn = await HardWareManager.Instance.YaskawaRobot.GetTypeBData(1); if (rtn != "1\r\0") { break; } _image = HardWareManager.Instance.Cmaera.SnapShot(); robotPos2 = await GetHolePoint(_image); await HardWareManager.Instance.YaskawaRobot.SetTypeBData(2, "1"); Step = MainStep.GetHolePoint1; DelegateControls.Instance.DelegateRichTextBoxZd("FormMain_RichTextBoxZd", "第一次拍照完成"); break; //VisionManager.Instance.ShapeModle.BackImage = _image.Clone(); //ModleFindResult result = VisionManager.Instance.ShapeModle.FindSimple(); //if (result != null) //{ // HTuple hommate2d; // HOperatorSet.VectorAngleToRigid(0, 0, 0, result.Row, result.Column, result.Angle, out hommate2d); // HOperatorSet.AffineTransContourXld(result.ModleRegion, out HObject hObject, hommate2d); // RegionX regionX = new RegionX(hObject, "green"); // DelegateControls.Instance.DelegateHdisplay("FormMain_hDisplay1", _image, new List<HalWindow.RegionX>() { regionX }); // HTuple _x = new HTuple(); // HTuple _y = new HTuple(); // VisionManager.Instance.Calibrate.GetRobotpoint(result.Row, result.Column, ref _x, ref _y); // robotPos2 = await HardWareManager.Instance.YaskawaRobot.GetRobotCPoint(); // robotPos2.Y += _x; // robotPos2.Z += _y; // await HardWareManager.Instance.YaskawaRobot.SetTypeBData(2, "1"); //} //else //{ // DelegateControls.Instance.DelegateHdisplay("FormMain_hDisplay1", _image, null); // DelegateControls.Instance.DelegateRichTextBoxZd("FormMain_RichTextBoxZd", "第一次取像未能找到第一个螺丝孔"); // HardWareManager.Instance.XinJiePlc.SetM(125, true); // Step = MainStep.CheckInPlace; // break; //} //await HardWareManager.Instance.YaskawaRobot.SetTypeBData(2, "1"); //Step = MainStep.GetHolePoint1; //DelegateControls.Instance.DelegateRichTextBoxZd("FormMain_RichTextBoxZd", "第一次拍照完成"); //break; } } catch (Exception ex) { HardWareManager.Instance.XinJiePlc.SetM(125, true); DelegateControls.Instance.DelegateRichTextBoxZd("FormMain_RichTextBoxZd", ex.Message); Step = MainStep.CheckInPlace; } Thread.Sleep(100); } }