2. 数据通信基础:周期性数据(过程数据)与非周期性数据(邮箱数据)的区别
做 EtherCAT 开发这些年,我经常被问到同一个问题:
「这周期性数据和非周期性数据,到底有啥不一样?」
说实话,我刚接触 EtherCAT 时也迷糊过一阵子。那时候看协议栈源码,看到两个完全不同的数据通道,心里直犯嘀咕——为什么不能用一个通道搞定所有事?
后来踩了几个坑才明白,这两种数据的设计,恰恰是 EtherCAT 能同时做到「快」和「灵活」的关键。
2.1 先说说周期性数据(过程数据)
周期性数据,也叫过程数据(Process Data)。
说白了,就是那些每个周期都要交换一次的数据。
比如:
- 伺服驱动器的位置、速度、转矩
- 数字量输入输出的开关状态
- 模拟量采集的电压、电流值
这些数据的特点是:实时性要求极高,数据量不大,但必须准时到达。
我记得有一次调试一个六轴机器人项目,周期时间设成了 1ms。结果因为某个从站的过程数据映射配错了,导致整个网络抖动。机器人走直线都走不直,跟喝醉了似的。后来排查了半天,才发现是过程数据长度不对,导致帧结构错位。
周期性数据的核心特征:
- 每个通信周期固定交换一次
- 数据长度通常较小(几个字节到几十个字节)
- 使用 FMMU(现场总线内存管理单元)直接映射到从站内存
- 不依赖邮箱通信机制,走的是「快速通道」
2.2 再说说非周期性数据(邮箱数据)
非周期性数据,也叫邮箱数据(Mailbox Data)。
它处理的是那些不需要每个周期都传的信息。
比如:
- 从站的配置参数(比如伺服驱动器的 PID 参数)
- SDO 上传下载(对象字典的读写)
- 诊断信息和错误日志
- 固件升级的二进制数据
你想想看,如果每次改个参数都要等一个周期,那配置过程得多慢?反过来,如果每个周期都传这些大块数据,那实时性肯定受影响。
所以 EtherCAT 的设计者想了个办法:给非周期性数据单独开一条「慢车道」。
我个人习惯这样理解:
周期性数据就像高速公路上的小轿车,跑得快、不停站。
非周期性数据就像货运火车,装得多、但需要进站装卸。
两条线路互不干扰,各司其职。
2.3 两者的核心区别
我整理了一个表格,方便你对照着看:
| 对比项 | 周期性数据(过程数据) | 非周期性数据(邮箱数据) |
|---|---|---|
| 通信时机 | 每个周期固定传输 | 按需触发,不固定 |
| 数据大小 | 小(通常 ≤ 64 字节) | 大(可达几千字节) |
| 实时性 | 极高(微秒级确定性) | 较低(毫秒级,取决于总线负载) |
| 传输机制 | FMMU 直接映射 | 邮箱协议(Mailbox Protocol) |
| 典型应用 | 控制指令、状态反馈 | 参数配置、诊断、固件升级 |
| 数据通道 | 逻辑寻址/物理寻址 | 邮箱通道(独立缓冲区) |
2.4 它们是怎么共存的?
嗯,这里要注意一个关键点:两种数据是在同一个 EtherCAT 帧里传输的。
EtherCAT 主站会在每个周期构造一个数据帧。这个帧里既有过程数据区域,也有邮箱数据区域。从站收到帧后,根据数据头部的标识来判断:
- 如果是过程数据,直接通过 FMMU 映射到对应的输出/输入缓存
- 如果是邮箱数据,则交给邮箱协议栈处理
我曾经在调试一个 32 轴的运动控制项目时,遇到过邮箱数据阻塞导致过程数据抖动的情况。排查下来发现,是因为某个从站的邮箱数据量太大,占用了过多的帧空间,导致过程数据不得不拆分到多个帧里传输。
避坑指南:
我曾经在一个项目中,把固件升级的邮箱数据包设得太大,结果导致过程数据的周期时间从 1ms 跳到了 3ms。后来我学乖了:邮箱数据一定要做分片传输,并且要监控邮箱数据对总线负载的影响。
2.5 知识体系结构图
下面这张图,是我自己画的数据通信分类逻辑,你看一眼就能明白整体框架:
2.6 实际项目中的选择建议
做项目时,怎么判断该用哪种数据?我一般按这个原则来:
- 控制类数据(位置指令、使能信号)→ 必须用周期性数据
- 配置类数据(参数修改、模式切换)→ 用非周期性数据
- 诊断类数据(温度、电压、错误码)→ 如果每个周期都要看,用周期性数据;偶尔查看用非周期性数据
- 大块数据(固件、日志文件)→ 只能用非周期性数据
其实说白了,就是一句话:高频、小量、实时要求高的走过程数据;低频、大量、实时要求低的走邮箱数据。
这个原则我用了好多年,基本没出过问题。
好了,这一章的内容就到这儿。两种数据的区别搞清楚了,后面讲具体协议实现时,你就能理解为什么 EtherCAT 要设计两套完全不同的通信机制了。
公众号:蓝海资料掘金营,微信deep3321