2. EtherCAT协议基础:数据帧结构、寻址方式、通信模式

各位同学好,我是老张。今天咱们聊聊EtherCAT协议最核心的三个东西:数据帧长什么样、怎么找到设备、以及数据怎么来回跑。说实话,搞懂这三样,你基本就掌握了EtherCAT的七成功力。

核心要点:EtherCAT不是靠IP地址通信的,它用的是以太网帧里的特殊结构。这一点和Profinet、EtherNet/IP完全不同,千万别搞混了。

2.1 数据帧结构——报文是怎么塞进以太网帧的

EtherCAT的数据帧,说白了就是把标准以太网帧的"数据载荷"部分,换成了EtherCAT自己的报文。我刚开始学的时候,总觉得这玩意儿很玄乎,后来拆开一看,其实挺简单的。

标准以太网帧长这样:

| 前导码 | 目标MAC | 源MAC | EtherType | 数据载荷 | FCS |
|  7字节  |  6字节  | 6字节  |  2字节    | 46-1500  | 4字节 |

EtherCAT把EtherType设为0x88A4,然后数据载荷里塞的就是它的报文。这个报文结构如下:

| 以太网帧头 | EtherCAT头 | 子报文1 | 子报文2 | ... | 子报文N | FCS |
|   14字节   |   2字节    | 可变长度 | 可变长度 |     | 可变长度 | 4字节 |

EtherCAT头只有2个字节:

  • 长度字段(11位):表示后面所有子报文的总长度
  • 保留位(1位):一般置0
  • 类型字段(4位):我见过最多的是0x01(EtherCAT命令)和0x04(邮箱数据)

每个子报文才是真正干活的东西:

| 子报文头 | 数据 | 工作计数器(WKC) |
|  10字节  | 可变 |     2字节       |

子报文头里包含:

  • 命令(8位):比如APRD、FPWR、BRD等,决定了怎么读写
  • 索引(8位):用于匹配请求和响应
  • 地址信息(32位):后面会详细讲
  • 长度(11位):数据部分的字节数
  • 保留位(3位)+M位(1位):M位表示是否还有更多子报文
  • IRQ(16位):中断请求标志

我的经验:调试时我最爱看工作计数器(WKC)。每个从站处理完报文后,会把WKC加1或加2。如果WKC没变,说明从站根本没理你——八成是地址配错了。

2.2 寻址方式——怎么找到你要的那个设备

EtherCAT的寻址方式有好几种,我当年刚接触时被绕得晕头转向。其实你记住一个原则就行:不同场景用不同寻址

2.2.1 设备寻址(Device Addressing)

设备寻址又分两种:

  • 自动增量寻址(Auto Increment):从站按物理位置编号,第一个从站是0,第二个是-1,第三个是-2...说白了就是负数往下数。这种方式在启动阶段特别好用,因为那时候还不知道设备具体是谁。
  • 固定节点地址寻址(Configured Station Address):每个从站有一个1-65535的地址,由主站分配。我习惯在配置阶段就把地址写好,运行起来后只用这个。

2.2.2 逻辑寻址(Logical Addressing)

这个就厉害了。主站把整个网络映射成一个4GB的虚拟地址空间(32位地址)。每个从站负责其中一段。数据帧经过时,从站看看地址是不是自己的,是就处理,不是就跳过。

为什么用逻辑寻址?因为周期通信时,主站可以一次性读写多个从站的数据,效率极高。我做过一个项目,用逻辑寻址后,100个轴的控制周期从1ms降到了200μs。

2.2.3 广播寻址(Broadcast)

所有从站都会处理这个报文。常用于同步操作,比如同时启动所有轴。

寻址方式 地址范围 典型用途 我踩过的坑
自动增量 0 ~ -65535 启动阶段枚举设备 拓扑变化后地址会变,别在运行时用
固定节点 1 ~ 65535 非周期通信(邮箱) 地址冲突时整个网络会挂
逻辑寻址 0 ~ 4GB 周期过程数据通信 映射表配错,数据全乱套
广播 特殊值 全局同步命令 别在广播里写大量数据

注意:我曾经在一个项目里,把自动增量地址和固定节点地址混着用,结果从站死活不响应。查了两天才发现——有些从站在收到固定节点地址后,就不再响应自动增量寻址了。所以,启动阶段用自动增量,运行阶段统一用固定节点或逻辑寻址,别混着来。

2.3 通信模式——周期性 vs 非周期性

EtherCAT有两种通信模式,说白了就是:一个用来跑实时数据,一个用来传大块数据

2.3.1 周期性过程数据通信(PDO)

这是EtherCAT的看家本领。主站每个周期发送一个帧,所有从站在帧经过时,把自己的数据塞进去或者读出来。整个过程是流水线式的——帧从第一个从站传到最后一个,再原路返回。

特点:

  • 数据量小(一般几个字节到几十个字节)
  • 周期固定(我常用1ms、500μs、甚至100μs)
  • 确定性高(抖动在微秒级)
  • 使用逻辑寻址或固定节点寻址

我做过一个高速贴片机项目,200多个轴,周期500μs。刚开始总担心带宽不够,后来发现EtherCAT的帧处理延迟只有几百纳秒,完全没问题。

2.3.2 非周期性邮箱数据通信(SDO)

邮箱通信用来传大块数据,比如参数配置、固件升级、诊断信息。它用的是"请求-响应"模式,主站发一个邮箱报文,从站处理完后回复。

特点:

  • 数据量大(可以传几KB)
  • 实时性要求不高(几毫秒到几百毫秒都行)
  • 使用固定节点寻址
  • 有协议开销(需要邮箱协议头)

我的建议:千万别在周期通信里传大块数据。我见过有人把固件升级放在PDO里,结果整个网络周期从1ms变成了100ms,轴都抖成筛子了。记住:PDO跑实时,SDO跑配置,各司其职。

2.4 知识体系总览

下面这张图是我自己画的,把今天讲的内容串起来了。你仔细看看,应该能理解EtherCAT的数据是怎么从主站到从站的。

EtherCAT协议核心知识体系 EtherCAT主站 以太网帧 (EtherType=0x88A4) | 以太网头 | EtherCAT头 | 子报文1 | 子报文2 | ... | 子报文结构 | 命令 | 索引 | 地址 | 长度 | 数据 | WKC | 寻址方式 • 自动增量 (0, -1, -2...) • 固定节点 (1~65535) • 逻辑寻址 (4GB空间) • 广播 通信模式 • 周期性 (PDO) 实时过程数据 • 非周期性 (SDO) 邮箱配置数据 从站1 (地址0) 从站2 (地址-1) 从站3 (地址-2) ... ← 数据帧从主站发出,经过每个从站,最后返回主站 → 每个从站处理完报文后,工作计数器(WKC)会递增,主站据此判断是否成功

嗯,这张图基本把今天的内容都涵盖了。你想想看,数据帧从主站出发,带着子报文一路经过每个从站。从站根据寻址方式判断报文是不是给自己的,是就处理,不是就原样转发。处理完后,工作计数器加1,表示"我干完了"。最后帧返回主站,主站检查WKC就知道谁干了谁没干。

我个人觉得,理解了这个流程,EtherCAT就算入门了。剩下的就是各种细节——比如DC同步、分布式时钟、CoE协议这些,都是在今天这个基础上搭起来的。

一句话总结:EtherCAT用标准以太网帧做载体,通过特殊的寻址方式找到设备,用PDO跑实时数据、SDO传配置信息。记住这个框架,后面学什么都快。

专注资料整理