4. 分布式时钟寄存器详解

EtherCAT 分布式时钟(DC)的调试,本质上是对从站 ESC 内部一组寄存器的读写与观察。这些寄存器分布在 ESC 地址空间 0x0900~0x09FF 区间,构成了 DC 的“控制面板”。理解每个寄存器的含义、访问方式与相互依赖关系,是定位时钟不同步、抖动过大、同步丢失等问题的前提。本节将围绕时间寄存器、系统时间偏移、传播延迟、时钟控制与状态寄存器四组核心对象展开,并给出可落地的读写与判读方法。

一、核心原理:四组寄存器如何协同工作

DC 的同步过程可以概括为“测量—补偿—锁定”三步。系统时间寄存器(0x0910)保存本地时钟的 64 位纳秒计数;系统时间偏移寄存器(0x0920)用于写入参考时钟与本地时钟的差值;传播延迟寄存器(0x0928)记录帧在链路上往返的延时;时钟控制与状态寄存器(0x0980/0x0984)则负责启动同步、选择参考时钟并反馈锁定状态。四者关系如下:

  • 时间寄存器:提供“现在几点”的原始读数,是所有比较与补偿的基准。
  • 系统时间偏移:把本地时间“平移”到参考时钟时间轴,是同步精度的直接来源。
  • 传播延迟:补偿物理链路与转发带来的固定延时,决定偏移计算是否准确。
  • 控制与状态:决定谁当参考时钟、何时启动、当前是否已锁定。
DC 寄存器协同:测量 → 补偿 → 锁定 系统时间寄存器 0x0910 (64bit) 本地纳秒计数 只读 / 可写初值 系统时间偏移 0x0920 (64bit) 参考时钟 − 本地时钟 读写 / 同步核心 传播延迟 0x0928 (32bit) 链路往返延时 只读 / 测量结果 时钟控制与状态寄存器 0x0980 控制 / 0x0984 状态 启动同步 · 选择参考时钟 · 锁定反馈 SYNC0/SYNC1 周期与相位 测量阶段 读时间 + 测延迟 锁定阶段 状态位确认同步

二、时间寄存器与系统时间偏移的读写方法

系统时间寄存器 0x0910 为 64 位,低 32 位在 0x0910,高 32 位在 0x0914。读取时必须先读高 32 位、再读低 32 位,避免进位导致的时间跳变。系统时间偏移 0x0920 同样是 64 位,写入时先写低 32 位、再写高 32 位,最后触发一次同步更新。典型操作如下:

# 读取从站 1 的系统时间(低/高 32 位)
ethercat reg_read -p 1 -t uint32 0x0910
ethercat reg_read -p 1 -t uint32 0x0914

# 写入系统时间偏移:先低后高
ethercat reg_write -p 1 -t uint32 0x0920 0x00000000
ethercat reg_write -p 1 -t uint32 0x0924 0x00000001

# 读取传播延迟(单位 ns)
ethercat reg_read -p 1 -t uint32 0x0928

# 查看时钟控制与状态
ethercat reg_read -p 1 -t uint32 0x0980
ethercat reg_read -p 1 -t uint32 0x0984

偏移量的计算通常由主站自动完成:主站先读取参考时钟时间,再读取目标从站时间,两者之差写入 0x0920。若手动调试,需注意偏移量是“参考 − 本地”,符号写反会导致时间轴反向漂移。

三、传播延迟与时钟控制状态寄存器

传播延迟寄存器 0x0928 记录的是测量帧从参考时钟端口出发、经目标从站返回的往返时间。该值由硬件在拓扑测量阶段自动写入,通常只读。若该值为 0 或明显偏大,说明测量未完成或链路存在异常。时钟控制寄存器 0x0980 的典型位定义如下:

寄存器 位/字段 含义 调试关注点
0x0980 bit0 启动系统时间同步 置 1 后从站开始跟随参考时钟
0x0980 bit1 选择参考时钟 仅一个从站应置位,多置位会冲突
0x0980 bit2~3 SYNC0/SYNC1 使能 与过程数据周期匹配
0x0984 bit0 时钟已锁定 为 0 表示尚未同步完成
0x0984 bit1 同步错误 为 1 需检查偏移与延迟
0x0928 32bit 传播延迟(ns) 异常大值提示链路或拓扑问题

四、案例与排障:一次同步失败的复盘

某设备上电后,从站 3 的 SYNC0 中断周期抖动达到 80 μs,远超 10 μs 要求。排查步骤:

  1. 读取 0x0984,发现 bit0=0、bit1=1,说明同步未锁定且报错。
  2. 读取 0x0928,传播延迟为 0xFFFFFFFF,明显异常,判断测量未完成。
  3. 检查 0x0980,发现 bit1 被多个从站同时置位,参考时钟选择冲突。
  4. 修正配置,仅保留从站 1 为参考时钟,重新触发拓扑测量。
  5. 再次读取 0x0928 得到约 1200 ns,0x0984 bit0=1,抖动降至 3 μs 以内。
常见误区:把 0x0920 偏移量写成“本地 − 参考”,导致时间轴反向;或在同步未锁定时就启动 SYNC0 中断,造成周期性抖动。务必先确认 0x0984 锁定位,再使能同步输出。
调试建议:每次修改 0x0980 后,间隔 100 ms 再读 0x0984,给硬件留出锁定时间;同时用示波器观察 SYNC0 引脚,与寄存器状态交叉验证。