GrabBag/App/BagThreadPosition/MODBUS_PROTOCOL.md

102 lines
3.3 KiB
Markdown
Raw Normal View History

# 糖包拆线 ModbusTCP 协议说明
**应用名称**: BagThreadPosition糖包拆线
**版本**: v1.0
**日期**: 2026-02-07
## 概述
糖包拆线应用作为 ModbusTCP 服务端,使用标准 ModbusTCP 协议(端口 502与外部设备客户端通信实现相机扫描控制和检测结果输出。
### 基本信息
- **服务端**: 糖包拆线应用BagThreadPosition
- **客户端**: PLC、机器人控制器或其他支持 ModbusTCP 的设备
- **协议**: ModbusTCP基于 TCP/IP 的 Modbus 协议)
- **端口**: 502
- **功能码**: 0x03读保持寄存器、0x10写多个保持寄存器
## 寄存器地址映射
### 控制寄存器
| 地址 | 功能 | 读/写 | 数据类型 | 说明 |
|------|------|-------|----------|------|
| 0 | 启动扫描 | 写 | uint16 | 写入1启动相机扫描 |
| 2 | 检测状态 | 读 | uint16 | 0=未完成, 1=成功, 2=失败 |
### 数据寄存器
| 地址 | 功能 | 读/写 | 数据类型 | 说明 |
|------|------|-------|----------|------|
| 4+ | xyzu数据 | 读 | float[] | 拆线位置数据每条拆线8个寄存器 |
## 使用流程
### 客户端操作步骤
### 1. 启动扫描
客户端写入寄存器[0] = 1
- 服务端启动相机扫描
- 寄存器[2]被重置为0检测中
### 2. 等待检测完成
客户端循环读取寄存器[2]直到值不为0
- 值为1检测成功xyzu数据已自动写入寄存器[4]开始的位置
- 值为2检测失败
### 3. 读取检测结果
当寄存器[2] = 1成功客户端直接从寄存器[4]开始读取 xyzu 数据。
## 数据格式
### 寄存器布局
每条拆线占用 8 个寄存器4个float每个float占2个寄存器
```
寄存器[4+i*8+0:1] -> x (centerX, float)
寄存器[4+i*8+2:3] -> y (centerY, float)
寄存器[4+i*8+4:5] -> z (centerZ, float)
寄存器[4+i*8+6:7] -> u (rotateAngle, float)
```
其中 i 为拆线索引从0开始
### xyzu 含义
- **x (centerX)**: 拆线端部中心点的X坐标毫米
- **y (centerY)**: 拆线端部中心点的Y坐标毫米
- **z (centerZ)**: 拆线端部中心点的Z坐标毫米
- **u (rotateAngle)**: 拆线旋转角度(度,范围 -30° ~ 30°
### Float 数据格式
每个 float 值占用 2 个 uint16 寄存器IEEE 754 单精度浮点数):
- 低位寄存器float 的低16位
- 高位寄存器float 的高16位
## 注意事项
1. **服务端**: 糖包拆线应用启动后自动开启 ModbusTCP 服务端,监听端口 502
2. **客户端**: 支持标准 ModbusTCP 协议的设备均可连接PLC、机器人控制器等
3. **数据顺序**: 拆线数据按检测顺序排列
4. **自动输出**: 检测成功后,服务端自动将 xyzu 数据写入寄存器[4]开始的位置,客户端无需额外请求
5. **字节序**: Float 数据使用小端字节序Little Endian
6. **连接数**: 支持多个客户端同时连接,但建议单客户端操作
7. **超时处理**: 建议客户端设置合理的超时时间如30秒等待检测完成
## 错误处理
如果寄存器[2]返回2失败可能的原因
- 相机未连接
- 检测算法失败
- 检测处理器未初始化
建议客户端在失败后重新启动扫描或通知操作人员检查设备状态。