SDK 连接契约
先装好 Darra Profinet Slave。用语言 SDK 读写过程数据。
语言 SDK
无参构造,再启动。不传 IP、端口、站名。站名和网卡在配置工具里设。
连上什么样:
| 看什么 | 含义 |
|---|---|
Connected | 控制器已经在换周期数据 |
EverConnected | 曾经连上过。现在没连就是掉线 |
WaitReason / StatusMessage | 还没连上时的原因 |
本机同时只能有一个语言 SDK 在跑过程数据。关掉占用的程序,下一个就能接上。
第二个会话怎么被拒
连接门是全机唯一的(跨进程、跨语言共用一道门)。第二个实时会话一定失败,但各语言的失败形态不同 —— 这不是契约不同,是各语言按自己的惯例报同一件事:
| 语言 | 第二个实时会话 |
|---|---|
| C | PnSServiceConnectRealtime 返回 PNS_ERR_BUSY |
| C++ | Start() 返回 false,原因写 LastError() |
| C# | Start() 抛 InvalidOperationException,并把 PnSErrorCode.Busy 记成最近错误码 |
| Java | start() 抛 PnSServiceException |
| Python | start() 返回 PnSErr.NOT_AVAILABLE(不抛) |
| Rust | start() 返回 Err(ServiceError::RealtimeGate),last_error_code() 是 PnSErrorCode::Busy |
一句话:托管语言(C# / Java)抛异常,C / C++ / Python / Rust 走返回值。每个语言的具体写法见各自的初始化页(同一目录下 c/ cpp/ java/ python/ rust/ 各一份)。
Busy 这个码有两个来源:上一个操作没做完,和这道门被占。见枚举参考。
门什么时候放开
占门的是实例,不是进程。只 Stop 不让出:
| 语言 | 放开实例 |
|---|---|
| C | PnSServiceClose() |
| C++ | Close()(析构也会调) |
| C# | Dispose() —— Stop() 不释放门 |
| Java | close()(try-with-resources 退出会调) |
| Python | close()(with 退出会调) |
| Rust | close()(Drop 会调) |
程序整个退出也算放开:门是内核对象,进程结束时自动回收,不会卡死下一个。