//取得六个坐标值的方法 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); }
//当要记录点位的时候,把此时的点位置记录下来(标准的格式,不做转换,保留小数点) 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); }
//从手册可以知道,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); }
//取得六个角度值的方法 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); }
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; }
//从手册可以知道,260-265的寄存器保存了当前机械手的状态信息 public void GetRobotState() { //这里实时读取UR数据(读取是否开机,是否紧急停机等状态信息,手册来看地址就是260) int[] RobotState = Socket502_URState.ReadMultipleRegister(6, 260, false); OnGetRobotStateSuccess(RobotState); }