Rust API 参考
Darra PnSlave Rust SDK(crate darra_pnet)。命名采用 Rust 惯例(snake_case),语义与 C# 页一致。
主路径:PnetService::connect() 不指定 host → start / read / write / pdo / stop。无用户周期:写 I,看 Q。Q 只读。HTTP 备用:PnetService::new("127.0.0.1", DEFAULT_PORT, None)。
单一 PROFINET 网口契约:设备对外只开放一个 PROFINET 网口。网卡选择在 GUI / Service 配置层完成;SDK 不选网卡、不跑用户周期。
use darra_pnet::PnetService;
概览
| 类型 | 职责 |
|---|---|
PnetService | 服务模式单一入口:connect() 无 host;start / read / write / pdo / stop |
Pdo | ETH 式过程映像视图(读 Q / 写 I,无用户周期) |
Device | native 直连备选(打开 / load_config / 启停 / 槽位 IO) |
ServiceAddress / ServiceArea | 服务模式地址解析 |
PnetError / ServiceError | 错误类型 |
PnetService — 主路径(无 host)
connect() 不经 Web API、不指定 host。start() 先映射驱动命名 Section \Device\DarraRT_Pnet_GlobalIO;read / write / pdo 直接拷过程映像;stop() 卸载映射。不打开 \\.\DarraRT_Pnet。无用户周期:写 I(设备 → 控制器),看 Q(控制器 → 设备)。
use darra_pnet::PnetService;
let mut svc = PnetService::connect(); // 无 host 主路径
svc.start()?; // 映射过程映像
let q = svc.read()?; // 看 Q(控制器 → 设备)
svc.write(&[0x01, 0x02, 0x03, 0x04])?; // 写 I(设备 → 控制器)
let b = svc.pdo().in_u8(0)?; // PDO 读 Q
svc.pdo().out_u8(0, 0x11)?; // PDO 写 I
svc.stop()?; // 卸载映射
svc.close();
| 成员 | 类型 | 类别 | 读写 | 说明 |
|---|---|---|---|---|
PnetService::connect() | PnetService | 设备 | 静态 | 主路径:无 host,不经 Web API |
start() | ServiceResult<()> | 设备 | 写 | 映射 GlobalIO;已映射则幂等 |
read() | ServiceResult<Vec<u8>> | IO | 只读 | 读整段 Q(控制器 → 设备) |
write(data) | ServiceResult<()> | IO | 写 | 写 I(设备 → 控制器,允许短写) |
pdo() | Pdo<'_> | PDO | 只读 | ETH 式 PDO 视图(读 Q / 写 I) |
stop() | ServiceResult<()> | 设备 | 写 | 卸载映射;在连不撕 AR |
get(offset) | ServiceResult<u8> | IO | 只读 | 读 Q 绝对字节 |
set(offset, value) | ServiceResult<()> | IO | 写 | 写 I 绝对字节 |
status() | ServiceResult<ServiceState> | 设备 | 只读 | 运行态枚举 |
status_ex() | ServiceResult<ServiceStatus> | 设备 | 只读 | 运行态快照(state / connected / error_code) |
is_connected() / is_started() | bool | 设备 | 只读 | 会话 / 本地启动状态 |
close() | () | 设备 | 写 | 释放会话(不向服务端发 stop) |
status_ex() 返回 ServiceStatus(state / connected / error_code / error_code_raw):connected = 是否已与 IO 控制器建立周期数据交换,error_code = 栈错误码枚举(PnetRuntimeErrorCode:Ok=0 / ErrInit=-1 / ErrCfg=-2 / ErrThread=-3 / ErrRunning=-4 / ErrPdi=-5 / ErrDap=-6 / ErrNull=-8 / ErrDiag=-9 / Unknown=-10000),未识别值如实 Unknown,原值仍经 error_code_raw 透传。
Pdo — 过程映像(读 Q / 写 I)
svc.pdo() 包一层已 start 的会话。无用户周期、不发 HTTP。字 / 双字大端,允许未对齐偏移。
let pdo = svc.pdo();
let q0 = pdo.in_u8(0)?; // 读 Q
pdo.out_u8(0, 0x11)?; // 写 I
let w = pdo.in_i16(2)?; // 读 Q 大端字
pdo.out_i16(2, -2)?; // 写 I 大端字
| 成员 | 类型 | 类别 | 读写 | 说明 |
|---|---|---|---|---|
in_u8(offset) | ServiceResult<u8> | PDO | 只读 | 读 Q 1 字节 |
in_i16(offset) | ServiceResult<i16> | PDO | 只读 | 读 Q 大端字(允许未对齐) |
in_i32(offset) | ServiceResult<i32> | PDO | 只读 | 读 Q 大端双字(允许未对齐) |
out_u8(offset, value) | ServiceResult<()> | PDO | 写 | 写 I 1 字节 |
out_i16(offset, value) | ServiceResult<()> | PDO | 写 | 写 I 大端字 |
out_i32(offset, value) | ServiceResult<()> | PDO | 写 | 写 I 大端双字 |
copy_inputs_to(dest) | ServiceResult<usize> | PDO | 只读 | 整段拷 Q 到调用方缓冲 |
copy_to_outputs(src) | ServiceResult<usize> | PDO | 写 | 整段 / 短写 I |
read_struct<T>() | ServiceResult<T> | PDO | 只读 | Q 前 T::packed_size() 字节 → 结构体 |
write_struct<T>(value) | ServiceResult<()> | PDO | 写 | 结构体 → I 偏移 0 |
结构体须实现 PdoPacked(紧排、大端;不 transmute packed 布局)。
地址化读写(可选)
西门子风格地址仍可用。写 I 看 Q;Q 区只读,写 Q 返回 ServiceError::OutputReadOnly。
| 区域 | 地址格式 | 方向语义 |
|---|---|---|
| I 区(输入面) | I0.0 / IB0 / IW2 / ID4 | 设备 → 控制器;可写 |
| Q 区(输出面) | Q0.0 / QB0 / QW2 / QD4 | 控制器 → 设备;只读 |
| M 区(内部存储) | M0.0 / MB0 / MW100 / MD0 | 映射输入面 |
| DB 区(槽位数据块) | DB1.DBX0.0 / DB1.DBB2 / DB1.DBW0 / DB1.DBD4 | 仅槽位 1;槽位 > 1 返回 DbSlotNotSupported |
字 / 双字大端序,偏移即字节偏移、不强制 2 / 4 对齐(IW3 合法)。
| 成员 | 类型 | 类别 | 读写 | 说明 |
|---|---|---|---|---|
read_bool(address) | ServiceResult<bool> | IO | 只读 | 读位(I0.0 / Q0.0 / M1.6 / DB1.DBX0.0) |
write_bool(address, value) | ServiceResult<()> | IO | 写 | 写位(I / M / DB;Q 只读) |
read_int16(address) | ServiceResult<i16> | IO | 只读 | 读字(IW2 / QW2 / MW0 / DB1.DBW0,大端) |
write_int16(address, value) | ServiceResult<()> | IO | 写 | 写字(I / M / DB;Q 只读) |
read_int32(address) | ServiceResult<i32> | IO | 只读 | 读双字(ID4 / QD4 / MD0 / DB1.DBD0,大端) |
write_int32(address, value) | ServiceResult<()> | IO | 写 | 写双字(I / M / DB;Q 只读) |
get_io() | ServiceResult<(Vec<u8>, Vec<u8>)> | IO | 只读 | 过程映像快照(I 区 / Q 区) |
parse_address(text) | ServiceResult<ServiceAddress> | IO | 静态 | 解析 HSL 式地址 |
Device — native 直连(备选)
use darra_pnet::Device;
let mut device = Device::open()?;
device.load_config(r"C:\DARRA\Profinet_Slave\config.xml")?;
device.start()?;
device.stop()?;
| 成员 | 类型 | 类别 | 读写 | 说明 |
|---|---|---|---|---|
Device::open() | Result<Device> | 设备 | 静态 | 打开设备(搜索 DarraPnet.dll) |
Device::builder() | DeviceBuilder | 设备 | 静态 | 构建器入口(可指定 DLL 路径) |
load_config(path) | Result<()> | 配置 | 写 | 加载运行配置 XML |
start() / stop() | Result<()> | 设备 | 写 | 启动 / 停止协议栈 |
state() | DeviceState | 设备 | 只读 | 设备状态 |
slave() | Slave<'_> | 从站 | 只读 | 从站控制 |
io() | PnetIo<'_> | IO | 只读 | 槽位过程数据 |
alarm() / config() / diag() | 各域 | 各域 | 只读 | 报警 / 配置 / 诊断 |
Cargo.toml
[dependencies]
darra_pnet = "1.0.0"