事件订阅
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);
| 参数 | 默认 | 说明 |
|---|---|---|
nodeId | null (Server, i=2253) | 事件源节点 |
existingSubscription | null | 复用已存在的 Subscription, null 则内部新建 |
OpcUaEventSubscription
| 成员 | 说明 |
|---|---|
EventArrived | 事件到达回调 |
Dispose() | 移除该 Event MI; 如果是内部新建容器还会销毁容器 |
EventArrivedEventArgs
| 字段 | 类型 | 说明 |
|---|---|---|
Severity | ushort | 严重度 1-1000 |
Message | string | 事件文本 |
SourceName | string | 事件源名 |
Time | DateTime? | 事件发生时间 |
EventType | string | 事件类型 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")));