事件
通过 device.Events 订阅运行态事件。
自动日志
每个事件触发时都会再打 Logged(等级跟随源事件),无论是否另订了对应事件。绑 Logged 即可收到中文消息。
功能概览
| 类别 | 事件 | 说明 | 自动日志 |
|---|---|---|---|
| 连接 | device.Events.ConnectedChanged | 与 IO 控制器的周期交换通断 | ✓ |
| 运行态 | device.Events.StateChanged | 运行态变化 | ✓ |
| 运行错误 | device.Events.ErrorOccurred | 运行错误 | ✓ |
| 日志 | device.Events.Logged | 上面每条事件都会再打这条 | — |
连接
ConnectedChanged
device.Events.ConnectedChanged += (sender, e) => { };
// EventHandler<PnSConnectedChangedEventArgs>
周期数据交换通断时触发(Connected == false 且 EverConnected == true = 掉线;EverConnected == false = 从未连上)。
回调参数:
public sealed class PnSConnectedChangedEventArgs : EventArgs
{
public bool Connected { get; } // 当前是否在换周期数据
public bool EverConnected { get; } // 是否曾经连上过
public PnSEventLevel Level { get; } // 连接 = Info;掉线 / 从未连上 = Warn
}
示例:
device.Events.ConnectedChanged += (sender, e) =>
{
if (!e.Connected && e.EverConnected)
Console.WriteLine("掉线");
};
运行态
StateChanged
device.Events.StateChanged += (sender, e) => { };
// EventHandler<PnSStateChangedEventArgs>
运行态变化时触发(SDK 只观测,不主动切状态)。
回调参数:
public sealed class PnSStateChangedEventArgs : EventArgs
{
public PnSState OldState { get; } // 变化前,见 [PnSState](./api#pnsstate)
public PnSState NewState { get; } // 变化后
public PnSEventLevel Level { get; } // Info
}
示例:
device.Events.StateChanged += (sender, e) =>
Console.WriteLine($"{e.OldState} → {e.NewState}");
ErrorOccurred
device.Events.ErrorOccurred += (sender, e) => { };
// EventHandler<PnSErrorEventArgs>
运行错误出现时触发;e.ErrorCode 是 int 原值,枚举形态请用 device.ErrorCode。
回调参数:
public sealed class PnSErrorEventArgs : EventArgs
{
public int ErrorCode { get; } // 运行错误原值(不是枚举)
public string Message { get; } // 中文消息
public PnSEventLevel Level { get; } // Warn
}
示例:
device.Events.ErrorOccurred += (sender, e) =>
Console.WriteLine($"{e.ErrorCode}: {e.Message}");
日志
Logged
public event Action<PnSEventLevel, string> Logged;
每个事件触发时都会再打这条,等级跟随源事件。
回调参数:
level(PnSEventLevel) — 日志级别message(string) — 日志正文
PnSEventLevel 枚举值
本语言类型名 PnSEventLevel,取值见 枚举参考。
示例:
device.Events.Logged += (PnSEventLevel level, string message) =>
Console.WriteLine($"[{level}] {message}");
线程安全
事件回调不在 UI 线程上触发。更新界面时需要线程同步:
// WinForms
device.Events.ConnectedChanged += (sender, e) =>
this.Invoke(() => labelStatus.Text = e.Connected ? "已连接" : "未连接");
// WPF
device.Events.ConnectedChanged += (sender, e) =>
Dispatcher.Invoke(() => StatusText = e.Connected ? "已连接" : "未连接");