EtherCAT从会到不会——封包解析(3)

本来还想着起什么名字,但是对比起内容,名字什么的一点都不重要。

最近我又想起要写点什么东西防止最后什么都不剩下。那就从EtherCAT开始吧!

总览

封包架构概览

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

EtherCAT Header

EtherCAT Header

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

EtherCAT Datagram

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)的传输,通过对空间地址的映射,来提升封包的传输效率。

FMMU

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封包解析/
作者
Jacob Chen
发布于
2026年3月8日
许可协议