Rust SDK 概述
DarraEtherCAT Rust SDK 是用于开发 EtherCAT 主站应用程序的 crate,提供安全的 Rust API 进行主站与从站之间的高速实时通信。
安装
在 Cargo.toml 中添加依赖:
[dependencies]
ethercat = "0.1"
或从本地路径引用:
[dependencies]
ethercat = { path = "../ethercat" }
系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 7+ (推荐 Windows 10/11) 或 Linux |
| Rust | 1.70+ (stable) |
| 网络适配器 | 常规以太网网卡 |
| 权限 | 管理员权限(Windows)/ root 权限(Linux) |
安装 DarraRT 驱动
DarraRT 驱动提供微秒级实时性能,完全免费。
快速开始
使用 Darra 配置工具
- 打开 Darra 配置工具,扫描 EtherCAT 网络
- 配置从站参数(PDO 映射、DC 设置等)
- 导出 JSON 配置文件
- 在代码中加载 JSON 文件初始化主站
use ethercat::{EtherCATMaster, EcState};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 推荐方式:使用 JSON 配置文件一步初始化
let mut master = EtherCATMaster::from_json_file("config.json")?;
// 或手动初始化
let mut master = EtherCATMaster::new()?;
master.set_network(r"\Device\NPF_{...}", "")?;
master.set_state(EcState::Operational)?;
master.start();
// 读取从站数据
let slave = master.slave(1);
let value: u16 = slave.sdo_read_value(0x6041, 0x00)?;
println!("StatusWord: 0x{:04X}", value);
Ok(())
}
设计理念
Rust SDK 遵循 Rust 惯用模式:
- RAII 自动释放 —
EtherCATMaster实现Droptrait,超出作用域时自动 Stop + Dispose 释放资源 - 工厂方法 — 通过
EtherCATMaster::new()/with_index()/from_json()/from_json_file()创建主站 - Result 错误处理 — 所有可能失败的操作返回
Result<T, DarraError> - 零拷贝 PDO — 通过 IOmap 指针直接访问过程数据
- 闭包回调 — 事件订阅使用 Rust 闭包,自动管理生命周期
- 安全封装 — 用户接触的全部 API 均为安全 Rust,无需
unsafe
功能特性
| 功能 | 说明 |
|---|---|
| 一步初始化 (from_json/from_json_file) | JSON 配置一步完成主站初始化 |
| 状态链转换 (set_state) | 自动执行多步状态转换链并应用启动参数 |
| OD 树遍历 (OdList) | 加载完整对象字典,支持类型化读写 |
| CiA 402 驱动状态机 | 独立构造 CiA402Instance,PDO/SDO 自动切换 |
| PDO 监控 (PdoMonitor) | 按字节范围监视 PDO 输入变化 |
| FSoE 安全通信 | FsoeManager/FsoeMdp 手动连接管理 |
| 拓扑查询 | 构建并查询从站网络拓扑树 |
快速示例:
// 类型化 SDO 读写
let status: u16 = slave.sdo_read_value(0x6041, 0x00)?;
slave.sdo_write_value(0x6040, 0x00, &0x0006u16)?;
// OD 树遍历
let od = OdList::load(master.index(), 1)?;
for obj in &od.objects {
println!("0x{:04X}: {}", obj.index, obj.name);
}
// CiA 402 独立构造
let pdo_map = Cia402PdoMap::scan(master.index(), 1)?;
let drv = CiA402Instance::new(master.index(), 1, pdo_map);
drv.enable_default();
// PDO 监控
let mut monitor = PdoMonitor::new(master.index());
monitor.watch(1, "statusword", 0, 2);
let changes = monitor.check();
// 拓扑查询
let topo = master.topology();
let children = master.topology_get_children(1);