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就是一把「瑞士军刀」。它不花哨,但够用、好用。接下来的章节,我们会一步步用它搭建真正的多从站协同控制系统。
准备好了吗?咱们下一章见真章。