跳到主要内容

诊断

通过 svc.diagnostics 读诊断与报警(diag_snapshot / alarms 仍可用,同一数据)。

配合事件使用

建议通过 事件 驱动异常处理,而非自行轮询。 直接读取诊断属性适用于 UI 显示等场景。

运行态(connected / state / error_code)见 属性与状态机。过程数据读写见 过程数据

功能概览

功能说明
诊断快照链路、帧计数、看门狗、抖动、报警观测
现场问题对照按症状选字段
过程数据质量IOPS / IOCS
报警活动列表 / 历史 / 确认

诊断快照

分组属性类型说明
可用性okbool诊断是否可用。False = 设备未启动,读 message
可用性shared_memory_mappedbool过程数据是否已就绪
可用性messagestr不可用时的原因;可用时为空
可用性timestampdatetime | None快照生成时刻。解析失败为 None
链路statestr运行状态文案
链路link_upbool网卡链路是否 Up
链路connectedbool周期数据是否正常
链路active_iocr_countint已激活的 IO 连接数
链路iocr_activeintIO 连接激活位图
链路iocr_healthyintIO 连接健康位图
计数heartbeatint心跳计数
计数cycle_counterint周期循环计数
计数last_errorint最近错误码(0 = 无)
计数rx_frames / tx_framesint收 / 发总帧数
计数rx_rt_frames / tx_rt_framesint收 / 发 RT 周期帧
计数dropped_framesint被丢弃的帧
计数invalid_framesint非法帧
计数watchdog_tripsint看门狗超时次数
计数last_rx_tsc / last_tx_tscint最近收 / 发帧 TSC
过程区input_area_lengthint输入区长度(字节)
过程区output_area_lengthint输出区长度(字节)
周期stack_cyclesint周期计数
周期stack_frames_rx / stack_frames_txint收 / 发帧
周期stack_missed_ticksint错过的节拍
周期stack_max_jitter_usint最大抖动(微秒)
报警观测stack_alarm_rx_countint收到控制器报警总数
报警观测stack_alarm_tx_ack_okint本机报警被确认次数
报警观测stack_alarm_tx_ack_failint本机报警确认失败次数
报警观测stack_alarm_ack_pendingint在途报警(0/1)
报警观测stack_alarm_maint_stateint维护请求状态
报警观测stack_alarm_last_arepint最近控制器报警:Arep
报警观测stack_alarm_last_slotint最近控制器报警:槽位
报警观测stack_alarm_last_subslotint最近控制器报警:子槽位
报警观测stack_alarm_last_typeint最近控制器报警:类型
报警观测stack_alarm_last_seqint最近控制器报警:序列号
报警观测stack_alarm_last_usiint最近控制器报警:USI
报警观测stack_alarm_last_lenint最近控制器报警:负载长度
错误error_codeint错误码原值(0 = 无)
错误error_code_enumPnSRuntimeErrorCode上项的枚举形态。未识别值为 UNKNOWN

diag_snapshot

@property
def diag_snapshot(self) -> PnSServiceDiagSnapshot

一次取回当前诊断快照,适合界面刷新和日志。设备尚未启动时 ok == False,读 message,不视为异常。也可写成 PnSDiagSnapshot

示例:

snap = svc.diag_snapshot
if not snap.ok:
print(snap.message)
else:
print("Up" if snap.link_up else "Down")
print("周期交换正常" if snap.connected else "未建立")
print(f"帧: {snap.rx_frames} / {snap.tx_frames}")
print(f"看门狗: {snap.watchdog_trips}")

现场问题对照

现场症状看哪些字段
网线没插好diag_snapshot.link_up
周期数据通不通diag_snapshot.connected
看门狗反复跳diag_snapshot.watchdog_trips
帧在丢dropped_frames + invalid_frames
周期稳不稳stack_max_jitter_us + stack_missed_ticks
控制器报警没消化stack_alarm_ack_pending / stack_alarm_tx_ack_fail
本机有没有活动报警alarms / alarm_count

过程数据质量

io_status

@property
def io_status(self) -> PnSServiceIoStatus

IOPS / IOCS 快照。0x80 = GOOD,0x00 = BAD。掉线如实全 BAD。未启动 / 失败返回空状态,判据全 False。也可写成 PnSIoStatus

属性类型说明
input_iops / input_iocsbytes输入 IOPS / IOCS
output_iops / output_iocsbytes输出 IOPS / IOCS
input_validbool本轮收到过 I 区
output_validbool本轮写过 Q 区已送达控制器(掉线、未送出 = False)
input_data_goodbool收到过且输入 IOPS 全 GOOD
output_data_goodbool写过且输出 IOPS 全 GOOD
output_consumedbool输出 IOCS 全 GOOD
all_goodbool上面三项都真

示例:

if not svc.io_status.all_good:
print(svc.io_status)

报警

分组属性类型说明
计数alarm_countint活动报警总数。与 alarms 同源
计数critical_alarm_countintCritical 报警数
列表alarmslist[PnSServiceAlarm]当前活动报警。空列表 = 无活动报警,不是失败
列表alarm_historylist[PnSServiceAlarm]历史(最近 500 条,时间升序)。空列表 = 无历史

alarms

@property
def alarms(self) -> list

当前活动报警。无活动报警返回空列表,不是失败。也可写成 PnSAlarmItem

示例:

for a in svc.alarms:
print(a)

alarm_history

@property
def alarm_history(self) -> list

报警历史(最近 500 条,时间升序)。无历史返回空列表,不是失败。

示例:

for a in svc.alarm_history:
print(a.occurred_at, a.severity, a.message)

acknowledge_alarm

def acknowledge_alarm(self, alarm_id: str) -> None

确认一条活动报警。ID 取自 alarms。空 id 抛 PnSServiceError;无此 ID 也抛。ack_alarm 同义。

示例:

svc.acknowledge_alarm("PnS.LinkDown")

acknowledge_all_alarms

def acknowledge_all_alarms(self) -> int

确认全部活动报警。ack_all_alarms 同义。

返回值:

  • int — 被确认条数(0 = 无活动报警)

示例:

n = svc.acknowledge_all_alarms()
PnSServiceAlarm
属性类型说明
idstr报警 ID(如 PnS.LinkDown
severitystr严重度:Info / Warning / Error / Critical
messagestr报警消息
occurred_atdatetime | None最近一次发生时间。解析失败为 None
countint发生次数(≥1)
sourcestr来源

标识

im_data

@property
def im_data(self) -> PnSServiceImData

订货号、序列号、站名。缺字段保持空 / 0 / False。也可写成 PnSImData

示例:

im = svc.im_data
print(im.station_name, hex(im.vendor_id), hex(im.device_id), im.order_id)