4. EtherCAT从站协议栈实现

EtherCAT从站的核心不是“跑一个协议软件”,而是把协议处理下沉到硬件。EtherCAT从站控制器(ESC,EtherCAT Slave Controller)在物理层与主站之间承担帧的实时解析、转发、过程数据映射与时钟同步,CPU只负责应用逻辑。理解ESC的硬件架构,是判断Lattice FPGA能否胜任、以及如何组织从站协议栈的前提。

ESC硬件架构:数据在从站内部如何流动

ESC内部可划分为四个关键单元:物理层接口(MII/RGMII)、帧处理单元(Frame Processing)、存储区(DPRAM/Process Data RAM)与分布式时钟单元(DC Unit)。主站发出的EtherCAT帧从端口0进入,帧处理单元读取子报文中的命令、地址与数据,按逻辑寻址或自动增量寻址判断该子报文是否属于本从站:属于本从站则在本站存储区完成读写,不属于则仅做转发。处理完成后帧从端口1(或端口2)继续向下游传递,形成“边转发边处理”的流水线,因此从站引入的延迟通常只有数百纳秒量级。

存储区是ESC与本地应用之间的唯一数据界面。过程数据(Process Data)被映射到固定偏移的DPRAM区域,主站通过FMMU(Fieldbus Memory Management Unit)把逻辑地址映射到本地物理地址,通过SyncManager把过程数据通道与邮箱通道分开管理。典型配置中,SM0/SM1用于邮箱(参数、SDO、诊断),SM2用于主站到从站的输出过程数据,SM3用于从站到主站的输入过程数据。应用CPU不直接触碰以太网帧,只读写SM2/SM3对应的DPRAM窗口。

EtherCAT从站ESC内部数据流与过程数据接口 EtherCAT主站 逻辑寻址帧 端口0 MII/RGMII 帧处理单元 命令解析 / 地址判断 读写 / 转发 端口1 下游从站 ESC 存储区 (DPRAM) SM0 / SM1 邮箱通道(SDO、诊断) SM2 输出过程数据(主→从) SM3 输入过程数据(从→主) FMMU / SyncManager 逻辑地址→物理地址 分布式时钟 DC 系统时间 / 锁存 应用 CPU / 软核逻辑 读写SM2/SM3窗口,执行控制算法 时间戳/同步

过程数据接口:SM2/SM3与PDO映射

过程数据接口的本质是“固定周期、固定偏移、无握手”的交换。以一台16路数字量输入、8路数字量输出的从站为例,可配置输入PDO为2字节(16位DI),输出PDO为1字节(8位DO)。主站每个周期把1字节输出写入SM2,从站在同一周期把2字节输入写入SM3,主站下一周期读走。整个过程没有请求应答,只有周期刷新,因此从站应用必须在周期内完成“读输出→执行逻辑→写输入”的闭环。

在Lattice FPGA中,SM2/SM3通常映射为软核(如LatticeMico或RISC-V软核)可访问的寄存器窗口,或直接由硬件状态机读写。若采用硬件直连,可用组合逻辑把SM2的8位输出直接驱动到IO,把IO输入直接写入SM3,延迟可压缩到几个时钟周期;若需要复杂控制算法,则由软核在中断或轮询中处理。两种方式的选择取决于控制周期与算法复杂度。

分布式时钟同步:让所有从站“看同一块表”

分布式时钟(DC)解决的是多从站动作同时性问题。主站选择一个从站作为参考时钟,其余从站通过测量帧往返延迟计算自身时钟偏移,并调整本地时钟频率与偏移,使系统时间对齐。同步过程分两步:先测量各从站之间的传播延迟,再持续补偿漂移。同步完成后,从站可在SYNC0/SYNC1信号触发下,在指定系统时间点执行输出锁存或采样,实现微秒级甚至亚微秒级同步。

在Lattice FPGA中实现DC,需要ESC提供系统时间寄存器与锁存端口,FPGA侧用高频时钟计数并接受ESC的漂移补偿值。典型做法是:ESC输出SYNC0脉冲,FPGA在脉冲边沿锁存输出数据或采样输入,从而把“软件周期”与“硬件时刻”解耦。若忽略DC,多轴或高速IO场景会出现明显动作错位。

基于Lattice FPGA的从站开发流程

开发流程可归纳为“选型—配置—集成—验证”四步。选型阶段确认FPGA是否内置或可挂接ESC IP,Lattice部分器件提供EtherCAT从站IP核,也可通过SPI/并行接口外接独立ESC芯片。配置阶段使用厂商工具生成ESC寄存器配置,包括FMMU、SyncManager、PDO映射与DC参数,并导出ESI/XML文件供主站识别。集成阶段把ESC IP与用户逻辑、软核、IO接口连接,分配DPRAM地址,编写过程数据读写代码。验证阶段先用主站扫描从站、检查SM通信与PDO数据,再启用DC观察同步误差,最后跑实际控制任务。

教学示例参数:控制周期1 ms,输入PDO 2字节,输出PDO 1字节,DC同步目标误差小于1 μs。这些数值用于说明配置思路,实际项目需按器件手册与主站能力调整。

一个容易忽略的细节是过程数据的一致性。若软核在读取2字节输入时被刷新打断,可能读到半新半旧的数据。解决方式包括:使用ESC的三缓冲(Triple Buffer)机制,或由硬件在SYNC0时刻统一锁存。Lattice FPGA中可用双口RAM加锁存信号实现,确保应用读到的是同一时刻的快照。

最后,从站协议栈并非“越软越好”。把帧处理、FMMU、DC交给ESC硬件,把周期控制交给FPGA逻辑,把非实时参数与诊断交给软核,才能兼顾实时性与灵活性。理解ESC架构与过程数据接口,是后续调试与优化的基础。