跳到主要内容

Event 事件订阅

OPC UA Server 上的事件 (报警, 状态变化, 自定义消息) 可以通过 EventMonitoredItem 订阅.

配套阅读

最简事件订阅

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 回调里的字段:

字段类型说明
Severityushort严重度 1-1000, 1000 最高
Messagestring事件文本
SourceNamestring事件源名
TimeDateTime?事件发生时间
EventTypestring事件类型 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), 服务端推送

相关链接