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

6.3 KiB
Raw Blame History

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