# 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秒超时,触发重连 |