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 配置步骤

  1. 设置节点 ID: 通过拨码开关或 SDO 写入 0x2101。注意总线上的 ID 不能重复。
  2. 配置 PDO 映射: 把目标位置、速度等参数映射到 TPDO(发送 PDO)和 RPDO(接收 PDO)。
  3. 设置通信参数: 波特率(常见 125k、250k、500k)、同步周期等。
  4. 启动 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 本章知识体系

下面这张图总结了三种协议在脉冲模块中的定位和关系:

脉冲模块通信协议知识体系 脉冲模块通信协议知识体系 脉冲输出模块 Modbus RTU CANopen EtherCAT RS-485 CRC 校验 主从模式 低速低成本 对象字典 PDO/SDO NMT 状态机 多主通信 飞读飞写 DC 同步 100μs 周期 多轴同步 选型建议 单轴低速 → Modbus RTU 多轴中等速度 → CANopen 多轴高速高精度同步 → EtherCAT

这张图把三种协议的核心特性和适用场景串起来了。调试时,你心里要清楚:当前项目用的是什么协议?它的瓶颈在哪?是速度不够,还是可靠性不够?对症下药,别盲目换协议。

最后提醒一句: 协议只是工具。我见过有人用 EtherCAT 做单轴点动,也见过有人用 Modbus RTU 做 8 轴同步。前者浪费钱,后者找罪受。选协议前,先搞清楚需求。需求清楚了,协议自然就选对了。