跳到主要内容

DC 同步

从站级 DC(分布式时钟)配置。通过 slave.DC() 访问。

推荐使用主站级方法

大多数场景建议使用 master.configureDCAll() 一次性配置所有 DC 从站。 从站级方法适用于需要对个别从站设置不同参数的场景。

只读属性

类别方法类型说明
DC 状态HasDC()boolean是否支持 DC
DCActive()intDC 激活状态(0=禁用, 非0=已激活)
DC 时间DCCycle0()int当前 SYNC0 周期(纳秒)
DCCycle1()int当前 SYNC1 周期(纳秒)
DCShift()int当前相位偏移(纳秒)
PropagationDelay()int帧从主站到达此从站的传播延迟(纳秒)
备注

DC 状态和时间属性通过 slave.*() 直接访问(如 slave.HasDC()slave.DCActive()),传播延迟通过 slave.DC().PropagationDelay() 访问。

hasDC()

public boolean hasDC()

返回 ESC 硬件 bit,表示从站 ESC 是否声明支持 DC。仅反映硬件能力,不代表当前应用层在使用 DC。

hasEsiDcSync()

public boolean hasEsiDcSync()

返回 ESI 描述文件中是否声明 DC 操作模式(OpMode AssignActivate / SYNC0 周期)。找不到匹配 ESI 时退化为 hasDC()

用途: 过滤 ESC 硬件声明支持 DC 但实际不需要 DC 同步的设备(例如 GCAN-8200 等转换网关),避免在 SafeOp→Op 阶段写入无效 SYNC0/1 寄存器引起 AL 0x002C/0x0030

典型用法:

DC dc = slave.DC();
if (dc.hasDC() && dc.hasEsiDcSync()) {
// 应用层需要为该从站配置 DC
dc.ConfigureDC(1_000_000, 0, 0);
}

配置方法

ConfigureDC(int sync0CycleNs, int sync1CycleNs, int shiftNs)

public boolean ConfigureDC(int sync0CycleNs, int sync1CycleNs, int shiftNs)

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

参数:

  • sync0CycleNs (int) -- SYNC0 周期(纳秒),0 表示禁用
  • sync1CycleNs (int) -- SYNC1 增量时间(纳秒),0 表示仅 SYNC0
  • shiftNs (int) -- 相位偏移(纳秒),0 表示自动计算

示例:

slave.DC().ConfigureDC(1_000_000, 0, 0);  // SYNC0 = 1ms

ConfigureDC(DcSyncMode mode, int sync0CycleNs, int sync1CycleNs, int shiftNs)

public boolean ConfigureDC(DcSyncMode mode, int sync0CycleNs, int sync1CycleNs, int shiftNs)

根据同步模式配置 DC(ETG.1020)。自动配置 SM 同步类型。

参数:

  • mode (DcSyncMode) -- DC 同步模式
  • sync0CycleNs (int) -- SYNC0 周期(纳秒),仅 DcSynchron 模式使用
  • sync1CycleNs (int) -- SYNC1 周期(纳秒),仅 DcSynchron 模式使用
  • shiftNs (int) -- 相位偏移(纳秒),仅 DcSynchron 模式使用

相关结构:

public enum DcSyncMode {
FreeRun(0), // 自由运行 - 不使用 DC 同步
SmSynchron(1), // SM 同步 - 使用 SM 事件触发
DcSynchron(2); // DC 同步 - 使用 SYNC0/SYNC1 信号
}

示例:

slave.DC().ConfigureDC(DcSyncMode.DcSynchron, 1_000_000, 0, 0);  // DC SYNC0 = 1ms
slave.DC().ConfigureDC(DcSyncMode.SmSynchron, 0, 0, 0); // SM 同步模式
slave.DC().ConfigureDC(DcSyncMode.FreeRun, 0, 0, 0); // 自由运行

CurrentDcSyncMode()

public DcSyncMode CurrentDcSyncMode()

获取当前 DC 同步模式。自动检测从站的同步配置。

返回值:

  • DcSyncMode -- 当前同步模式

示例:

DcSyncMode mode = slave.DC().CurrentDcSyncMode();
System.out.printf("当前 DC 同步模式: %s%n", mode);

DisableDC()

public void DisableDC()

禁用此从站的 DC 同步。

同步窗口诊断

GetSyncWindowStatus()

public SyncWindowStatus GetSyncWindowStatus()

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

返回值:

  • SyncWindowStatus -- 同步窗口状态

相关结构:

public static class SyncWindowStatus {
public int DiffNs; // 当前时间差(纳秒)
public int MaxDiffNs; // 最大时间差(纳秒)
public int MinDiffNs; // 最小时间差(纳秒)
public boolean InSync; // 是否在同步窗口内
public int OutOfSyncCount; // 超出同步窗口次数
}

示例:

DC.SyncWindowStatus status = slave.DC().GetSyncWindowStatus();
if (status != null) {
System.out.printf("同步差=%dns, 同步=%b, 最大=%dns%n",
status.DiffNs, status.InSync, status.MaxDiffNs);
}

ResetSyncWindowStats()

public void ResetSyncWindowStats()

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

完整示例

Slave slave = master.getSlave(0);

if (slave.HasDC()) {
// 查询当前同步模式
DcSyncMode currentMode = slave.DC().CurrentDcSyncMode();
System.out.printf("当前同步模式: %s%n", currentMode);

// 配置 DC 同步
slave.DC().ConfigureDC(DcSyncMode.DcSynchron, 1_000_000, 0, 0); // SYNC0 = 1ms

System.out.printf("DCActive=%d, DCCycle0=%dns, DCShift=%dns%n",
slave.DCActive(), slave.DCCycle0(), slave.DCShift());
System.out.printf("传播延迟=%dns%n", slave.DC().PropagationDelay());

// 同步窗口详细状态
DC.SyncWindowStatus status = slave.DC().GetSyncWindowStatus();
if (status != null) {
System.out.printf("同步差=%dns, 同步=%b, 最大=%dns, 最小=%dns%n",
status.DiffNs, status.InSync, status.MaxDiffNs, status.MinDiffNs);
System.out.printf("超出同步窗口次数=%d%n", status.OutOfSyncCount);
}

// 重置同步窗口统计
slave.DC().ResetSyncWindowStats();

// 切换到 SM 同步模式
// slave.DC().ConfigureDC(DcSyncMode.SmSynchron, 0, 0, 0);

// 禁用 DC
// slave.DC().DisableDC();
}