1. SOEM入门:EtherCAT技术概述、SOEM协议栈简介、SOEM源码获取与编译

1.1 为什么是EtherCAT?

做工业控制这么多年,我见过太多现场总线了。从早期的RS485、CAN,到后来的PROFINET、EtherNet/IP,每种总线都有自己的脾气。但EtherCAT,说实话,是我用过最「爽」的一个。

为什么?因为它的数据交换方式太巧妙了。

传统以太网是「问-答」模式:主站发一个包,从站收到后处理,再发回去。一来一回,时间全浪费在路上了。EtherCAT不一样,它用的是「飞过式」处理——数据帧从主站出发,经过每个从站时,从站只花几纳秒的时间,把自己要发的数据塞进去,把要收的数据取出来,然后继续往下传。最后一个从站把数据帧原路返回给主站。

你想想看,这相当于所有从站在同一趟「数据列车」上同时上下货。效率能不高吗?

核心优势:

  • 实时性极强:1000个数字量I/O的刷新时间只需30μs
  • 拓扑灵活:支持线型、星型、树型、环型
  • 数据利用率高:帧头帧尾只占一次,有效载荷几乎100%
  • 成本可控:从站使用专用ESC芯片,主站用标准以太网控制器即可

我在一个包装机械项目里用过EtherCAT控制48个伺服轴。同步抖动控制在1μs以内。换做其他总线,这个精度想都不敢想。

1.2 SOEM协议栈是什么?

SOEM,全称是Simple Open EtherCAT Master。看名字就知道,它主打「简单」和「开源」。

市面上EtherCAT主站方案不少:

方案 类型 费用 适用场景
TwinCAT 商业闭源 Windows平台,大型系统
Acontis 商业闭源 中高 多平台,专业级
IgH EtherLab 开源(GPL) 免费 Linux内核模块
SOEM 开源(BSD) 免费 嵌入式、跨平台、轻量级

SOEM最吸引我的地方是它的BSD许可证。这意味着你可以把它用在商业产品里,不用开源自己的代码。对于做产品的朋友来说,这点太重要了。

另外,SOEM是纯C语言写的,不依赖操作系统。我在STM32、Zynq、甚至裸机上都跑过。移植起来非常方便。

我的建议:如果你是第一次接触EtherCAT主站开发,从SOEM入手是最快的。它代码量不大(核心也就几千行),结构清晰,注释也比较到位。我当年就是啃了一个星期的SOEM源码,基本就把EtherCAT协议搞明白了。

1.3 SOEM源码获取与编译

好,咱们动手吧。

1.3.1 获取源码

SOEM托管在GitHub上,地址是:https://github.com/OpenEtherCATsociety/SOEM

获取方式有两种:

// 方式一:直接克隆最新版
git clone https://github.com/OpenEtherCATsociety/SOEM.git

// 方式二:下载稳定版压缩包
// 访问GitHub Releases页面,选择v1.4.0或更新版本

我个人习惯用git clone,方便后续更新。不过要注意,master分支可能包含一些实验性代码。做产品的话,我建议用tag版本。

1.3.2 目录结构

下载完后,看看SOEM的目录结构:

SOEM/
├── CMakeLists.txt          # 主构建文件
├── README.md
├── LICENSE                 # BSD许可证
├── soem/                   # 核心协议栈源码
│   ├── ethercat.c          # 主站核心逻辑
│   ├── ethercatconfig.c    # 配置工具
│   ├── ethercatcoe.c       # CoE(CANopen over EtherCAT)
│   ├── ethercatfoe.c       # FoE(文件访问)
│   ├── ethercatsoe.c       # SoE(伺服驱动)
│   └── ...
├── osal/                   # 操作系统抽象层
│   ├── linux/              # Linux平台实现
│   ├── win32/              # Windows平台实现
│   └── ...
├── test/                   # 测试示例
│   ├── simple_test/        # 最简单的测试
│   ├── slaveinfo/          # 扫描从站信息
│   └── ...
└── doc/                    # 文档

这个结构很清晰。核心协议栈在soem/目录,操作系统相关的东西在osal/。如果你想移植到新平台,主要改osal/下面的文件就行。

1.3.3 编译(Linux平台)

SOEM使用CMake构建。编译步骤很简单:

# 进入源码目录
cd SOEM

# 创建build目录
mkdir build && cd build

# 配置
cmake ..

# 编译
make -j4

# 安装(可选)
sudo make install

编译完成后,会在build/目录下生成:

  • libsoem.so(动态库)
  • simple_test(测试程序)
  • slaveinfo(从站扫描工具)

注意:编译时需要安装libpcap开发库。SOEM在Linux下通过raw socket或pcap抓包方式收发EtherCAT帧。

sudo apt-get install libpcap-dev

我曾经在一个新装的Ubuntu系统上编译,忘了装libpcap,报了一堆链接错误。折腾了半小时才发现是这个问题。嗯,先装依赖,再编译,顺序别搞反了。

1.3.4 编译(Windows平台)

Windows下推荐用Visual Studio + CMake:

# 用CMake生成VS工程
cmake .. -G "Visual Studio 16 2019" -A Win32

# 或者用MinGW
cmake .. -G "MinGW Makefiles"
make

Windows下需要安装WinPcap或Npcap。SOEM在Windows上通过WinPcap API收发数据帧。

1.3.5 验证编译结果

编译成功后,先别急着接硬件。跑一下simple_test看看:

# 需要root权限(raw socket需要)
sudo ./simple_test

如果没有接EtherCAT从站,程序会输出类似这样的信息:

SOEM (Simple Open EtherCAT Master)
Simple test for SOEM
Starting simple test
No socket connection on enp3s0
End simple test, close socket
End program

这说明SOEM已经能正常初始化网络接口了。只是没找到从站而已。

小技巧:如果你手头没有EtherCAT硬件,可以用slaveinfo工具配合一个EtherCAT从站模拟器来测试。我早期学习时就用过一个叫EtherCAT Slave Simulator的软件,在Windows上模拟从站行为,配合SOEM主站做联调。效果还不错。

1.4 本章小结

这一章我们聊了:

  • EtherCAT为什么快——「飞过式」数据处理
  • SOEM是什么——轻量、开源、BSD许可的EtherCAT主站协议栈
  • 怎么获取和编译SOEM——git clone + cmake + make

说白了,SOEM就是一把「瑞士军刀」。它不花哨,但够用、好用。接下来的章节,我们会一步步用它搭建真正的多从站协同控制系统。

准备好了吗?咱们下一章见真章。


专注资料整理