EtherCAT从会到不会——封包解析(3)
本来还想着起什么名字,但是对比起内容,名字什么的一点都不重要。
最近我又想起要写点什么东西防止最后什么都不剩下。那就从EtherCAT开始吧!
总览

- EtherCAT 使用标准的IEEE 802.3以太网帧,因此可以使用标准的网络控制器,主站也无需使用特殊的硬件。
- EtherCAT 帧的 EtherType 0x88A4,以区别于其他以太网帧。因此,EtherCAT 可以与其他以太网协议并行运行。
- EtherCAT 不需要 IP协议,但是也可以封装在 UDP/IP 协议中(上图中第2种情况)。
EtherCAT Header

| 字段 | 数据类型 | 描述 |
|---|---|---|
| Length | 11 bit | EtherCAT Datagrams 的长度,不包括 FCS(校验) 从站不检查 |
| Reserved | 1 bit | 保留,0 |
| Type | 4 bit | 协议类型。只有当 Type = 0x1 时,从站 ESC 才会执行 EtherCAT Command |
EtherCAT Datagram

| 字段 | 数据类型 | 描述 |
|---|---|---|
| Cmd | byte | EtherCAT Command Type(EtherCAT命令) |
| Idx | byte | 索引。由主站生成,从站用于判断 Datagram 是否重复或者丢失。 |
| Address | dword | 地址数据 |
| Len | 11 bit | 该 Datagram 所携带的 Data 部分的大小 |
| R | 3 bit | Reserved,保留 |
| C | 1 bit | Circulating Frame,循环帧。 0:该帧未被循环 1:该帧循环过一次 |
| M | 1 bit | 0:(Last)最后一次 EtherCAT datagram 1: (More Follow)后面还有 EtherCAT datagrams |
| IRQ | word | 将所有从站的 EtherCAT Event Request registers 进行逻辑或(OR)运算 |
| Data | byte[n] | 读取或写入的数据 |
| WKC | word | Working Counter,工作计数器,Datagram 每被处理一次就自增相应的数值 |
例子

EtherCAT Command Type(EtherCAT命令)
| 模式 | EtherCAT命令(Cmd值) | 读/写 | 描述 | 触发条件 | WKC |
| 无 | NOP(0) | 无 | 没有操作 | 无 | 0 |
| Position Address 位置寻址(顺序寻址) |
APRD(1) | R | 向从站读取一定长度数据 | ADP=0 | 1 |
| APWR(2) | W | 向从站写入一定长度数据 | 1 | ||
| APRW(3) | RW | 与从站交换数据 | 3(1+2) | ||
| Node Address 节点寻址(站号寻址) |
FPRD(4) | R | 向从站读取一定长度数据 | ADP=conf. station adr. | 1 |
| FPWR(5) | W | 向从站写入一定长度数据 | 1 | ||
| FPRW(6) | RW | 与从站交换数据 | 3(1+2) | ||
| Broadcast 广播 |
BRD(7) | R | 主站向所有从站的内存区读取数据并做逻辑或(OR)操作 | all | 与执行到该指令的从站个数相关 |
| BWR(8) | W | 主站广播写入所有从站 | |||
| BRW(9) | RW | 主站与所有从站交换数据,对读取的数据做逻辑或(OR)操作 | |||
| Logical Address 逻辑寻址 |
LRD(10) | R | 读取一定长度数据 | FMMU | |
| LWR(11) | W | 写入一定长度数据 | |||
| LRW(12) | RW | 与从站交换数据 | |||
| Position Address 位置寻址(顺序寻址) |
ARMW(13) | RW | 读取从站数据,并写入之后所有从站的相同地址 | Read: ADP=0 Write: ADP≠0 |
|
| Node Address 节点寻址(站号寻址) |
FRMW(14) | RW | 读取从站数据,并写入之后所有从站的相同地址 | Read: ADP= conf. station adr. Write: ADP≠ conf. station adr. |
EtherCAT Addressing Modes(寻址模式)

由于 Address 数据的定义与寻址方式相关,这就导致了执行不同的 EtherCAT Command(EtherCAT命令)时,解析 Address 的方式就会有所不同。
分类
| 寻址模式 | 字段 | 数据类型 | 描述 | |
| Device Addressing 设备寻址 |
Position Addressing 位置寻址 |
Position | WORD | Each slave increments Position. Slave is addressed if Position = 0. |
| Offset | WORD | Local register or memory address of the ESC | ||
| Node Addressing 节点寻址 |
Address | WORD | Slave is addressed if Address matches Configured Station Address or Configured Station Alias (if enabled). | |
| Offset | WORD | Local register or memory address of the ESC | ||
| Broadcast 广播 |
Position | WORD | Each slave increments Position (not used for addressing) | |
| Offset | WORD | Local register or memory address of the ESC | ||
| Logical Addressing 逻辑寻址 |
Address | DWORD | Logical Address (configured by FMMUs) Slave is addressed if FMMU configuration matches Address. | |
Position Address/Auto Increment Address(位置寻址)
- 主站会根据要访问的从站对象,将 Address 中的 Position 设置为 0 或者 负值。
- Datagram 每经过一个从站,Position + 1。
- 从站读取 Position 的值,如果等于0,从站将在接收时执行相应的命令。
- 位置寻址应该只在 EtherCAT 系统启动时用于扫描从站,以后只偶尔用于检测新连接的从站。
Node Address/Configured Station Address(节点寻址)
- 直接由控制器设定各从站的固定站号,且不能由从站来更改。
- 与 Position Address(位置寻址)的地址彼此独立,与实体配线顺序无关。
- Address 中的 Address 值与配置的从站站号相等时,则从站执行相应命令。
- 通常用于对个别和已标识的设备的寄存器访问(如 Mailbox 访问)。
以 Codesys 系统举例,位置寻址、节点寻址的不同

Broadcast(广播)
- 每一个 EtherCAT 从站都会执行。
- 广播寻址一般用于检查所有从站的状态、初始化从站等工作。
Logical Address(逻辑寻址)
- 主站会将所有需要读写的数据全部放在同一个逻辑地址空间中(4GB)。
- 在 EtherCAT 网络启动时,主站会配置好每个从站的 FMMU(现场总线存储器管理单元)。
- 从站从 FMMU 的配置信息得知,逻辑地址与从站的物理地址之间的映射关系。
- 逻辑寻址用于Process Data(PDO)的传输,通过对空间地址的映射,来提升封包的传输效率。

Working Counter
- 每个 EtherCAT Datagram 都以一个16位工作计数器(WKC)结束。
- Working Counter 计算这个 EtherCAT Datagram 成功寻址的设备数量(即执行的次数)。
- 每个Datagram都应该有一个由主站计算的预期 Working Counter 值。主站可以通过比较 Working Counter 和期望值来检查 EtherCAT Datagram 的有效处理。
| 命令 | 类型 | 自增值 |
| Read command | No success | +0 |
| Successful read | +1 | |
| Write command | No success | +0 |
| Successful write | +1 | |
| ReadWrite command | No success | +0 |
| Successful read | +1 | |
| Successful write | +2 | |
| Successful read and write | +3 |
参考资料:
- ET1100datasheet
EtherCAT从会到不会——封包解析(3)
https://jacobblog.pages.dev/2026/03/08/EtherCAT-03封包解析/