# 棒材定位系统 Modbus TCP 通信协议 ## 1. 系统架构 - **视觉系统**:作为 Modbus TCP Server(默认端口 502) - **外部客户端**:连接到视觉系统进行检测触发和结果读取 ## 2. 连接参数 | 参数 | 值 | |------|------| | 协议 | Modbus TCP | | 端口 | 502(默认) | | 角色 | Server(被动等待连接) | ## 3. 寄存器定义 | 地址 | 寄存器数 | 类型 | 读/写 | 说明 | |------|----------|------|-------|------| | 0 | 1 | uint16 | R/W | 检测触发(写入非零值触发,1=相机1,2=相机2,触发后自动清零) | | 1 | 1 | uint16 | R | 状态码 | | 2 | 2 | float | R | X(中心点 X 坐标,mm) | | 4 | 2 | float | R | Y(中心点 Y 坐标,mm) | | 6 | 2 | float | R | Z(中心点 Z 坐标,mm) | | 8 | 2 | float | R | Roll(绕X轴旋转角,度) | | 10 | 2 | float | R | Pitch(绕Y轴旋转角,度) | | 12 | 2 | float | R | Yaw(绕Z轴旋转角,度) | > **浮点数编码**:IEEE 754 单精度浮点数,每个 float 占 2 个 uint16 寄存器,字节序由网络配置决定 > **坐标系**:XYZ 为机械臂坐标系下的值(已经过手眼标定转换),RPY 为 ZYX 外旋欧拉角 ## 4. 状态码定义 | 状态码 | 说明 | |--------|------| | 0 | 正在检测 | | 1 | 检测成功(地址 2~13 数据有效) | | 2 | 检测失败 | | 3 | 检测成功但结果为空 | ## 5. 通信流程 ### 5.1 触发检测 1. 外部客户端写入地址 0,值为相机编号(1 或 2) 2. 视觉系统自动清零地址 0,并将地址 1 设为 0(正在检测) 3. 视觉系统触发对应相机的检测 ### 5.2 读取结果 1. 检测完成后,视觉系统写入: - 地址 1:状态码(1=成功,2=失败,3=空结果) - 地址 2~13:第一个棒材的 X, Y, Z, Roll, Pitch, Yaw(仅状态码为 1 时有效) 2. 外部客户端轮询地址 1,当值从 0 变为非零时表示检测完成 3. 状态码为 1 时,读取地址 2~13 获取定位结果 ### 5.3 典型时序 ``` 客户端 视觉系统 | | |--- 写入 地址0 = 1 (触发相机1) ----->| | |-- 清零地址0,地址1=0(正在检测) | |-- 执行检测... | | |<-- 读取 地址1 = 0 (正在检测) -------| | | |<-- 读取 地址1 = 1 (检测成功) -------| | |-- 写入地址1=1, 地址2~13=结果 |<-- 读取 地址2~13 (XYZ+RPY) --------| | | ``` ## 6. 注意事项 1. 触发寄存器写入后会自动清零,无需客户端手动清零 2. 仅输出第一个检测到的棒材结果 3. 坐标数据为机械臂坐标系下的值(已经过手眼标定转换) 4. 欧拉角为 ZYX 外旋顺序(从轴向方向和法向方向构建旋转矩阵提取) 5. 浮点数字节序(大端/小端)由网络配置中的 byteOrder 参数决定