GrabBag/App/RodWeldSeam/Doc/钢筋焊缝定位系统ModbusTCP通信协议.md
2026-07-11 16:00:14 +08:00

158 lines
6.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.

# 钢筋焊缝定位系统 Modbus TCP 通信协议
## 1. 系统架构
- **视觉系统**:作为 Modbus TCP Server默认端口 502
- **外部客户端**:连接到视觉系统进行检测触发和结果读取
## 2. 连接参数
| 参数 | 值 |
|------|------|
| 协议 | Modbus TCP |
| 端口 | 502默认 |
| 角色 | Server被动等待连接 |
## 3. 寄存器定义
寄存器输出与 App 页面"焊缝结果卡片"显示内容对应焊缝类型、中心点、起点、终点并提供机械臂坐标系下的姿态角Roll/Pitch/Yaw替代法向量便于机器人直接抓取。
| 地址 | 寄存器数 | 类型 | 读/写 | 说明 |
|------|----------|------|-------|------|
| 0 | 1 | uint16 | R/W | 控制命令(写入后自动清零,命令见 3.1 |
| 1 | 1 | uint16 | R | 状态码(见第 4 节) |
| 2 | 1 | uint16 | R | 焊缝类型0=未知1=点焊2=焊缝3=焊缝间隙) |
| 3 | 1 | uint16 | R | 当前焊缝索引(从 1 开始计数) |
| 4 | 1 | uint16 | R | 焊缝总数(本次检测识别出的焊缝个数) |
| 5 | 1 | uint16 | R | 保留 |
| 6 | 2 | float | R | 中心点 Xmm |
| 8 | 2 | float | R | 中心点 Ymm |
| 10 | 2 | float | R | 中心点 Zmm |
| 12 | 2 | float | R | 起点 Xmm |
| 14 | 2 | float | R | 起点 Ymm |
| 16 | 2 | float | R | 起点 Zmm |
| 18 | 2 | float | R | 终点 Xmm |
| 20 | 2 | float | R | 终点 Ymm |
| 22 | 2 | float | R | 终点 Zmm |
| 24 | 2 | float | R | Roll绕 X 轴旋转角,度) |
| 26 | 2 | float | R | Pitch绕 Y 轴旋转角,度) |
| 28 | 2 | float | R | Yaw绕 Z 轴旋转角,度) |
> **浮点数编码**IEEE 754 单精度浮点数,每个 float 占 2 个 uint16 寄存器,字节序由网络配置 `byteOrder` 决定0=大端1=小端)。
> **坐标系**XYZ 为机械臂坐标系下的值已经过手眼标定转换RPY 为 ZYX 外旋欧拉角,由焊缝轴向方向与法向方向构建旋转矩阵后提取,已包含完整姿态信息,无需单独输出法向量。
### 3.1 控制命令(地址 0
| 命令值 | 说明 |
|--------|------|
| 1 | 触发相机 1 执行检测 |
| 2 | 触发相机 2 执行检测 |
| 10 | 读取下一个缓存焊缝结果(从上次检测结果中依次获取) |
### 3.2 焊缝类型(地址 2
| 类型值 | 含义 | 页面显示 |
|--------|------|----------|
| 0 | UNKNOWN | "未知" |
| 1 | POINT | "点焊" |
| 2 | SEAM | "焊缝" |
| 3 | SEAM_GAP | "焊缝(间隙)" |
## 4. 状态码定义
| 状态码 | 说明 |
|--------|------|
| 0 | 正在检测 |
| 1 | 成功(地址 2~29 数据有效) |
| 2 | 检测失败 |
| 3 | 结果为空 / 无更多缓存结果 |
## 5. 通信流程
### 5.1 触发检测
1. 外部客户端写入地址 0值为相机编号1 或 2
2. 视觉系统自动清零地址 0并将地址 1 设为 0正在检测
3. 视觉系统触发对应相机的检测
4. 检测完成后自动输出第一个焊缝结果(地址 1=1地址 2~29=焊缝数据)
### 5.2 读取结果
1. 检测完成后,视觉系统写入:
- 地址 1状态码1=成功2=失败3=空结果)
- 地址 2焊缝类型
- 地址 3当前焊缝索引1
- 地址 4焊缝总数
- 地址 6~29第 1 个焊缝的中心/起点/终点/RPY仅状态码为 1 时有效)
2. 外部客户端轮询地址 1当值从 0 变为非零时表示检测完成
3. 状态码为 1 时,读取地址 2~29 获取页面同款定位结果
### 5.3 典型时序(单焊缝)
```
客户端 视觉系统
| |
|--- 写入 地址0 = 1 (触发相机1) ----->|
| |-- 清零地址0地址1=0(正在检测)
| |-- 执行检测...
| |
|<-- 读取 地址1 = 0 (正在检测) -------|
| |
|<-- 读取 地址1 = 1 (检测成功) -------|
| |-- 写入地址1=1
| | 地址2=类型地址3=1地址4=总数,
| | 地址6~29=第1个焊缝的中心/起止/RPY
|<-- 读取 地址2~29 -------------------|
| |
```
### 5.4 读取多焊缝结果时序
当检测到多个焊缝时,可通过写命令 10 依次获取后续结果:
```
客户端 视觉系统
| |
|--- 写入 地址0 = 1 (触发相机1) ----->|
| |-- 清零地址0地址1=0(正在检测)
| |-- 执行检测(发现 N 个焊缝)...
| |
|<-- 读取 地址1 = 1 (成功) -----------|
| |-- 自动输出第 1 个焊缝结果
|<-- 读取 地址2~29 (焊缝1全部信息) ----|
| |
|--- 写入 地址0 = 10 (读取下一个) ---->|
| |-- 输出第 2 个焊缝结果地址3=2
|<-- 读取 地址1 = 1 (成功) -----------|
|<-- 读取 地址2~29 (焊缝2全部信息) ----|
| |
|--- 写入 地址0 = 10 (继续读取) ------>|
| |-- 无更多结果
|<-- 读取 地址1 = 3 (无更多结果) ------|
| |
```
> **注意**:触发新的检测(写 1 或写 2缓存索引自动归零第一个焊缝由系统主动输出写 10 用于继续读取后续焊缝。
## 6. 寄存器与页面字段对照
| 页面字段WeldSeamItem 卡片) | 对应寄存器 |
|------------------------------|------------|
| `焊缝 N [类型]` 中的 N | 地址 3当前焊缝索引 |
| `焊缝 N [类型]` 中的"类型" | 地址 2焊缝类型枚举 |
| `中心: (X, Y, Z)` | 地址 6/8/10float ×3 |
| `起止` 起点 `(X, Y, Z)` | 地址 12/14/16float ×3 |
| `起止` 终点 `(X, Y, Z)` | 地址 18/20/22float ×3 |
| `法向: (X, Y, Z)` | 不单独输出,已折算到 RPY |
| (页面未显示,给机器人使用) | 地址 24/26/28Roll/Pitch/Yaw |
## 7. 注意事项
1. 触发寄存器写入后会自动清零,无需客户端手动清零
2. 检测完成后自动输出第一个焊缝结果;写命令 10 可依次获取第 2、3… 个结果
3. 坐标数据为机械臂坐标系下的值(已经过手眼标定转换)
4. 欧拉角为 ZYX 外旋顺序(从焊缝轴向方向和法向方向构建旋转矩阵提取),已表达完整姿态,无需读取法向量
5. 浮点数字节序(大端/小端)由网络配置中的 `byteOrder` 参数决定
6. 当状态码非 1 时,地址 2~29 中的数据视为无效,客户端不应使用