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";
});
字段速查
| EventType | BrowsePath | 含义 |
|---|---|---|
| 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# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| EventFilter | EventFilter | EventFilter | EventFilter | EventFilter | DarraUa_EventFilter |
| SimpleAttributeOperand | SimpleAttributeOperand | SimpleAttributeOperand | SimpleAttributeOperand | SimpleAttributeOperand | DarraUa_SimpleAttributeOperand |