3. EtherCAT从站软件架构设计

EtherCAT从站软件并不是从零手写的。对于绝大多数采用ET1100、ET1200、LAN9252、AX58100等从站控制器的项目,标准做法是使用ETG官方提供的SSC(Slave Stack Code)工具生成协议栈骨架,再在其上填充应用逻辑。理解SSC生成代码的结构、对象字典的构建方式、过程数据映射的绑定关系以及状态机的实现位置,是设计一个可维护从站软件的基础。

SSC工具生成代码的整体结构

SSC工具以Excel配置文件(通常命名为xxx.xlsx)为输入,输出一个完整的从站协议栈工程。这个工程通常分为三层:硬件抽象层、协议栈层和应用层。硬件抽象层包含esc.h/esc.c,负责读写ESC寄存器、操作EEPROM、处理PDI中断;协议栈层包含mailbox.c、coe.c、objdef.c、state.c等,负责邮箱通信、CoE对象访问、状态机迁移;应用层则是sample.c或用户自定义文件,负责把过程数据与真实硬件绑定。

SSC配置表中最关键的几项决定了生成代码的形态:从站控制器型号、PDI接口类型(Digital I/O、SPI、8/16位异步微控制器)、是否启用CoE、是否启用FoE、过程数据长度、同步模式(FreeRun、SM-Synchronous、DC-Synchronous)。例如选择LAN9252 + SPI PDI + CoE + DC模式,生成的代码会包含SPI读写函数、DC同步中断处理和CoE对象字典框架。

对象字典的构建

对象字典是CoE通信的核心。SSC生成的对象字典以TOBJECT结构体数组形式存在于objdef.c中,每个条目包含索引、子索引、数据类型、访问权限、指向数据的指针和长度。标准条目如0x1000(设备类型)、0x1018(身份对象)、0x1C00(同步管理器类型)由SSC自动生成,而厂商特定对象(0x2000~0x5FFF)和过程数据对象(0x6000~0x6FFF输入、0x7000~0x7FFF输出)需要用户在配置表中定义。

以一台4通道模拟量输入从站为例,在SSC配置表中定义0x6000为输入过程数据,子索引0x01~0x04分别对应4个通道的16位采样值。生成代码后,objdef.c中会出现对应的条目,数据指针指向ApplicationObj结构体中的成员。应用层只需周期性更新这些成员,协议栈会在SM2事件触发时自动将其写入ESC的过程数据RAM。

对象字典条目的访问权限必须与过程数据映射一致。如果0x6000被设为只读(RO),但应用层试图写入,CoE访问会返回SDO中止码0x06010002(试图写只读对象)。

过程数据映射的实现

过程数据映射决定了哪些对象被放入SM2(输入)和SM3(输出)的同步管理器缓冲区。SSC生成的代码中,映射关系由Obj.InpSyncMan和Obj.OutSyncMan结构体描述,包含起始地址、长度和映射条目列表。映射条目的格式为32位:高16位是对象索引,低16位包含子索引和位长度。

实际运行时,协议栈在状态机进入SAFE-OP或OP时,会根据映射表把对象数据拷贝到ESC的DPRAM。对于输入过程数据,应用层更新对象后,协议栈在SM2事件中断中执行拷贝;对于输出过程数据,协议栈在SM3事件中断中从DPRAM读取并更新对象,应用层再读取对象。这个方向约定必须在整个设计中保持一致:0x6000系列是输入(从站→主站),0x7000系列是输出(主站→从站)。

EtherCAT从站软件架构与数据流 应用层 (sample.c) ADC采样 → 0x6000:01~04 0x7000:01~04 → DAC输出 LED/GPIO 状态指示 协议栈层 (SSC生成) objdef.c 对象字典 state.c 状态机 mailbox.c / coe.c 硬件抽象层 (esc.c) SPI/并行总线读写 ESC DPRAM 访问 EEPROM / 中断 EtherCAT 状态机 (state.c) INIT PRE-OP SAFE-OP OP 错误 过程数据映射方向约定 0x6000 (输入): 从站 → 主站 SM2事件触发拷贝到DPRAM 0x7000 (输出): 主站 → 从站 SM3事件触发从DPRAM读取

状态机的实现与迁移条件

EtherCAT从站状态机包含INIT、PRE-OP、SAFE-OP、OP四个基本状态,以及可选的BOOT状态。SSC生成的state.c中,状态迁移由AL_ControlInd函数处理,主站通过写AL Control寄存器请求状态切换,从站检查迁移条件后更新AL Status寄存器。

各状态的迁移条件有明确要求:INIT→PRE-OP需要邮箱通信初始化完成;PRE-OP→SAFE-OP需要SM2/SM3配置正确且过程数据映射有效;SAFE-OP→OP需要DC同步建立(如果启用DC)且输入过程数据已就绪。如果条件不满足,从站会停留在当前状态并在AL Status中设置错误位,主站读取到错误码后可以定位问题。

实际调试中,最常见的状态机问题是卡在PRE-OP无法进入SAFE-OP。原因通常是SM2/SM3的长度配置与对象字典中过程数据映射的总长度不一致。例如映射了4个16位输入通道,SM2长度应设为8字节,如果配置表中误写为4字节,状态迁移会失败并返回错误码0x001E(SM2长度不匹配)。

从配置到运行的完整链路

把上述环节串起来,一个从站软件从SSC配置到实际运行的过程如下:在Excel配置表中定义从站控制器型号、PDI接口、过程数据对象和同步模式;运行SSC工具生成协议栈工程;在应用层文件中实现对象数据的读写逻辑;编译下载到目标MCU;上电后从站依次经历INIT→PRE-OP→SAFE-OP→OP;主站通过SDO读取0x1000和0x1018确认设备识别;通过PDO交换过程数据;观察AL Status寄存器确认无错误。

这个链路中,SSC工具负责生成协议栈骨架和对象字典框架,开发者负责填充应用逻辑和验证映射关系。理解每一层的职责边界,才能在出现通信异常时快速定位是配置问题、映射问题还是应用层数据更新问题。

设计检查要点:SSC配置表中的过程数据长度必须与对象字典中0x6000/0x7000的映射总长度一致;SM2/SM3的起始地址不能重叠;如果启用DC,应用层需要在DC中断中更新输入数据,而不是在自由运行循环中更新。