# 钢筋焊缝定位系统 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 | 中心点 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 | 姿态 A(度,轴含义由 `poseOutputOrder` 决定) | | 26 | 2 | float | R | 姿态 B(度,轴含义由 `poseOutputOrder` 决定) | | 28 | 2 | float | R | 姿态 C(度,轴含义由 `poseOutputOrder` 决定) | | 40 | 2 | float | W | 机械臂当前 X(mm) | | 42 | 2 | float | W | 机械臂当前 Y(mm) | | 44 | 2 | float | W | 机械臂当前 Z(mm) | | 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/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(姿态 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 中的数据视为无效,客户端不应使用