4. 分布式时钟寄存器与ESC硬件基础

分布式时钟(Distributed Clocks,DC)之所以能在 EtherCAT 网络中实现亚微秒级同步,根本原因在于每个从站控制器(ESC)内部都有一套由硬件直接维护的时间寄存器组。这套寄存器位于 ESC 地址空间的 0x0900~0x09FF 区间,共 256 字节,是主站读写时间信息、计算偏移与漂移、下发同步补偿的唯一硬件入口。理解这组寄存器的字段含义、更新时机与读写规则,是后续所有 DC 调优工作的前提——如果连"系统时间从哪来、接收时间在什么时刻被锁存、漂移系数如何影响补偿量"都不清楚,调参就只能靠试错。

0x0900~0x09FF 寄存器组总览

这 256 字节并非全部用于 DC,而是按功能划分为若干连续字段。工程上最常打交道的核心字段如下表所示(地址为字节偏移,均为 ESC 内部地址):

地址长度字段读写作用
0x09008 B系统时间 System TimeR/W本地时钟当前值,64 位,单位 ns
0x09084 B接收时间寄存器 Receive TimeR锁存本端口收到帧的本地时刻(低 32 位)
0x090C4 B系统时间偏移 System Time OffsetR/W对系统时间的静态修正量,单位 ns
0x09104 B系统时间延迟 System Time DelayR/W测量得到的传输延迟补偿值,单位 ns
0x09142 B系统时间差 System Time DiffR相邻从站系统时间之差(低 16 位)
0x09184 B漂移系数 Speed Count StartR/W漂移补偿的起始计数值
0x09204 B系统时间循环周期R/WSYNC0 周期,单位 ns
0x09244 BSYNC0 脉冲长度R/WSYNC0 信号有效宽度,单位 ns
0x09284 BSYNC1 循环周期R/WSYNC1 周期,单位 ns
0x09801 BDC 激活寄存器R/W使能 64 位系统时间与 SYNC 输出
0x09811 BDC 激活状态R反映 DC 是否已生效
0x09821 BDC 系统时间有效R系统时间是否已稳定可用
0x098E1 BDC 连续锁存R/W控制接收时间是否连续锁存

需要强调:不同厂商 ESC(如 ET1100、ET1200、LAN9252、AX58100)在 0x0900 区间的字段布局基本遵循 ETG.1000 规范,但个别扩展字段和保留位存在差异。调优前应查阅对应 ESC 数据手册,确认字段偏移与位定义,不能仅凭通用规范盲目写入。

系统时间:64 位纳秒计数器

系统时间(0x0900,8 字节)是 DC 的"心脏"。它是一个 64 位无符号计数器,单位纳秒,由 ESC 内部时钟驱动递增。64 位纳秒的理论回绕周期约为 584 年,工程上可视为永不溢出。主站通过读取该值获得从站本地时间,通过写入该值实现时间对齐。

系统时间的实际输出并非直接来自计数器,而是经过两级修正:

系统时间 = 本地计数器 + 系统时间偏移(0x090C) + 系统时间延迟(0x0910)

其中偏移量用于一次性对齐(例如把从站时间直接拉到参考时间),延迟量用于补偿物理传输时延。两者都是 32 位有符号数,单位 ns。理解这个叠加关系非常关键:当你在调试中发现"写入系统时间后读数仍不对",往往是因为偏移或延迟字段残留了旧值,导致写入被叠加修正抵消。

接收时间与发送时间:帧经过的硬件时间戳

接收时间寄存器(0x0908)记录的是本从站端口收到 EtherCAT 帧那一刻的本地系统时间低 32 位。它的更新由硬件在帧到达的物理时刻自动完成,不依赖软件干预,因此精度远高于软件打时间戳。发送时间则记录帧从本端口发出的时刻,通常与接收时间配合,用于计算链路往返延迟。

在 DC 初始化阶段,主站会依次读取各从站的接收时间,利用相邻从站接收时间之差推算链路延迟。这里有一个容易踩的坑:接收时间寄存器默认只在特定条件下锁存,若未正确配置 0x098E(连续锁存控制),读到的可能是上一次的陈旧值。因此标准流程中,主站会先写 0x098E 使能连续锁存,再发起测量帧。

偏移量与漂移系数:静态对齐与动态跟踪

