03 分布式时钟(DC)与同步

03 分布式时钟(DC)与同步

规范依据:ETG.1000.4(DL 协议,DC 寄存器)、ETG.1020(协议增强)、各 ESC 手册(如 Beckhoff ET1100/ET1200、TI ESC、HMS/Microchip LAN9252 等)
本篇为知识整理,寄存器地址以 ETG/ET1100 定义为准;个别 ESC 实现细节(滤波深度上限、端口数)随芯片不同,已在文中标注。

1. 为什么需要分布式时钟

多轴机器人/机床做插补运动时,”同一时刻”必须对所有轴成立:

  • 各伺服必须在同一物理时刻锁存编码器位置(否则主站看到的多轴位置不是同一快照,动力学/耦合计算失真);
  • 各伺服必须在同一物理时刻把新的目标值作用到电流环/位置环(否则轮廓轨迹在轴间错位,表现为加工纹路、圆度误差、机械抖动)。

EtherCAT 帧是串行经过各从站的:帧到达第 1 个从站和第 100 个从站之间有传播延迟(每个 ESC 转发延迟约几百 ns + 线缆延迟约 5 ns/m)。如果从站”收到帧就动作”,各轴动作时刻天然错开数 µs~几十 µs。

DC(Distributed Clocks)的目标:让所有支持 DC 的从站共享一个 System Time(系统时间),同步精度典型 < 1 µs(实测常见 < 100 ns),从站的采样/输出不再由”帧到达”触发,而是由本地 ESC 按 System Time 产生的 SYNC0/SYNC1 硬件中断触发。

1
2
3
4
5
6
不用 DC(帧触发):                     用 DC(SYNC0 触发):
帧 ─→ 轴1 ─→ 轴2 ─→ 轴3 帧提前送达各轴缓冲区
↑动作 ↑动作 ↑动作 │
t0 t0+Δ1 t0+Δ2 SYNC0 ───┼───┬───┬─── 同一 System Time
(轴间错位 Δ = 传播延迟) ↓ ↓ ↓
轴1 轴2 轴3 同时刻动作(<1µs 偏差)

2. 参考时钟(Reference Clock)

角色 定义
参考时钟 拓扑中第一个支持 DC 的从站的本地时钟(ESC 内部 64-bit ns 计数器),作为全网 System Time 的基准
从时钟 其余支持 DC 的从站,通过偏移 + 漂移补偿对齐参考时钟
主站时钟 主站 PC/控制器自己的时钟,可选参与:既可以让主站时钟对齐参考时钟(常见),也可以反向让参考时钟跟随主站/外部时钟(如 grandmaster、ETG.1020 的 external sync)

要点:

  • 参考时钟选”第一个 DC 从站”是因为它离主站最近、帧最先到达,便于以它的时间戳为基准分发;这是约定而非协议强制,主站栈(IgH、SOEM、TwinCAT)默认如此,也允许指定其他从站。
  • System Time 的纪元定义为 2000-01-01 00:00:00,单位 ns,64-bit(低 32-bit 约 4.29 s 回绕,仅低精度设备使用 32-bit)。
  • 主站通常不是时钟基准——主站发帧存在 OS 调度抖动,让硬件 ESC 做基准更稳;主站只需保证发帧周期大致稳定,剩下交给 DC。

3. 传播延迟测量(Propagation Delay Measurement)

3.1 机制

主站在初始化阶段(通常 PREOP 之前/期间)发送一条对寄存器 0x0900BWR(广播写):

  1. 该帧经过每个从站的每个开放端口时,ESC 硬件把”帧首到达本端口的本地时刻”锁存到接收时间戳寄存器:
    • 0x0900 端口 0、0x0904 端口 1、0x0908 端口 2、0x090C 端口 3(各 32-bit,本地时钟);
    • 0x0918(64-bit)锁存帧经过 ECAT 处理单元的本地时刻,用于偏移计算。
  2. 主站随后用读命令(APRD/FPRD)把各从站的这些时间戳读回;
  3. 主站离线计算各段线缆+转发延迟,把每个从站的累计延迟写入 0x0928 System Time Delay

3.2 为什么”环形”可测

EtherCAT 物理上是逻辑环:帧从从站的端口 0 进入,沿”处理方向”走到线末端,再沿”转发方向”原路返回。因此同一条测量帧会经过每个端口两次方向之一,每个从站能同时拿到”去程到达时刻”和”回程到达时刻”:

1
2
3
4
主站 ──→ [从站A p0]──→[p1] ══线缆══ [从站B p0]──→(末端回环)
↑回程 ←────────────────── ←──┘
A 的时间戳: t_A0 (p0 去程), t_A1 (p1 回程)
B 的时间戳: t_B0 (p0 去程=回环点)

对从站 A:t_A1 − t_A0 = 帧走完 A 下游整段并返回的往返时间(用 A 自己的钟测,不需要 A/B 时钟同步——这是关键)。逐级相减即可剥出每段延迟,线性拓扑下相邻两站间延迟:

[
d_{A\to B} \approx \frac{(t_{A1}-t_{A0}) - (t_{B1}-t_{B0})}{2}
]

