跳到主要内容

PnSService

PROFINET IO Device 的入口。启动设备、写 Q / 读 I、看运行态和诊断。

本 SDK 只做 PROFINET IO Device,不提供其它现场总线协议的入口。

类结构

PnSService                                       # 设备实例

├── process_data → ProcessData # 写 Q / 读 I
│ ├── inputs_mapping / outputs_mapping # 0 拷贝,映射一次
│ ├── read_struct / write_struct # 快照,值不会自己变
│ ├── In # 读 I(模块输入),只读
│ └── Out # 写 Q(模块输出),可写
├── events → PnSEvents # 运行态事件
│ ├── add_connected_changed # 周期交换通断
│ ├── add_state_changed # 运行态变化
│ ├── add_error_occurred # 运行错误
│ └── add_logged # 上面每条都会再打这条
├── diagnostics → PnSDiagnostics # 诊断子对象(快照 / IOPS / 报警 / 记录)
│ ├── snapshot # 诊断快照
│ ├── io_status # IOPS / IOCS
│ ├── alarms / alarm_history # 本机报警 / 历史
│ └── records # 用户区记录

├── connected / state / wait_reason # 周期交换 / 运行态 / 等待原因
├── ever_connected / error_code # 曾经连上 / 运行错误
└── im_data # I&M 标识

写 Q(模块输出,设备 → 控制器),读 I(模块输入,控制器 → 设备)。扁平属性 diag_snapshot / alarms 仍可用,与 diagnostics 同一数据。

用法

启停

from darra_pns import PnSService, PnSErr

with PnSService() as svc:
rc = svc.start()
if rc != PnSErr.OK:
return

while running:
if not svc.connected:
# svc.wait_reason
continue
svc.write_bool("Q0.0", True) # 写 Q
from_plc = svc.read_bool("I0.0") # 读 I

svc.stop()

看状态不必实例:PnSService.is_service_ready / PnSService.service_connected / PnSService.service_wait_reason

过程数据

方式访问说明
过程数据svc.process_data.inputs_mapping(S) / outputs_mapping(S)0 拷贝,映射一次
过程数据svc.process_data快照 read_struct / write_structIn / Out 字节

标识

name = svc.im_data.station_name
vendor = svc.im_data.vendor_id
product = svc.im_data.device_id

过程数据读写

字 / 双字为大端。详见 过程数据

金路径是 0 拷贝:映射一次,源头变字段自己变(结构体须 _pack_ = 1)。

import ctypes

class FromPlc(ctypes.BigEndianStructure):
_pack_ = 1
_fields_ = [("a", ctypes.c_uint8),
("b", ctypes.c_int16),
("flag", ctypes.c_uint8)]

# 0 拷贝:映射一次
inp = svc.process_data.inputs_mapping(FromPlc)
outp = svc.process_data.outputs_mapping(FromPlc)
present = inp.a # 总线刷新后自己变
outp.a = 1 # 直落过程映像

# 快照:拷出来不会自己变
status, pos = svc.process_data.read_struct("Hi")
svc.process_data.write_struct("Hi", 1, -2)

svc.process_data.Out[0].content = 0x11
v = svc.process_data.In[0].content

诊断与报警

通过 svc.diagnostics 读诊断(只读快照:链路、帧计数、看门狗、抖动与报警观测)。详见 诊断。事件见 事件

snap = svc.diagnostics.snapshot
if not snap.ok:
print(snap.message)

for a in svc.diagnostics.alarms:
print(a.message)