1. 同步模式是什么:数据"什么时候用"
上一篇文章解决了数据怎么从帧到内存(FMMU)、怎么交接给应用(SM)。但还有一个问题:MCU 什么时候取数据、取完什么时候发反馈?——这决定了一台伺服从站的"节拍"跟谁走。EtherCAT 从站有三种主流同步模式,本质是三种"时钟源":
| 模式 | 节拍来自 | 抖动 | 典型场景 |
|---|---|---|---|
| Free-Run | MCU 自己的定时器(应用周期) | 与主站无关(几十 μs ~ ms 自定) | IO 从站、测试、非联动 |
| SM 同步 | SM2 新数据事件(帧到达) | 主站帧间隔抖动 + 链路(μs 级) | 中等精度、单从站控制 |
| DC 同步 | Sync0 中断(全网统一绝对时间) | ns~亚 μs 级 | 多轴联动、伺服轨迹——必选 |
选错同步模式,轻则数据"晚一周期",重则多轴不同步、轨迹走形。精度差一个数量级,代价差一个数量级——这是本篇文章的核心结论。
2. Free-Run:应用自定周期
MCU 按自己的定时器周期(如 1ms)跑应用循环:到点就检查 SM 有没有新数据,有则取用,没有则用旧值。特点:
- 实现最简单:不需要 DC 配置、不需要等帧;主站周期和应用周期可以不一样;
- 缺点:应用节拍与主站不同步,数据可能"晚到一拍"或重复用旧值;多个从站之间完全没有对齐关系;
- 适用:数字量 IO、传感器、诊断类从站——数据时效性要求不高。
Free-Run 本质上不是"同步",而是"各自跑、数据凑合"。任何需要轴与轴配合的场景都不该用它。
3. SM 同步:以帧到达为节拍
SM 同步让 MCU 的消费动作跟着 SM2 的新数据事件走:主站每周期发帧 → ESC 写 SM2 → SM 事件/中断 → MCU 立即取数据执行。节拍就是主站的通信周期(如 1ms / 250μs):
- 优点:数据一定是最新一帧,无"晚一拍";不需要 DC 硬件能力;
- 抖动来源:主站帧发送的 jitter(软件主站尤其明显)、网络转发延时变化、从站 PHY/ESC 处理时间差异——总抖动典型 μs 级;
- 适用:单从站闭环、或对轴间同步要求不苛刻的场合。
注意 SM 同步的"同一时刻"是相对的:两个从站各自在自己收到帧时动作,收到的时刻差 = 帧在主站到各自从站的传播差——同一个"帧到"事件,不同从站感受的时间点天然不同,这就是它做不了精密多轴同步的原因。
4. DC 同步:全网统一时钟 + Sync0
DC(Distributed Clocks,分布式时钟)让全网从站共享一个统一的绝对时间,再按这个时间在指定时刻同时触发应用(Sync0 中断)。机制分三步:
| 步骤 | 干什么 | 谁做 |
|---|---|---|
| 1. 时钟基准 | 选定一个从站(或主站)时钟为参考时钟,全网以它为准 | 主站配置 |
| 2. 漂移补偿 | 每个从站测量自己时钟与参考时钟的偏差(延时 + 漂移),周期校正本地时钟 | ESC DC 单元 + 主站同步报文 |
| 3. Sync0 触发 | 本地时钟对齐后,各从站在同一个绝对时间点产生 Sync0 中断 → 应用同时取数执行 | ESC 硬件 |
同步误差 = 漂移补偿残差 + 传播延时误差 < 1 μs(典型数十 ns)
对比:SM 同步的帧到达差是 μs~几十 μs 量级——DC 直接把它压掉两个数量级
5. 三种模式横向对比
| 维度 | Free-Run | SM 同步 | DC 同步 |
|---|---|---|---|
| 节拍来源 | MCU 定时器 | SM2 帧事件 | Sync0 中断 |
| 轴间同步 | 无 | 相对(帧传播差) | 绝对(统一时钟) |
| 典型抖动 | — | μs 级 | ns~亚 μs |
| 需要 DC 能力 | 否 | 否 | 是(EEPROM F8 声明) |
| 配置复杂度 | 最低 | 中 | 高(Sync0/相移/补偿) |
| 典型场景 | IO / 测试 | 单轴、简单闭环 | 多轴联动、CNC、机器人 |
6. DC 细节:参考时钟、漂移补偿与 Sync0 参数
- 参考时钟:通常选链路第一从站(0 号从站)或主站。其余从站通过测量"系统时间传播延时"与"时钟偏差"两个量来对齐本地时钟,这个过程在 OP 前自动完成、运行中持续校正;
- 漂移补偿:石英晶振各有 ±ppm 级频率误差(如 ±100ppm = 1s 差 100μs),不补偿 1 秒就漂出 μs 级——补偿环路持续测量并微调本地时钟分频,误差被压到 ns 级;
- Sync0 周期:应用触发周期,一般 = 通信周期(1ms/500μs/250μs 等);
- 相移(Shift Time):Sync0 在周期内的偏移,用来把触发时刻挪到"数据已就位"之后——比如帧在周期 t0 到达、应用在 t0+相移 触发,保证用的是最新一帧。
通信周期 500μs · Sync0 周期 500μs · 相移 20μs:帧在每周期开头到达(数据写入 SM2),20μs 后所有从站同时触发 FOC 电流环,读取的是刚到达的目标值——轴间启动误差 <1μs。
7. 同步单元(Sync Unit):多个 SM 共享一个节拍
一个从站可能有多个过程数据通道(如一个轴 + 一个 IO 扩展)。同步单元把一个或多个 SM 绑定到同一个 Sync0 触发上:
- 同步单元 0:SM2(输出 PDO)→ Sync0 触发读入;
- 同步单元 1:SM3(输入 PDO)→ Sync0 触发前写入(反馈数据在触发前准备好,下一帧取走)。
同步单元的意义:保证同一从站内所有通道在同一时刻消费/生产,避免"位置环用了新数据、速度环还在用旧数据"的混乱。
8. 多轴为什么必须 DC:轨迹同步的物理基础
两台伺服从站各跑各的 SM 同步,启动时刻差 = 帧传播差 + 各自处理抖动,典型 μs~几十 μs。对 CNC/机器人,插补周期 1ms 内位置指令是连续曲线,μs 级启动差会让两轴实际到达位置差出"每周期 0.1%~1% 的插补步长"——高速时就是轨迹误差,甚至轮廓畸变。DC 把启动差压到 <1μs,等效插补误差被压两个数量级,轮廓精度才谈得上。DC 不是"更高级的选项",而是多轴轨迹控制的硬前提——这也解释了为什么伺服/机器人从站的 ESI 里 DC 能力是标配。
9. 交互演示:DC 时钟漂移补偿收敛
三个从站的晶振漂移各不相同。关闭补偿,时钟误差随时间线性发散(μs → ms);打开补偿,误差被周期校正压回亚 μs 级:
观察要点:
- 补偿关:误差 = 漂移率 × 时间,线性发散——+100ppm 10s 后差 1ms,两轴早偏了;
- 补偿开:误差被周期校正收敛,稳态只剩亚 μs 级残余振荡——这就是 DC"ns 级同步"的来源;
- 拖动漂移率:漂移越大,补偿开时的残余振荡略升但仍在 μs 以下;补偿关的发散斜率线性变陡。
10. 工程避坑清单
| 坑 | 现象 | 对策 |
|---|---|---|
| DC 从站配成 SM 同步 | 多轴轻微不同步、高速轨迹走形 | 多轴/伺服一律 DC;用 Sync0 周期 = 通信周期 + 相移留出数据就位时间 |
| Sync0 周期 ≠ 通信周期 | 数据"隔帧使用"、控制周期混乱 | 保持一致;需要慢周期就整数倍(2×/4×)且保证数据最新 |
| 相移设太小 | 触发时数据还没写进 SM2,用旧值 | 相移 > 帧到达+ESC处理时间;实测后留 10~50% 裕量 |
| Free-Run 跑伺服 | 轴自转抖动、跟随误差大 | 换 SM/DC;Free-Run 只留给 IO 类 |
| EEPROM F8 没声明 DC | 主站不给 DC 配置、同步失败 | SII 里 DC 能力位必须如实声明(见 EEPROM 详解篇) |
| 补偿未建立就进 OP | 前几周期同步误差大 | SafeOp 阶段留足时钟同步建立窗口,进 OP 前检查 DC 状态寄存器 |
| 抖动归因错位 | 以为是网络抖动,实际是主站软件 jitter | 用示波器量 Sync0 引脚实测;软件主站优先配 DC |
一句话收尾:Free-Run 是"各跑各的",SM 同步是"跟着帧走",DC 是"全网一个钟"——轴数越多、速度越快,越要往 DC 靠;同步模式选对了,EtherCAT 的实时性才真正兑现。