EtherCAT协议基础:协议栈结构、帧格式、寻址方式与通信模式

核心原理:从站硬件处理与主站协议栈的分工

EtherCAT之所以具备高实时性,其根本原因在于从站不参与协议栈的逐层解析,而是由专用ESC(EtherCAT Slave Controller)硬件在报文经过时直接“飞读飞写”。主站发送的以太网帧经过每个从站时,ESC会实时提取发给自己的输出数据,并插入自己的输入数据,整个过程仅产生纳秒级延迟。主站侧则运行完整的协议栈软件,负责构建帧、管理寻址、处理状态机与周期性数据交换。

从软件角度看,EtherCAT主站协议栈通常分为四层:应用层(CoE/SoE/FoE等)、邮箱通信层(Mailbox)、数据链路层(寻址与帧封装)以及网卡驱动层。应用层面向用户功能,如过程数据对象(PDO)映射;邮箱层用于非周期通信,如参数配置;数据链路层负责将逻辑寻址的PDO数据映射到子报文;驱动层则直接操作网卡的DMA缓冲区,确保帧的实时收发。

关键认知:EtherCAT的“协议栈”并非像TCP/IP那样在每个节点上完整运行。从站只有硬件状态机,主站才是唯一运行完整协议栈的节点。这种“主站集中式处理、从站硬件透传”的架构,是EtherCAT区别于PROFINET RT、EtherNet/IP的关键。
EtherCAT主站协议栈 应用层 CoE / FoE / SoE / EoE PDO映射、SDO对象字典 邮箱通信层 Mailbox Service 非周期数据(配置/诊断) 数据链路层 寻址 / 帧封装 / 子报文 FMMU / 逻辑寻址管理 网卡驱动层 DMA / 零拷贝 / 实时调度 原始套接字或专用驱动 从站 1 ESC 硬件 FMMU + 状态机 从站应用(uC) 数字量/模拟量/伺服 从站 2 ESC 硬件 FMMU + 状态机 从站应用(uC) I/O 端子 / 驱动器 从站 N ESC 硬件 + 应用 处理后的帧返回主站 EtherCAT 帧结构 以太网头 (14B) EtherCAT头 (2B) 0x88A4 子报文 1 (数据) 子报文 2 ... 子报文 N FCS (4B) 子报文结构 命令(1B) | 索引(1B) | 地址(4B) 长度(2B) | R(1B) | C(1B) 数据区(0-1486B) | WKC(2B) WKC: 工作计数器,从站处理标志

帧格式与寻址方式:位置寻址与逻辑寻址

EtherCAT直接使用标准以太网帧,但以太网类型字段设为0x88A4。帧结构依次为:以太网头(14字节)、EtherCAT头(2字节)、一个或多个子报文,最后是FCS校验。EtherCAT头中的长度字段指示整个报文长度,而每个子报文则包含命令、索引、地址区、数据区和WKC(工作计数器)。

寻址方式分为三种,理解它们对主站开发至关重要:

  • 位置寻址(Position Addressing):子报文地址区存放从站物理位置编号(如第3个从站),报文依次经过各从站时,每个从站将位置计数器减1,当计数为0时匹配。适用于启动阶段扫描从站。
  • 节点寻址(Node Addressing):地址区存放从站在线配置的站地址(由主站在初始化时分配,1~65535)。适用于邮箱通信,如CoE的SDO访问。
  • 逻辑寻址(Logical Addressing):地址区存放一个逻辑地址(如0x1000),通过从站内部的FMMU(Fieldbus Memory Management Unit)将逻辑地址映射到从站本地物理内存地址。适用于周期过程数据通信,主站一次广播即可读写多个从站的数据。
寻址方式 地址区内容 典型用途 从站匹配机制
位置寻址 从站物理位置(0~N) 启动扫描、自动枚举 位置计数器递减至0
节点寻址 站地址(1~65535) 邮箱通信(SDO/配置) 与从站配置地址比对
逻辑寻址 逻辑地址(FMMU映射) 周期过程数据(PDO) FMMU将逻辑地址映射到本地内存

通信模式:周期过程数据与邮箱通信

EtherCAT的通信模式可归纳为两大类:周期过程数据通信(PDO)和非周期邮箱通信(Mailbox)。在正常运行时,主站以固定周期(如1ms)发送过程数据帧,帧内包含多个逻辑寻址的子报文,每个从站通过FMMU映射读写自己的输入输出数据。这种模式开销极小,一个千兆以太网帧即可承载上百个从站的实时数据。

