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:第二次取像未找到螺丝孔位置");
            }
        }
Beispiel #3
0
        /// <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);
            }
        }