分布式时钟同步过程:同步信号传播、时钟漂移补偿、初始偏移测量
EtherCAT 分布式时钟(DC)的核心目标,是让网络中所有从站设备共享同一个时间基准,从而在物理上分散的节点上实现微秒甚至亚微秒级的同步输出与采样。要理解这一目标如何达成,不能只停留在“同步”这个抽象概念上,而必须拆解为三个环环相扣的工程问题:同步信号如何传播、时钟漂移如何补偿、初始偏移如何测量。本节将沿着数据帧在物理链路中的实际流动路径,逐步剖析这三个过程。
3.1 同步信号传播:从主站到从站的“时间接力”
EtherCAT 的同步并不依赖独立的同步脉冲线,而是将时间信息“嵌入”在标准以太网数据帧中。主站每个周期发送的数据帧,会依次穿过每一个从站,最终由最后一个从站返回。这个“穿行”过程,就是同步信号传播的物理基础。
每个支持 DC 的从站,内部都有一个本地时钟寄存器(通常为 64 位,纳秒级分辨率)。当数据帧的前导符(前导码后的第一个字节)经过从站的物理层接收引脚时,硬件会立即捕获当前本地时钟值,并记录为接收时间戳(Receive Time Stamp)。这个动作完全由硬件完成,不经过 CPU,因此延迟是确定性的,通常只有几个纳秒的抖动。
关键点在于:数据帧在每个从站内部会产生一个转发延迟(从接收端口到发送端口),这个延迟由从站硬件决定,通常在 1 微秒以内。主站通过后续的测量过程,可以精确获知每个从站的转发延迟值,并在计算同步偏移时予以扣除。
上图展示了数据帧从主站出发,依次经过从站 1、2、3 的过程。每个从站在帧头到达时记录本地时间 T₁、T₂、T₃。这些时间戳随后通过过程数据或邮箱通信上报给主站,主站据此计算各从站与参考时钟之间的偏差。
3.2 初始偏移测量:确定“零点差”
即使所有从站的晶振频率完全一致,它们的本地时钟起始值也可能不同(例如上电时刻不同)。这个起始值的差异,称为初始偏移(Initial Offset)。测量初始偏移的过程,通常在系统启动阶段或 DC 同步使能时执行一次。
测量原理基于一个简单的数学关系:假设主站参考时钟为 Tref,从站 i 的本地时钟为 Ti,则两者关系可表示为:
T_ref = T_i + Offset_i + PropagationDelay_i
其中 PropagationDelay_i 是从主站到从站 i 的物理链路延迟(包括所有中间从站的转发延迟之和)。主站通过发送带有同步帧(ARMW 或 FRMW 命令)的报文,获取从站 i 的当前本地时间 Ti,同时记录主站本地时间 Tref。由于主站事先已经通过拓扑测量知道了 PropagationDelay_i,因此可以解出 Offset_i:
Offset_i = T_ref - T_i - PropagationDelay_i
这个 Offset_i 会被写入从站的 System Time Offset 寄存器(0x0920)。此后,从站硬件在每次捕获时间戳时,会自动将本地时钟值减去该偏移,从而得到与主站参考时钟对齐的“系统时间”。
- 主站发送 FRMW 命令读取从站 2 的本地时间寄存器(0x0910),得到 T₂_raw。
- 主站记录发送时刻的参考时钟 T_ref_send,并利用已知的链路延迟计算出帧到达从站 2 时的参考时钟 T_ref_arrive = T_ref_send + PropagationDelay₂。
- 计算偏移:Offset₂ = T_ref_arrive - T₂_raw。
- 将 Offset₂ 写入从站 2 的 0x0920 寄存器。
- 从站 2 硬件立即生效:此后其本地时间显示值 = 原始计数器值 + Offset₂。
值得注意的是,链路延迟的测量是初始偏移测量的前提。EtherCAT 规范中定义了两种测量方法:静态测量(在启动时通过发送特定报文逐个测量)和动态测量(在运行中周期性校正)。静态测量通常使用“帧往返时间”法:主站发送一个报文到从站 i,从站 i 立即返回,主站记录总往返时间,减去已知的转发延迟,即可得到主站到从站 i 的单向链路延迟。
3.3 时钟漂移补偿:持续对抗“频率差”
初始偏移解决的是“起点不同”的问题,但即使起点对齐了,由于每个从站使用的晶振频率存在微小差异(典型值为 ±100 ppm,即百万分之±100),经过一段时间后,各从站时钟会逐渐偏离参考时钟。这个累积偏差称为时钟漂移(Clock Drift)。
EtherCAT 的漂移补偿机制采用周期性的软件锁相环(PLL)方法。主站每个同步周期(例如 1 ms)执行以下步骤:
- 读取实际时间:主站通过 FRMW 命令读取每个从站的当前系统时间(已包含初始偏移校正)。
- 计算偏差:将从站时间与主站参考时间比较,得到偏差值 ΔT。
- 计算校正量:根据 ΔT 的大小和方向,计算一个时间增量值 Δt_corr。
- 写入校正寄存器:将 Δt_corr 写入从站的
System Time Offset寄存器(0x0920),从站硬件会在下一个时钟周期自动将本地时间加上该增量。
这个过程的本质是:不是去调整晶振频率,而是通过软件“微调”时间值来补偿频率差。如果从站时钟偏慢(ΔT 为正,即从站时间落后),主站就写入一个正的 Δt_corr,让从站时间跳快一点;反之亦然。
| 补偿参数 | 寄存器地址 | 说明 |
|---|---|---|
| System Time Offset | 0x0920 | 初始偏移 + 动态补偿量,硬件自动累加 |
| System Time | 0x0910 | 从站当前系统时间(读取值) |
| System Time Difference | 0x092C | 主站计算出的偏差值,用于调试 |
| Speed Counter | 0x0930 | 用于测量从站时钟频率偏差的内部计数器 |
3.4 案例:8 轴运动控制系统的同步调优
某自动化设备使用 EtherCAT 总线控制 8 个伺服轴,要求所有轴的位置采样和输出同步误差小于 1 μs。系统启动后,工程师发现同步误差达到 5 μs,且呈周期性波动。
排查过程:
- 首先检查初始偏移是否正确写入:读取每个从站的 0x0920 寄存器,发现从站 5 的偏移值为 0,说明该从站未完成初始偏移测量。
- 进一步检查链路延迟表,发现从站 5 的 PropagationDelay 被错误配置为 0(默认值),导致偏移计算错误。
- 重新执行拓扑扫描,正确测量每个从站的转发延迟和链路延迟后,更新偏移值。
- 观察漂移补偿效果:在 1 ms 同步周期下,连续运行 1 小时,记录各从站时间偏差,发现最大偏差从 5 μs 降至 0.8 μs。
# 调试日志片段(主站侧)
[DC-SYNC] Slave 5: Offset=0x000000012A5C, Drift=+23ns/cycle
[DC-SYNC] Slave 5: Offset corrected to 0x000000012A5F
[DC-SYNC] Slave 5: Sync error = 0.32 μs (OK < 1 μs)
- 误区一:认为初始偏移测量只需做一次,运行中不需要更新。实际上,温度变化会导致晶振频率漂移,因此漂移补偿必须持续运行。
- 误区二:忽略转发延迟的测量精度。如果转发延迟测量误差超过 100 ns,将直接影响同步精度。
- 误区三:在从站 CPU 中处理时间戳。正确做法是使用硬件捕获,避免软件延迟抖动。
- 误区四:补偿周期设置过长。如果补偿周期大于 10 ms,漂移累积量可能超出补偿范围,导致同步失锁。
3.5 复盘:同步过程的整体逻辑
回顾整个分布式时钟同步过程,可以归纳为三个层次:
- 物理层:数据帧穿行,硬件捕获时间戳,保证时间测量的确定性。
- 链路层:测量转发延迟和链路延迟,建立从站到主站的传播时间模型。
- 应用层:初始偏移校正 + 周期性漂移补偿,维持长期同步精度。
在实际调优中,建议按照“先测延迟、再校偏移、后调补偿”的顺序进行。使用示波器或逻辑分析仪观察 SYNC 输出信号与主站参考脉冲的相位差,可以直观验证同步效果。当所有从站的 SYNC 脉冲边沿对齐到 ±100 ns 以内时,说明分布式时钟调优已基本到位。