主站诊断
通过 master.Diagnostics 访问所有诊断、监控、统计功能。
配合事件使用
建议通过 事件 驱动异常处理,而非自行轮询。
直接读取诊断属性适用于 UI 显示等场景。
从站诊断
单个从站的状态诊断、链路质量请参考 从站诊断。
功能概览
| 功能 | 说明 |
|---|---|
| 通信与性能统计 | 帧计数、丢包、抖动、WKC、PDO 丢帧、网口状态、拓扑 |
| DC 同步 | 同步窗口阈值、DCSyncLost 事件 |
| 冗余状态 | 冗余激活、断线点检测 |
| 诊断控制 | 启停数据采集、重置统计 |
通信与性能统计
| 类别 | 属性 | 类型 | 访问 | 使能控制 | 说明 |
|---|---|---|---|---|---|
| 帧计数 | RTcnt | int | 只读 | 是 | 每秒帧数(Hz),5秒平均 |
ErrorCnt | uint | 只读 | 是 | 每秒错误数,5秒平均 | |
Lost | float | 只读 | 是 | 最近5秒丢包率(0.0 ~ 1.0) | |
| 周期与抖动 | CycleTimeSpan | int | 只读 | 是 | 实际周期时间(微秒),实时值 |
AvgJitterUs | double | 只读 | 是 | 最近5秒平均抖动(微秒) | |
MaxJitterUs | double | 只读 | 是 | 最近5秒最大抖动(微秒) | |
| 工作计数器 | WKC | ushort | 只读 | 不可停 | 当前工作计数器 |
ExpectedWKC | ushort | 只读 | 不可停 | 期望工作计数器,WKC ≠ ExpectedWKC 表示有从站未正确响应 | |
| PDO 丢帧 | PDO.TotalLost | uint | 只读 | 不可停 | 累计丢帧数(所有组合计) |
PDO.ConsecutiveLost | uint | 只读 | 不可停 | 当前连续丢帧数(所有组中最大值) | |
PDO.GetFrameLossStats(byte group) | PDOFrameLossStats | 只读 | 不可停 | 获取指定组的 PDO 丢帧统计。0-7 返回对应组,不传参数返回所有组汇总。返回值含 TotalLost / ConsecutiveLost / MaxConsecutiveLost | |
| 从站异常 | WorstSlaveIndex | ushort | 只读 | 不可停 | 异常率最高的从站索引 |
WorstLinkQuality | short | 只读 | 不可停 | 最差从站的通信健康度(%),越低越差 | |
| 网口状态 | PrimaryPortOk | bool | 只读 | 不可停 | 主端口是否正常(有流量且5秒内无错误) |
SecondaryPortOk | bool | 只读 | 不可停 | 副端口是否正常(有流量且5秒内无错误,无冗余时始终 false) | |
PrimaryPortErrors | uint | 只读 | 不可停 | 主端口最近5秒错误数 | |
SecondaryPortErrors | uint | 只读 | 不可停 | 副端口最近5秒错误数 | |
| 拓扑 | TopologyDescription | string | 只读 | 不可停 | 拓扑模式描述("线性" / "环形" / "环+分支") |
TimingMode | string | 只读 | 不可停 | 定时模式("硬件定时器" / "软件定时器" / "降级") | |
| DC 同步 | SyncWindowThreshold | int | 读写 | 不可停 | 同步窗口阈值(纳秒),默认 1000ns。超出阈值触发 DCSyncLost 事件 |
| 冗余状态 | RedundancyActive | bool | 只读 | 不可停 | 冗余是否激活(存在断线但网络仍正常运行) |
RingMode | RingMode | 只读 | 不可停 | 环拓扑冗余运行模式(Inactive/Dual/Degraded) | |
BreakPoint | BreakPointInfo? | 只读 | 不可停 | 当前断线点(多个断点只返回第一个)。断线时自动设置,恢复后自动清除,无断线为 null | |
| 诊断控制 | Enabled | bool | 读写 | 诊断数据采集开关(默认关闭)。启用后周期性采样,记录标记为[是]的统计数据 |
计算公式
| 指标 | 公式 | 说明 |
|---|---|---|
| RTcnt | 采样周期帧数 / 窗口秒数 | 滑动窗口平均帧频 |
| ErrorCnt | 采样周期错误数 / 窗口秒数 | 滑动窗口平均错误率 |
| Lost | 错误数 / 帧数 | 滑动窗口丢包比率 |
需 Enabled = true。
PDOFrameLossStats 结构
| 属性 | 类型 | 说明 |
|---|---|---|
| TotalLost | uint | 累计丢帧数 |
| ConsecutiveLost | uint | 当前连续丢帧数 |
| MaxConsecutiveLost | uint | 历史最大连续丢帧数 |
示例:
var diag = master.Diagnostics;
diag.Enabled = true; // 启用诊断数据采集
// 帧计数
Console.WriteLine($"帧频: {diag.RTcnt} Hz");
Console.WriteLine($"丢包率: {diag.Lost:P2}");
Console.WriteLine($"错误数: {diag.ErrorCnt}");
// 周期与抖动
Console.WriteLine($"周期时间: {diag.CycleTimeSpan} µs");
Console.WriteLine($"抖动: 平均 {diag.AvgJitterUs:F2} µs, 最大 {diag.MaxJitterUs:F2} µs");
// WKC
if (diag.WKC != diag.ExpectedWKC)
Console.WriteLine($"WKC 异常: {diag.WKC} / {diag.ExpectedWKC}");
// PDO 丢帧(所有组汇总)
var pdo = diag.PDO;
Console.WriteLine($"PDO 丢帧: 累计={pdo.TotalLost}, 连续={pdo.ConsecutiveLost}");
if (pdo.ConsecutiveLost > 10)
Console.WriteLine("警告: PDO 连续丢帧!");
// 按组查询丢帧(0-7)
var group0Stats = pdo.GetFrameLossStats(0); // 组0(默认组)
var group1Stats = pdo.GetFrameLossStats(1); // 组1
Console.WriteLine($"组0丢帧: {group0Stats.TotalLost}, 组1丢帧: {group1Stats.TotalLost}");
// 从站异常
Console.WriteLine($"最差从站: #{diag.WorstSlaveIndex} ({diag.WorstLinkQuality}%)");
// 网口状态
Console.WriteLine($"主端口: {(diag.PrimaryPortOk ? "正常" : "异常")}");
Console.WriteLine($"副端口: {(diag.SecondaryPortOk ? "正常" : "未连接")}");
// 拓扑信息
Console.WriteLine($"拓扑: {diag.TopologyDescription}");
Console.WriteLine($"定时: {diag.TimingMode}");
从站通信诊断
每个从站的 ESC 端口错误通过 slave.Diagnostics.ReadPortErrors() 获取。详见 从站诊断 - 通信诊断。
foreach (var slave in master.Slaves)
{
var errors = slave.Diagnostics.ReadPortErrors();
if (errors?.HasErrors == true)
Console.WriteLine($"从站 {slave.SlaveNum}: 端口存在错误");
}
DC 同步
自动监控(ETG.1500 5.13.3),每秒检查各从站时间偏差。超出 SyncWindowThreshold 阈值时触发 DCSyncLost 事件。
单个从站
单个从站的同步状态请使用 slave.Diagnostics.DC.IsInSync 和 slave.Diagnostics.DC.SyncTimeDifference。
冗余状态
RingMode 反映环拓扑冗余的运行状态。Inactive 表示冗余未初始化,Dual 表示双向冗余正常工作,Degraded 表示 secondary 链路不可用仅 primary 工作。
BreakPoint 每次读取时实时检测——读取每个从站的端口状态与扫描时的 activeports 对比,找出断线的从站和端口。多个断点只返回第一个。
RingMode 枚举
| 值 | 名称 | 说明 |
|---|---|---|
| 0 | Inactive | 未激活:冗余监控未初始化 |
| 1 | Dual | 双向冗余:双端口发送,正常工作 |
| 2 | Degraded | 降级模式:secondary链路不可用,仅primary工作 |
BreakPointInfo 结构
| 属性 | 类型 | 说明 |
|---|---|---|
| SlaveIndex | ushort | 断线处上一个从站的索引 (1-based) |
| Port | byte | 断线端口号 (0-3, 对应 P0-P3) |
从站冗余诊断
单个从站的冗余状态请参考 从站诊断 - 冗余诊断。
示例:
var diag = master.Diagnostics;
// 环拓扑冗余模式
Console.WriteLine($"冗余模式: {diag.RingMode}");
if (diag.RingMode == RingMode.Degraded)
Console.WriteLine("警告: secondary链路不可用,仅primary工作");
if (diag.RedundancyActive)
Console.WriteLine("冗余已激活");
var bp = diag.BreakPoint;
if (bp != null)
Console.WriteLine($"断线: {bp}"); // 输出: "断线: 从站5 P3"
诊断控制
标记为"是"的属性需先设置 Enabled = true 启动周期性采样,标记为"不可停"的功能始终活跃。
Reset()
public void Reset()
一次性重置所有诊断统计,包括:
- 基础诊断统计(帧错误、WKC 错误等)
- PDO 丢帧统计
- DC 同步窗口统计
- 所有从站的端口错误计数器