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的数据是怎么从主站到从站的。
嗯,这张图基本把今天的内容都涵盖了。你想想看,数据帧从主站出发,带着子报文一路经过每个从站。从站根据寻址方式判断报文是不是给自己的,是就处理,不是就原样转发。处理完后,工作计数器加1,表示"我干完了"。最后帧返回主站,主站检查WKC就知道谁干了谁没干。
我个人觉得,理解了这个流程,EtherCAT就算入门了。剩下的就是各种细节——比如DC同步、分布式时钟、CoE协议这些,都是在今天这个基础上搭起来的。
一句话总结:EtherCAT用标准以太网帧做载体,通过特殊的寻址方式找到设备,用PDO跑实时数据、SDO传配置信息。记住这个框架,后面学什么都快。