Beispiel #1
0
        //取得六个坐标值的方法
        public void GetPositions()
        {
            //这里实时读取UR数据(先读取六个坐标值,手册来看地址就是400)
            int[] SixPositions = Socket502.ReadMultipleRegister(6, 400);

            //对于XYZ,取得的并不能直接使用,而是要经过转换
            float[] PositionsFiltered = new float[6];

            for (int i = 0; i < 6; i++)
            {
                //见Modbus UR参考文档:如果XYZ有超过32768,则变成负值(虽然是0-65535,但是我们要自己变成有符号数“-32767”到“32768”)
                if (SixPositions[i] > 32768)
                {
                    SixPositions[i] = SixPositions[i] - 65535;
                }

                //前面三个XYZ做同样处理(对于所有的XYZ都要除以10)
                if (i < 3)
                {
                    PositionsFiltered[i] = (float)SixPositions[i] / 10;
                }
                //后面三个UVW只要直接除以1000即可
                else
                {
                    PositionsFiltered[i] = (float)SixPositions[i] / 1000;
                }
            }


            //读到之后就改写自己的成员值(注意XYZ值还是要原汁原味的浮点数,方便计算)

            URDateHandle.Positions_X = (PositionsFiltered[0] / 1000);
            URDateHandle.Positions_Y = (PositionsFiltered[1] / 1000);
            URDateHandle.Positions_Z = (PositionsFiltered[2] / 1000);

            URDateHandle.Positions_U = (PositionsFiltered[3]);
            URDateHandle.Positions_V = (PositionsFiltered[4]);
            URDateHandle.Positions_W = (PositionsFiltered[5]);


            #region 测试是否定时收到数据

            /*
             * //这里可以测试一下有没有成功实现
             * string temp = "";
             * for (int i = 0; i < PositionsFiltered.Length; i++)
             * {
             *  temp += Convert.ToString(PositionsFiltered[i]) + "|";
             * }
             * MessageBox.Show(temp);
             */
            #endregion

            //还是需要借助委托触发,我这里执行完了,怎么通知主程序是关键
            OnGetPositionSuccess(PositionsFiltered);
        }
Beispiel #2
0
        //当要记录点位的时候,把此时的点位置记录下来(标准的格式,不做转换,保留小数点)
        public double[] GetPose()
        {
            URRegisterHandle.connectServer();

            int ReadNum          = 6;
            int ReadStartAddress = 400;

            int[] SixPositions = new int[6];
            SixPositions = URRegisterHandle.ReadMultipleRegister(ReadNum, ReadStartAddress);

            double[] PositionsFiltered = new double[6];

            for (int i = 0; i < 6; i++)
            {
                if (SixPositions[i] > 32768)
                {
                    SixPositions[i] = SixPositions[i] - 65535;
                }
                //这里全部用浮点值
                if (i < 3)
                {
                    PositionsFiltered[i] = (float)SixPositions[i] / 10000;
                }
                else
                {
                    PositionsFiltered[i] = (float)SixPositions[i] / 1000;
                }
            }

            return(PositionsFiltered);
        }
Beispiel #3
0
        //从手册可以知道,410-415的寄存器保存了当前机械手的六个速度信息
        public void GetRobotSpeed()
        {
            //这里实时读取UR数据(读取是否开机,是否紧急停机等状态信息,手册来看地址就是260)
            int[] RobotSpeed = Socket502_URSpeedState.ReadMultipleRegister(6, 410, false);

            float[] SpeedFiltered = new float[6];

            for (int i = 0; i < 6; i++)
            {
                //见Modbus UR参考文档:如果XYZ有超过32768,则变成负值(虽然是0-65535,但是我们要自己变成有符号数“-32767”到“32768”)
                if (RobotSpeed[i] > 32768)
                {
                    RobotSpeed[i] = RobotSpeed[i] - 65535;
                }

                //前面三个XYZ做同样处理(对于所有的XYZ都要除以10)

                /*
                 * if (i < 3)
                 * {
                 *  SpeedFiltered[i] = (float)RobotSpeed[i] / 1000;
                 * }
                 *
                 * //后面三个UVW只要直接除以1000即可
                 * else
                 * {
                 *  PositionsFiltered[i] = (float)SixPositions[i] / 1000;
                 * }*/
            }

            OnGetRobotSpeedSuccess(RobotSpeed);
        }
Beispiel #4
0
        //取得六个角度值的方法
        public void GetAngles()
        {
            //这里实时读取UR数据(读取六个关节角度值,手册来看地址就是270)
            int[] SixAngles = Socket502_Angle.ReadMultipleRegister(6, 270, false);

            //对于六个角度值,只有double类型可以放这种双精度类型值
            double[] AnglesFiltered = new double[6];

            for (int i = 0; i < 6; i++)
            {
                if (SixAngles[i] > 32768)
                {
                    SixAngles[i] = SixAngles[i] - 65535;
                }

                //这里取到的都是弧度值,要转换为角度值(除以1000之后还是弧度,要再转换为角度)
                AnglesFiltered[i] = (double)SixAngles[i] / 1000 * (180 / 3.14);
            }

            //读到之后就改写自己的成员值(转换为弧度值)
            URDateHandle.Angles_X = (AnglesFiltered[0] * (3.14 / 180));
            URDateHandle.Angles_Y = (AnglesFiltered[1] * (3.14 / 180));
            URDateHandle.Angles_Z = (AnglesFiltered[2] * (3.14 / 180));
            URDateHandle.Angles_U = (AnglesFiltered[3] * (3.14 / 180));
            URDateHandle.Angles_V = (AnglesFiltered[4] * (3.14 / 180));
            URDateHandle.Angles_W = (AnglesFiltered[5] * (3.14 / 180));

            //还是需要借助委托触发,我这里执行完了,怎么通知主程序是关键
            OnGetAngleSuccess(AnglesFiltered);
        }
Beispiel #5
0
        private void btn_RegisterRead_Click(object sender, EventArgs e)
        {
            int ReadNum          = Convert.ToInt32(txtReadNum.Text);
            int ReadStartAddress = Convert.ToInt32(txtReadStartAddress.Text);

            int [] TempArray = URRegisterHandle.ReadMultipleRegister(ReadNum, ReadStartAddress);

            string TempStr = "";

            for (int i = 0; i < TempArray.Length; i++)
            {
                TempStr = TempStr + TempArray[i].ToString() + "|";
            }

            txtReadValues.Text = TempStr;
        }
Beispiel #6
0
 //从手册可以知道,260-265的寄存器保存了当前机械手的状态信息
 public void GetRobotState()
 {
     //这里实时读取UR数据(读取是否开机,是否紧急停机等状态信息,手册来看地址就是260)
     int[] RobotState = Socket502_URState.ReadMultipleRegister(6, 260, false);
     OnGetRobotStateSuccess(RobotState);
 }