Skip to content

7000 端口协议

概述

数据帧结构

项目长度 (Byte)说明
SyncByte20x4E66 固定包头
Length216进制长度 00xffff;不包含数据头和命令字,不包含 CRC 段
Command2命令字
dataLength数据段(主要为 JSON 数据格式)
CRC4对不含包头数据做 CRC 校验(CRC32)

通讯协议配置

7000 端口可选择 TCPUDP 两种通讯协议,通过进入控制器后台修改配置文件 config/controller.json,在 hostComputerService 节点下:

  • socketType:socket 类型,可选 "TCP""UDP",默认为 "TCP"
  • checkCRC:是否进行 CRC 检测;false 时不检测 CRC(但 CRC 所占用的 4 个字节仍需发送),默认为 true

查询状态可设置为 UDP 通讯进行数据获取,最小周期可达 1ms。


命令字总览

命令字方向功能
0x1E00上位机 → 控制器查询状态
0x1E01控制器 → 上位机查询状态回复
0x1E02上位机 → 控制器运动控制
0x1E03控制器 → 上位机运动控制回复
0x1E04上位机 → 控制器变量、IO 控制
0x1E10上位机 → 控制器开关伺服点位运动控制
0x1E11控制器 → 上位机开关伺服点位运动控制回复
0x1E12上位机 → 控制器点位发送
0x1E13控制器 → 上位机点位发送回复