(末端从站只有单端口开放时 t_B1−t_B0 取 0 或 ESC 内部环回延迟;公式假设线缆上下行对称,EtherCAT 100BASE-TX 全双工满足此假设。)

每个往返时间都是单个从站自己的时钟差值,晶振频偏只造成 ppm 级误差,所以延迟测量可以在时钟尚未同步时进行。主站通常多次测量取平均以压制抖动。


4. 偏移补偿与漂移补偿

DC 对齐分两步:先一次性搬走”大偏差”(offset),再持续伺服”晶振频差”(drift)。

4.1 偏移补偿(System Time Offset, 0x0920

每个 ESC 的本地时钟从上电起自由计数,彼此初值毫无关系(可能差几分钟)。主站利用延迟测量帧中读到的 0x0918(各站看到同一帧的本地时刻)计算:

1
2
3
SystemTime(从站) = 本地时钟 + SystemTimeOffset(0x0920)
目标: SystemTime(从站) ≈ SystemTime(参考时钟)
主站写入: 0x0920 ← t_ref(帧经过参考站时刻) − t_local(帧经过本站时刻) + 累计传播延迟

写入 0x0920 后各站的 System Time 已粗对齐(残差 = 测量误差 + 写入期间的漂移)。

4.2 漂移补偿(持续分发 + 时间控制环)

晶振有 ±20~100 ppm 频差,粗对齐后每秒仍会漂移几十 µs,必须持续伺服。主站在周期性过程数据帧里(或独立帧)加入一条 ARMW 或 FRMW 命令,地址指向参考从站的 0x0910(System Time,64-bit)

  • ARMW/FRMW(Read Multiple Write)语义:帧到达被寻址的从站(参考时钟)时读出其 System Time 放入数据区;帧经过其余所有从站时把该值写入它们的 0x0910 比较逻辑。
  • 每个从时钟 ESC 硬件计算 接收到的参考时间 + 本站 0x0928 延迟 与本站 System Time 之差,存入 0x092C System Time Difference,并驱动内部时间控制环:微调本地计数器步进速率(加/减计数),把差值收敛到 0。

相关调节/滤波寄存器(ET1100 定义):

寄存器 名称 作用
0x0930 Speed Counter Start 时间控制环的调速力度(带宽),复位后需主站写一次以启动漂移补偿
0x0932 Speed Counter Diff 当前调速偏差(只读,调试用)
0x0934 System Time Difference Filter Depth 对时差样本的平均滤波深度
0x0935 Speed Counter Filter Depth 对调速量的滤波深度
0x092C System Time Difference 当前本站与参考时钟差(bit31 为符号,监控同步质量就读它)

运维要点:主站可周期性 BRD 读 0x092C,所有从站的差值绝对值持续 < 1 µs(常见 < 100 ns)即认为 DC 收敛。IgH/SOEM 都提供了对应接口(如 SOEM 的 ec_DCtime、IgH 的 ecrt_master_sync_slave_clocks())。


5. SYNC0 / SYNC1 信号

同步时钟只是手段,SYNC 脉冲才是真正驱动应用的东西。ESC 内部有一个由 System Time 驱动的脉冲发生单元:

寄存器 作用
0x0980 Cyclic Unit Control(SYNC/latch 单元归主站还是本地 µC 控制)
0x0981 Activation:使能 SYNC0/SYNC1 输出、单次/循环模式
0x0990(64-bit) Start Time:第一个 SYNC0 脉冲的 System Time(”首周期对齐”就靠它)
0x09A0 SYNC0 Cycle Time(ns),如 1 000 000 = 1 ms
0x09A4 SYNC1 Cycle Time(相对 SYNC0 的偏移/周期,具体语义见 ESC 手册)
0x0984 脉冲宽度(Pulse Length)

要点:

  • SYNC0 是 ESC 硬件产生的中断脉冲,接到从站本地 µC/FPGA/驱动控制器的中断脚——精度由硬件保证,与帧到达时刻解耦。
  • 所有从站配置相同的 SYNC0 周期和经过对齐的 Start Time,于是全网 SYNC0 沿在 System Time 轴上重合 → 各站同时刻动作。
  • 伺服的典型用法:在 SYNC0 上升沿锁存编码器位置(采样一致性)、并把上个周期收到的目标值切换进控制环(输出一致性);SYNC1 常用于给应用一个相对 SYNC0 延后的第二事件(如”SYNC0 采样、SYNC1 上送”或 ADC 转换完成时刻),是否支持及语义由从站定义。
  • 从站应用侧的同步行为通过 CoE 对象 0x1C32(输出/RxPDO 同步参数)/0x1C33(输入/TxPDO 同步参数) 描述与配置::01 Sync Type(见下表)、:02 Cycle Time、:03 Shift Time 等。

6. 三种同步模式对比

Free Run SM-Synchronous DC-Synchronous
触发源 从站本地定时器,与总线无关 SM2/SM3 事件(过程数据帧到达时刻) SYNC0/SYNC1 硬件中断(System Time)
0x1C32:01 Sync Type 0 1 2(SYNC0)/ 3(SYNC1)
轴间一致性 受帧传播延迟影响(轴间错位 µs 级)且吃主站发帧抖动 < 1 µs,与帧到达时刻解耦
对主站抖动的容忍 无要求 抖动直接进入从站动作时刻 只需帧”按时到达缓冲区”,抖动被 SYNC0 吸收
硬件要求 ESC 即可 ESC 支持 DC + 从站应用接 SYNC 中断
典型场景 IO 采集、无实时性要求 单轴/低要求运动、简单 IO 同步 多轴插补、CSP/CSV/CST 伺服、分布式采样

7. 主站侧要求

DC 把从站侧的抖动问题解决了,但对主站提出了新要求:

7.1 周期发帧与抖动控制

  • 主站必须以固定周期(如 1 ms)发送过程数据帧,抖动应远小于周期(经验值:< 周期的 10%,越小裕量越充足)。
  • Linux 下通常组合:PREEMPT_RT 内核 + 实时线程(SCHED_FIFO)+ clock_nanosleep(TIMER_ABSTIME) 绝对时间唤醒 + CPU 隔离/中断绑核;网卡侧避免中断合并(coalescing)带来的收帧延迟。

7.2 发帧时机必须领先 SYNC0

DC 模式下的时序约束:目标数据必须在 SYNC0 沿之前已经写入从站的 SM 缓冲区,否则从站在 SYNC0 时刻拿到的是旧数据(或直接报同步错误):

1
2
3
4
5
System Time 轴 →
──┬────────────────────────┬────────────────────────┬──
SYNC0(n) SYNC0(n+1) SYNC0(n+2)
│←— shift/裕量 —→│
主站发帧 ──传播──→ 数据落入各从站 SM 缓冲 ✓(必须早于 SYNC0(n+1))
  • 主站周期任务的唤醒相位要与 System Time 对齐(主站时钟先对齐参考时钟,或按读回的 ec_DCtime 做相位闭环);
  • 发帧时刻 + 最坏传播/处理延迟 + 抖动 < SYNC0 时刻,不足则配置 Shift Time0x1C32:03 或把 0x0990 起始时间整体平移)把 SYNC0 相对”帧到达”后移;
  • 输入方向同理:若希望主站每周期读到”刚采样”的数据,需安排 SYNC0(采样)早于该周期的帧经过(TxPDO 上送)。

