DC 配置
什么是 DC?
DC(分布式时钟)是 EtherCAT 的硬件级时间同步机制。它让网络中所有从站共享同一个时间基准,使各从站能在完全相同的时刻执行动作。
DC 对设备的好处
- 多轴同步运动 — 所有伺服驱动器在同一时刻更新位置指令,消除轴间抖动,轨迹插补更平滑
- IO 同步采样 — 所有输入输出在同一时刻,主站读取时数据一致,适合高速控制和测量
- 精确 I/O 时间戳 — 输入数据带有硬件时间戳,主站可精确知道采样发生的物理时刻
- 确定性输出 — 输出在固定时刻生效,不受 EtherCAT 帧到达时间的抖动影响,降低系统延迟和不确定性
主站级 DC 配置。通过 master 直接调用。
相关页面
- 单个从站的 DC 配置请参见 从站 DC 同步
- 周期属性请参考 配置 - 周期配置
- DC 同步监控请参考 主站诊断 - DC 同步
属性
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| DC 状态 | HasDC | bool | 只读 | 网络中是否有支持 DC 的从站 |
方法
ConfigureDC(uint sync0CycleNs, uint sync1CycleNs = 0, int? shiftNs = null)
public void ConfigureDC(uint sync0CycleNs, uint sync1CycleNs = 0, int? shiftNs = null)
为所有 DC 从站配置 DC 同步。所有参数单位:纳秒(ns)。默认自动完成:
- 传播延迟测量 — 读取各端口接收时间并计算延迟
- 偏移计算 — 基于传播延迟自动计算每个从站的相位偏移
- DC 应用 — 写入 SYNC0/SYNC1 周期和起始时间到各从站
参数:
sync0CycleNs(uint) — SYNC0 周期(纳秒),0 表示禁用 DCsync1CycleNs(uint) — SYNC1 增量时间(纳秒),0 表示仅 SYNC0shiftNs(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();