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 | 不用 DC(帧触发): 用 DC(SYNC0 触发): |
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 之前/期间)发送一条对寄存器 0x0900 的 BWR(广播写):
- 该帧经过每个从站的每个开放端口时,ESC 硬件把”帧首到达本端口的本地时刻”锁存到接收时间戳寄存器:
0x0900端口 0、0x0904端口 1、0x0908端口 2、0x090C端口 3(各 32-bit,本地时钟);0x0918(64-bit)锁存帧经过 ECAT 处理单元的本地时刻,用于偏移计算。
- 主站随后用读命令(APRD/FPRD)把各从站的这些时间戳读回;
- 主站离线计算各段线缆+转发延迟,把每个从站的累计延迟写入
0x0928System Time Delay。
3.2 为什么”环形”可测
EtherCAT 物理上是逻辑环:帧从从站的端口 0 进入,沿”处理方向”走到线末端,再沿”转发方向”原路返回。因此同一条测量帧会经过每个端口两次方向之一,每个从站能同时拿到”去程到达时刻”和”回程到达时刻”:
1 | 主站 ──→ [从站A p0]──→[p1] ══线缆══ [从站B 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 | SystemTime(从站) = 本地时钟 + SystemTimeOffset(0x0920) |
写入 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 之差,存入0x092CSystem 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 同步参数) 描述与配置::01Sync Type(见下表)、:02Cycle Time、:03Shift 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 | System Time 轴 → |
- 主站周期任务的唤醒相位要与 System Time 对齐(主站时钟先对齐参考时钟,或按读回的
ec_DCtime做相位闭环); - 发帧时刻 + 最坏传播/处理延迟 + 抖动 < SYNC0 时刻,不足则配置 Shift Time(
0x1C32:03或把0x0990起始时间整体平移)把 SYNC0 相对”帧到达”后移; - 输入方向同理:若希望主站每周期读到”刚采样”的数据,需安排 SYNC0(采样)早于该周期的帧经过(TxPDO 上送)。
7.3 Sync/Latch 编程模型
主站配置 DC 的典型步骤(IgH/SOEM/TwinCAT 内部大同小异):
- 扫描拓扑,确定第一个 DC 从站为参考时钟;
- BWR
0x0900触发时间戳锁存 → 读回 → 计算并写各站0x0928(延迟)与0x0920(偏移); - 在周期帧中加入 ARMW/FRMW
0x0910持续漂移补偿,等待0x092C收敛; - 写
0x09A0/0x09A4周期、0x0990起始时间(取”当前 System Time + 若干整周期 + shift”,保证是未来时刻且全网一致),写0x0981激活 SYNC0/1; - 主站周期任务与 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
正在加载留言…