跳到主要内容

DC 配置

什么是 DC?

DC(分布式时钟)是 EtherCAT 的硬件级时间同步机制。它让网络中所有从站共享同一个时间基准,使各从站能在完全相同的时刻执行动作。

DC 对设备的好处
  • 多轴同步运动 — 所有伺服驱动器在同一时刻更新位置指令,消除轴间抖动,轨迹插补更平滑
  • IO 同步采样 — 所有输入输出在同一时刻,主站读取时数据一致,适合高速控制和测量
  • 精确 I/O 时间戳 — 输入数据带有硬件时间戳,主站可精确知道采样发生的物理时刻
  • 确定性输出 — 输出在固定时刻生效,不受 EtherCAT 帧到达时间的抖动影响,降低系统延迟和不确定性

主站级 DC 配置。通过 master 直接调用。

相关页面

属性

类别属性类型访问说明
DC 状态HasDCbool只读网络中是否有支持 DC 的从站

方法

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

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

为所有 DC 从站配置 DC 同步。所有参数单位:纳秒(ns)。默认自动完成:

  1. 传播延迟测量 — 读取各端口接收时间并计算延迟
  2. 偏移计算 — 基于传播延迟自动计算每个从站的相位偏移
  3. DC 应用 — 写入 SYNC0/SYNC1 周期和起始时间到各从站

参数:

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

示例:

master.ConfigureDC(1_000_000);              // SYNC0 = 1ms
master.ConfigureDC(1_000_000, shiftNs: 0); // SYNC0 = 1ms, 不设置偏移
master.ConfigureDC(1_000_000, 500_000); // SYNC0 = 1ms, SYNC1 = 500µs
推荐配置

125μs 高性能配置(WDK 驱动推荐):

master.Config.LoopCycle = 125_000;    // PDO 交换周期 125μs
master.ConfigureDC(125_000); // SYNC0 = 125μs,自动计算偏移

1ms 常规配置(通用场景):

master.Config.LoopCycle = 1_000_000;  // PDO 交换周期 1ms
master.ConfigureDC(1_000_000); // SYNC0 = 1ms,自动计算偏移
要点说明
SYNC0 与 LoopCycle应保持一致或为其整数倍,数据未到达的同步没有意义
自动偏移(推荐)shiftNs 不传 / null,主站自动测量传播延迟并计算:Shift = MaxPropagationDelay - Slave.PropagationDelay
手动偏移也可设置一个较高的固定值,如 0.8 × sync0CycleNs
过采样例外Oversampling 设备中 SYNC0 < LoopCycle,从站在一个 PDO 周期内多次采样,需设备硬件和 PDO 映射专门支持
关于 SYNC1

SYNC1 是相对于 SYNC0 的增量时间。例如 SYNC0=1,000,000ns, SYNC1=500,000ns 表示 SYNC1 在每个 SYNC0 后 500µs 触发。

与从站级配置的区别
  • master.ConfigureDC() — 一次性配置所有 DC 从站
  • slave.ConfigureDC() — 配置单个从站

两者都默认自动计算偏移。仅在需要对个别从站设置不同参数时使用从站级方法。

EnableContinuousMeasurement(bool enable, uint intervalSec = 0)

public void EnableContinuousMeasurement(bool enable, uint intervalSec = 0)

启用或禁用持续传播延迟测量(ETG.1500 5.13.2)。启用后主站定期重新测量传播延迟,适用于温度漂移等导致延迟变化的场景。

参数:

  • enable (bool) — true 启用,false 禁用
  • intervalSec (uint) — 测量间隔(秒),0 表示使用默认间隔

示例:

master.EnableContinuousMeasurement(true, 60);  // 每 60 秒重新测量
master.EnableContinuousMeasurement(false); // 禁用
备注

默认情况下 DC 偏移在 ConfigureDC() 时一次性计算。仅在长时间运行且环境温度变化较大时启用此功能。

同步窗口监控

主站每秒自动检查各 DC 从站的时间偏差。当从站偏差超出 SyncWindowThreshold 阈值时触发 DCSyncLost 事件。

// 阈值:默认 1000ns,可调整
master.Diagnostics.SyncWindowThreshold = 500; // 设为 500ns

// 事件:从站从"同步"变为"失同步"时触发一次(不重复触发)
master.Events.DCSyncLost += (masterIdx, slaveIdx, diffNs) =>
Console.WriteLine($"从站 {slaveIdx} DC 同步丢失: 偏差 {diffNs}ns");

GetMaxSyncDifference()

public int GetMaxSyncDifference()

获取所有 DC 从站中的最大时间偏差(纳秒)。

返回值:

  • int — 最大时间偏差(纳秒),失败返回 -1

示例:

int maxDiff = master.GetMaxSyncDifference();
Console.WriteLine($"最大同步偏差: {maxDiff}ns");

IsAllSlavesInSync()

public bool IsAllSlavesInSync()

检查所有 DC 从站是否都在同步窗口内(偏差 ≤ SyncWindowThreshold)。

返回值:

  • bool — 所有从站同步返回 true

示例:

if (!master.IsAllSlavesInSync())
Console.WriteLine("存在从站同步偏差过大");

ResetAllSyncWindowStats()

public void ResetAllSyncWindowStats()

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

示例:

master.ResetAllSyncWindowStats();
单个从站

单个从站的同步窗口详细状态请使用 slave.GetSyncWindowStatus(),包含 DiffNs、MaxDiffNs、MinDiffNs、InSync、OutOfSyncCount。

完整示例

125μs 高性能(WDK 驱动)

var master = new DarraEtherCAT()
.SetENI(@"C:\config.xml");

var (success, message) = master.Build();
if (!success) return;

// 1. 配置周期 — 125μs(WDK 驱动推荐值)
master.Config.LoopCycle = 125_000;

// 2. 切换到 SafeOp
master.State = EcState.SafeOp;

// 3. 配置 DC(自动偏移)— SYNC0 与 LoopCycle 保持一致
if (master.HasDC)
{
master.ConfigureDC(125_000);
}

Thread.Sleep(1000);

// 4. 切换到 Op
master.State = EcState.Op;

// 监听 DC 同步丢失事件
master.Events.DCSyncLost += (masterIdx, slaveIdx, diffNs) =>
Console.WriteLine($"从站 {slaveIdx} DC 同步丢失: 偏差 {diffNs}ns");

持续测量与同步监控

// 长时间运行:启用持续传播延迟测量(温度漂移补偿)
master.EnableContinuousMeasurement(true, 60);

// 同步窗口监控
if (!master.IsAllSlavesInSync())
{
int maxDiff = master.GetMaxSyncDifference();
Console.WriteLine($"同步偏差过大: {maxDiff}ns");
}

// 重置统计
master.ResetAllSyncWindowStats();