跳到主要内容

事件

通过 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 == falseEverConnected == 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 ? "已连接" : "未连接");