GrabBag/App/WeldSeam/Doc/WeldSeam_ModbusTCP_Protocol.md
2026-08-18 14:44:38 +08:00

63 lines
2.8 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.

# 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 恢复连接后必须先核对现场设备状态。