跳到主要内容

Events — ua.Events.*

DarraOpcUa.Events 是 SDK 内部事件统一通道, 把会话生命周期 / 订阅生命周期 / 数据变化 / 通讯异常都汇集到一个对象上, 方便上层 UI 做日志 / 状态栏 / 调试.

与 OPC UA 协议事件区分
  • ua.Events.* — SDK 内部事件 (本节, 与协议无关)
  • ua.SubscribeEvents(...) — OPC UA 协议事件 (Alarms & Conditions), 见 事件订阅

完整事件清单

会话生命周期

事件EventArgs 字段触发时机
ConnectedEndpointUrl, Status首次连接成功
DisconnectedEndpointUrl, Status, Reason主动 / 被动断开
ReconnectingEndpointUrl检测到断线, 启动自动重连
ReconnectedEndpointUrl自动重连成功
KeepAliveTimestamp, StatusKeepAlive 心跳成功
StateChangedOldState, NewState, Reason任何 SessionState 变化

订阅生命周期

事件触发时机
ServerEvent(SubscriptionCreated, ...)CreateSubscription 成功
ServerEvent(MonitoredItemAdded, ...)sub.Add 成功
ServerEvent(MonitoredItemRemoved, ...)sub.Remove 成功
ServerEvent(SubscriptionLost, ...)订阅被服务端清理
ServerEvent(SubscriptionRestored, ...)TransferSubscriptions 后恢复

数据 / 服务器

事件EventArgs触发时机
DataChange(sub, nodeId, valueString, status)任何订阅 DataChange (统一通道, 与 sub.DataChanged 双发)
ServerEvent(category, severity, source, msg, statusCode)内部 Read / Write / Browse / Call / HistoryRead 等操作

异常

事件EventArgs触发时机
CommunicationError(StatusCode, where, msg)通讯失败 (KeepAlive 失败 / Read 异常等)
SecurityError(StatusCode, msg)加密 / 证书相关错误

OpcUaEventCategory 枚举

ServerEvent 第一个参数是 Category, 完整清单:

Connected, Disconnected, Reconnecting, Reconnected, KeepAlive, StateChanged,
SubscriptionCreated, SubscriptionLost, SubscriptionRestored,
MonitoredItemAdded, MonitoredItemRemoved, SubscriptionCleared,
DataChange, ServerEvent, Alarm,
Read, Write, Browse, Call, HistoryRead,
CommunicationError, SecurityError, ProtocolError,
Info, Diagnostic

OpcUaEventSeverity 枚举

Trace, Debug, Info, Warn, Error, Fatal

用法示例

通用日志钩子 (一行打印 SDK 内所有事件)

ua.Events.ServerEvent += (s, e) =>
{
Console.WriteLine($"[{e.Severity}] [{e.Category}] {e.Source}: {e.Message} ({e.Status})");
};

调试期非常省事 — 不订阅具体事件, 一行 hook 看全部.

状态栏绑定 (WPF)

ua.Events.StateChanged += (s, e) =>
{
Dispatcher.Invoke(() =>
{
statusLabel.Text = $"{e.NewState}";
statusLabel.Foreground = e.NewState == SessionState.Connected
? Brushes.Green : Brushes.Red;
});
};

错误统计

int errorCount = 0;
ua.Events.CommunicationError += (s, e) => Interlocked.Increment(ref errorCount);

与订阅 DataChanged 的关系

订阅 sub.DataChanged 仅收到该订阅的事件; ua.Events.DataChange 收到 SDK 下所有订阅的事件 (统一通道). 两者并存, 上层按场景选用:

  • 单订阅业务逻辑 → sub.DataChanged
  • 全局日志 / 录波 / 调试 → ua.Events.DataChange

线程模型

必须切回 UI 线程

事件回调在 C 层 Publish 线程上调用, 不在调用方线程. UI 操作必须 Dispatcher.Invoke / this.Invoke 切回 UI 线程, 否则跨线程 UI 操作抛 InvalidOperationException.

不要在事件里执行长操作 (>100 ms), 否则会阻塞 Publish 队列.

下一步