发布时间: 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