跳到主要内容

DC 同步

从站级 DC(分布式时钟)配置。所有 DC 属性和方法直接通过 slave.* 访问。

推荐使用主站级方法

大多数场景建议使用 master.ConfigureDC() 一次性配置所有 DC 从站。 从站级方法适用于需要对个别从站设置不同参数的场景。两者都默认自动计算偏移。

只读属性

类别属性类型访问说明
DC 状态HasDCbool只读是否支持 DC
DCActivebyte只读DC 激活状态(0=禁用, 非0=已激活)
DC 时间DCCycle0int只读当前 SYNC0 周期(纳秒)
DCCycle1int只读当前 SYNC1 周期(纳秒)
DCShiftint只读当前相位偏移(纳秒)
PropagationDelayint只读帧从主站到达此从站的传播延迟(纳秒)
DC 拓扑DCNext / DCPreviousushort只读DC 链中下一个/上一个从站索引
DCParentPortint只读DC 父端口号
DCReceiveTimeA/B/C/Dint只读各端口接收时间(纳秒)

配置方法

ConfigureDC(uint sync0CycleNs, uint sync1CycleNs = 0, int? shiftNs = null)

public void ConfigureDC(uint sync0CycleNs, uint sync1CycleNs = 0, int? shiftNs = null)

一次性配置从站 DC 同步。所有参数单位:纳秒(ns)

参数:

  • sync0CycleNs (uint) — SYNC0 周期(纳秒),0 表示禁用
  • sync1CycleNs (uint) — SYNC1 增量时间(纳秒),0 表示仅 SYNC0
  • shiftNs (int?) — 相位偏移(纳秒):null=自动计算(默认),0=不设置偏移,其他值=手动偏移

示例:

slave.ConfigureDC(1_000_000);              // SYNC0 = 1ms
slave.ConfigureDC(1_000_000, shiftNs: 0); // SYNC0 = 1ms, 不设置偏移

DisableDC()

public void DisableDC()

禁用此从站的 DC 同步。

同步窗口诊断

GetSyncWindowStatus()

public SyncWindowStatus? GetSyncWindowStatus()

获取从站 DC 同步窗口的详细状态。不支持 DC 或读取失败时返回 null

返回值:

  • SyncWindowStatus? — 同步窗口状态

相关结构:

public struct SyncWindowStatus
{
public int DiffNs; // 当前时间差(纳秒)
public int MaxDiffNs; // 最大时间差(纳秒)
public int MinDiffNs; // 最小时间差(纳秒)
public bool InSync; // 是否在同步窗口内
public uint OutOfSyncCount; // 超出同步窗口次数
}
便捷属性

如果只需要 InSyncSyncTimeDifference,可通过 slave.Diagnostics.DC 访问,详见 从站诊断GetSyncWindowStatus() 适合需要完整统计信息的场景。

ResetSyncWindowStats()

public void ResetSyncWindowStats()

重置此从站的同步窗口统计(最大/最小时间差、超出同步次数等)。

完整示例

var slave = master.Slaves[0];

if (slave.HasDC)
{
slave.ConfigureDC(1_000_000); // SYNC0 = 1ms

Console.WriteLine($"DCActive={slave.DCActive}, DCCycle0={slave.DCCycle0}ns, DCShift={slave.DCShift}ns");

// 同步窗口详细状态
var status = slave.GetSyncWindowStatus();
if (status.HasValue)
{
Console.WriteLine($"同步差={status.Value.DiffNs}ns, 同步={status.Value.InSync}");
}

slave.DisableDC();
}