跳到主要内容

报警与条件

概述

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

MethodNodeId入参
Acknowledgei=9111(event_id: vector<uint8_t>, comment: string)
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.AddComment(condition_id, event_id, comment)报警加备注
ua.EnableCondition(condition_id)报警启用
ua.DisableCondition(condition_id)报警禁用
ua.ConditionRefresh(sub_id)报警补发激活报警
ua.ConditionRefresh2(sub_id, mi_id)报警仅指定 MI
ua.OneShotShelve(shelving_state_id)报警一次性屏蔽
ua.TimedShelve(shelving_state_id, ms)报警限时屏蔽
ua.Unshelve(shelving_state_id)报警取消屏蔽

返回 StatusCode, 失败不抛异常。

代码示例

#include <darra/opcua.h>
using namespace darra::opcua;

DarraOpcUa ua("opc.tcp://server:4840");
ua.Connect();

auto sub = ua.CreateSubscription(500);
auto ev = sub->SubscribeEvents("i=2253"); // ServerObject

ev->OnEventArrived([&](const EventArrivedEventArgs& e) {
auto event_id = e.GetField("EventId").AsByteString();
auto condition_id = e.GetField("ConditionId").AsString();

// a. 让服务端补发当前激活报警
ua.ConditionRefresh(sub->SubscriptionId());

// b. 用户点 "确认"
auto rc = ua.Acknowledge(condition_id, event_id, "操作员已知");
if (rc != StatusCode::Good) std::cerr << "Acknowledge 失败: " << rc << "\n";

// c. 现场处理
ua.Confirm(condition_id, event_id, "现场已处理");

// d. 临时屏蔽 30 秒
ua.TimedShelve(condition_id + ".ShelvingState", 30000.0);
});

错误处理

StatusCode含义
Good成功
BadEventIdUnknownEventId 不匹配
BadConditionAlreadyEnabled已启用
BadConditionAlreadyShelved已屏蔽

最佳实践

  • 首次订阅后必调 ConditionRefresh
  • Acknowledge 后再 Confirm, 两步
  • TimedShelve 单位 ms, 不是秒
  • 不要在 OnEventArrived 里同步 ack, 推队列后台处理

跨语言对照

C#PythonJavaC++RustC
AcknowledgeacknowledgeacknowledgeAcknowledgeacknowledgeDarraUa_Condition_Acknowledge
ConfirmconfirmconfirmConfirmconfirmDarraUa_Condition_Confirm
ConditionRefreshcondition_refreshconditionRefreshConditionRefreshcondition_refreshDarraUa_Condition_Refresh

下一步