GrabBag/App/StatorWorkpiecePosition/Doc/工件定位ModbusTCP协议.md

119 lines
4.3 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 / 从设备 |
| 客户设备角色 | Client / 主设备 |
| 连接端口 | 现场标准端口 `502` |
| 寄存器地址 | 本文档使用 0-based 地址 |
| 数据区 | Holding Register |
| 浮点格式 | 32 位 IEEE754,占 2 个 16 位寄存器 |
| 默认浮点字顺序 | 高字在前,低字在后,即 `ABCD` |
## 2. 支持的功能码
| 功能码 | 名称 | 用途 |
|---|---|---|
| `0x03` | Read Holding Registers | 读取状态和检测结果 |
| `0x06` | Write Single Register | 写入触发命令 |
| `0x10` | Write Multiple Registers | 写入触发命令 |
## 3. 寄存器表
| 地址 | 名称 | 数据类型 | 客户操作 | 说明 |
|---:|---|---|---|---|
| `0` | Trigger | uint16 | 写 | 触发检测命令 |
| `1` | Status | uint16 | 读 | 检测状态 |
| `2` | ResultStart | - | 读 | 工件检测结果起始地址 |
## 4. 触发命令
以下工件序号规则仅适用于 `WorkpieceRotorApp`;`WorkpieceTaperedApp` 协议保持原有实现。
Rotor 客户向 `Trigger` 寄存器写入组合命令:`工件序号 × 10 + 相机号`。个位为相机号(1–9),十位及以上为工件序号。
| 写入值 | 命令 |
|---:|---|
| `0` | 不触发 |
| `1` / `2` | 使用相机 1 / 2 和配置的默认工件检测 |
| `11` / `12` | 使用相机 1 / 2 和 1 号工件检测 |
| `21` / `22` | 使用相机 1 / 2 和 2 号工件检测 |
| 个位为 `0` 的非零值 | 无效相机号,启动失败 |
相机必须已配置且可用;工件序号必须存在于“工件尺寸”Tab。省略工件序号(写入 `1–9`)时使用默认工件。
组合值不能超过 uint16 上限 `65535`:相机 1–5 最多可指定工件 6553,相机 6–9 最多可指定工件 6552。
沿用原寄存器地址,不增加寄存器,不修改结果区;`workpieceType` 仍表示算法输出类型,与尺寸序号无关。
工件序号按列表顺序从 1 连续编号,上下移动或删除后重新编号;保存后须同步调整 PLC 的工件序号。旧配置的半径、高度自动迁移为 1 号工件。
服务端收到非零值后将触发寄存器清零,并捕获本次相机号和工件序号。
未配置的序号或无效尺寸列表使本次启动失败(`Status=2`);忙时的新请求被忽略,不覆盖当前尺寸及状态。
客户应等待本轮完成后再发送下一次请求。检测开始后修改配置不会改变本轮半径、高度。
工件检测算法会在定位过程中同步计算所需的料框信息,不需要单独触发料框检测。
## 5. 状态寄存器
客户读取 `Status` 寄存器:
| 状态值 | 说明 |
|---:|---|
| `0` | 正在检测 |
| `1` | 检测完成 |
| `2` | 检测失败 |
工件检测完成且 `Status=1` 后,客户读取工件检测结果寄存器。
## 6. 工件检测结果
当前 Modbus TCP 返回第一个工件结果。
结果从地址 `2` 开始,共 14 个寄存器:
| 地址 | 寄存器数 | 数据类型 | 字段 | 说明 |
|---:|---:|---|---|---|
| `2` | 1 | uint16 | `workpieceType` | 工件类型 |
| `3` | 1 | uint16 | reserved | 保留 |
| `4-5` | 2 | float | `X` | X 坐标,单位 mm |
| `6-7` | 2 | float | `Y` | Y 坐标,单位 mm |
| `8-9` | 2 | float | `Z` | Z 坐标,单位 mm |
| `10-11` | 2 | float | `A` | 姿态第 1 项,单位 deg |
| `12-13` | 2 | float | `B` | 姿态第 2 项,单位 deg |
| `14-15` | 2 | float | `C` | 姿态第 3 项,单位 deg |
`workpieceType` 取值含义如下:
| `workpieceType` | 含义 |
|---:|---|
| `0` | 中央 |
| `1` | 上边 |
| `2` | 下边 |
| `3` | 左边 |
| `4` | 右边 |
| `5` | 左上角 |
| `6` | 右上角 |
| `7` | 左下角 |
| `8` | 右下角 |
| `9` | 隔板 |
## 7. 姿态字段顺序
默认姿态字段含义:
| 字段 | 默认含义 |
|---|---|
| `A` | Roll |
| `B` | Pitch |
| `C` | Yaw |
如现场约定了其他姿态顺序,以项目交付时确认的协议参数为准。
## 8. 典型交互流程
1. 客户设备连接视觉设备 Modbus TCP 端口。
2. 客户设备向地址 `0` 写入组合命令,例如 `21`,使用相机 1 触发 2 号工件检测。
3. 客户设备轮询地址 `1`。
4. 当地址 `1` 读取为 `1` 时,读取地址 `2-15` 获取工件结果。
5. 当地址 `1` 读取为 `2` 时,本次检测失败,不读取结果。