Event 事件订阅
OPC UA Server 上的事件 (报警, 状态变化, 自定义消息) 可以通过 EventMonitoredItem 订阅.
配套阅读
- 配套规范 — AC Alarms & Conditions — Severity / EventType 概念
- 基础知识 — 订阅模型 — Subscription 容器
- C# SDK Event Subscription
最简事件订阅
using var evSub = ua.SubscribeEvents(); // 默认订 Server 节点 (i=2253)
evSub.EventArrived += (s, e) =>
{
Console.WriteLine($"[{e.Severity}] {e.SourceName}: {e.Message}");
Console.WriteLine($" Type={e.EventType} Time={e.Time}");
};
Thread.Sleep(TimeSpan.FromMinutes(5));
EventArrived 回调里的字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| Severity | ushort | 严重度 1-1000, 1000 最高 |
| Message | string | 事件文本 |
| SourceName | string | 事件源名 |
| Time | DateTime? | 事件发生时间 |
| EventType | string | 事件类型 NodeId |
订阅指定节点的事件
某些节点 (如某条产线) 自己也是 EventNotifier, 可以单独订:
using var evSub = ua.SubscribeEvents("ns=2;s=Line1");
复用已有 Subscription 容器
如果已经有一个 Subscription 在跑数据订阅, 想把 Event MI 也挂到同一个容器:
using var sub = ua.CreateSubscription(500);
// 数据订阅
sub.Add("ns=2;s=Counter");
// Event 订阅复用同一个容器
using var evSub = ua.SubscribeEvents("ns=2;s=Line1", existingSubscription: sub);
容器所有权
复用容器时, evSub.Dispose 只移除自己的 Event MI, 不销毁容器. 否则 (默认 null) evSub 内部新建 1000ms 容器, 由 evSub 拥有.
事件过滤
当前 SDK 默认订阅所有事件类型 (BaseEventType). 如需按 EventType / Severity 过滤, 需要构造 EventFilter — 详见 SDK 文档 Event 章节.
与统一事件通道的区别
注意区分两个概念:
ua.Events.*— SDK 内部统一事件通道 (Connected/Disconnected/KeepAlive 等), 与 OPC UA 协议无关SubscribeEvents(...)— OPC UA 协议事件 (Alarms & Conditions), 服务端推送