跳到主要内容

EventFilter

概述

OPC UA Part 4 §7.18 EventFilter:

  • select_clauses — 抓哪些字段
  • where_clause — 过滤条件 (V1 暂未实现)

SimpleAttributeOperand 字段: type_definition_id / browse_path / attribute_id / index_range。

不传 EventFilter 时默认 5 字段。

代码示例

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

DarraOpcUa ua("opc.tcp://localhost:4840");
ua.Connect();
auto sub = ua.CreateSubscription(500);

EventFilter filter{
.select_clauses = {
SimpleAttributeOperand{ "i=2041", {"EventId"} },
SimpleAttributeOperand{ "i=2041", {"EventType"} },
SimpleAttributeOperand{ "i=2041", {"SourceName"} },
SimpleAttributeOperand{ "i=2041", {"Time"} },
SimpleAttributeOperand{ "i=2041", {"Message"} },
SimpleAttributeOperand{ "i=2041", {"Severity"} },
SimpleAttributeOperand{ "i=2782", {"ConditionId"} },
SimpleAttributeOperand{ "i=2915", {"ActiveState", "Id"} },
}
};

auto ev = sub->SubscribeEvents("i=2253", filter);

ev->OnEventArrived([](const EventArrivedEventArgs& e) {
auto eid = e.fields[0].AsByteString();
auto time = e.fields[3].AsDateTime();
auto msg = e.fields[4].AsString();
auto sev = e.fields[5].AsUInt16();
auto active = e.fields[7].AsBoolean();
std::cout << "sev=" << sev << " " << msg << " active=" << active << "\n";
});

字段速查

EventTypeBrowsePath含义
BaseEventType (i=2041){"EventId"}事件唯一 ID
BaseEventType{"Severity"}严重度 1-1000
ConditionType (i=2782){"ConditionId"}条件 NodeId
AcknowledgeableConditionType (i=2881){"AckedState", "Id"}bool 是否 Ack
AlarmConditionType (i=2915){"ActiveState", "Id"}bool 是否激活

实现说明

  • Stack 不支持时回退默认 5 字段

最佳实践

  • 显式列字段
  • 顺序对齐: fields[i] 顺序就是 select_clauses 顺序
  • 报警面板必抓 ConditionId

跨语言对照

C#PythonJavaC++RustC
EventFilterEventFilterEventFilterEventFilterEventFilterDarraUa_EventFilter
SimpleAttributeOperandSimpleAttributeOperandSimpleAttributeOperandSimpleAttributeOperandSimpleAttributeOperandDarraUa_SimpleAttributeOperand

下一步