类 CoE

java.lang.Object
com.darra.ethercat.slave.CoE
所有已实现的接口:
IMailboxProtocol

public class CoE extends Object implements IMailboxProtocol
CoE (CANopen over EtherCAT) 完整实现 对齐 C# CoEInstance: SDO 读写、对象字典、紧急消息、诊断消息、CiA 子对象、访问权限
  • 构造器详细资料

    • CoE

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

    • getLastSdoError

      public EtherCATTypes.SDOError getLastSdoError()
      获取最后一次 SDO 操作的错误码 (对齐 C# Slave/CoE.cs:45-60 LastSdoError 模式).

      实装策略 (managed): SDK 端在每次 SDORead/SDOWrite 调用后, 把 abort code 缓存 到 instance 字段 lastSdoError, 此 getter 仅返回 cached 值. 不再依赖 DLL 端 GetLastSdoError 导出 (避免 thread-local 跨 JNI 边界的复杂性).

      调用模式:

       byte[] data = coe.SDORead(0x6041, (byte)0);
       if (data == null) {
           SDOError err = coe.getLastSdoError(); // 拿到具体 abort code
       }
       
      返回:
      最近一次 SDO 操作的错误码; 操作成功返回 EtherCATTypes.SDOError.NO_ERROR.
    • getProtocolType

      public byte getProtocolType()
      从接口复制的说明: IMailboxProtocol
      协议类型 (ECT_MBXT_*): AoE=0x01, EoE=0x02, CoE=0x03, FoE=0x04, SoE=0x05, FSoE=0x08, VoE=0x0F.
      Protocol type constant (ECT_MBXT_*).
      指定者:
      getProtocolType 在接口中 IMailboxProtocol
      返回:
      协议类型 0x03 (CoE) / protocol type 0x03 (CoE).
    • getProtocolName

      public String getProtocolName()
      从接口复制的说明: IMailboxProtocol
      协议名称 ("CoE" / "FoE" / "SoE" / "AoE" / "EoE" / "VoE" / "FSoE").
      Protocol name literal.
      指定者:
      getProtocolName 在接口中 IMailboxProtocol
      返回:
      协议名称 "CoE" / protocol name "CoE".
    • isSupported

      public boolean isSupported()
      从站是否支持 CoE 邮箱协议 (读 SII mbx_proto bit 2).
      Whether the slave supports CoE (SII mbx_proto bit 2). Falls back to true on native-side failure so legacy callers that never validated support before reading SDO keep working.
      指定者:
      isSupported 在接口中 IMailboxProtocol
    • getLastStatus

      public MailboxStatus getLastStatus()
      从接口复制的说明: IMailboxProtocol
      最后一次邮箱事务的统一状态. 初始为 MailboxStatus.PENDING.
      Status of the most recent mailbox transaction; initial value is MailboxStatus.PENDING.
      指定者:
      getLastStatus 在接口中 IMailboxProtocol
      返回:
      最近一次邮箱事务状态 / last transaction status.
    • getLastErrorCode

      public long getLastErrorCode()
      从接口复制的说明: IMailboxProtocol
      最后一次邮箱事务的协议层错误码 (CoE=SDO Abort, FoE=FoE Error, SoE=SoE Error, 等). 0 表示无错误或不适用.
      Protocol-level error code of the last transaction (CoE SDO abort, FoE error code, SoE error, etc.). Zero means no error or not applicable.
      指定者:
      getLastErrorCode 在接口中 IMailboxProtocol
      返回:
      最近一次协议层错误码 / last protocol-level error code.
    • getStatistics

      public MailboxStatistics getStatistics()
      邮箱统计快照.
      Mailbox statistics snapshot.

      [审计补齐 roundSDKSAN2] 经真实导出的 native EcxMbxGetStats 拉取, 与 C# CoE.Statistics 同源. native 未就绪时降级空快照.

      指定者:
      getStatistics 在接口中 IMailboxProtocol
    • resetStatistics

      public void resetStatistics()
      重置邮箱统计计数器.
      Reset mailbox statistics counters.

      [审计补齐 roundSDKSAN2] 真调 native EcxMbxResetStats 重置 per-slave/ per-protocol 统计, 同时清理 Java 端的 lastStatus / lastErrorCode 缓存.

      指定者:
      resetStatistics 在接口中 IMailboxProtocol
    • SDORead

      public byte[] SDORead(short index, byte subIndex, boolean completeAccess, int timeoutMs)
      SDO 读取 (原始字节, 支持 CompleteAccess)
      参数:
      index - 对象索引
      subIndex - 子索引
      completeAccess - 是否使用 Complete Access 模式 (一次读取所有子索引)
      timeoutMs - 超时 (毫秒)
      返回:
      数据字节数组, 失败返回 null
    • SDORead

      public byte[] SDORead(short index, byte subIndex, int timeoutMs)
      SDO 读取 (原始字节, 无 CompleteAccess)
      参数:
      index - 对象索引
      subIndex - 子索引
      timeoutMs - 超时 (毫秒)
      返回:
      数据字节数组, 失败返回 null
    • SDORead

      public byte[] SDORead(short index, byte subIndex)
      SDO 读取 (默认超时, 无 CompleteAccess)
    • SDORead

      public byte[] SDORead(short index, byte subIndex, boolean completeAccess)
      SDO 读取 (默认超时, 指定 CompleteAccess)
    • SDOWrite

      public boolean SDOWrite(short index, byte subIndex, byte[] data, boolean completeAccess, int timeoutMs)
      SDO 写入 (原始字节, 支持 CompleteAccess)
      参数:
      index - 对象索引
      subIndex - 子索引
      data - 数据
      completeAccess - 是否使用 Complete Access 模式
      timeoutMs - 超时 (毫秒)
      返回:
      是否成功
    • SDOWrite

      public boolean SDOWrite(short index, byte subIndex, byte[] data, int timeoutMs)
      SDO 写入 (原始字节, 无 CompleteAccess)
    • SDOWrite

      public boolean SDOWrite(short index, byte subIndex, byte[] data)
      SDO 写入 (默认超时, 无 CompleteAccess)
    • SDOWrite

      public boolean SDOWrite(short index, byte subIndex, byte[] data, boolean completeAccess)
      SDO 写入 (默认超时, 指定 CompleteAccess)
    • defaultExecutor

      protected Executor defaultExecutor()
      默认 Executor, 子类或用户可覆盖以使用自定义线程池 (Default Executor, subclass or user can override for custom thread pool)。

      仅在按 masterIndex 反查不到父 master 串行闸时 (未 build 的单测场景) 作为回退; 正常 build 后的主站走父闸串行, 不经此 executor。

    • sdoReadAsync

      public CompletableFuture<byte[]> sdoReadAsync(short index, byte subIndex, boolean completeAccess)
      异步读取 SDO (Asynchronously read SDO). 对齐 C# CoEInstance.SDOReadAsync. 经父 master 串行闸排队隔离, 调用方拿 future 不堵线程。
      参数:
      index - SDO 索引 (SDO index)
      subIndex - 子索引 (sub-index)
      completeAccess - 完全访问模式 (complete access mode)
      返回:
      包含响应字节数组的 CompletableFuture (CompletableFuture with response bytes)
      抛出:
      CoE.CoEAbortException - 读取失败 (SDO Abort / read failure), 经 future 异常抛回
    • sdoReadAsync

      public CompletableFuture<byte[]> sdoReadAsync(short index, byte subIndex)
      异步读取 SDO (无 CompleteAccess, Asynchronously read SDO without CompleteAccess)
    • sdoWriteAsync

      public CompletableFuture<Boolean> sdoWriteAsync(short index, byte subIndex, byte[] data, boolean completeAccess)
      异步写入 SDO (Asynchronously write SDO). 对齐 C# CoEInstance.SDOWriteAsync. 经父 master 串行闸排队隔离, 调用方拿 future 不堵线程。
      参数:
      index - SDO 索引 (SDO index)
      subIndex - 子索引 (sub-index)
      data - 数据 (payload bytes)
      completeAccess - 完全访问模式 (complete access mode)
      返回:
      成功为 true 的 CompletableFuture (CompletableFuture resolving to true on success)
      抛出:
      CoE.CoEAbortException - 写入失败 (SDO Abort / write failure), 经 future 异常抛回
    • sdoWriteAsync

      public CompletableFuture<Boolean> sdoWriteAsync(short index, byte subIndex, byte[] data)
      异步写入 SDO (无 CompleteAccess, Asynchronously write SDO without CompleteAccess)
    • SDOReadAsync

      public CompletableFuture<byte[]> SDOReadAsync(short index, byte subIndex, boolean completeAccess)
      异步读取 SDO (失败返回 null, 不抛 CoEAbortException; 对齐 C# SDOReadAsync)。 经父 master 串行闸排队隔离, 与同主站其它 EtherCAT 操作串行, 不并发打邮箱。
      参数:
      index - 对象索引
      subIndex - 子索引
      completeAccess - 完全访问 (整对象读)
      返回:
      CompletableFuture<byte[]> — 数据; 失败 (含 NotPresent/状态让路) 完成为 null。 取消返回的 future (cancel(true)) 会调 native AbortNetwork 让阻塞中的邮箱往返返回。
    • SDOReadAsync

      public CompletableFuture<byte[]> SDOReadAsync(short index, byte subIndex)
      SDOReadAsync(short, byte, boolean) 无 CompleteAccess 版。
    • SDOWriteAsync

      public CompletableFuture<Boolean> SDOWriteAsync(short index, byte subIndex, byte[] data, boolean completeAccess)
      异步写入 SDO (失败返回 false, 不抛 CoEAbortException; 对齐 C# SDOWriteAsync)。 经父 master 串行闸排队隔离, 与同主站其它 EtherCAT 操作串行, 不并发打邮箱。
      参数:
      index - 对象索引
      subIndex - 子索引
      data - 要写入的数据 (不能为 null/空)
      completeAccess - 完全访问 (整对象写)
      返回:
      CompletableFuture<Boolean> — 成功为 true。取消会调 native AbortNetwork。
    • SDOWriteAsync

      public CompletableFuture<Boolean> SDOWriteAsync(short index, byte subIndex, byte[] data)
    • getSlaveIndex

      public short getSlaveIndex()
      获取从站索引 (get slave index)
    • SDOReadInt8

      public Byte SDOReadInt8(short index, byte subIndex)
      读取 Int8
    • SDOReadInt16

      public Short SDOReadInt16(short index, byte subIndex)
      读取 Int16
    • SDOReadInt32

      public Integer SDOReadInt32(short index, byte subIndex)
      读取 Int32
    • SDOReadUInt16

      public Integer SDOReadUInt16(short index, byte subIndex)
      读取 UInt16 (以 int 返回)
    • SDOReadUInt32

      public Long SDOReadUInt32(short index, byte subIndex)
      读取 UInt32 (以 long 返回)
    • SDOReadFloat

      public Float SDOReadFloat(short index, byte subIndex)
      读取 Float
    • SDOReadDouble

      public Double SDOReadDouble(short index, byte subIndex)
      读取 Double
    • SDOReadString

      public String SDOReadString(short index, byte subIndex)
      读取 String
    • ReadMultipleAsync

      public CompletableFuture<Map<Long,byte[]>> ReadMultipleAsync(List<int[]> entries)
      批量 SDO 读取 — 一次调用读取多个对象 异步执行, 不阻塞调用线程
      参数:
      entries - 要读取的 (index, subindex) 列表, 每个元素为 int[2]
      返回:
      CompletableFuture 结果 Map, key 为 (index<<8|subindex) 编码, value 为数据 (失败为 null)
    • SDOWriteInt16

      public boolean SDOWriteInt16(short index, byte subIndex, short value)
    • SDOWriteInt32

      public boolean SDOWriteInt32(short index, byte subIndex, int value)
    • SDOWriteUInt16

      public boolean SDOWriteUInt16(short index, byte subIndex, int value)
    • SDOWriteUInt32

      public boolean SDOWriteUInt32(short index, byte subIndex, long value)
    • SDOWriteFloat

      public boolean SDOWriteFloat(short index, byte subIndex, float value)
    • SDOWriteDouble

      public boolean SDOWriteDouble(short index, byte subIndex, double value)
    • SDOWriteByte

      public boolean SDOWriteByte(short index, byte subIndex, byte value)
    • ODList

      public Map<Short,List<CoE.ObjectEntry>> ODList()
      获取对象字典列表 (通过 loadODList 加载)
      返回:
      按 OD 索引分组的 ObjectEntry Map
    • loadODList

      public CoE.EcODList loadODList()
      加载完整 OD 树结构 (对齐 C# ODList getter + LoadODList) 调用 GetSlaveSDOList + GetSlavePointer_SDO_WithODList
    • loadObjectDictionary

      public List<CoE.ObjectDictionary> loadObjectDictionary()
      直接通过 CoE SDO Information Service 加载对象字典. 不依赖 GetSlaveSDOList 缓存, 每次实时从从站拉 OD 索引 + 详情.
      返回:
      解析后的 OD 列表; 失败返回 null.
    • getObjectDescription

      public CoE.ObjectDictionary getObjectDescription(short index)
      直接读单个对象 Description (DataType/MaxSub/Name).
      返回:
      ObjectDictionary 元数据 (不含子条目); 失败返回 null.
    • getEntryDescription

      public CoE.ObjectEntry getEntryDescription(short index, byte subindex)
      直接读单个 Entry Description (DataType/BitLength/ObjAccess/Name).
      返回:
      ObjectEntry; 失败返回 null.
    • loadODListAsync

      public CompletableFuture<CoE.EcODList> loadODListAsync()
      异步加载对象字典 (对齐 C# LoadODListAsync)
    • isODListLoading

      public boolean isODListLoading()
      对象字典是否正在异步加载
    • getODList

      public CoE.EcODList getODList()
      获取已加载的 OD 列表
    • getCount

      public int getCount()
      对象字典中的对象数量 (对齐 C# Count)
    • containsKey

      public boolean containsKey(short index)
      检查给定索引是否存在 (对齐 C# ContainsKey)
    • containsKey

      public boolean containsKey(String key)
      检查给定字符串键是否存在
    • GetEmergencyHistory

      public List<CoE.EmergencyMessage> GetEmergencyHistory()
      获取紧急消息历史 (通过 EMCY 记录 API)
    • ClearEmergencyHistory

      public void ClearEmergencyHistory()
      清除紧急消息历史
    • readDiagnosticMessages

      public List<CoE.DiagnosticMessage> readDiagnosticMessages()
      读取诊断历史消息 (0x10F3, ETG.1510, 对齐 C# ReadDiagnosticMessages)
    • getDeviceProfile

      public int getDeviceProfile()
      读取设备协议编号 (0x1000 Device Type 低 16 位)
    • getCiA402

      public Object getCiA402()
      获取 CiA 402 伺服驱动器实例 (对齐 C# CiA402 属性) 从站不支持 CiA 402 时返回 null
    • getCiA401

      public Object getCiA401()
      获取 CiA 401 I/O 模块实例 (对齐 C# CiA401 属性) 从站不支持 CiA 401 时返回 null
    • parseCompleteAccessData

      public static Map<Integer,byte[]> parseCompleteAccessData(byte[] caData, CoE.ObjectDictionary od)
      解析 Complete Access 读取的原始字节数据,按子索引拆分。 规则 (ETG.1000.6 §5.6.2): - SubIndex 0 始终填充到 16 位 (2字节) - BIT 类型连续打包,下一个非 BIT 类型从下一个字节边界开始
      参数:
      caData - Complete Access 读取的原始字节数据
      od - 对应的对象字典条目 (需已加载 OE 列表)
      返回:
      按子索引拆分的字节数组字典 (key = 实际子索引号)
    • pollHasNewDiagnostic

      public int pollHasNewDiagnostic()
      快速轮询 0x10F3:04 NewAvailable 标志 / fast poll 0x10F3:04. 无新消息时不读完整历史, 适合高频轮询.
      Light-weight polling that avoids reading the entire history when no new diagnosis message is present.
      返回:
      1=有新消息 / new diag available, 0=无 / none, -1=通信失败 / comm failure.
    • readDiagnosticMeta

      public CoE.DiagMeta readDiagnosticMeta()
      读 0x10F3 元数据 / read 0x10F3 meta (Max / Newest / Acked / Flags).
      返回:
      DiagMeta 对象 / meta object; null 表示通信失败 / null on failure.
    • readDiagnosticMessage

      public byte[] readDiagnosticMessage(int msgIdx, int bufSize)
      读指定 subindex (6..255) 的诊断消息原始字节 / read a single diagnosis message.
      参数:
      msgIdx - 消息 subindex (6..255) / message sub-index.
      bufSize - 接收缓冲区大小 / buffer capacity in bytes.
      返回:
      实际读取的字节数组, 长度 = native 实际写入; null 表示失败.
      Byte array trimmed to the actually-filled length; null on failure.
    • acknowledgeDiagnostic

      public boolean acknowledgeDiagnostic(int msgIdx)
      确认指定 subindex (6..255) 已处理 / acknowledge diagnosis messages up to msgIdx. 从站按 ring 模式清理 无效输入:'<'= ack_subidx 的消息.
      参数:
      msgIdx - 要确认的最后一个 subindex / last sub-index acknowledged.
      返回:
      true=OK, false=失败 / false on failure.