跳到主要内容

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
Rust1.70+ (stable)
网络适配器常规以太网网卡
权限管理员权限(Windows)/ root 权限(Linux)

安装 DarraRT 驱动

DarraRT 驱动提供微秒级实时性能,完全免费。

快速开始

使用 Darra 配置工具
  1. 打开 Darra 配置工具,扫描 EtherCAT 网络
  2. 配置从站参数(PDO 映射、DC 设置等)
  3. 导出 JSON 配置文件
  4. 在代码中加载 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 实现 Drop trait,超出作用域时自动 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);