4. 分布式时钟寄存器详解
EtherCAT 分布式时钟(DC)的调试,本质上是对从站 ESC 内部一组寄存器的读写与观察。这些寄存器分布在 ESC 地址空间 0x0900~0x09FF 区间,构成了 DC 的“控制面板”。理解每个寄存器的含义、访问方式与相互依赖关系,是定位时钟不同步、抖动过大、同步丢失等问题的前提。本节将围绕时间寄存器、系统时间偏移、传播延迟、时钟控制与状态寄存器四组核心对象展开,并给出可落地的读写与判读方法。
一、核心原理:四组寄存器如何协同工作
DC 的同步过程可以概括为“测量—补偿—锁定”三步。系统时间寄存器(0x0910)保存本地时钟的 64 位纳秒计数;系统时间偏移寄存器(0x0920)用于写入参考时钟与本地时钟的差值;传播延迟寄存器(0x0928)记录帧在链路上往返的延时;时钟控制与状态寄存器(0x0980/0x0984)则负责启动同步、选择参考时钟并反馈锁定状态。四者关系如下:
- 时间寄存器:提供“现在几点”的原始读数,是所有比较与补偿的基准。
- 系统时间偏移:把本地时间“平移”到参考时钟时间轴,是同步精度的直接来源。
- 传播延迟:补偿物理链路与转发带来的固定延时,决定偏移计算是否准确。
- 控制与状态:决定谁当参考时钟、何时启动、当前是否已锁定。
二、时间寄存器与系统时间偏移的读写方法
系统时间寄存器 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 要求。排查步骤:
- 读取 0x0984,发现 bit0=0、bit1=1,说明同步未锁定且报错。
- 读取 0x0928,传播延迟为 0xFFFFFFFF,明显异常,判断测量未完成。
- 检查 0x0980,发现 bit1 被多个从站同时置位,参考时钟选择冲突。
- 修正配置,仅保留从站 1 为参考时钟,重新触发拓扑测量。
- 再次读取 0x0928 得到约 1200 ns,0x0984 bit0=1,抖动降至 3 μs 以内。