4. 通信协议基础:Modbus RTU、CANopen、EtherCAT 在脉冲模块中的应用
脉冲模块不是孤岛。它得跟 PLC、运动控制器或者上位机对话。怎么对话?靠协议。今天聊的三个协议——Modbus RTU、CANopen、EtherCAT——我几乎每天都在跟它们打交道。它们各有脾气,选对了事半功倍,选错了调试到怀疑人生。
4.1 为什么脉冲模块需要通信协议?
你想想看,脉冲模块本质上就是个“翻译官”。它把控制器发来的位置、速度、加减速时间,转成实实在在的脉冲信号给驱动器。没有协议,数据怎么传?靠猜吗?
协议干三件事:
- 定义数据格式——多少位、什么顺序、校验方式。
- 定义通信规则——谁先说话、说完谁听、超时怎么办。
- 定义错误处理——数据坏了怎么发现、怎么重发。
核心观点:协议不是性能瓶颈,选错协议才是。Modbus RTU 便宜但慢,EtherCAT 快但贵,CANopen 在中间。没有最好的协议,只有最合适的。
4.2 Modbus RTU:老当益壮的串行协议
Modbus RTU 是我入行时第一个接触的工业协议。说实话,它很老,1979 年就出来了。但老不代表没用。在低速、短距离、成本敏感的场景里,它依然能打。
4.2.1 帧结构
Modbus RTU 走 RS-485 物理层。一帧数据长这样:
| 地址码 (1字节) | 功能码 (1字节) | 数据区 (N字节) | CRC校验 (2字节) |
- 地址码: 1~247,0 是广播地址。我见过有人把两个模块设成同一个地址,结果两个都不响应——嗯,排查了半小时才发现。
- 功能码: 03 读保持寄存器,06 写单个寄存器,16 写多个寄存器。脉冲模块最常用 03 和 16。
- CRC 校验: 循环冗余校验。数据错了能发现,但不能纠错。
4.2.2 在脉冲模块中的典型应用
我习惯把脉冲模块的寄存器映射成一张表。比如:
| 寄存器地址 | 数据类型 | 含义 | 读写 |
|---|---|---|---|
| 0x0000 | UINT16 | 目标位置(低16位) | 读写 |
| 0x0001 | UINT16 | 目标位置(高16位) | 读写 |
| 0x0002 | UINT16 | 运行速度 | 读写 |
| 0x0003 | UINT16 | 状态字 | 只读 |
我的习惯: 调试时先用 Modbus 调试助手读一遍所有寄存器,确认模块响应正常。别一上来就写 PLC 程序,那是给自己挖坑。
4.2.3 避坑指南
- 波特率匹配: 我曾经遇到过模块和 PLC 波特率都设成 115200,但就是通信不上。后来发现模块的晶振精度不够,实际波特率偏了 2%。换成 9600 就好了——低速更稳定。
- CRC 计算: 别自己手写 CRC 算法,用现成的库。我见过有人把高低字节搞反,查了两天。
- 响应超时: 脉冲模块执行指令需要时间(比如加减速过程)。Modbus 主站超时设太短,模块还没响应就报错了。我一般设 100ms 起步。
4.3 CANopen:灵活可靠的现场总线
CANopen 基于 CAN 总线。它比 Modbus 复杂,但功能强得多。在脉冲模块里,CANopen 最大的优势是实时性和多主通信。
4.3.1 对象字典(OD)
CANopen 的核心是对象字典。每个参数都有一个 16 位的索引和 8 位的子索引。比如:
索引 0x6040: 控制字
子索引 0x00: 控制字值 (UINT16)
索引 0x6060: 操作模式
子索引 0x00: 模式选择 (INT8)
0x01: 位置模式
0x03: 速度模式
0x08: 归零模式
说白了,对象字典就是一张巨大的参数表。你通过 SDO(服务数据对象)读写它,通过 PDO(过程数据对象)高速交换实时数据。
4.3.2 PDO 与 SDO 的区别
| 特性 | PDO | SDO |
|---|---|---|
| 通信方式 | 生产者/消费者,无需应答 | 客户端/服务器,需要应答 |
| 数据量 | 最多 8 字节 | 最多 4 字节(分段可更多) |
| 实时性 | 高(周期发送或事件触发) | 低(请求-响应模式) |
| 典型用途 | 位置、速度、状态等实时数据 | 参数配置、故障诊断 |
注意: PDO 没有应答机制。数据丢了就丢了。所以关键参数(比如急停指令)别走 PDO,走 SDO 更安全。我曾经在一个项目中把急停放在 PDO 里,结果总线负载高时丢帧,设备没停下来——从那以后,急停指令我永远走 SDO 或硬接线。
4.3.3 脉冲模块的 CANopen 配置步骤
- 设置节点 ID: 通过拨码开关或 SDO 写入 0x2101。注意总线上的 ID 不能重复。
- 配置 PDO 映射: 把目标位置、速度等参数映射到 TPDO(发送 PDO)和 RPDO(接收 PDO)。
- 设置通信参数: 波特率(常见 125k、250k、500k)、同步周期等。
- 启动 NMT: 发送 NMT 命令让模块进入 Operational 状态。
调试技巧: 用 CAN 分析仪抓包。看 NMT 状态切换是否正常,PDO 是否按预期触发。我习惯先抓一段正常通信的 log,出问题时对比——差异一目了然。
4.4 EtherCAT:高速运动控制的王者
EtherCAT 不是以太网,它是以太网上的实时协议。在脉冲模块里,EtherCAT 能做到 100μs 以内的周期。如果你做多轴同步,EtherCAT 几乎是唯一选择。
4.4.1 工作原理
EtherCAT 用“飞读飞写”的方式。主站发一帧数据,经过每个从站时,从站读取自己的数据并写入反馈数据,然后转发给下一个从站。最后一个从站把数据返回主站。
说白了,数据在物理层上就处理完了,不需要软件协议栈的干预。所以快。
4.4.2 脉冲模块的 EtherCAT 对象
EtherCAT 使用 CANopen over EtherCAT(CoE)。对象字典跟 CANopen 几乎一样。但多了几个 EtherCAT 特有的对象:
| 索引 | 名称 | 说明 |
|---|---|---|
| 0x1C12 | Sync Manager 2 通信类型 | 配置 PDO 的通信通道 |
| 0x1C13 | Sync Manager 3 通信类型 | 配置 PDO 的通信通道 |
| 0x1600~0x1603 | RxPDO 映射 | 接收 PDO 的映射配置 |
| 0x1A00~0x1A03 | TxPDO 映射 | 发送 PDO 的映射配置 |
4.4.3 配置要点
- DC 同步: 分布式时钟。多轴同步必须开启。我习惯把参考时钟设在第一个从站,其他从站跟随。
- PDO 长度: 别超过 8 字节。超过的话 EtherCAT 会自动分段,但会多占一个周期。
- 看门狗: 设 2~3 个周期。主站断了,模块能自动进入安全状态。
经验之谈: EtherCAT 调试最怕“断站”。主站扫描不到从站,或者从站状态变成 OP 后又掉回 PREOP。90% 的原因是网线质量差或接线松动。剩下的 10% 是 EEPROM 配置错误。我包里常备一根短网线,排查时直接连主站和模块——排除线缆问题。
4.5 协议对比与选型建议
三种协议怎么选?我列个表,你一看就明白:
| 维度 | Modbus RTU | CANopen | EtherCAT |
|---|---|---|---|
| 物理层 | RS-485 | CAN | 以太网 |
| 最大速率 | 115.2 kbps | 1 Mbps | 100 Mbps |
| 周期时间 | 5~20 ms | 1~5 ms | 50~200 μs |
| 同步精度 | 无 | 100 μs | 1 μs |
| 成本 | 低 | 中 | 高 |
| 典型场景 | 单轴、低速、简单控制 | 多轴、中等速度、分布式 | 多轴、高速、高精度同步 |
我的建议: 别盲目追求高速。如果项目只需要 10ms 的刷新周期,Modbus RTU 完全够用。EtherCAT 的调试复杂度是 Modbus 的 3 倍以上。选协议时,先问自己三个问题:需要多少轴?同步精度要求多少?预算多少?答案出来了,协议自然就定了。
4.6 本章知识体系
下面这张图总结了三种协议在脉冲模块中的定位和关系:
这张图把三种协议的核心特性和适用场景串起来了。调试时,你心里要清楚:当前项目用的是什么协议?它的瓶颈在哪?是速度不够,还是可靠性不够?对症下药,别盲目换协议。
最后提醒一句: 协议只是工具。我见过有人用 EtherCAT 做单轴点动,也见过有人用 Modbus RTU 做 8 轴同步。前者浪费钱,后者找罪受。选协议前,先搞清楚需求。需求清楚了,协议自然就选对了。