EtherCAT协议基础:协议栈结构、帧格式、寻址方式与通信模式
核心原理:从站硬件处理与主站协议栈的分工
EtherCAT之所以具备高实时性,其根本原因在于从站不参与协议栈的逐层解析,而是由专用ESC(EtherCAT Slave Controller)硬件在报文经过时直接“飞读飞写”。主站发送的以太网帧经过每个从站时,ESC会实时提取发给自己的输出数据,并插入自己的输入数据,整个过程仅产生纳秒级延迟。主站侧则运行完整的协议栈软件,负责构建帧、管理寻址、处理状态机与周期性数据交换。
从软件角度看,EtherCAT主站协议栈通常分为四层:应用层(CoE/SoE/FoE等)、邮箱通信层(Mailbox)、数据链路层(寻址与帧封装)以及网卡驱动层。应用层面向用户功能,如过程数据对象(PDO)映射;邮箱层用于非周期通信,如参数配置;数据链路层负责将逻辑寻址的PDO数据映射到子报文;驱动层则直接操作网卡的DMA缓冲区,确保帧的实时收发。
帧格式与寻址方式:位置寻址与逻辑寻址
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伺服驱动器(从站),主站需要完成启动配置和周期同步。启动流程如下:
- 扫描与位置寻址:主站发送位置寻址的BRD(广播读)命令,依次识别每个从站的类型和厂商信息,并为其分配节点地址(如1、2、3)。
- 邮箱配置:使用节点寻址的邮箱通信,通过CoE协议将每个驱动器的PDO映射、伺服参数(如增益、速度限制)写入对象字典。
- FMMU配置:主站为每个从站配置FMMU,将逻辑地址段(如0x1000~0x100F)映射到各从站的输入输出缓存区。
- 状态机切换:通过邮箱命令将从站状态机从INIT切换到OP(Operational),使能周期数据交换。
- 周期运行:主站以1ms周期发送逻辑寻址的帧,同时写入3个驱动器的目标位置,并读取实际位置和状态字。
误区与复盘:常见错误及规避方法
在EtherCAT主站开发中,初学者常犯以下错误,值得特别留意:
- 误区一:混淆位置寻址与节点寻址。位置寻址的编号是动态的,取决于物理拓扑顺序;节点寻址是静态配置的。若在运行阶段误用位置寻址,一旦从站掉线或拓扑变化,会导致数据写入错误的从站。
- 误区二:忽略WKC校验。WKC是判断从站是否正确处理子报文的关键。例如,写命令要求WKC增加1,读命令要求增加从站数量。若主站不检查WKC,可能无法发现从站通信故障。
- 误区三:FMMU配置错误导致数据错位。逻辑地址映射必须与从站PDO映射严格对应。例如,若将逻辑地址0x1000映射到从站1的输出,而实际从站1的PDO长度只有4字节,则后续从站的映射地址必须从0x1004开始,否则数据会重叠。
- 误区四:周期时间过短导致邮箱饿死。若周期任务持续占用总线,邮箱通信可能永远得不到处理。应在每个周期预留一定时间片处理邮箱事件,或设置邮箱超时机制。
掌握EtherCAT的协议栈分层、帧格式、三种寻址方式以及周期/邮箱两种通信模式,是后续实现主站功能的基础。在实际开发中,建议先从简单的位置寻址扫描开始,逐步过渡到逻辑寻址的周期通信,并在每个阶段验证WKC和状态机转换,这样能有效降低调试复杂度。