7.3 Sync/Latch 编程模型

主站配置 DC 的典型步骤(IgH/SOEM/TwinCAT 内部大同小异):

  1. 扫描拓扑,确定第一个 DC 从站为参考时钟;
  2. BWR 0x0900 触发时间戳锁存 → 读回 → 计算并写各站 0x0928(延迟)与 0x0920(偏移);
  3. 在周期帧中加入 ARMW/FRMW 0x0910 持续漂移补偿,等待 0x092C 收敛;
  4. 0x09A0/0x09A4 周期、0x0990 起始时间(取”当前 System Time + 若干整周期 + shift”,保证是未来时刻且全网一致),写 0x0981 激活 SYNC0/1;
  5. 主站周期任务与 System Time 相位锁定,进入 OP。

另外 ESC 还提供 Latch0/Latch1 输入(0x09A8 控制、0x09B0 起时间戳寄存器):外部信号沿触发时锁存 System Time,用于探针功能(touch probe,对应 CiA 402 的 0x60B8~`0x60BD`)、外部事件打时间戳。


8. 常见 DC 问题排查

现象 可能原因 查什么 / 怎么办
从站拒绝进 OP,AL Status Code 0x001A(Synchronization Error) 主站发帧抖动过大 / 帧频繁迟到,从站连续在 SYNC0 时刻没等到新数据 主站实时性(cyclictest 量化抖动)、网卡中断合并、周期任务相位;看从站 0x092C 是否收敛
AL Code 0x0030~`0x0036`(Invalid DC SYNC config / PLL Error / Sync Timeout / Invalid Cycle Time 等) SYNC0 周期与 0x1C32:02 不一致、周期超出从站支持范围、激活顺序错误 核对 ESI 中支持的周期;先写周期与起始时间再写 0x0981 激活
各轴动作仍有固定错位 Shift Time 配置不当,或部分从站落在 SM-Sync 模式 读各站 0x1C32:01 确认 Sync Type=2;统一 shift 策略
首周期丢步/报错,之后正常 0x0990 Start Time 写成了过去时刻,或各站起始时间未对齐到同一 System Time 栅格 Start Time = 当前 System Time 向上取整到周期边界 + ≥2 个周期裕量
同步精度差(0x092C 抖动大) 漂移补偿帧频率过低、0x0930 未写(补偿环未启动)、滤波深度不合适 每周期都带 ARMW/FRMW;检查 0x0930/0x0934/0x0935
热插拔/换线后错位 拓扑变化后传播延迟未重测 重新执行延迟测量并更新 0x0928
长时间运行后主站与总线相位漂移 主站只做了初始对齐、未持续锁相 主站周期任务对 ec_DCtime(参考时钟时间)做 PI 相位闭环

下一篇:04-CiA402伺服控制.md

文章互动

阅读 --

留言

0 条留言

正在加载留言…