Java SDK 概述
Darra EtherCAT Java SDK 提供了用于开发 EtherCAT 主站应用程序的类库,支持主站与从站之间的高速实时通信。
安装
- Maven
- Gradle
- 手动引用 JAR
<dependency>
<groupId>xyz.darra</groupId>
<artifactId>darra-ethercat-master</artifactId>
<version>2.7.0</version>
</dependency>
implementation 'xyz.darra:darra-ethercat-master:2.7.0'
如果不使用 Maven/Gradle,可以直接引用编译好的 JAR:
- 从 下载页面 获取
darra-ethercat-master.jar与运行时库 - 将 JAR 添加到项目 classpath
- 确保运行时库与 JAR 在同一目录或在系统库搜索路径中
系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 7+ (推荐 Windows 10/11) |
| Java | JDK 11+ (推荐 JDK 17 LTS) |
| 网络适配器 | 常规以太网网卡 |
| 权限 | 管理员权限 |
安装 DarraRT 驱动
DarraRT 驱动提供微秒级实时性能,完全免费。详见 下载页面。
快速开始
- 打开 Darra 配置工具,扫描 EtherCAT 网络
- 配置从站参数(PDO 映射、DC 设置等)
- 导出 JSON 配置文件
- 在代码中加载 JSON 文件初始化主站
import com.darra.ethercat.master.EtherCATMaster;
import com.darra.ethercat.data.EcState;
// ★ 推荐方式: 使用 DENI 文件 (Darra 配置工具一键导出)
EtherCATMaster.BuildResult r = EtherCATMaster.create()
.setENI("C:/EtherCAT/MyProject.deni")
.build();
if (!r.success) throw new RuntimeException(r.message);
try (EtherCATMaster master = r.master) {
master.setState(EcState.OP);
// 开始通信...
} // 自动 close() 释放资源
备选方式: 自动搜索网卡 (无 DENI 时)
不使用 DENI 时, 用 NetworkInfo.getAvailableNetworks() 自动扫描所有网卡, 取有从站的那张:
import com.darra.ethercat.master.EtherCATMaster;
import com.darra.ethercat.statics.NetworkInfo;
import com.darra.ethercat.data.EcState;
import java.util.List;
// 扫所有 NIC 并探测从站数 (耗时 ~500ms-1.5s)
List<NetworkInfo> nets = NetworkInfo.getAvailableNetworks(false, true);
// 选有从站的 NIC
NetworkInfo ec = nets.stream()
.filter(n -> n.getSlaveCount() != null && n.getSlaveCount() > 0)
.findFirst()
.orElseThrow(() -> new RuntimeException("未发现 EtherCAT 网络"));
System.out.printf("找到: %s (从站 %d 台, MAC=%s)%n",
ec.getDescription(), ec.getSlaveCount(), ec.getMacAddress());
try (EtherCATMaster master = EtherCATMaster.create()) {
master.setNetwork(ec.getName(), null);
master.setState(EcState.OP);
}
- DENI — 生产环境, 一行加载 ESI/PDO/DC 全套参数, 推荐.
- 自动搜索 — 演示 / 工具类应用 / 不需要预配置启动参数的场景.
Java SDK 采用 PascalCase 无前缀 的属性方法命名(对齐 C#),不使用 get/set 前缀。例:master.SlaveCount() / slave.Name() / slave.CoE()。不变值用 public final 字段:slave.SlaveNum / master.MasterIndex。
高级 API
SDK 提供了一组高级 API,简化常见操作流程:
| 功能 | 说明 |
|---|---|
| JSON 一步初始化 | createFromJson() / createFromJsonFile() 一步完成主站初始化 |
| 状态链转换 (setState) | 自动执行多步状态转换链 |
| CiA 402 驱动状态机 | 一步使能/故障复位/状态解析 |
| EMCY 紧急消息缓冲 | 读取从站紧急消息历史记录 |
| PDO 零拷贝读写 | 通过 ByteBuffer 直接读写 PDO 数据 |
| 拓扑查询 | 构建并查询从站网络拓扑树 |
| WDK 实时驱动 | 微秒级 PDO 周期 |
| 冗余网络 | 双网卡环形冗余 |
快速示例:
// CiA402 驱动器使能
slave.CiA402().Enable();
// 类型化 SDO 读写
Integer pos = slave.CoE().SDOReadInt32((short) 0x6064, (byte) 0);
slave.CoE().SDOWriteInt32((short) 0x607A, (byte) 0, 100000);
// 读取紧急消息
List<CoE.EmergencyMessage> history = slave.CoE().GetEmergencyHistory();
// 拓扑查询
List<Integer> children = master.TopologyChildren(parentIdx);
2.5.x 版本新增
| 功能 | 说明 |
|---|---|
| MDP 模块化设备自动编排 | 进 OP 时自动检测并配置模块化设备(GCAN-8200 等),详见 MDP |
| 邮箱统计 | 7 个邮箱协议(CoE/FoE/SoE/AoE/EoE/VoE/FSoE)的 getStatistics() / resetStatistics() 接通真实 native 统计(此前为占位) |
| 异步邮箱事务 | DarraCore.EcxMbxSubmitAsync / EcxMbxWait / EcxMbxCancel / EcxMbxGetResult 异步邮箱事务原语 |
| 从站实时状态镜像 | slave.WcContributed() / slave.AlStatusMirror() / slave.IsLost() 零帧实时读取内核 per-slave 状态镜像,详见 从站诊断 |
| SERCOS IDN 编解码 | SoE.encodeIdn / decodeIdn / tryParseSercosIdn |
| ESI DC 能力门 | slave.DC().dcSyncModeFromEsi() / hasEsiDcSync() 走 ESI 真实声明的 DC OpMode |
Java 特有语法糖
除标准 API 外, Java SDK 在 com.darra.ethercat.sugar 包提供一组利用 Java 语言特性的可选扩展, 让代码更简洁. 详见 Java 特有语法糖 — 包含 try-with-resources / Stream<Slave> 流式 / Optional<Slave> null safety / Iterable for-each / CompletableFuture<T> 异步 / BlockingQueue<EmergencyEvent> 诊断队列 / record 不可变身份 / Functional listener (lambda) / MasterBuilder 流式构造器. 这些是可选的, 不影响标准 API 使用.
自动健康检查 · Auto health checks
master.Build() 时自动跑, 不匹配 → SDK 日志 Warning:
- 驱动版本比对 — SDK 查询底层实时驱动的内核版本, 跟 SDK 的 MAJOR.MINOR 比对, 不一致即告警
- RT 核隔离 — 后台检查实时核隔离配置标记, 缺失提示重装 SDK
错误码本地化 · Error localization
AL Status 描述双语. SDK 默认英文, 中文专用接口给 UI:
String en = PrintHelper.getALStatusDescription(code); // English
String zh = PrintHelper.getALStatusDescriptionChinese(code); // 中文
DriverVersionInfo drv = DriverVersionHelper.get(); // 内核驱动版本
版本兼容
- 同 MAJOR.MINOR 内 PATCH 互相兼容 (例 2.7.0 ↔ 2.7.5), 包管理器升级即可, 不需重装驱动
- MAJOR / MINOR 变化 → 必须重装配套的驱动安装包, 否则会报版本兼容错误