偏移量(0x090C)解决的是"初始时刻差多少",漂移系数解决的是"随着时间推移差多少"。两者性质完全不同:

  • 偏移量:一次性静态修正。主站计算出参考时间与本地时间之差,写入 0x090C,从站系统时间立即跳变到目标值。适合初始化对齐。
  • 漂移系数:动态速率修正。由于各从站晶振频率存在 ppm 级差异,即使初始对齐,运行一段时间后仍会缓慢发散。漂移系数通过微调本地计数器的递增速率,使从站时间"走快一点"或"走慢一点",持续跟踪参考时钟。

漂移补偿的实现依赖 0x0918(Speed Count Start)等字段。ESC 内部有一个可编程的分频/补偿机制:在固定的参考周期内,根据漂移系数决定是否额外插入或跳过若干个时钟脉冲,从而改变计数速率。漂移系数的量纲与晶振频率、补偿周期相关,典型配置下每单位对应约 1 ns/s 量级的速率调整。实际写入值需要根据实测漂移率计算,不能随意设定。

漂移系数的符号方向必须与参考系一致:若定义"从站时间落后于参考时间",则正漂移系数应使从站走快。不同 ESC 对符号的定义可能相反,切换参考系时必须在文档中明确标注,否则会出现"越补越偏"的现象。

寄存器读写时序与硬件约束

0x0900 区间的读写并非普通内存访问,而是通过 EtherCAT 过程数据或邮箱通道完成的。关键约束有三点:

  1. 64 位系统时间必须整体读写。若分两次读高低 32 位,中间可能发生进位,导致拼接结果错误。规范要求使用 64 位原子访问,或先读高 32 位、再读低 32 位、再读高 32 位校验。
  2. 写入系统时间前应先停止 DC 或进入安全状态。运行中直接改写系统时间会造成 SYNC 脉冲错乱,可能触发从站看门狗。
  3. 偏移与延迟字段的写入顺序:通常先写延迟(测量值),再写偏移(对齐值),最后使能 DC。顺序颠倒会导致中间态时间跳变。

下面这张图展示了 0x0900 寄存器组内部各字段之间的数据流与修正关系,帮助建立"本地计数器 → 偏移/延迟修正 → 系统时间输出 → SYNC 脉冲"的完整链路认知:

0x0900~0x09FF 寄存器组数据流与修正链路 本地晶振计数器 64 位 ns 递增 漂移系数 0x0918 速率修正 系统时间偏移 0x090C 静态对齐 系统时间延迟 0x0910 传输补偿 修正叠加 计数器 + 偏移 + 延迟 速率受漂移系数调制 系统时间 0x0900 64 位 ns 输出 供主站读取与对齐 SYNC0 / SYNC1 脉冲 0x0920 / 0x0928 周期 接收时间 0x0908 帧到达硬件锁存 速率调制 静态修正 延迟补偿 合成 触发 延迟测量

调优中的典型参数与判断依据

在实际调优中,以下几个量是必须观察和判断的:

  • 系统时间差(0x0914):反映相邻从站时间偏差。若该值持续增大,说明漂移补偿不足或晶振差异过大。典型健康值应稳定在几十纳秒以内。
  • DC 激活状态(0x0981):写入 0x0980 后应回读确认该位为 1,否则 DC 未真正生效,后续所有同步都无意义。
  • 系统时间有效位(0x0982):表示系统时间是否已稳定。在刚使能 DC 后该位可能短暂为 0,需等待其置位后再进行对齐操作。
  • 漂移系数收敛性:连续多次读取系统时间差,若差值在补偿后逐渐收敛到零附近,说明漂移系数方向与量级正确;若发散,则符号或量级有误。
切勿在 DC 运行过程中随意改写 0x0900 系统时间。若必须调整,应先通过 0x0980 关闭 DC,写入后再重新使能,并重新执行延迟测量与偏移对齐。跳过此流程可能导致从站 SYNC 脉冲丢失,进而触发分布式时钟看门狗,表现为从站报错或进入安全状态。

总结来看,0x0900~0x09FF 寄存器组是 DC 同步的硬件基石:系统时间提供统一时基,接收/发送时间提供链路延迟测量依据,偏移量完成静态对齐,漂移系数实现动态跟踪。调优的本质,就是围绕这几个字段反复测量、计算、写入、验证,使各从站系统时间差收敛到工艺允许的窗口内。下一阶段将进入具体的偏移计算与漂移系数整定方法。