SOES:软实现EtherCAT从站协议栈项目介绍及从站开发案例
在现代工业自动化领域,EtherCAT(Ethernet for Control Automation Technology)以其高速、实时和开放的特性,成为现场总线通信的主流协议之一。EtherCAT网络中,主站(Master)负责调度和管理,而从站(Slave)则连接各类传感器、执行器等设备。如何高效、低成本地实现EtherCAT从站,是嵌入式开发者关注的重点。SOES(Simple Open EtherCAT Slave)正是为此而生的开源协议栈解决方案。
目录
- 一、SOES开源项目简介
- 二、SOES源码结构详解
- 三、SOES项目与核心知识点的对应关系
- 四、SOES与EtherCAT从站芯片的关系
- 五、编译与使用流程(参考 soes/doc/tutorial.txt)
- 六、典型开发流程
- 七、 SOES 从站开发案例
- 1、开发概述
- 2、启动代码示例
- 3、配置流程
- 3.1. 硬件初始化
- 3.2. 软件初始化
- 3.3. 应用循环
- 4、应用层处理(DIG_process)
- 4.1. 输出处理
- 4.2. 输入处理
- 5、应用数据与过程数据映射
- SII-EEPROM
- ESI 文件
- 对象字典(Object Dictionary)
- 6、SDO 参数与对象处理
- 7、开发案例总结
- 八、总结
- 其他资源
- 1. 直接使用EtherCAT协议开发从站的难点
- 2. SOES的作用和优势
- (1)协议栈封装
- (2)兼容性和可靠性
- (3)移植性和扩展性
- (4)开发效率高
- 3. 总结
- 1. **开源协议栈**
- (1)**EtherLab IgH EtherCAT Slave Stack**
- (2)**OpenEtherCAT Slave**
- 2. **商业协议栈**
- (1)**Beckhoff EtherCAT Slave Stack Code (SSC)**
- (2)**acontis EC-Master/EC-Slave**
- (3)**Port GmbH EtherCAT Slave Stack**
- 3. **芯片厂商自带协议栈**
- 4. **FPGA/软核实现**
- 5. **对比与选择建议**
一、SOES开源项目简介
SOES(Simple Open EtherCAT Slave)是一个面向嵌入式系统的开源EtherCAT从站协议栈。它以C语言实现,代码精简、结构清晰,适合资源受限的MCU/SoC平台。SOES的目标是为开发者提供一个易于移植、易于理解的EtherCAT从站实现,支持工业现场的高实时性和高可靠性需求。
开源项目地址:https://github.com/OpenEtherCATsociety/SOES
主要特性:
- 支持EtherCAT协议的核心功能,包括COE(CANopen over EtherCAT)、PDO、SDO、状态机管理、同步机制等。
- 代码高度模块化,便于在不同硬件平台上移植和扩展。
- 提供多种硬件平台的参考实现(如树莓派、XMC4300、TI AM335x等)。
- 适合学习、教学、产品开发和二次定制。
二、SOES源码结构详解
SOES项目结构清晰,主要目录和文件说明如下:
SOES-master/
├── applications/ # 各硬件平台的示例工程
│ ├── linux_lan9252demo/
│ ├── raspberry_lan9252demo/
│ ├── rtl_lwip_eoe/
│ ├── rtl_slavedemo/
│ ├── rtl_xmc4_dynpdo/
│ ├── tiesc_am335x/
│ ├── tiesc_k2gice/
│ └── xmc4300_slavedemo/
├── cmake/ # CMake构建脚本及工具链
├── drivers/ # EtherCAT芯片驱动(如LAN9252)
├── soes/ # 协议栈核心代码
│ ├── hal/ # 硬件抽象层(不同平台适配)
│ ├── doc/ # 文档(含tutorial.txt)
│ ├── ecat_slv.c/h # 协议栈主控与状态机
│ ├── esc.c/h # EtherCAT核心功能
│ ├── esc_coe.c/h # COE协议支持
│ ├── esc_eep.c/h # EEPROM支持
│ ├── esc_eoe.c/h # EOE协议支持
│ ├── esc_foe.c/h # FOE协议支持
│ └── ... # 其他协议与工具
├── README.md # 项目说明
└── version.h.in
三、SOES项目与核心知识点的对应关系
-
EtherCAT协议栈实现
- 协议栈的核心代码主要在
soes/
目录下,如ecat_slv.c
、esc.c
、esc_coe.c
等文件,分别实现了EtherCAT协议的各个层级和COE(CANopen over EtherCAT)等扩展协议。
- 协议栈的核心代码主要在
-
从站设备初始化
- 各平台的初始化代码在
applications/
下的不同子目录(如main.c
),以及soes/hal/
目录下的硬件抽象层(HAL)代码(如esc_hw.c
),负责初始化硬件和协议栈。
- 各平台的初始化代码在
-
数据处理
- 数据的收发和处理主要在
ecat_slv.c
和各平台的main.c
文件中实现,负责与主站的数据交互。
- 数据的收发和处理主要在
-
PDO映射
- PDO的定义和映射通常在
objectlist.c
或slave_objectlist.c
等文件中实现,这些文件定义了从站的过程数据对象结构。
- PDO的定义和映射通常在
-
SDO通信
- SDO相关的处理在
esc_coe.c
文件中实现,支持主站对从站参数的读写和配置。
- SDO相关的处理在
-
同步机制
- 同步相关的代码分布在
ecat_slv.c
和esc.c
,支持分布式时钟(DC)和主站同步命令的响应。
- 同步相关的代码分布在
-
状态机管理
- 从站状态机的实现主要在
ecat_slv.c
,负责从站的各个状态(如INIT、PRE-OP、SAFE-OP、OP)的切换和管理。
- 从站状态机的实现主要在
-
错误处理机制
- 错误检测和处理逻辑分布在协议栈各层代码中,如
esc.c
、ecat_slv.c
,并通过EtherCAT标准的错误寄存器和报警机制上报主站。
- 错误检测和处理逻辑分布在协议栈各层代码中,如
-
配置与诊断功能
- 相关功能在
esc_coe.c
、esc_eep.c
等文件中实现,支持主站对从站的配置和诊断。
- 相关功能在
-
代码的可移植性和模块化
- SOES项目结构清晰,协议栈与硬件平台解耦,便于在不同MCU/SoC平台上移植。
hal/
目录下为不同平台提供了硬件适配层。
- SOES项目结构清晰,协议栈与硬件平台解耦,便于在不同MCU/SoC平台上移植。
知识点 | SOES源码位置/实现说明 |
---|---|
EtherCAT协议栈 | soes/ecat_slv.c , soes/esc.c , soes/esc_coe.c |
从站设备初始化 | 各applications/xxx/main.c ,soes/hal/ 下各平台代码 |
数据处理 | soes/ecat_slv.c ,各平台main.c |
PDO映射 | applications/xxx/objectlist.c 或slave_objectlist.c |
SDO通信 | soes/esc_coe.c |
同步机制 | soes/ecat_slv.c , soes/esc.c |
状态机管理 | soes/ecat_slv.c |
错误处理机制 | soes/esc.c , soes/ecat_slv.c |
配置与诊断功能 | soes/esc_coe.c , soes/esc_eep.c |
可移植性和模块化 | soes/hal/ ,各平台applications/ |
四、SOES与EtherCAT从站芯片的关系
虽然SOES是软实现的协议栈,但在实际应用中,通常仍需配合专用的EtherCAT从站芯片(如LAN9252、ET1100等)或具备EtherCAT功能的硬件外设。
- 物理层与MAC层的实时性要求:EtherCAT对以太网帧的转发延迟和时序有极高要求,专用芯片可在硬件层面实现帧的级联转发,保证网络的实时性和确定性。
- SOES的定位:SOES主要实现协议栈的上层逻辑(如对象字典、数据处理、状态机等),而底层的帧收发、转发、同步等高实时性操作,依赖硬件实现。SOES通过硬件抽象层(HAL)与这些芯片对接。
- 软实现的局限性:理论上可以用MCU的以太网外设+软件模拟EtherCAT底层,但很难达到工业级的实时性和兼容性。只有极少数高性能MCU/FPGA能做到全软实现,但通常也会有专门的EtherCAT硬件模块辅助。
五、编译与使用流程(参考 soes/doc/tutorial.txt)
SOES项目的编译和使用流程大致如下:
-
准备开发环境
- 安装CMake、GCC/ARM-GCC等交叉编译工具链。
- 准备目标硬件开发板(如树莓派、XMC4300、AM335x等)。
-
选择目标平台
- 进入
applications/
目录,选择对应硬件平台的子目录(如linux_lan9252demo
)。
- 进入
-
配置与编译
- 使用CMake生成Makefile或工程文件。例如:
cd applications/linux_lan9252demo mkdir build && cd build cmake .. make
- 具体编译参数和平台相关配置可参考
CMakeLists.txt
和README.md
。
- 使用CMake生成Makefile或工程文件。例如:
-
烧录与运行
- 将编译生成的二进制文件烧录到目标硬件。
- 连接EtherCAT主站(如TwinCAT、EtherLab等)进行网络测试。
-
调试与扩展
- 可根据实际需求修改
objectlist.c
等文件,调整PDO/SDO映射和对象字典。 - 如需适配新硬件,需在
soes/hal/
下添加对应的硬件抽象层代码。
- 可根据实际需求修改
详细的编译和移植说明可参考 soes/doc/tutorial.txt
文件。
六、典型开发流程
- 选择目标硬件平台,适配HAL层代码。
- 配置对象字典(PDO/SDO)。
- 编译并烧录到目标设备。
- 使用EtherCAT主站软件进行测试和调试。
七、 SOES 从站开发案例
1、开发概述
SOES 是一个库,为微控制器用户应用提供访问 EtherCAT 现场总线通信环境的能力,包括:
- EtherCAT 状态机
- 邮箱接口
- 协议支持
- CoE(CANopen over EtherCAT)
- FoE(File over EtherCAT)及引导模板
邮箱和协议的支持是典型的应用场景,通常需要从站协议栈来控制 EtherCAT 的应用层。PDI(Process Data Interface,过程数据接口)通常是 SPI 或其他微控制器接口。
本教程将展示如何快速上手 SOES,并设计一个简单的从站应用。所有代码均为本地应用或全局变量,便于根据实际需求进行优化和调整。
目标应用示例:
- 输入 40bit
- 一个按钮(8bit)
- 一个编码器值(32bit)
- 输出 8bit
- LED(8bit)
- 参数
- 编码器设置
- 从站命令
- 复位计数器
2、启动代码示例
main 函数的作用是启动两个任务:一个执行 SOES 协议栈,一个控制错误 LED。部分 ESC(EtherCAT Slave Controller)芯片自带 RUN/ERROR LED 引脚,否则可由微控制器控制。
int main (void)
{rprintp ("SOES (Simple Open EtherCAT Slave)\nsoes test\n");// 启动 led_error 任务task_spawn ("led_error", led_error, 15, 512, NULL);// 启动 soes 任务task_spawn ("soes", soes, 9, 1024, NULL);return (0);
}
3、配置流程
soes 函数是 EtherCAT 从站的主入口,可分为三部分:硬件初始化、软件初始化、应用循环。
3.1. 硬件初始化
esc_reset
:如无物理 EEPROM,用于 ESC 复位(应用层本地实现)。ESC_init
:初始化 SPI 通信或类似接口。- 等待 ESC 启动,检测 SPI 是否正常,查询 ESC 寄存器 DL 状态,确认 EEPROM 加载和 PDI 正常。
void soes (void *arg)
{TXPDOsize = SM3_sml = sizeTXPDO ();RXPDOsize = SM2_sml = sizeRXPDO ();esc_reset ();ESC_init ((void *)spi_name);task_delay (tick_from_ms (200));// 等待 ESC 启动while ((ESCvar.DLstatus & 0x0001) == 0){ESC_read (ESCREG_DLSTATUS, (void *) &ESCvar.DLstatus,sizeof (ESCvar.DLstatus));ESCvar.DLstatus = etohs (ESCvar.DLstatus);}// 复位 ESC 到初始化状态ESC_ALstatus (ESCinit);...
}
3.2. 软件初始化
- 复位从站到 Init 状态,清除错误,停止应用层(禁用 SyncManager,阻止数据交换)。
void soes (void *arg)
{
...while ((ESCvar.DLstatus & 0x0001) == 0){ESC_read (ESCREG_DLSTATUS, (void *) &ESCvar.DLstatus,sizeof (ESCvar.DLstatus));ESCvar.DLstatus = etohs (ESCvar.DLstatus);}// 复位 ESC 到初始化状态ESC_ALstatus (ESCinit);ESC_ALerror (ALERR_NONE);ESC_stopmbx ();ESC_stopinput ();ESC_stopoutput ();// 应用主循环while (1)...
}
3.3. 应用循环
- 处理 ALevent(状态变化、SyncManager 变化等)
- 处理 ESC 状态机
- 处理邮箱及协议(如 CoE、FoE)
- 调用应用层处理函数(如 DIG_process)
void soes (void *arg)
{
...while (1){if((ESCvar.ALstatus & 0x0f) == ESCinit){txpdomap = DEFAULTTXPDOMAP;rxpdomap = DEFAULTRXPDOMAP;txpdoitems = DEFAULTTXPDOITEMS;rxpdoitems = DEFAULTTXPDOITEMS;}ESC_read (ESCREG_LOCALTIME, (void *) &ESCvar.Time, sizeof (ESCvar.Time));ESCvar.Time = etohl (ESCvar.Time);ESC_state ();if (ESC_mbxprocess ()){ESC_coeprocess ();ESC_foeprocess ();ESC_xoeprocess ();}DIG_process ();};
}
4、应用层处理(DIG_process)
4.1. 输出处理
- 判断当前是否处于支持输出的状态(如 OP 状态)。
- 若在 OP 状态,从 SyncManager2 读取输出 PDO 数据,刷新本地变量(如 LED 状态),并写入实际硬件(如 GPIO)。
- 包含看门狗机制,超时则关闭输出并切换到安全状态。
void RXPDO_update (void)
{ESC_read (SM2_sma, &Wb.LED, RXPDOsize);
}void DIG_process (void)
{if (App.state & APPSTATE_OUTPUT){if (ESCvar.ALevent & ESCREG_ALEVENT_SM2) // SM2 触发{RXPDO_update ();reset_wd ();gpio_set(GPIO_LED, Wb.LED & BIT(0));}if (!wd_cnt){ESC_stopoutput ();// 看门狗,输出无效ESC_ALerror (ALERR_WATCHDOG);// 切换到安全操作状态并设置错误位ESC_ALstatus (ESCsafeop | ESCerror);wd_trigger = 1;}}else{reset_wd ();}
...
}
4.2. 输入处理
- 在安全操作状态下持续更新输入。
- 读取用户应用数据(如 GPIO),写入本地 PDO 变量,再通过 SyncManager3 写入 ESC RAM,供主站读取。
void TXPDO_update (void)
{ESC_write (SM3_sma, &Rb.button, TXPDOsize);
}void DIG_process (void)
{
...Rb.button = gpio_get(GPIO_WAKEUP);Cb.reset_counter++;Rb.encoder = Cb.reset_counter;TXPDO_update ();
}
5、应用数据与过程数据映射
要通过 EtherCAT 过程数据传递应用数据,需要用三种对象来描述数据:
- ESI 文件(EtherCAT Slave Information,XML)
- SII-EEPROM(Slave Information Interface,硬件存储)
- CoE 对象字典(Object Dictionary)
ESI 和 SII-EEPROM 是必需的,CoE 对象字典用于描述复杂从站。
SII-EEPROM
- 存储设备标识、组、设备描述、SyncManager、Mailbox、DC(分布式时钟)、EEPROM 配置等信息。
ESI 文件
- XML 格式,描述从站的厂商、设备、组、SyncManager、Mailbox、CoE 支持、DC 支持等。
对象字典(Object Dictionary)
- 遵循 CANopen DS301 范围,分区明确(如输入区、输出区、配置区等)。
- RxPDO、TxPDO 分别映射到 0x1600-0x17FF、0x1A00-0x1BFF。
- 通过对象字典将本地变量与 EtherCAT PDO/SDO 映射关联。
示例:
// objectlist.h
FLASHSTORE _objd SDO7000[] =
{ {0x00, DTYPE_UNSIGNED8, 8, ATYPE_R, &acNameNOE[0], 0x01, nil},{0x01, DTYPE_UNSIGNED8, 8, ATYPE_RW, &acName7000_01[0], 0, &(Wb.LED)}
};typedef struct
{uint8 LED;
} _Wbuffer;
6、SDO 参数与对象处理
- SDO 参数可异步读写,支持参数镜像、写入钩子等功能。
- 通过
ESC_objecthandler
钩子函数可在 SDO 下载时执行自定义逻辑。
void ESC_objecthandler (uint16 index, uint8 subindex)
{switch (index){case 0x7100:{switch (subindex){case 0x01:{encoder_scale_mirror = encoder_scale;break;}}break;}}
}
7、开发案例总结
本案例详细介绍了 SOES 的初始化、主循环、输入输出处理、对象字典与过程数据映射、SDO 参数处理等关键流程。开发者可根据实际需求,灵活调整和扩展应用层逻辑,实现自定义的 EtherCAT 从站设备。
建议:
- 结合本教程和源码,快速上手 SOES 项目。
- 参考 ETG 官方文档,深入理解 EtherCAT 协议和对象字典设计。
- 根据硬件平台适配 HAL 层,完善 ESI/SII/OD 配置,实现高效可靠的工业现场通信。
八、总结
SOES作为软实现的EtherCAT从站协议栈,极大降低了嵌入式设备接入EtherCAT网络的门槛。它专注于协议和应用层的实现,配合专用的EtherCAT从站芯片或具备EtherCAT功能的硬件外设,能够满足工业现场对实时性和可靠性的严苛要求。
对于开发者而言,SOES不仅是学习EtherCAT协议的绝佳范例,也是开发自定义EtherCAT从站设备的有力工具。
建议开发者结合官方文档、项目源码和soes/doc/tutorial.txt
,快速上手并根据实际需求进行二次开发。
如需进一步了解SOES的移植、与具体芯片的对接方法,或协议栈的详细实现,欢迎留言交流!
其他资源
你的问题非常好,很多初学者在接触EtherCAT从站开发时都会有类似疑问。下面我用通俗的语言详细解答:
1. 直接使用EtherCAT协议开发从站的难点
EtherCAT协议本身是一套非常复杂且严格的工业以太网协议,它不仅仅是普通的以太网通信,还包括了:
- 实时性极高的帧转发机制(帧级联、极低延迟)
- 多种同步机制(分布式时钟、同步管理器等)
- 多层协议支持(如CoE、FoE、SDO、PDO、状态机等)
- 严格的状态机和错误处理
- 邮箱机制、对象字典、EEPROM/SII、ESI文件等
如果你“直接”开发EtherCAT从站协议栈,意味着你要从零实现上述所有功能,这对个人开发者或小团队来说,几乎是不现实的,主要原因有:
- 协议复杂度高:EtherCAT协议文档庞大,细节繁多,容易出错。
- 兼容性要求高:工业主站(如TwinCAT、Codesys等)对从站的兼容性要求极高,自己写的代码很难一次通过主站和官方一致性测试(CTT)。
- 实时性和可靠性要求高:工业现场对实时性和稳定性要求极高,自己开发难以保证。
- 开发周期长、维护难度大:从零开发协议栈,周期长,后续维护和升级也很困难。
2. SOES的作用和优势
SOES(Simple Open EtherCAT Slave)就是为了解决上述难题而诞生的。它的作用和优势体现在:
(1)协议栈封装
- SOES已经实现了EtherCAT从站协议的核心功能,包括状态机、邮箱、CoE/SDO/PDO、同步、错误处理等。
- 你只需要关注应用层的数据处理和硬件适配,不用关心底层复杂的协议细节。
(2)兼容性和可靠性
- SOES经过大量实际项目和主站测试,兼容性和稳定性有保障。
- 只要按照SOES的接口和流程开发,基本可以顺利通过主站的识别和一致性测试。
(3)移植性和扩展性
- SOES结构清晰,模块化设计,便于在不同MCU/SoC/平台上移植。
- 你可以很方便地扩展自己的对象字典、PDO/SDO、应用逻辑等。
(4)开发效率高
- 你只需专注于“我的设备有哪些输入输出、参数、命令”,而不用关心EtherCAT协议的底层实现。
- 大大缩短开发周期,降低开发和维护成本。
3. 总结
- 直接开发EtherCAT从站协议栈,难度极高、风险极大、周期极长,且很难保证兼容性和稳定性。
- SOES等开源协议栈,为开发者屏蔽了底层复杂性,让你专注于应用和硬件,极大提升开发效率和产品质量。
所以,SOES不是可有可无的“工具”,而是开发EtherCAT从站设备的“基础设施”!
当然,除了SOES(Simple Open EtherCAT Slave)之外,市面上还有多种EtherCAT从站协议栈可供选择,涵盖开源、闭源、商业授权等多种类型。下面为你详细介绍几种常见的替代方案:
1. 开源协议栈
(1)EtherLab IgH EtherCAT Slave Stack
- 简介:由德国汉诺威工业大学(IgH)主导开发,原本以主站(Master)协议栈著称,也有从站(Slave)实现。
- 特点:支持Linux平台,代码结构较为复杂,适合有一定底层开发经验的用户。
- 网址:EtherLab EtherCAT
(2)OpenEtherCAT Slave
- 简介:由Beckhoff等公司推动的开源项目,部分代码可用,但功能和文档不如SOES完善。
- 特点:适合学习和实验,工业应用需谨慎。
2. 商业协议栈
(1)Beckhoff EtherCAT Slave Stack Code (SSC)
- 简介:由EtherCAT协议的发明者Beckhoff官方提供,功能最全、兼容性最好。
- 特点:支持所有EtherCAT协议特性,文档齐全,广泛应用于工业产品。
- 授权:需向Beckhoff申请授权(免费/付费视具体用途)。
- 网址:Beckhoff EtherCAT SSC
(2)acontis EC-Master/EC-Slave
- 简介:德国acontis公司出品,全球知名的EtherCAT协议栈供应商。
- 特点:支持多平台,性能优异,技术支持完善。
- 授权:商业授权,适合企业级产品。
- 网址:acontis EC-Slave
(3)Port GmbH EtherCAT Slave Stack
- 简介:德国Port公司出品,专注于工业通信协议栈。
- 特点:支持多种MCU/FPGA,提供定制服务。
- 授权:商业授权。
- 网址:Port EtherCAT
3. 芯片厂商自带协议栈
许多EtherCAT从站芯片或SoC厂商会提供官方协议栈或参考实现,例如:
- Microchip LAN9252/9253:自带参考固件和协议栈。
- TI(德州仪器)PRU-ICSS EtherCAT Slave:TI官方提供完整的协议栈和例程。
- Infineon/XMC4300/4800:自带EtherCAT从站固件和协议栈。
这些协议栈通常针对自家硬件高度优化,适合特定芯片平台。
4. FPGA/软核实现
- Altera/Intel、Xilinx等FPGA厂商:提供EtherCAT从站IP核,配合软硬件协议栈使用,适合高性能、定制化场景。
5. 对比与选择建议
- 学习/实验/轻量级应用:SOES、EtherLab等开源协议栈。
- 工业产品/高可靠性/全功能需求:Beckhoff SSC、acontis、Port等商业协议栈。
- 特定芯片平台:优先考虑芯片厂商官方协议栈。
- 高性能/定制化:FPGA+IP核+协议栈。