GrabBag/App/HoleDetection/Doc/MODBUS_PROTOCOL.md
2026-03-11 23:40:06 +08:00

148 lines
5.4 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.

# HoleDetection 孔洞检测 - Modbus TCP 通信协议
> **注意:此协议已停用。** 当前版本使用 TCP 文本协议(眼在手上),详见 `孔洞检测TCP通信协议.md`。
## 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. 地址映射规则
寄存器地址直接对应 Modbus 保持寄存器地址(可通过配置文件自定义)。
默认配置:
```
地址 0: 拍照请求
地址 1: 数据输出完成标志
地址 2: 坐标数据起始
```
## 4. 寄存器地址定义
### 4.1 控制寄存器
| 寄存器地址 | 类型 | 读/写 | 说明 |
|-----------|------|-------|------|
| 0 | uint16 | R/W | 拍照请求标志1=触发相机1, 2=触发相机2 |
| 1 | uint16 | W | 数据输出完成标志1=完成) |
### 4.2 坐标数据寄存器地址2开始最多10个点
每个点包含6个float值X, Y, Z, Pitch, Roll, Yaw每个float占用2个寄存器大端序共12个寄存器/点。
| 点序号 | 寄存器地址范围 | 说明 |
|--------|--------------|------|
| 点0 | 2-13 | 第1个孔洞坐标 |
| 点1 | 14-25 | 第2个孔洞坐标 |
| 点2 | 26-37 | 第3个孔洞坐标 |
| 点3 | 38-49 | 第4个孔洞坐标 |
| 点4 | 50-61 | 第5个孔洞坐标 |
| 点5 | 62-73 | 第6个孔洞坐标 |
| 点6 | 74-85 | 第7个孔洞坐标 |
| 点7 | 86-97 | 第8个孔洞坐标 |
| 点8 | 98-109 | 第9个孔洞坐标 |
| 点9 | 110-121 | 第10个孔洞坐标 |
### 4.3 单点坐标数据布局以点0为例
| 寄存器地址 | 类型 | 说明 |
|-----------|------|------|
| 2-3 | float (大端) | X坐标 (mm) |
| 4-5 | float (大端) | Y坐标 (mm) |
| 6-7 | float (大端) | Z坐标 (mm) |
| 8-9 | float (大端) | Pitch角度 (°) |
| 10-11 | float (大端) | Roll角度 (°) |
| 12-13 | float (大端) | Yaw角度 (°) |
> **注意**:
> - 每个float值占用2个寄存器采用IEEE 754单精度浮点数格式
> - 大端序Big-Endian高位字在低地址寄存器低位字在高地址寄存器
> - 最多支持10个点共120个寄存器10 × 6 × 2 = 120
## 5. 通信流程
```
时序图:
3D视觉系统 汇川PLC
│ │
│ 轮询读取地址0(拍照请求) │
│◄─────────────────────────────│
│ │
│ 地址0=1(相机1) 或 =2(相机2) │
│◄─────────────────────────────│
│ │
│ 写0到地址0(清除请求) │
│─────────────────────────────►│
│ │
│ [执行拍照和孔洞检测算法] │
│ │
│ 写坐标到地址2开始 │
│─────────────────────────────►│
│ │
│ 写1到地址1(数据完成) │
│─────────────────────────────►│
│ │
```
### 5.1 详细流程说明
1. **轮询拍照请求**
- 3D系统持续轮询读取PLC的拍照请求寄存器地址0
- 轮询间隔100ms可配置
- 使用边沿检测只在0→非0变化时触发
- 寄存器值即为相机索引1=相机1, 2=相机2
2. **拍照执行**
- 检测到地址0为非0值后立即写0到地址0清除请求
- 根据寄存器值选择对应相机触发拍照
- 执行孔洞检测算法
3. **坐标输出**
- 算法处理完成后将坐标数据写入地址2开始的寄存器
- 单点12个寄存器6个float值
- 数据格式IEEE 754单精度浮点数大端序
4. **完成通知**
- 坐标数据写入成功后写1到地址1
- 通知PLC数据输出完成
## 6. 连接管理
### 6.1 自动重连机制
- 初始化时尝试连接PLC
- 连接失败时自动启动重连定时器
- 重连间隔3000ms可配置
- 持续重连直到连接成功或软件关闭
### 6.2 优雅退出
- 设置关闭标志,阻止新的重连尝试
- 停止所有定时器(轮询、重连)
- 断开Modbus连接
- 释放资源
## 7. 错误处理
| 错误类型 | 处理方式 |
|----------|----------|
| 连接失败 | 自动重连,发送错误信号 |
| 读取失败 | 记录日志,下次轮询重试 |
| 写入失败 | 记录日志,返回失败状态 |
| 超时 | 默认1秒超时触发重连 |