GrabBag/App/WeldSeam/Doc/WeldSeam_ModbusTCP_Protocol.md

63 lines
2.8 KiB
Markdown
Raw Normal View History

2026-08-18 14:44:38 +08:00
# WeldSeam ModbusTCP 协议
## 1. 通信参数
| 项目 | 值 |
|---|---|
| 角色 | 视觉控制器为 ModbusTCP Server主控/PLC 为 Client |
| 默认端口 | `5020` |
| Unit ID | `1`(服务端按标准 MBAP 头处理) |
| 数据区 | Holding Registers |
| 支持功能码 | `0x03` 读保持寄存器、`0x06` 写单寄存器、`0x10` 写多寄存器 |
| 地址表示 | 下表为 PDU 零基地址PLC 若使用 4xxxx 表示法需按厂商规则换算 |
所有 32 位浮点数均使用 IEEE-754 `float32`,高 16 位寄存器在前;每个寄存器内部仍按 Modbus 网络字节序(大端)传输。
## 2. 寄存器映射
| PDU 地址 | 数量 | 读写 | 名称 | 说明 |
|---:|---:|---|---|---|
| `0` | 1 | R/W | Command | 写 `1` 开始扫描,写 `2` 停止扫描并计算;服务端受理后自动清零 |
| `1` | 1 | R | Status | `0`就绪,`1`扫描中,`2`计算中,`3`成功,`4`失败 |
| `2` | 1 | R | PointCount | 有效路径点数量,范围 `0..40` |
| `3..242` | 240 | R | PointData | 最多 40 个路径点,每点 6 个寄存器X/Y/Z 三个 float32 |
`i` 个路径点(`i=0..39`)的地址:
| 坐标 | PDU 起始地址 | 寄存器数 |
|---|---:|---:|
| `Xi` | `3 + i*6` | 2 |
| `Yi` | `5 + i*6` | 2 |
| `Zi` | `7 + i*6` | 2 |
仅前 `PointCount` 个点有效;其余点寄存器为 `0`。TCP 文本协议不受 40 点限制Modbus 超过 40 点时只发布前 40 点。
## 3. 操作流程
1. Client 读取 `Status(1)`,确认值为 `0``3``4`,并确认现场允许开始新任务。
2. Client 向 `Command(0)``1`
3. Server 清空旧结果并将 `Status` 置为 `1`主控随后移动相机VzNLSDK 以非摆动动态模式采集。
4. 相机移动结束并停止后Client 向 `Command(0)``2`
5. Server 停止采集并将 `Status` 置为 `2`,随后自动调用算法计算。
6. 成功时 Server 写入 `PointCount/PointData` 并将 `Status` 置为 `3`;失败时清零点数并将 `Status` 置为 `4`
7. Client 在 `Status=3` 后读取 `PointCount`,再按点数读取路径点。
按 Modbus 规范,功能码 `0x03` 单次最多读取 125 个寄存器。读取较多路径点时Client 必须把 `PointData` 拆成多次连续读取,且不得拆开某个 float32 对应的两个寄存器。
## 4. float32 示例
数值 `12.5` 的 IEEE-754 十六进制为 `0x41480000`
```text
高字寄存器 = 0x4148
低字寄存器 = 0x0000
```
若第 0 点 `X0=12.5`,则 PDU 地址 `3=0x4148`、地址 `4=0x0000`
## 5. 异常处理
- 非就绪状态写开始命令、非扫描状态写停止命令或未知命令时,`Status` 置为 `4`
- 扫描失败、点云为空、算法返回错误或无有效焊缝时,`PointCount=0``Status=4`
- 通信断开不自动重复运动或扫描命令Client 恢复连接后必须先核对现场设备状态。