GrabBag/App/RodWeldSeam/Doc/钢筋焊缝定位系统ModbusTCP通信协议.md

186 lines
9.0 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默认端口 5020
- **外部客户端**:连接到视觉系统进行检测触发和结果读取
## 2. 连接参数
| 参数 | 值 |
|------|------|
| 协议 | Modbus TCP |
| 端口 | 5020默认 |
| 角色 | 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 | 姿态 A轴含义由 `poseOutputOrder` 决定) |
| 26 | 2 | float | R | 姿态 B轴含义由 `poseOutputOrder` 决定) |
| 28 | 2 | float | R | 姿态 C轴含义由 `poseOutputOrder` 决定) |
| 40 | 2 | float | W | 机械臂当前 Xmm |
| 42 | 2 | float | W | 机械臂当前 Ymm |
| 44 | 2 | float | W | 机械臂当前 Zmm |
| 46 | 2 | float | W | 机械臂当前姿态 A |
| 48 | 2 | float | W | 机械臂当前姿态 B |
| 50 | 2 | float | W | 机械臂当前姿态 C |
> **浮点数编码**IEEE 754 单精度浮点数,每个 float 占 2 个 uint16 寄存器,字节序由网络配置 `byteOrder` 决定0=大端1=小端)。
> **坐标系**:结果 XYZ 为机械臂基坐标系下的值。眼在手上时,系统使用地址 40~51 的当前法兰位姿与“相机到法兰”标定矩阵组合后,再转换中心、起点、终点、方向和姿态;眼在手外时,地址 40~51 不参与结果计算。
> **寄存器保持规则**:地址 40~51 启动时默认为全 0写入后持续保留当前值。检测前无需强制重新写入未写入的寄存器使用当前保留值程序启动后从未写入时即使用 0。
### 3.1 姿态 A/B/C 顺序
输入地址 46/48/50 与输出地址 24/26/28 共用网络配置 `poseOutputOrder`
| 配置值 | A | B | C |
|--------|---|---|---|
| 0 | RX | RY | RZ |
| 1 | RX | RZ | RY |
| 2 | RY | RX | RZ |
| 3 | RY | RZ | RX |
| 4 | RZ | RX | RY |
| 5 | RZ | RY | RX |
### 3.2 控制命令(地址 0
| 命令值 | 说明 |
|--------|------|
| 1 | 触发相机 1 执行检测 |
| 2 | 触发相机 2 执行检测 |
| 10 | 读取下一个缓存焊缝结果(从上次检测结果中依次获取) |
### 3.3 焊缝类型(地址 2
| 类型值 | 含义 | 页面显示 |
|--------|------|----------|
| 0 | UNKNOWN | "未知" |
| 1 | POINT | "点焊" |
| 2 | SEAM | "焊缝" |
| 3 | SEAM_GAP | "焊缝(间隙)" |
## 4. 状态码定义
| 状态码 | 说明 |
|--------|------|
| 0 | 正在检测 |
| 1 | 成功(地址 2~29 数据有效) |
| 2 | 检测失败 |
| 3 | 结果为空 / 无更多缓存结果 |
## 5. 通信流程
### 5.1 触发检测
1. 眼在手上模式下,外部客户端可按需更新地址 40~51 的机械臂当前位姿;可整块写入,也可分段写入,不更新时沿用当前寄存器值
2. 外部客户端写入地址 0值为相机编号1 或 2
3. 视觉系统在收到触发命令时读取并固化地址 40~51 的当前值,自动清零地址 0并将地址 1 设为 0正在检测
4. 视觉系统触发对应相机的检测
5. 检测完成后自动输出第一个焊缝结果(地址 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 典型时序(单焊缝)
```
客户端 视觉系统
| |
|--- 按需写入 地址40~51 (可选更新) ---->|
|--- 写入 地址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 依次获取后续结果:
```
客户端 视觉系统
| |
|--- 按需写入 地址40~51 (可选更新) ---->|
| |-- 更新机械臂位姿寄存器当前值
|--- 写入 地址0 = 1 (触发相机1) ----->|
| |-- 读取并固化地址40~51当前值清零地址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系统读取地址 40~51 的当前保留值,并用它转换本次全部焊缝;客户端可以在触发前更新,也可以直接沿用已有值,初始默认全 0。缓存索引自动归零第一个焊缝由系统主动输出。写 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/28姿态 A/B/C |
## 7. 注意事项
1. 触发寄存器写入后会自动清零,无需客户端手动清零
2. 检测完成后自动输出第一个焊缝结果;写命令 10 可依次获取第 2、3… 个结果
3. 坐标数据为机械臂坐标系下的值(已经过手眼标定转换)
4. 眼在手上模式在触发时读取地址 40~51 的当前值;寄存器初始全 0写入后保持不要求每次触发前重新填写。触发后继续改写地址 40~51 不会影响正在执行的本次检测
5. 姿态 A/B/C 的轴顺序由 `poseOutputOrder` 决定,角度单位为度
6. 浮点数字节序(大端/小端)由网络配置中的 `byteOrder` 参数决定,输入和输出使用同一设置
7. 当状态码非 1 时,地址 2~29 中的数据视为无效,客户端不应使用