150 lines
6.3 KiB
Markdown
150 lines
6.3 KiB
Markdown
# 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秒超时,触发重连 | - |
|