GrabBag/App/WorkpieceHole/Doc/MODBUS_PROTOCOL.md
2026-04-17 10:18:03 +08:00

150 lines
6.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.

# WorkpieceHole 工件孔定位 - Modbus TCP 通信协议
## 1. 系统架构
```
┌─────────────────┐ Modbus TCP ┌─────────────────────┐
│ │◄────────────────────►│ │
│ 3D视觉系统 │ 192.168.0.88 │ 汇川PLC-easy320 │
│ (Modbus客户端) │ :502 │ (Modbus服务端) │
│ │ │ │
└─────────────────┘ └─────────────────────┘
```
## 2. 网络配置
| 设备 | IP地址 | 端口 | 角色 |
|------|--------|------|------|
| 3D视觉系统 | - | - | Modbus TCP 客户端 |
| 汇川PLC-easy320 | 192.168.0.88 | 502 | Modbus TCP 服务端 |
## 3. 地址映射规则
汇川PLC D寄存器与Modbus保持寄存器地址映射关系
```
代码协议地址 = D寄存器地址 + 1
示例:
D1000 -> 代码协议地址 1001
D1002 -> 代码协议地址 1003
D2000 -> 代码协议地址 2001
```
## 4. 寄存器地址定义
### 4.1 控制寄存器
| PLC寄存器 | 代码协议地址 | 类型 | 读/写 | 说明 |
|-----------|------------|------|-------|------|
| D1000 | 1001 | uint16 | R/W | 拍照请求1=相机1检测2=相机2检测 |
| D1002 | 1003 | uint16 | W | 检测结果状态码(见下表) |
### 4.2 检测结果状态码D1002
| 状态码 | 含义 | 说明 |
|--------|------|------|
| 1 | 检测成功 | 检测正确完成且有结果坐标数据已写入D2000 |
| 2 | 异常物料 | 算法返回异常物料错误码(`SX_ERR_UNKNOWN_OBJECT = -2501` |
| 3 | 无产品 | 算法返回无产品错误码(`SX_ERR_ZERO_OBJECTS = -1010`,兼容空目标类错误) |
| 11 | 检测失败 | 其他算法或系统异常 |
| 12 | 相机失败 | 相机打开或连接失败 |
### 4.3 坐标数据寄存器D2000起1个点
检测成功时,将第一个工件的坐标写入 D2000-D2011包含6个float值X, Y, Z, Pitch, Roll, Yaw每个float占用2个寄存器大端序共12个寄存器。
| PLC寄存器 | 代码协议地址 | 类型 | 说明 |
|-----------|------------|------|------|
| D2000-D2001 | 2001-2002 | float (大端) | X坐标 (mm) |
| D2002-D2003 | 2003-2004 | float (大端) | Y坐标 (mm) |
| D2004-D2005 | 2005-2006 | float (大端) | Z坐标 (mm) |
| D2006-D2007 | 2007-2008 | float (大端) | Pitch角度 (°) |
| D2008-D2009 | 2009-2010 | float (大端) | Roll角度 (°) |
| D2010-D2011 | 2011-2012 | float (大端) | Yaw角度 (°) |
> **注意**:
> - 每个float值占用2个寄存器采用IEEE 754单精度浮点数格式
> - 大端序Big-Endian高位字在低地址寄存器低位字在高地址寄存器
> - 仅写入第一个工件的坐标数据
## 5. 通信流程
```
时序图:
3D视觉系统 汇川PLC
│ │
│ 轮询读取D1000(地址1001) │
│◄─────────────────────────────│
│ │
│ D1000=1或2 (拍照请求) │
│◄─────────────────────────────│
│ (1=相机1检测, 2=相机2检测) │
│ │
│ 写0到D1000(地址1001) │
│─────────────────────────────►│
│ │
│ [执行拍照和算法处理] │
│ │
│ 写坐标到D2000(地址2001)开始│
│─────────────────────────────►│ (仅检测成功时)
│ │
│ 写状态码到D1002(地址1003) │
│─────────────────────────────►│ (1/2/3/11/12)
│ │
```
### 5.1 详细流程说明
1. **轮询拍照请求**
- 3D系统持续轮询读取PLC的D1000寄存器代码协议地址1001
- 轮询间隔100ms可配置
- 使用边沿检测只在0→非零变化时触发
- D1000=1 触发相机1检测D1000=2 触发相机2检测
2. **拍照执行**
- 检测到D1000为非零后立即写0到D1000清除请求
- 暂停轮询根据D1000的值选择对应相机
- 触发相机拍照,执行工件孔定位算法
3. **坐标输出**(仅检测成功时)
- 算法处理完成后将坐标数据写入PLC的D2000开始的寄存器
- 代码协议地址2001-2012单点12个寄存器6个float值
- 数据格式IEEE 754单精度浮点数大端序
4. **结果通知**
- 无论成功还是失败均写状态码到D1002代码协议地址1003
- 状态码1=成功有结果2=异常物料3=无产品11=检测失败12=相机失败
- 写入状态码后恢复拍照请求轮询
## 6. 连接管理
### 6.1 自动重连机制
- 初始化时尝试连接PLC
- 连接失败时自动启动重连定时器
- 重连间隔3000ms可配置
- 持续重连直到连接成功或软件关闭
### 6.2 优雅退出
- 设置关闭标志,阻止新的重连尝试
- 停止所有定时器(轮询、重连)
- 断开Modbus连接
- 释放资源
## 7. 错误处理
| 错误类型 | 处理方式 | D1002状态码 |
|----------|----------|------------|
| 相机连接失败 | 通知PLC恢复轮询 | 12 |
| 异常物料(`SX_ERR_UNKNOWN_OBJECT = -2501` | 通知PLC恢复轮询 | 2 |
| 无产品(`SX_ERR_ZERO_OBJECTS = -1010`,兼容空目标类错误) | 通知PLC恢复轮询 | 3 |
| 其他算法检测失败 | 通知PLC恢复轮询 | 11 |
| 检测成功有结果 | 发送坐标通知PLC恢复轮询 | 1 |
| 连接断开 | 自动重连,发送错误信号 | - |
| 读取失败 | 记录日志,主动断开触发重连 | - |
| 写入失败 | 记录日志,返回失败状态 | - |
| 超时 | 默认1秒超时触发重连 | - |