1. 查询状态(0x1E00

请求字段说明

字段类型说明
channelint通道;最多 9 个通道,默认为 1
stopint停止发送;为 1 时停止之前的持续发送,下面的数据可不发
robotint机器人编号;取值范围 [1, 4]
modeint请求回复模式;0:应答(请求一次回复一次),1:持续(请求一次持续回复)
intervalint持续回复间隔时间(ms);仅 mode=1 时有效,范围 [1, 60000]
queryTypestring[]查询运行参数列表,无需查询的不写
typeCfgobject查询内容配置,仅需要查询相关类型数据时有效

queryType 可选值

说明
realPosACS实时坐标位置(关节坐标系)
realPosMCS实时坐标位置(直角坐标系)
realPosPCS实时坐标位置(工具坐标系)
realPosUCS实时坐标位置(用户坐标系)
axisVel轴速度
axisAcc轴加速度
torque力矩
electric电流
numGVar数值变量
IOIO 端口
serialNum序列号
runControlPosRunNum运动控制当前轨迹已运行点位数
detailedMotionPos详细运动点位(每个机器人同一时刻仅支持一个通道查询)

typeCfg 配置说明

  • numGVar:查询全局变量(int 类型),如 ["GD001", "GA001", "GI001", "GI333"]
  • IO:查询 IO 端口(string 类型),如 ["DI1", "DI16", "DO1", "DO3", "DO17"];若查询的 IO 不存在,返回 -1;可查询最大数量不应大于 IO 个数
  • detailedMotionPos
    • num:每帧数据回复的点位数目(int)
    • optional:可选参数(string[]),可选 "ACS""MCS""time""reset"

请求示例

json
{
  "channel": 1,
  "stop": 1,
  "robot": 1,
  "mode": 0,
  "interval": 10,
  "queryType": [
    "realPosACS", "realPosMCS", "realPosPCS", "realPosUCS",
    "axisVel", "axisAcc",
    "torque", "electric",
    "numGVar",
    "IO",
    "serialNum",
    "runControlPosRunNum",
    "detailedMotionPos"
  ],
  "typeCfg": {
    "numGVar": ["GD001", "GA001", "GI001", "GI333"],
    "IO": ["DI1", "DI16", "DO1", "DO3", "DO17"],
    "detailedMotionPos": {
      "num": 10,
      "optional": ["ACS", "MCS", "time", "reset"]
    }
  }
}

2. 查询状态回复(0x1E01

回复字段说明

字段类型说明
channelint通道;最多 9 个通道
robotint机器人编号;取值范围 [1, 4]
replyDataobject回复查询的结果;未查询的不会回复

坐标数据说明

坐标格式:机器人(前 7 个)+ 外部轴(后 5 个)

  • 无外部轴时,坐标个数为轴数
  • 有外部轴时,坐标个数为 7 + 外部轴个数

replyData 字段详情

字段说明
realPosACS实时坐标位置(关节坐标系),float 数组
realPosMCS实时坐标位置(直角坐标系),float 数组
realPosPCS实时坐标位置(工具坐标系),float 数组
realPosUCS实时坐标位置(用户坐标系),float 数组
axisVel轴速度,float 数组
axisAcc轴加速度,float 数组
torque力矩,float 数组
electric电流,float 数组
numGVar全局变量键值对,如 {"GD001": 0.1, "GA001": true, "GI001": 33}
IOIO 状态键值对,如 {"DI1": 1, "DO1": 0};若 IO 不存在返回 -1
runControlPosRunNum运动控制当前轨迹已运行点位数
serialNum序列号;每次回复加 1,每个通道互相独立
detailedMotionPos详细运动点位

detailedMotionPos 详情

  • num:每帧数据回复的点位数目(int)
  • data:点位数组,每个点位包含:
    • ACS:关节坐标,float 数组
    • MCS:直角坐标,float 数组
    • time:时间戳 [秒, 纳秒],如 [123456, 654321]

回复示例

json
{
  "channel": 1,
  "robot": 1,
  "replyData": {
    "realPosACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    "realPosMCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    "realPosPCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    "realPosUCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    "axisVel":    [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    "axisAcc":    [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    "torque":     [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    "electric":   [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    "numGVar": {"GD001": 0.1, "GA001": true, "GI001": 33, "GI333": -55},
    "IO": {"DI1": 1, "DI16": 0, "DO1": 0, "DO3": 1, "DO17": -1},
    "runControlPosRunNum": 0,
    "serialNum": 1,
    "detailedMotionPos": {
      "num": 10,
      "data": [
        {
          "time": [123456, 654321],
          "ACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
          "MCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]
        }
      ]
    }
  }
}

3. 运动控制(0x1E02

请求字段说明

字段类型说明
robotint机器人编号;取值范围 [1, 4]
clearBufferint清空运动轨迹缓存队列;1:清空(不影响当前正在传输的数据),0 时可不发
targetModeint运动模式;0:独立点位,1:连续轨迹
sendModeint0:一次传输完全部轨迹点位,1:每次传输部分点位
runModeint每次传输部分点位时有效;0:接收完轨迹再运动,1:边接收边运动
endint1:停止之前的持续传输,下面的数据可不发;0 时可不发此字段
sumint仅"接收完轨迹再运动"时有效;总共要发的帧数
countint仅"接收完轨迹再运动"时有效;当前为第几帧
cfgobject运动配置(仅需第一帧设置,且仅第一帧有效)
targetPosfloat[]单目标点(使用此节点只走一个目标点)
targetVecobject[]多目标点(按顺序走完所有点位;与 targetPos 同时存在时,仅 targetPos 生效)

cfg 字段详情

字段类型说明
coordstring坐标系,如 "ACS"
extMoveint是否有外部轴运动;1:有,0 或不写:无
syncint外部轴是否同步;0 或不写:不同步,1:同步
speedint速度设定;不写则使用默认值
accint加速度设定;不写则使用默认值
plint不写则默认 5;仅"独立点位"且使用 targetVec 时有效
moveModestring运动模式;可选 "TeachSet""MOVJ""MOVL""MOVS",默认 "TeachSet";仅"独立点位"且使用 targetVec 时有效
timeoutint超时时间(ms),不写则不检测超时,范围 10–10000;仅"接收完轨迹再运动"时有效

示例一:独立点位 · 一次传输全部点位

json
{
  "robot": 1,
  "clearBuffer": 1,
  "targetMode": 0,
  "cfg": {
    "coord": "ACS",
    "extMove": 0,
    "sync": 0,
    "speed": 100,
    "acc": 100,
    "pl": 5,
    "moveMode": "TeachSet"
  },
  "targetPos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
  "targetVec": [
    {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]},
    {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]},
    {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]},
    {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}
  ]
  // targetPos 和 targetVec 同时存在时,仅 targetPos 生效
}

示例二:独立点位 · 每次传输部分点位 · 接收完轨迹再运动

json
{
  "robot": 1,
  "clearBuffer": 1,
  "end": 0,
  "targetMode": 0,
  "sendMode": 1,
  "runMode": 0,
  "sum": 10,
  "count": 1,
  "cfg": {
    "coord": "ACS",
    "extMove": 0,
    "sync": 0,
    "speed": 100,
    "acc": 100,
    "pl": 5,
    "moveMode": "TeachSet",
    "timeout": 100
  },
  "targetVec": [
    {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]},
    {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}
  ]
}

示例三:连续轨迹 · 一次传输全部点位

json
{
  "robot": 1,
  "clearBuffer": 1,
  "targetMode": 1,
  "sendMode": 0,
  "cfg": {
    "coord": "ACS",
    "extMove": 0,
    "sync": 0,
    "speed": 100,
    "acc": 100
  },
  "targetVec": [
    {
      "pos":       [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "axisVel":   [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "axisAcc":   [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "timeStamp": 10
    },
    {
      "pos":       [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "axisVel":   [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "axisAcc":   [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "timeStamp": 10
    }
  ]
}

timeStamp:运行到该点位时相对于起始点的时间(ms)

示例四:连续轨迹 · 每次传输部分点位 · 接收完轨迹再运动

json
{
  "robot": 1,
  "clearBuffer": 1,
  "end": 0,
  "targetMode": 1,
  "sendMode": 1,
  "runMode": 0,
  "sum": 10,
  "count": 1,
  "cfg": {
    "coord": "ACS",
    "extMove": 0,
    "sync": 0,
    "speed": 100,
    "acc": 100,
    "timeout": 100
  },
  "targetVec": [
    {
      "pos":       [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "axisVel":   [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "axisAcc":   [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
      "timeStamp": 10
    }
  ]
}

4. 运动控制回复(0x1E03

回复字段说明

字段类型说明
robotint机器人编号;取值范围 [1, 4]
successbooltrue:成功,false:失败
sizeint运动轨迹缓存队列的当前轨迹数目;仅 success=true 时有该项
causestring失败原因(成功时为空)

cause 失败原因

说明
"busy"当前有未传输完成的数据
"timeout"接收超时
"dataErr"数据错误
"termination"发送端终止了正在传输的数据

回复示例

json
{
  "robot": 1,
  "success": false,
  "size": 1,
  "cause": "timeout"
}

5. 变量、IO 控制(0x1E04

请求字段说明

字段类型说明
numGVarobject设置变量;GA 为 bool 型,GI 为 int 型,GD 为 double 型
IOobject设置 IO 口;1/0 表示 IO 口状态

请求示例

json
{
  "numGVar": {
    "GA001": true,
    "GI033": 6,
    "GD666": -2.33
  },
  "IO": {
    "DO1": 1,
    "DO13": 0
  }
}

6. 开关伺服点位运动控制(0x1E10

注意: 该功能和"运动控制"功能(0x1E02)不可同时使用。

请求字段说明

字段类型说明
robotint机器人编号;取值范围 [1, 4]
switchbooltrue:开启,false:关闭

请求示例

json
{
  "robot": 1,
  "switch": true
}

7. 开关伺服点位运动控制回复(0x1E11

回复字段说明

字段类型说明
successbooltrue:成功,false:失败
causestring失败原因(成功时为空)

cause 失败原因

说明
"busy"当前通道被占用
"dataErr"数据错误
"startupErr"启动失败

回复示例

json
{
  "success": false,
  "cause": "busy"
}

8. 点位发送(0x1E12

请求字段说明

字段类型说明
robotint机器人编号;取值范围 [1, 4]
endint1:停止之前的持续传输,下面的数据可不发;0 时可不发此字段。在点位未传输完毕时,会清空之前接收到的数据,重新等待新的点位队列
sumint总共要发的帧数
countint当前的帧数
PosVecfloat[][]点位坐标数组;格式:机器人(前 7 个)+ 外部轴(后 5 个)

请求示例

json
{
  "robot": 1,
  "end": 1,
  "sum": 10,
  "count": 1,
  "PosVec": [
    [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
    [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]
  ]
}

9. 点位发送回复(0x1E13

回复字段说明

字段类型说明
robotint机器人编号;取值范围 [1, 4]
successbooltrue:接收成功,false:接收失败
causestring失败原因(成功时为空)

cause 失败原因

说明
"notStart"未开启伺服点位运动控制模式
"dataErr"数据错误
"termination"发送端终止了正在传输的数据
"cacheFull"缓存区已满(最大缓存 6 条轨迹)

回复示例

json
{
  "robot": 1,
  "success": false,
  "cause": "dataErr"
}

附录一:TLV 协议格式详解

TLV 结构

7000 端口协议采用 TLV(Type-Length-Value) 封装的二进制帧结构,由以下字段组成:

字段偏移长度 (Byte)说明
SyncByte02同步头/魔数,固定值 0x4E66,用于帧同步
Length22数据长度,大端序(Big-Endian),范围 00xFFFF;表示 Data 段的字节数
Command42命令字,大端序,标识该帧的功能类型
Data6Length数据段,JSON 格式的 UTF-8 编码字符串
CRC6 + Length4CRC32 校验值,大端序;对 Command + Data 段计算

帧结构图示

text
+----------+----------+----------+-----------+------------+
| SyncByte | Length   | Command  | Data      | CRC        |
| 2 Bytes  | 2 Bytes  | 2 Bytes  | N Bytes   | 4 Bytes    |
+----------+----------+----------+-----------+------------+
|          |                   CRC 校验范围               |
+----------+--------------------------------------------+

字节序说明

  • Length:大端序(Big-Endian),即高位字节在前
  • Command:大端序
  • CRC:大端序

示例:查询状态帧

上位机发送查询状态请求(命令字 0x1E00):

text
| 0x4E 0x66 | 0x00 0x3C | 0x1E 0x00 | {...JSON...} | CRC32 |

其中:

  • SyncByte = 0x4E66
  • Length = 0x003C(60 字节,即 JSON 数据的长度)
  • Command = 0x1E00
  • Data = 60 字节的 JSON 字符串
  • CRC = 对 Command + Data 共 62 字节的 CRC32 校验值

附录二:CRC32 校验说明

校验范围

CRC 校验覆盖 Command(2 字节)+ Data(Length 字节),不包含 SyncByte 和 Length 字段,也不包含 CRC 自身。

校验算法

使用标准 CRC-32 算法,多项式为 0x04C11DB7

校验配置

通过修改配置文件 config/controller.jsonhostComputerService.checkCRC 字段:

  • true(默认):启用 CRC 校验,数据帧必须包含正确的 CRC 值
  • false:不进行 CRC 校验,但 CRC 所占用的 4 个字节仍需发送(可填充任意值)

CRC 计算示例(伪代码)

text
function calcCRC32(data, length):
    crc = 0xFFFFFFFF
    for i in range(length):
        crc = crc ^ data[i]
        for j in range(8):
            if (crc & 1):
                crc = (crc >> 1) ^ 0xEDB88320
            else:
                crc = crc >> 1
    return crc ^ 0xFFFFFFFF

附录三:通讯建立与握手流程

TCP 模式下的连接建立

  1. 上位机发起 TCP 连接:连接到控制器的 7000 端口(默认 IP 为控制器 IP)
  2. TCP 三次握手完成:建立可靠的 TCP 连接
  3. 数据帧传输:按照 TLV 格式发送/接收数据帧
  4. 心跳维持:通过持续查询状态或定时发送数据保持连接

UDP 模式下的通讯

  1. 无连接通讯:UDP 模式下无需建立连接,直接发送数据帧
  2. 端口绑定:上位机绑定本地端口,控制器回复到该端口
  3. 丢包处理:UDP 不保证可靠传输,适合高频状态查询(最小周期 1ms)
  4. 推荐用途:高频状态查询场景使用 UDP,运动控制使用 TCP

持续模式下的通讯(mode=1)

  1. 发送查询状态请求(0x1E00mode=1),设置 interval(回复间隔)
  2. 控制器按照 interval 周期持续回复状态数据(0x1E01
  3. 发送 stop=1 的请求停止持续回复
  4. 每个通道独立维护 serialNum(序列号),每次回复递增 1

附录四:命令字编址规则

命令字结构

7000 端口的命令字采用 2 字节(16 位)编码,按功能分为以下段:

范围功能类别说明
0x1E000x1E0F状态查询与控制基本状态查询、运动控制、IO/变量控制
0x1E100x1E1F伺服点位运动开关伺服、点位发送与接收

命令字对应关系

命令字方向功能
0x1E00上位机 → 控制器查询状态
0x1E01控制器 → 上位机查询状态回复
0x1E02上位机 → 控制器运动控制
0x1E03控制器 → 上位机运动控制回复
0x1E04上位机 → 控制器变量、IO 控制
0x1E10上位机 → 控制器开关伺服点位运动控制
0x1E11控制器 → 上位机开关伺服点位运动控制回复
0x1E12上位机 → 控制器点位发送
0x1E13控制器 → 上位机点位发送回复

命令字编址规则

  • 请求命令字为偶数(如 0x1E000x1E02
  • 回复命令字为对应的奇数(如 0x1E010x1E03
  • 上位机 → 控制器方向为偶数命令字
  • 控制器 → 上位机方向为奇数命令字

附录五:常见通讯配置示例

示例 1:TCP 模式高频状态查询

上位机通过 TCP 连接 7000 端口,以 10ms 间隔持续查询机器人实时位置:

json
{
  "channel": 1,
  "stop": 0,
  "robot": 1,
  "mode": 1,
  "interval": 10,
  "queryType": ["realPosACS", "realPosMCS", "axisVel", "axisAcc"]
}

示例 2:UDP 模式最低延迟查询

将配置文件 socketType 设置为 "UDP",以 1ms 间隔查询,用于高速数据采集:

json
{
  "channel": 1,
  "robot": 1,
  "mode": 1,
  "interval": 1,
  "queryType": ["realPosACS", "torque", "electric"]
}

示例 3:单次查询全局变量和 IO

json
{
  "channel": 1,
  "robot": 1,
  "mode": 0,
  "queryType": ["numGVar", "IO"],
  "typeCfg": {
    "numGVar": ["GD001", "GI001"],
    "IO": ["DI1", "DI2", "DO1", "DO2"]
  }
}

示例 4:运动控制 - 单点位运动

json
{
  "robot": 1,
  "clearBuffer": 1,
  "targetMode": 0,
  "cfg": {
    "coord": "MCS",
    "extMove": 0,
    "speed": 50,
    "acc": 80
  },
  "targetPos": [100.0, 200.0, 300.0, 0.0, 0.0, 0.0, 0.0]
}

推荐配置

场景协议间隔checkCRC说明
实时监控(低延迟)UDP1–5msfalse丢包容忍,最低延迟
实时监控(可靠)TCP10–20mstrue保证数据完整
运动控制TCP按需true需可靠传输
批量数据采集TCP50–100mstrue低频持续采集