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_struct、In / 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)