类 DC

java.lang.Object
com.darra.ethercat.slave.DC

public class DC extends Object
DC (Distributed Clock) 从站级别配置 对齐 C# Slave/DC.cs: ConfigureDC, DisableDC, PropagationDelay, SyncWindowStatus
  • 嵌套类概要

    嵌套类
    修饰符和类型
    说明
    static enum 
    DC 同步模式 (对齐 C# DcSyncMode, ETG.1020)
    static class 
    同步窗口状态
  • 构造器概要

    构造器
    构造器
    说明
    DC(short masterIndex, short slaveIndex)
     
  • 方法概要

    修饰符和类型
    方法
    说明
    boolean
    ConfigureDC(int sync0CycleNs, int sync1CycleNs, int shiftNs)
    配置 DC 同步 (参数单位: 纳秒) 对齐 C# Slave.ConfigureDC — 成功返回 true, 失败 (底层抛异常) 返回 false.
    boolean
    按模式配置 DC (默认参数)
    boolean
    ConfigureDC(DC.DcSyncMode mode, int sync0CycleNs, int sync1CycleNs, int shiftNs)
    根据同步模式配置 DC (ETG.1020) FreeRun: 禁用 SYNC0/SYNC1 SmSynchron: 禁用 SYNC0/SYNC1, SM 同步 DcSynchron: 配置 SYNC0 信号 DcSynchron01: 配置 SYNC0 + SYNC1 信号
    获取当前 DC 同步模式 (对齐 C# CurrentDcSyncMode).
    int
    查询本从站 ESI 声明的 DC 同步模式 (对齐 C SDK esi_dll_get_device_dc_sync_mode / native EcEsi_GetDeviceDcSyncMode, 序号 1606).
    void
    禁用 DC 同步
    void
    enableContinuousMeasurement(boolean enable, int intervalSec)
    启用/禁用持续传播延迟测量 (ETG.1500 5.13.2)
    void
    enableDriftCompensation(boolean enable, int maxDriftNs, int correctionFactor)
    启用/禁用 DC 漂移补偿
    long
    主站最近一次 PDO 周期从参考时钟从站 FRMW 取回的 64-bit DC 系统时间 (纳秒).
    int
    获取所有 DC 从站中的最大同步偏差 (纳秒)
    int
    当前参考时钟从站索引 (1-based).
    获取同步窗口状态
    boolean
    从站是否启用 DC (ESC 硬件 bit, 对齐 C# Slave.HasDC).
    boolean
    ESI 是否声明此从站使用 DC 同步 (对齐 C# Slave.HasEsiDcSync / C SDK esi_dll_has_esi_dc_sync).
    boolean
    isAllSlavesInSync(int thresholdNs)
    检查所有 DC 从站是否都在同步窗口内
    int
    获取从站传播延迟 (纳秒)
    void
    重置所有从站的同步窗口统计
    void
    重置同步窗口统计

    从类继承的方法 java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 构造器详细资料

    • DC

      public DC(short masterIndex, short slaveIndex)
  • 方法详细资料

    • ConfigureDC

      public boolean ConfigureDC(int sync0CycleNs, int sync1CycleNs, int shiftNs)
      配置 DC 同步 (参数单位: 纳秒) 对齐 C# Slave.ConfigureDC — 成功返回 true, 失败 (底层抛异常) 返回 false. 注意: 底层 SetSyncBySlaveIndex 本身无返回码, 真实硬件错误需通过主站 LastError 查询.
      参数:
      sync0CycleNs - SYNC0 周期
      sync1CycleNs - SYNC1 周期, 0=禁用
      shiftNs - 相位偏移
      返回:
      true=派发成功, false=底层异常
    • DisableDC

      public void DisableDC()
      禁用 DC 同步
    • hasDC

      public boolean hasDC()
      从站是否启用 DC (ESC 硬件 bit, 对齐 C# Slave.HasDC). 与 Slave.hasDC() 同源, 此处提供 DC 命名空间下的便捷入口.
    • dcSyncModeFromEsi

      public int dcSyncModeFromEsi()
      查询本从站 ESI 声明的 DC 同步模式 (对齐 C SDK esi_dll_get_device_dc_sync_mode / native EcEsi_GetDeviceDcSyncMode, 序号 1606).

      返回值 (与 native esi_parser EsiDevice::dc_sync_mode 一致):

      • -2 = 参数非法 / 从站未绑定 ESI Device (调用方应退化为 hasDC())
      • -1 = ESI 未声明 <Dc> 节点 (从站不用 DC, 应跑 FreeRun)
      • 0 = ESI <Dc> 存在但无 OpMode → FreeRun
      • 1 = SM-Sync (启用 SM 但 AssignActivate 无 0x100)
      • 2 = DC-Sync0 (EL7041-1000 / Ezi-SERVO2 等)
      • 3 = DC-Sync01

      前提: 已 EcEsi_LoadDirectory + EcEsi_AutoMatchAll 把 ESI 绑定到从站 (测试程序 Phase3a 在进 PreOp 之后临时加载/绑定). 未绑定时返回 -2.

      返回:
      上述枚举值; native 不可用返回 -2
    • hasEsiDcSync

      public boolean hasEsiDcSync()
      ESI 是否声明此从站使用 DC 同步 (对齐 C# Slave.HasEsiDcSync / C SDK esi_dll_has_esi_dc_sync).

      hasDC() 仅反映 ESC 硬件 bit, 不代表应用层使用 DC; 启用 DC 前应同时 检查 hasDC() 无效输入:'&'无效输入:'&' hasEsiDcSync(). 用于过滤例如 EL6022 / EK1110 / GCAN-8200 这类 ESC 报 DC capable 但 ESI 未声明 DC OpMode 的从站, 避免强写 DCCUC=0x0300 导致 DC 寄存器 FPWR wkc=0 (active=0x0000 如实 FAIL) 或 PreOP→SafeOP 卡死.

      [2026-05-20 根因修复] 此前用 managed EsiManager.getFiles() 缓存查表, 但 Java SDK setEsiFiles() 从未把路径加载进 managed 缓存 (pendingEsiPaths 只 add 不 consume), 故缓存恒空 → 永远 fallback 到 hasDC() → EL6022/EK1110 被误判要测 DC. 现改用 native EcEsi_GetDeviceDcSyncMode (序号 1606), 与已真机验证的 C/C++ SDK 完全 一致: dc_sync_mode >= 2 (DC-Sync0/01) 才算 ESI 真声明 DC.

      判定: EcEsi_GetDeviceDcSyncMode >= 2 → 真; 0/1 (FreeRun/SM-Sync) 与 -1 (ESI 无<Dc>) → 假; 未绑定 (-2) → 退化为 hasDC() 保守不误关.

      返回:
      是否声明使用 DC OpMode
    • PropagationDelay

      public int PropagationDelay()
      获取从站传播延迟 (纳秒)
    • GetSyncWindowStatus

      public DC.SyncWindowStatus GetSyncWindowStatus()
      获取同步窗口状态
      返回:
      状态, 不支持DC或读取失败返回 null
    • ResetSyncWindowStats

      public void ResetSyncWindowStats()
      重置同步窗口统计
    • enableContinuousMeasurement

      public void enableContinuousMeasurement(boolean enable, int intervalSec)
      启用/禁用持续传播延迟测量 (ETG.1500 5.13.2)
      参数:
      enable - 是否启用
      intervalSec - 测量间隔 (秒), 0=使用默认值 (10秒) (对齐 C# intervalSec)
    • enableDriftCompensation

      public void enableDriftCompensation(boolean enable, int maxDriftNs, int correctionFactor)
      启用/禁用 DC 漂移补偿
      参数:
      enable - 是否启用
      maxDriftNs - 漂移阈值 (纳秒), 超过此值才进行补偿
      correctionFactor - 补偿增益 (0-1024, 表示 0.0-1.0)
    • isAllSlavesInSync

      public boolean isAllSlavesInSync(int thresholdNs)
      检查所有 DC 从站是否都在同步窗口内
      参数:
      thresholdNs - 同步阈值 (纳秒), 由 DLL 内部判断
      返回:
      所有从站在同步窗口内返回 true
    • getMaxSyncDifference

      public int getMaxSyncDifference()
      获取所有 DC 从站中的最大同步偏差 (纳秒)
      返回:
      最大同步偏差 (纳秒), 失败返回 -1
    • resetAllSyncWindowStats

      public void resetAllSyncWindowStats()
      重置所有从站的同步窗口统计
    • getMasterDCTime

      public long getMasterDCTime()
      主站最近一次 PDO 周期从参考时钟从站 FRMW 取回的 64-bit DC 系统时间 (纳秒). ETG 2000-01-01 纪元. 应用层可用此值为事件/日志加时间戳.
      Master's latest 64-bit DC system time (ns, ETG 2000-01-01 epoch) read back via FRMW on the reference clock slave. Useful for time-stamping events and log entries consistent with slave DC clocks.
      返回:
      DC 时间 (纳秒) / DC time in nanoseconds; 0 表示 DC 未激活 / 0 if DC not active.
    • getReferenceClockSlaveIndex

      public int getReferenceClockSlaveIndex()
      当前参考时钟从站索引 (1-based). 由 DLL 在 configdc 阶段自动选为第一个 DC-capable 从站, 用户无需配置.
      Reference clock slave index (1-based). The DLL picks this during configdc; no user action required.
      返回:
      参考时钟从站索引 / reference clock slave index; 0 表示网络中无 DC 从站.
    • ConfigureDC

      public boolean ConfigureDC(DC.DcSyncMode mode, int sync0CycleNs, int sync1CycleNs, int shiftNs)
      根据同步模式配置 DC (ETG.1020) FreeRun: 禁用 SYNC0/SYNC1 SmSynchron: 禁用 SYNC0/SYNC1, SM 同步 DcSynchron: 配置 SYNC0 信号 DcSynchron01: 配置 SYNC0 + SYNC1 信号
      参数:
      mode - DC 同步模式
      sync0CycleNs - SYNC0 周期 (纳秒), 仅 DcSynchron 模式使用
      sync1CycleNs - SYNC1 周期 (纳秒), 仅 DcSynchron01 模式使用
      shiftNs - 相位偏移 (纳秒), 仅 DcSynchron 模式使用
    • ConfigureDC

      public boolean ConfigureDC(DC.DcSyncMode mode)
      按模式配置 DC (默认参数)
    • CurrentDcSyncMode

      public DC.DcSyncMode CurrentDcSyncMode()
      获取当前 DC 同步模式 (对齐 C# CurrentDcSyncMode). 通过 native GetDcSyncMode (内部读 0x1C32:01) 判断真实同步模式, 回退到 DC 寄存器状态推断. 协议算法已下沉到 Darra.Core.dll, SDK 公开代码不再出现 SDO 0x1C32 / 0x1C33 数字.
      返回:
      当前 DC 同步模式