发布时间: 2026-01-30

C#实现EC机器人8056端口解析


1. 简介

8056 端口可用于获取机器人的各种状态及数据,EC机器人会以 125HZ 的频率向 8056端口 发送机器人的状态数据,本文通过“机器人状态”和“机器人基座坐标”两个数据为例详细说明如何解析机器人状态数据。

2. 操作流程

2.1了解返回的数据包里有哪些数据(详情请看图-1)

图-1

2.2通过C#建立连接接收数据

第一步:建立连接。如图-2所示

图-2

第二步:接收机器人发送过来的数据包。如图-3和图-4所示

图-3

图-4

第三步:判断接收的数据是否有效。接收的数据最后4个字节转为10进制数要等于3967833836数据才算有效,反之数据无效。如图-5所示

图-5

2.3通过C#解析数据

2.3.1解析机器人状态数据

第一步:查看图-1可知机器人状态数据从237个字节开始占4个字节,所以就需要把这个4个字节提取出来。如图-6所示通过Array.Copy(buffer, 237, bt2, 0, 4);将所需要的4个字节提取出来存储在byte数组bt2中。

图-6

第二步:因为机器人发送过来的数据包大端序,需要转为小端序后再进行解析。如图-7所示,通过Array.Reverse(bt2);将字节数组bt2转为小端序,然后通过查看图-1可知机器人状态数据属于int32类型,所以再通过int robotState = BitConverter.ToInt32(bt2, 0);将bt2转为int32类型整数既可,然后就可以去判断robotState的值为多少从而知道机器人的当前状态。

图-7

2.3.2解析机器人基座坐标数据

第一步:查看图-1可知机器人状态数据从77个字节开始占48个字节,所以就需要把这个48个字节提取出来。如图-8所示通过Array.Copy(buffer, 77, bt3, 0, 48);将所需要的48个字节提取出来存储在byte数组bt3中。

图-8

第二步:查看图-1可知,机器人基座坐标的数据类型是一个长度为6的doubel数组,数组里每一个元素占8个字节,所以就需要将bt3数组里的48个字节按8个一组依次提取出来,解析完后依次存储在doubel数组里。如图-9所示,就是通过一个for循坏将bt3数组里的48个字节按8个一组依次提取出来,解析完后依次存储在doubel数组C里。

图-9

 

3. 常见问题解答

1.因为机器人发送的数据是大端序,所以需要将字节顺序反转为小端序。

4. 示例

图-10是该程序运行后的结果

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
 
namespace _8056
{
    internal class Program
    {
        static int it2 = 0;
        static string str2;
        public static Socket socket;
        static void Main(string[] args)
        {
            //建立连接
            socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint point = new IPEndPoint(IPAddress.Parse("192.168.1.200"), Convert.ToInt32(8056));
            try
            {
                socket.Connect(point);
                Console.WriteLine("8056连接成功");
            }
            catch (Exception ex) 
            {
                Console.WriteLine("8056连接失败");
            }
            //接收数据,总共数据长度为1024个字节
            byte[] buffer = new byte[1024];
            int A = socket.Receive(buffer, 0);
            Console.WriteLine("接收到的字节数="+A);
            Console.WriteLine("接收到的数据="+BitConverter.ToString(buffer));
            //判断接收的数据是否有效
            byte[] bt1 = new byte[4];
            Array.Copy(buffer, 1020, bt1, 0, 4);
            Array.Reverse(bt1);
            uint it1 = BitConverter.ToUInt32(bt1, 0);
            if (it1!= 3967833836)
            {
                Console.WriteLine("接收到的数据无效");
            }
            else
            {
                Console.WriteLine("接收到的数据有效");
                //解析机器人状态数据
                byte[] bt2 = new byte[4];
                Array.Copy(buffer, 237, bt2, 0, 4);
                Array.Reverse(bt2);
                int robotState = BitConverter.ToInt32(bt2, 0);
                switch (robotState)
                {
                    case 0:
                        Console.WriteLine("机器人处于停止状态");
                        break;
                    case 1:
                        Console.WriteLine("机器人处于暂停状态");
                        break;
                    case 2:
                        Console.WriteLine("机器人处于急停状态");
                        break;
                    case 3:
                        Console.WriteLine("机器人处于运行状态");
                        break;
                    case 4:
                        Console.WriteLine("机器人处于报警状态");
                        break;
                }
                //解析机器人的基座坐标
                byte[] bt3 = new byte[48];
                Array.Copy(buffer, 77, bt3, 0, 48);
                for (int i = 0; i < bt3.Length; i += 8)
                {
                    switch (it2)
                    {
                        case 0:
                            str2 = "X";
                            break;
                        case 1:
                            str2 = "Y";
                            break;
                        case 2:
                            str2 = "Z";
                            break;
                        case 3:
                            str2 = "RX";
                            break;
                        case 4:
                            str2 = "RY";
                            break;
                        case 5:
                            str2 = "RZ";
                            break;
                    }
                    byte[] bt4 = new byte[8];
                    double[] C = new double[6];
                    Array.Copy(bt3, i, bt4, 0, 8);
                    //Console.WriteLine(BitConverter.ToString(bt4));
                    Array.Reverse(bt4);
                    C[it2] = BitConverter.ToDouble(bt4, 0);
                    Console.WriteLine(str2 + "=" + C[it2]);
                    it2 = it2 + 1;
                }
            }
            
        }
    }
}

图-10

 

 

提交反馈