DC 同步
从站级 DC(分布式时钟)配置。所有 DC 属性和方法直接通过 slave.* 访问。
推荐使用主站级方法
大多数场景建议使用 master.ConfigureDC() 一次性配置所有 DC 从站。
从站级方法适用于需要对个别从站设置不同参数的场景。两者都默认自动计算偏移。
只读属性
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| DC 状态 | HasDC | bool | 只读 | 是否支持 DC |
DCActive | byte | 只读 | DC 激活状态(0=禁用, 非0=已激活) | |
| DC 时间 | DCCycle0 | int | 只读 | 当前 SYNC0 周期(纳秒) |
DCCycle1 | int | 只读 | 当前 SYNC1 周期(纳秒) | |
DCShift | int | 只读 | 当前相位偏移(纳秒) | |
PropagationDelay | int | 只读 | 帧从主站到达此从站的传播延迟(纳秒) | |
| DC 拓扑 | DCNext / DCPrevious | ushort | 只读 | DC 链中下一个/上一个从站索引 |
DCParentPort | int | 只读 | DC 父端口号 | |
DCReceiveTimeA/B/C/D | int | 只读 | 各端口接收时间(纳秒) |
配置方法
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 表示仅 SYNC0shiftNs(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; // 超出同步窗口次数
}
便捷属性
如果只需要 InSync 或 SyncTimeDifference,可通过 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();
}