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。
过程数据映射的实现
过程数据映射决定了哪些对象被放入SM2(输入)和SM3(输出)的同步管理器缓冲区。SSC生成的代码中,映射关系由Obj.InpSyncMan和Obj.OutSyncMan结构体描述,包含起始地址、长度和映射条目列表。映射条目的格式为32位:高16位是对象索引,低16位包含子索引和位长度。
实际运行时,协议栈在状态机进入SAFE-OP或OP时,会根据映射表把对象数据拷贝到ESC的DPRAM。对于输入过程数据,应用层更新对象后,协议栈在SM2事件中断中执行拷贝;对于输出过程数据,协议栈在SM3事件中断中从DPRAM读取并更新对象,应用层再读取对象。这个方向约定必须在整个设计中保持一致:0x6000系列是输入(从站→主站),0x7000系列是输出(主站→从站)。
状态机的实现与迁移条件
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工具负责生成协议栈骨架和对象字典框架,开发者负责填充应用逻辑和验证映射关系。理解每一层的职责边界,才能在出现通信异常时快速定位是配置问题、映射问题还是应用层数据更新问题。