跳到主要内容

初始化

推荐方式

PnSService::new(),调一次 start(),循环里写 Q、读 I。 先装好 Darra Profinet Slave。站名和网卡在配置工具里设好,构造不用传。不要每个周期 new / close

构造函数

PnSService::new()

pub fn new() -> PnSService

新建从站实例。服务没起来也能 new,不返回 Result。这只是拿到对象,还没启用 IO,主站也还没连上。

connect() 是旧名,等价 new()。不是「控制器已连接」。

示例:

use darra_pns::PnSService;

let mut device = PnSService::new();
device.start()?;

while running {
// 写 Q、读 I 写在这里
}

device.stop()?;

把实例留在整个程序寿命的作用域里。循环写在作用域 里面start 一次就够。每个周期 close 会把 Q 清掉,下一圈再写等于输出被扔掉。

启停

start()

pub fn start(&self) -> ServiceResult<()>

启用 IO,返回 ServiceResult<()>。成功不等于主站已经在换数据,那要看 connected()。已经 start 且还没 stop,再调一次直接返回 Ok(())

失败写 last_error(),返回 ServiceError。服务没起来是 ConnectFailed / ServiceUnreachable;另一实例已经在跑是 RealtimeGate(对应 PnSErrorCode::Busy)。契约见 SDK 连接契约

示例:

device.start()?;

stop()

pub fn stop(&self) -> ServiceResult<()>

停用 IO。实例还在,可以再 start。没 start 过或已经 stop,再调一次没事。失败写 last_error()

彻底放开用 close(),不是 stop()

示例:

device.stop()?;

资源释放

PnSService 实现了 Drop,超出作用域时自动 close()

close()

pub fn close(&mut self)

还在跑就清掉 Q,再放开实例。Q 会被清掉(清的是 Q 的净荷窗:PPM 输出区前 3 字节 IOPS 前缀不动);I 留着,等下一个程序。幂等。放开之后这个实例不能再用,要重新 PnSService::new()

停 IO 用 stop()stop 之后实例还在,可以再 start

示例:

device.close();