跳到主要内容

Rust API 参考

Darra Profinet Slave Rust SDK(crate darra_pns)。命名采用 Rust 惯例(snake_case),语义与 C# 页一致。周期自由配置,最低 1 ms。

PnSService::connect()start / read / write / pdo / stop。写 I、读 Q。Q 只读

设备对外只开放一个 PROFINET 网口。网卡选择在 GUI / 服务配置层完成;SDK 不选网卡。

use darra_pns::PnSService;

概览

类型职责
PnSService单一入口:connect()start / read / write / pdo / stop
Pdo过程数据视图(读 Q / 写 I)
Devicenative 直连备选(打开 / load_config / 启停 / 槽位 IO)
ServiceAddress / ServiceArea服务模式地址解析
PnSError / ServiceError错误类型

PnSService

connect() 建立本机会话。start()read / write / pdo 读写过程数据;stop() 结束会话。写 I(设备 → 控制器),读 Q(控制器 → 设备)。

use darra_pns::PnSService;

let mut svc = PnSService::connect();
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();
成员类型类别读写说明
PnSService::connect()PnSService设备静态本机会话
start()ServiceResult<()>设备启动会话;已启动则成功返回
read()ServiceResult<Vec<u8>>IO只读读整段 Q(控制器 → 设备)
write(data)ServiceResult<()>IO写 I(设备 → 控制器,允许短写)
pdo()Pdo<'_>PDO只读过程数据视图(读 Q / 写 I)
stop()ServiceResult<()>设备停止本会话。主站在连时不要拆应用关系
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() 返回 ServiceStatusstate / connected / error_code / error_code_raw):connected = 是否已与 IO 控制器建立周期数据交换,error_code = 栈错误码枚举(PnSRuntimeErrorCodeOk=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 的会话。字 / 双字大端,允许未对齐偏移。

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_pns::Device;

let mut device = Device::open()?;
device.load_config(r"C:\DARRA\Profinet_Slave\config.xml")?;
device.start()?;
device.stop()?;
成员类型类别读写说明
Device::open()Result<Device>设备静态打开设备(搜索 DarraPnS.dll
Device::builder()DeviceBuilder设备静态构建器入口(可指定 DLL 路径)
load_config(path)Result<()>配置加载运行配置 XML
start() / stop()Result<()>设备启动 / 停止协议栈
state()DeviceState设备只读设备状态
slave()Slave<'_>从站只读从站控制
io()PnSIo<'_>IO只读槽位过程数据
alarm() / config() / diag()各域各域只读报警 / 配置 / 诊断

Cargo.toml

[dependencies]
darra_pns = "1.0.0"

相关