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 主站初始化流程

不管用哪个库,主站初始化的套路其实差不多。我把它拆成几步,你照着做就行。

  1. 打开网络接口——说白了就是拿到网卡的句柄。SOEM里用ec_init(),IgH用ecrt_master_create()
  2. 扫描从站——发送广播命令,看看总线上挂了几个设备。SOEM的ec_config_init()会返回从站数量。
  3. 配置PDO映射——告诉从站你要收发哪些数据。这一步容易出错,我后面会讲。
  4. 进入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主站实现核心逻辑 主站选择 初始化流程:打开接口 → 扫描从站 → 配置PDO → 进入OP 邮箱通信(慢车道) CoE / FoE / SoE 过程数据(快车道) PDO映射 + DC同步 参数配置 / 固件升级 实时控制 / 多轴同步 关键:初始化阶段用邮箱,运行阶段用过程数据 多轴同步必须开启DC分布式时钟

这张图把主站实现分成了三个层次:选择、初始化、通信。你写代码时,就按这个顺序来。别跳步,跳步容易出问题。

最后说一句:EtherCAT主站实现,说白了就是两件事:把从站配好,把数据跑通。配从站靠邮箱,跑数据靠过程数据。多轴同步的关键在DC时钟。记住这三句话,你就抓住了核心。


专注资料整理