GrabBag/App/RodAndBarPosition/Doc/MODBUS_PROTOCOL.md
2026-03-28 14:02:51 +08:00

119 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 棒材定位系统 Modbus TCP 通信协议
## 1. 系统架构
- **视觉系统**:作为 Modbus TCP Server默认端口 502
- **外部客户端**:连接到视觉系统进行检测触发和结果读取
## 2. 连接参数
| 参数 | 值 |
|------|------|
| 协议 | Modbus TCP |
| 端口 | 502默认 |
| 角色 | Server被动等待连接 |
## 3. 寄存器定义
| 地址 | 寄存器数 | 类型 | 读/写 | 说明 |
|------|----------|------|-------|------|
| 0 | 1 | uint16 | R/W | 控制命令(写入后自动清零,命令见下表) |
| 1 | 1 | uint16 | R | 状态码 |
| 2 | 2 | float | R | X中心点 X 坐标mm |
| 4 | 2 | float | R | Y中心点 Y 坐标mm |
| 6 | 2 | float | R | Z中心点 Z 坐标mm |
| 8 | 2 | float | R | Roll绕X轴旋转角 |
| 10 | 2 | float | R | Pitch绕Y轴旋转角 |
| 12 | 2 | float | R | Yaw绕Z轴旋转角 |
> **浮点数编码**IEEE 754 单精度浮点数,每个 float 占 2 个 uint16 寄存器,字节序由网络配置决定
> **坐标系**XYZ 为机械臂坐标系下的值已经过手眼标定转换RPY 为 ZYX 外旋欧拉角
## 3.1 控制命令(地址 0
| 命令值 | 说明 |
|--------|------|
| 1 | 触发相机1执行检测 |
| 2 | 触发相机2执行检测 |
| 10 | 读取下一个缓存棒材结果(从上次检测结果中依次获取) |
## 4. 状态码定义
| 状态码 | 说明 |
|--------|------|
| 0 | 正在检测 |
| 1 | 成功(地址 2~13 数据有效) |
| 2 | 检测失败 |
| 3 | 结果为空 / 无更多缓存结果 |
## 5. 通信流程
### 5.1 触发检测
1. 外部客户端写入地址 0值为相机编号1 或 2
2. 视觉系统自动清零地址 0并将地址 1 设为 0正在检测
3. 视觉系统触发对应相机的检测
4. 检测完成后自动输出第一个棒材结果(地址 1=1地址 2~13=坐标)
### 5.2 读取结果
1. 检测完成后,视觉系统写入:
- 地址 1状态码1=成功2=失败3=空结果)
- 地址 2~13第一个棒材的 X, Y, Z, Roll, Pitch, Yaw仅状态码为 1 时有效)
2. 外部客户端轮询地址 1当值从 0 变为非零时表示检测完成
3. 状态码为 1 时,读取地址 2~13 获取定位结果
### 5.3 典型时序(单棒材)
```
客户端 视觉系统
| |
|--- 写入 地址0 = 1 (触发相机1) ------>|
| |-- 清零地址0地址1=0(正在检测)
| |-- 执行检测...
| |
|<-- 读取 地址1 = 0 (正在检测) --------|
| |
|<-- 读取 地址1 = 1 (检测成功) --------|
| |-- 写入地址1=1, 地址2~13=第1个棒材结果
|<-- 读取 地址2~13 (XYZ+RPY) ---------|
| |
```
### 5.4 读取多棒材结果时序
当检测到多个棒材时,可通过写命令 10 依次获取后续结果:
```
客户端 视觉系统
| |
|--- 写入 地址0 = 1 (触发相机1) ------>|
| |-- 清零地址0地址1=0(正在检测)
| |-- 执行检测发现N个棒材...
| |
|<-- 读取 地址1 = 1 (成功) -----------|
| |-- 自动输出第1个棒材结果
|<-- 读取 地址2~13 (棒材1坐标) --------|
| |
|--- 写入 地址0 = 10 (读取下一个) ---->|
| |-- 输出第2个棒材结果
|<-- 读取 地址1 = 1 (成功) -----------|
|<-- 读取 地址2~13 (棒材2坐标) --------|
| |
|--- 写入 地址0 = 10 (继续读取) ------>|
| |-- 无更多结果
|<-- 读取 地址1 = 3 (无更多结果) ------|
| |
```
> **注意**触发新的检测写1或写2缓存索引自动归零写10将重新从第2个棒材开始读取。
## 6. 注意事项
1. 触发寄存器写入后会自动清零,无需客户端手动清零
2. 检测完成后自动输出第一个棒材结果;写命令 10 可依次获取第2、3...个结果
3. 坐标数据为机械臂坐标系下的值(已经过手眼标定转换)
4. 欧拉角为 ZYX 外旋顺序(从轴向方向和法向方向构建旋转矩阵提取)
5. 浮点数字节序(大端/小端)由网络配置中的 byteOrder 参数决定