跳到主要内容

报警与条件

概述

OPC UA Part 9 在 ConditionType / AlarmConditionType 上定义了固定 NodeId 的标准 Method。SDK 封装为形参清晰的 Python 方法。

MethodNodeId入参
Acknowledgei=9111(event_id: bytes, comment: str)
Confirmi=9113(event_id, comment)
AddCommenti=9029(event_id, comment)
Enablei=2803
Disablei=2805
ConditionRefreshi=3875(subscription_id)
ConditionRefresh2i=12912(subscription_id, monitored_item_id)
OneShotShelvei=9211
TimedShelvei=9213(shelving_time_ms)
Unshelvei=9215

API

方法类别读写说明
ua.acknowledge(condition_id, event_id, comment)报警用户已知
ua.confirm(condition_id, event_id, comment)报警现场已处理
ua.add_comment(condition_id, event_id, comment)报警加备注
ua.enable_condition(condition_id)报警启用
ua.disable_condition(condition_id)报警禁用
ua.condition_refresh(sub_id)报警补发激活报警
ua.condition_refresh2(sub_id, mi_id)报警仅指定 MI
ua.one_shot_shelve(shelving_state_id)报警一次性屏蔽
ua.timed_shelve(shelving_state_id, ms)报警限时屏蔽
ua.unshelve(shelving_state_id)报警取消屏蔽

返回 StatusCode, 失败不抛异常。

代码示例

from opcua import DarraOpcUa, StatusCode

with DarraOpcUa("opc.tcp://server:4840") as ua:
ua.connect()

sub = ua.create_subscription(500)
ev = sub.subscribe_events("i=2253") # ServerObject

@ev.on_event_arrived
def on_event(args):
event_id = args.get_field("EventId").as_byte_string
condition_id = args.get_field("ConditionId").as_string

# a. 让服务端补发当前激活报警
ua.condition_refresh(sub.subscription_id)

# b. 用户点 "确认"
rc = ua.acknowledge(condition_id, event_id, "操作员已知")
if rc != StatusCode.GOOD:
print(f"Acknowledge 失败: {rc}")

# c. 现场处理
ua.confirm(condition_id, event_id, "现场已处理")

# d. 临时屏蔽 30 秒
ua.timed_shelve(condition_id + ".ShelvingState", 30_000.0)

错误处理

StatusCode含义
GOOD成功
BAD_EVENT_ID_UNKNOWNEventId 不匹配
BAD_CONDITION_ALREADY_ENABLED已启用
BAD_CONDITION_ALREADY_SHELVED已屏蔽

最佳实践

  • 首次订阅后必调 condition_refresh
  • acknowledge 后再 confirm, 两步
  • TimedShelve 单位 ms, 不是秒
  • 不要在 on_event 里同步 ack, 推队列后台处理

跨语言对照

C#PythonJavaC++RustC
AcknowledgeacknowledgeacknowledgeAcknowledgeacknowledgeDarraUa_Condition_Acknowledge
ConfirmconfirmconfirmConfirmconfirmDarraUa_Condition_Confirm
ConditionRefreshcondition_refreshconditionRefreshConditionRefreshcondition_refreshDarraUa_Condition_Refresh

下一步