4. EtherCAT主站实现:SOEM与IgH主站对比、主站初始化流程、邮箱通信与过程数据
4.1 两个主流开源主站:SOEM vs IgH
做EtherCAT主站开发,绕不开两个名字:SOEM和IgH。我个人两个都用过,先说说我的感受。
SOEM(Simple Open EtherCAT Master),说白了就是一个轻量级的库。它不依赖操作系统,你可以在裸机上跑,也可以在Linux、Windows上跑。我最早接触EtherCAT时用的就是它,因为简单,几行代码就能把从站扫出来。
IgH EtherCAT Master,这是德国一个研究所搞的,后来成了Linux内核的一部分。它是个正经的Linux内核模块,功能非常全。我在做产线项目时用的就是IgH,因为它稳定,而且支持热插拔。
嗯,这里要注意:选哪个,取决于你的场景。
| 对比项 | SOEM | IgH |
|---|---|---|
| 操作系统依赖 | 无(裸机/RTOS/Linux均可) | Linux内核模块 |
| 代码量 | 小,约2万行 | 大,约10万行 |
| 实时性 | 依赖应用层调度 | 内核态,实时性好 |
| 学习曲线 | 平缓 | 陡峭 |
| 典型场景 | 嵌入式、快速原型 | 工业PC、产线控制 |
我的建议:如果你是在做嵌入式控制器,比如用STM32或者FPGA,选SOEM。如果你是在工控机上跑Linux,需要稳定性和热插拔,选IgH。
4.2 主站初始化流程
不管用哪个库,主站初始化的套路其实差不多。我把它拆成几步,你照着做就行。
- 打开网络接口——说白了就是拿到网卡的句柄。SOEM里用
ec_init(),IgH用ecrt_master_create()。 - 扫描从站——发送广播命令,看看总线上挂了几个设备。SOEM的
ec_config_init()会返回从站数量。 - 配置PDO映射——告诉从站你要收发哪些数据。这一步容易出错,我后面会讲。
- 进入OP状态——把从站从Init状态切换到Operational状态。只有OP状态下才能交换过程数据。
我记得第一次做初始化时,卡在了第三步。从站死活不进OP,后来发现是PDO映射的字节数对不上。你想想看,一个32位的轴位置数据,你只配了16位,从站肯定罢工。
避坑指南:我曾经在配置PDO时,漏配了一个同步管理器通道。结果从站状态一直卡在Pre-OP。排查了整整一天,最后用Wireshark抓包才发现。所以,初始化完成后一定要检查每个从站的状态寄存器。
4.3 邮箱通信
邮箱通信,说白了就是EtherCAT的「慢车道」。它用来传输非实时数据,比如参数配置、固件升级、诊断信息。
为什么叫邮箱?因为它是点对点的,像发邮件一样。主站发一帧数据到从站的邮箱,从站处理完后,再通过下一帧把结果带回来。
邮箱通信有两种协议:
- CoE(CANopen over EtherCAT)——最常用,用来读写对象字典。比如你要改一个伺服驱动的电流环参数,就用CoE。
- FoE(File over EtherCAT)——用来传文件,比如固件升级。
实际项目中,我一般只在初始化阶段用邮箱。一旦进入OP状态,就全靠过程数据了。为什么?因为邮箱通信慢,一帧只能带几十个字节,而且需要主站轮询。
注意:邮箱通信不能用于实时控制。我曾经见过有人用邮箱发位置指令,结果轴跑起来一顿一顿的。实时控制必须走过程数据通道。
4.4 过程数据通信
过程数据,这才是EtherCAT的看家本领。它走的是「快车道」,每个周期自动交换,不需要主站逐帧处理。
过程数据的核心是PDO映射。你需要告诉从站:我要读哪些数据,写哪些数据,每个数据占几个字节。
举个例子,一个伺服驱动器,我通常这样配:
// 发送给从站(输出)
0x6040: 控制字 (2字节)
0x607A: 目标位置 (4字节)
0x60FF: 目标速度 (4字节)
// 从从站读取(输入)
0x6041: 状态字 (2字节)
0x6064: 实际位置 (4字节)
0x606C: 实际速度 (4字节)
配好之后,主站每个周期只需要读写一段连续的内存。SOEM里用ec_send_processdata()和ec_receive_processdata(),IgH里用ecrt_master_send()和ecrt_master_receive()。
嗯,这里有个关键点:过程数据的同步。EtherCAT用的是分布式时钟(DC),所有从站共享同一个时间基准。这样,即使主站发送有抖动,从站也能在精确的时刻采样和输出。
我的经验:在多轴同步场景下,一定要开启DC同步。我曾经做过一个6轴机械臂项目,没开DC时,轴间同步误差有几十微秒,开了之后降到1微秒以内。效果立竿见影。
4.5 知识体系总览
下面这张图,是我自己总结的EtherCAT主站实现的核心逻辑。你把它存下来,写代码时对照着看。
这张图把主站实现分成了三个层次:选择、初始化、通信。你写代码时,就按这个顺序来。别跳步,跳步容易出问题。
最后说一句:EtherCAT主站实现,说白了就是两件事:把从站配好,把数据跑通。配从站靠邮箱,跑数据靠过程数据。多轴同步的关键在DC时钟。记住这三句话,你就抓住了核心。