6.8 KiB
6.8 KiB
钢筋焊缝定位系统 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 | 中心点 X(mm) |
| 8 | 2 | float | R | 中心点 Y(mm) |
| 10 | 2 | float | R | 中心点 Z(mm) |
| 12 | 2 | float | R | 起点 X(mm) |
| 14 | 2 | float | R | 起点 Y(mm) |
| 16 | 2 | float | R | 起点 Z(mm) |
| 18 | 2 | float | R | 终点 X(mm) |
| 20 | 2 | float | R | 终点 Y(mm) |
| 22 | 2 | float | R | 终点 Z(mm) |
| 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 触发检测
- 外部客户端写入地址 0,值为相机编号(1 或 2)
- 视觉系统自动清零地址 0,并将地址 1 设为 0(正在检测)
- 视觉系统触发对应相机的检测
- 检测完成后自动输出第一个焊缝结果(地址 1=1,地址 2~29=焊缝数据)
5.2 读取结果
- 检测完成后,视觉系统写入:
- 地址 1:状态码(1=成功,2=失败,3=空结果)
- 地址 2:焊缝类型
- 地址 3:当前焊缝索引(1)
- 地址 4:焊缝总数
- 地址 6~29:第 1 个焊缝的中心/起点/终点/RPY(仅状态码为 1 时有效)
- 外部客户端轮询地址 1,当值从 0 变为非零时表示检测完成
- 状态码为 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/10(float ×3) |
起止 起点 (X, Y, Z) |
地址 12/14/16(float ×3) |
起止 终点 (X, Y, Z) |
地址 18/20/22(float ×3) |
法向: (X, Y, Z) |
不单独输出,已折算到 RPY |
| (页面未显示,给机器人使用) | 地址 24/26/28(Roll/Pitch/Yaw) |
7. 注意事项
- 触发寄存器写入后会自动清零,无需客户端手动清零
- 检测完成后自动输出第一个焊缝结果;写命令 10 可依次获取第 2、3… 个结果
- 坐标数据为机械臂坐标系下的值(已经过手眼标定转换)
- 欧拉角为 ZYX 外旋顺序(从焊缝轴向方向和法向方向构建旋转矩阵提取),已表达完整姿态,无需读取法向量
- 浮点数字节序(大端/小端)由网络配置中的
byteOrder参数决定 - 当状态码非 1 时,地址 2~29 中的数据视为无效,客户端不应使用