很多人第一次抓 EtherCAT 包,都会觉得:
不就是个以太网包吗?无非协议字段不一样。
这句话不完整。
EtherCAT 确实跑在以太网上,
但它不是普通那种“节点先收完整包,再解析处理”的通信模型。
它的关键点是:
报文在链路中流过时,从站就能直接读写属于自己的那部分数据。
所以 EtherCAT 报文虽然长着网包的外壳,
本质上却不是普通网包。
一句话先讲明白
EtherCAT 报文外面是标准以太网帧,里面却不是普通“收包再处理”的逻辑,而是一个可被多个从站沿途直接读写的实时数据载体。
第一,为什么它不是“普通网包”?
普通以太网通信的典型流程是:
• 网卡收完整帧
• 协议栈解析
• 找到目标数据
• 再交给上层处理
也就是说:
先收包,再处理。
EtherCAT 不是这样。
它的核心机制是:
主站发出报文后,从站不必把整个帧完整收下来再处理,而是在报文经过自己的瞬间,直接读取或写回指定偏移的数据,然后继续转发。
所以 EtherCAT 干的不是普通“点到点消息通信”,
而是:
一帧报文沿路流过,多个从站顺手完成各自的数据交换。
第二,最外层为什么又确实是以太网帧?
因为 EtherCAT 本来就是直接跑在二层以太网上。
它的最外层仍然是标准以太网帧:
• 目标 MAC
• 源 MAC
• EtherType
• 负载
• FCS
关键字段是 EtherType。
EtherCAT 使用:
0x88A4
所以抓包时,只要看到 EtherType 是 0x88A4,
基本就能判断这是 EtherCAT 帧。
这说明:
EtherCAT 用的是以太网外壳,但里面走的是自己的实时数据交换逻辑。
第三,EtherCAT 报文里面到底是什么结构?
最实用的理解方式是先看层次。
一个 EtherCAT 帧,可以粗看成三层:
1. 以太网帧头
普通二层外壳。
2. EtherCAT Header
说明后面 EtherCAT 负载的基本信息。
3. 一个或多个 EtherCAT Datagram
真正的数据访问都发生在这里。
这里最关键的一点是:
一个 EtherCAT 帧里,可以放多个 Datagram。
所以它不是简单的“一包对应一条请求”,
而是:
一个帧里可以打包一轮要完成的多笔访问。
第四,真正该看的核心单元其实是 Datagram
如果想看懂 EtherCAT 报文,
重点不是 MAC 头,
而是 Datagram。
因为真正的读写动作都在这里。
一个 Datagram 里,最值得看的字段通常是:
• CMD:要干什么
• 地址:访问哪里
• 长度:这一笔访问覆盖多少字节
• Data:实际数据
• WKC:这笔访问是否按预期被处理
极简记法就是:Datagram = CMD + 地址 + 长度 + 数据 + WKC。
抓住这几个个字段,
你就已经抓住了 EtherCAT 报文的主干。
第五,CMD 到底在表达什么?
CMD 表示这笔访问的类型。
最简单的理解是:
这次是读、写,还是读写组合;是按物理地址访问,还是按逻辑地址访问。
常见命令大致分两类。
第一类:物理访问
比如:
• APRD:自动递增物理地址读
• APWR:自动递增物理地址写
• APRW:自动递增物理地址读写
• FPRD:固定地址物理读
• FPWR:固定地址物理写
• FPRW:固定地址物理读写
AP = Auto Increment
FP = Fixed Position 或 Fixed Pointer
RD = Read、WR = Write、RW =ReadWrite
第二类:逻辑访问
比如:
• LRD:Logical Read
• LWR:Logical Write
• LRW:Logical Read/Write
这两类命令的区别,
主站此刻是在按“某个从站的本地对象”访问,还是按“整条线上的过程映像”访问。
第六,什么是物理地址,什么是逻辑地址?它们分别什么时候用?
这部分如果不讲清楚,
前面的 CMD 就容易变成死记缩写。
先说物理地址。
物理地址,指的是某个从站 ESC 里的本地地址空间,通常指 ESC 内部的寄存器或过程数据 RAM。
在 EtherCAT 物理寻址里,又分为 ADP 和 ADO 两部分。 ADP 用来定位链路中具体哪一个从站,相当于楼栋号;
ADO 用来定位该从站内部偏移,相当于房间号,
两者组合就能精准定位到指定从站的寄存器或过程数据内存。
你可以把它理解成:
我现在就是要找这一个从站,去读它的寄存器、配置它的同步管理器、看它的 AL 状态,或者改它某个本地参数。
这时候关注的是:
• 是哪一个从站
• 它本地哪一段寄存器或内存
• 这笔配置有没有打到它身上
所以物理地址常见于:
• 扫描和识别从站
• 初始化配置
• 访问 ESC 寄存器
• 配 FMMU、Sync Manager
• 状态切换和诊断
这里又分两种用法。
AP 类命令,常用于拓扑扫描和枚举阶段。
因为这时主站往往还没把每个从站的固定站址完全建立好,
更适合让报文沿链路自动递增地“点名”。
FP 类命令,常用于从站身份已经明确之后。
也就是主站已经知道:
我要访问的是第几个、哪一个固定站址的从站。
再说逻辑地址。
逻辑地址,不是在说某个从站自己的寄存器地址,而是在说主站组织出来的一整块过程数据映像地址。
它的视角不是“这是谁家的本地地址”,
而是:
这一轮周期通信里,整套输入输出数据在主站眼里被排成了一张连续的逻辑内存图。
各个从站不是直接拿‘自己的物理地址’来跑 PDO。
是先在初始化阶段通过 FMMU 和 Sync Manager,把各自的本地过程数据窗口映射到逻辑过程映像里的某一段。
进入运行期后,主站关心的就是逻辑过程映像本身,不需要每一轮都再盯底下那套物理寄存器布局。
所以逻辑地址最常见于:
• PDO 周期通信
• 过程数据交换
• 主站按整块 IO 映像收发数据
这就是为什么正式运行时,
主站更常关心的是:
这一整块逻辑过程映像区怎么交换。
而不是每一周期都去问:
某个从站的某个寄存器现在是多少。
一句话压缩这两套地址的边界:
物理地址解决“找到并配置某个从站”,逻辑地址解决“按统一过程映像完成周期数据交换”。
第七,为什么 PDO 周期通信时,它看起来更不像“普通网包”?
因为周期通信时,主站发出的不是“给某个从站的一条消息”,
而是:
把本周期所有过程数据按逻辑映像组织好,放进一个或几个 Datagram。
从站的处理方式也不是“完整收包再解析”,
而是:
报文流过时,只改自己负责的那几字节。
所以 EtherCAT 周期帧的特点通常是:
• 一个帧里带一大块过程数据
• 多个从站各改各的偏移
• 报文继续往下流
• 回到主站时,这一轮数据已经沿途更新完了
这就是它和普通 TCP/UDP 网包最不一样的地方。
第八,WKC 为什么这么重要?
WKC 是 Working Counter,工作计数器。
它的作用很直接:
判断这笔访问有没有被预期的从站正确处理。
每当某个从站按规则参与了这次访问,
WKC 就会增加。
所以主站收到报文后,不是只看“包回来了没有”,
更要看:
WKC 对不对。
这能帮助判断:
• 从站有没有按预期参与
• 链路是否异常
• 地址映射是否正确
• 本轮过程数据是否可信
所以工程上看 EtherCAT 报文时,
WKC 是关键判断字段,不是附属信息。
第九,一个典型 EtherCAT 报文可以怎么理解?
不用一开始就背位图,
先记住这个结构就够了:
也就是说:
一个 EtherCAT 帧 = 以太网外壳 + EtherCAT 头 + 一个或多个 Datagram。
以后抓包时,真正要看的是:
• 有几个 Datagram
• 每个 Datagram 在干什么
• 访问的是物理地址还是逻辑地址
• WKC 是否正确
第十,它和普通 TCP/UDP 网包最本质的区别是什么?
可以直接记 4 条。
• 它不走普通 IP/TCP/UDP 主路径
• 它不是典型的端到端消息模型
• 它强调报文经过时的 on-the-fly 处理
• 一个帧里可以承载多笔访问
这四条合起来,就是为什么 EtherCAT 报文虽然像网包,
但本质上不是“普通网包”。
第十一,现场抓包时最该怎么看?
按这个顺序最实用:
1. 先看 EtherType
是不是 0x88A4。
2. 再看有几个 Datagram
先把结构看清楚。
3. 看 CMD
判断现在是在做配置访问,还是过程数据交换。
4. 看地址和长度
判断访问的是哪片区域、搬了多少数据。
5. 最后看 WKC
这是判断通信是否按预期完成的关键信号。
如果是 AP 或 FP 类命令,
你脑子里要想的是:
现在在找哪一个从站,读写它哪段本地地址。
如果是 LRW、LRD、LWR 这类命令,
你脑子里要切到另一张图:
现在在搬整块逻辑过程映像,沿路每个从站只处理自己映射到的那一小段。
第十二,工程上最该怎么理解 EtherCAT 报文?
最稳的理解方式不是把它看成:
“一个带私有协议头的以太网包。”
而是:
一列沿链路流动、由多个从站沿途改写的实时数据列车。
主站把一轮通信需要的数据装进去。
从站在报文经过自己时修改自己的那部分。
整帧回到主站后,这一轮交换就完成了。
这个画面感一建立,后面很多概念都会顺:
• 为什么过程数据通信这么快
• 为什么逻辑地址很重要
• 为什么 WKC 是关键字段
• 为什么它特别适合周期实时通信
最后怎么一句话记住?
EtherCAT 报文外面像普通网包,里面却是多个从站沿途直接读写的实时数据载体;配置和诊断阶段更多看物理地址,周期 PDO 通信更多看逻辑地址;抓包时真正要盯住的是 Datagram、地址类型和 WKC。