邮箱通信则用于启动阶段的参数配置、SDO访问、固件升级(FoE)等。邮箱数据通常封装在节点寻址的子报文中,采用请求/响应机制。主站发送邮箱请求后,从站通过WKC指示是否已接收,并在后续周期中返回响应。值得注意的是,邮箱通信不会中断过程数据通信,两者可并行运行,但邮箱数据优先级较低,以保证实时性。

// 主站周期任务伪代码示例(周期1ms)
while (1) {
    // 1. 构建过程数据帧(逻辑寻址)
    ec_frame_t *frame = alloc_frame();
    frame->eth_type = 0x88A4;
    add_submessage(frame, CMD_LWR, LOGIC_ADDR_0x1000, output_data, len);
    
    // 2. 发送帧并等待返回(阻塞或DMA完成)
    send_frame(frame);
    wait_frame_done(frame);
    
    // 3. 解析返回帧,提取从站输入数据
    parse_inputs(frame, input_data);
    
    // 4. 处理邮箱事件(非阻塞)
    if (mailbox_has_event()) {
        process_mailbox();
    }
    sleep_until_next_cycle();
}

案例场景:三从站伺服驱动器的启动与周期同步

假设一条产线上有3个EtherCAT伺服驱动器(从站),主站需要完成启动配置和周期同步。启动流程如下:

  1. 扫描与位置寻址:主站发送位置寻址的BRD(广播读)命令,依次识别每个从站的类型和厂商信息,并为其分配节点地址(如1、2、3)。
  2. 邮箱配置:使用节点寻址的邮箱通信,通过CoE协议将每个驱动器的PDO映射、伺服参数(如增益、速度限制)写入对象字典。
  3. FMMU配置:主站为每个从站配置FMMU,将逻辑地址段(如0x1000~0x100F)映射到各从站的输入输出缓存区。
  4. 状态机切换:通过邮箱命令将从站状态机从INIT切换到OP(Operational),使能周期数据交换。
  5. 周期运行:主站以1ms周期发送逻辑寻址的帧,同时写入3个驱动器的目标位置,并读取实际位置和状态字。
开发提示:在编写主站代码时,建议将“扫描-配置-运行”三个阶段分离。扫描阶段使用位置寻址,配置阶段使用节点寻址+邮箱,运行阶段使用逻辑寻址+过程数据。这样既清晰又便于错误定位。

误区与复盘:常见错误及规避方法

在EtherCAT主站开发中,初学者常犯以下错误,值得特别留意:

  • 误区一:混淆位置寻址与节点寻址。位置寻址的编号是动态的,取决于物理拓扑顺序;节点寻址是静态配置的。若在运行阶段误用位置寻址,一旦从站掉线或拓扑变化,会导致数据写入错误的从站。
  • 误区二:忽略WKC校验。WKC是判断从站是否正确处理子报文的关键。例如,写命令要求WKC增加1,读命令要求增加从站数量。若主站不检查WKC,可能无法发现从站通信故障。
  • 误区三:FMMU配置错误导致数据错位。逻辑地址映射必须与从站PDO映射严格对应。例如,若将逻辑地址0x1000映射到从站1的输出,而实际从站1的PDO长度只有4字节,则后续从站的映射地址必须从0x1004开始,否则数据会重叠。
  • 误区四:周期时间过短导致邮箱饿死。若周期任务持续占用总线,邮箱通信可能永远得不到处理。应在每个周期预留一定时间片处理邮箱事件,或设置邮箱超时机制。
复盘建议:当遇到从站无响应时,首先检查WKC值是否与预期一致;其次使用EtherCAT抓包工具(如Wireshark配合EtherCAT解析插件)查看子报文命令和地址区内容;最后确认从站状态机是否已切换到OP。不要盲目修改FMMU映射或PDO配置,应先定位是寻址问题、配置问题还是时序问题。

掌握EtherCAT的协议栈分层、帧格式、三种寻址方式以及周期/邮箱两种通信模式,是后续实现主站功能的基础。在实际开发中,建议先从简单的位置寻址扫描开始,逐步过渡到逻辑寻址的周期通信,并在每个阶段验证WKC和状态机转换,这样能有效降低调试复杂度。