跳到主要内容

事件订阅

OPC UA 事件 (Alarms & Conditions) 通过 SubscribeEvents 订阅. 这是 OPC UA 协议事件, 与 SDK 内部 ua.Events.* 不是一回事.

区别
  • ua.SubscribeEvents(...)OPC UA 协议事件 (报警 / 条件, 服务端推送, 本节)
  • ua.Events.*SDK 内部事件 (会话 / 订阅生命周期, 与协议无关)

签名

public OpcUaEventSubscription SubscribeEvents(
string nodeId = null,
OpcUaSubscription existingSubscription = null);
参数默认说明
nodeIdnull (Server, i=2253)事件源节点
existingSubscriptionnull复用已存在的 Subscription, null 则内部新建

OpcUaEventSubscription

成员说明
EventArrived事件到达回调
Dispose()移除该 Event MI; 如果是内部新建容器还会销毁容器

EventArrivedEventArgs

字段类型说明
Severityushort严重度 1-1000
Messagestring事件文本
SourceNamestring事件源名
TimeDateTime?事件发生时间
EventTypestring事件类型 NodeId

用法

默认订阅 Server 节点

using var evSub = ua.SubscribeEvents();
evSub.EventArrived += (s, e) =>
{
Console.WriteLine($"[{e.Severity}] {e.SourceName}: {e.Message}");
Console.WriteLine($" EventType={e.EventType} Time={e.Time}");
};

Thread.Sleep(TimeSpan.FromMinutes(5));

订阅指定节点的事件

using var evSub = ua.SubscribeEvents("ns=2;s=Line1");  // Line1 必须是 EventNotifier

复用已有 Subscription 容器

using var sub = ua.CreateSubscription(500);
sub.Add("ns=2;s=Counter"); // 数据订阅

// 把 Event MI 挂到同一个容器
using var evSub = ua.SubscribeEvents("ns=2;s=Line1", existingSubscription: sub);

// evSub.Dispose 只移除 Event MI, 不销毁 sub

EventNotifier

只有 EventNotifier Attribute (12) 非 0 的节点才能产生事件. 默认 Server (i=2253) 是 EventNotifier. 自定义节点是否有事件源能力, 看服务端实现.

EventFilter (高级)

OPC UA EventFilter 可以过滤 EventType / Severity / SourceNode, 当前 SDK 默认订阅 BaseEventType (全部事件), 复杂过滤待后续版本暴露.


报警操作 (Acknowledge / Confirm)

收到 AlarmConditionType 事件后, 操作员通常要 Acknowledge (确认). 通过 Call 调用报警节点的 Acknowledge Method:

ua.Call(
objectNodeId: conditionId,
methodNodeId: $"{conditionId}.Acknowledge",
new Variant(eventId), new Variant(new LocalizedText("Operator confirmed")));

下一步