EnerOS v0.39.0
发布日期:2026-06-13
版本代号:Diag
Git Tag:v0.39.0
支持状态:稳定(Stable)
Crate 总数:102(新增 6 个)
测试用例数:12800+(新增 700)
概述
EnerOS v0.39.0「Diag」是故障诊断专题版本,将电力系统故障诊断能力从「人工分析录波文件」升级为「AI 驱动的自动诊断 + 波形识别 + 精准定位 + 报告生成」全自动化流程。本版本基于 v0.31.0 的 AI Agent、v0.32.0 的 ML 运行时与 v0.38.0 的仿真能力,构建了电网故障诊断的智能闭环。
Diag 版本的核心设计哲学是「录波即证据 + AI 即专家」——故障录波器记录的波形是故障的客观证据,AI 诊断引擎扮演领域专家的角色,从波形中提取特征、识别故障类型、定位故障位置、追溯故障成因,并生成结构化诊断报告。这使得故障平均诊断时间从小时级压缩到分钟级,大幅缩短故障恢复时间。
本版本引入五大核心能力:故障录波分析、波形识别引擎、故障定位算法、诊断报告生成、故障知识图谱。所有能力均通过 eneros-diag、eneros-diag-record、eneros-diag-waveform、eneros-diag-location、eneros-diag-report 五个新 crate 实现。
关键数据
| 指标 | 数值 | 说明 |
|---|---|---|
| 故障类型识别准确率 | 98.3% | 含 12 种故障 |
| 故障定位误差 | < 0.5% | 线路长度 |
| 录波分析耗时 | 3.2s | 单次故障 |
| 诊断报告生成 | 8s | 含 AI 总结 |
| 新增 Crate | 6 | 诊断相关 |
| 新增测试 | 700+ | 含 100 个端到端 |
新特性
1. 故障录波分析
新增 eneros-diag-record crate,提供故障录波文件的解析、标准化与分析能力,支持 COMTRADE 2013 标准格式。
录波文件解析
use eneros_diag_record::{ComtradeParser, Record, Channel};
// 解析 COMTRADE 格式录波文件
let record = ComtradeParser::parse("fault_20260613_001.cfg", "fault_20260613_001.dat")?;
println!("故障时间: {}", record.trigger_time);
println!("采样率: {} Hz", record.sampling_rate);
println!("通道数: {}", record.channels.len());
println!("总采样点: {}", record.total_samples);
// 提取模拟通道(电压/电流)
let voltages = record.analog_channels(AnalogType::Voltage);
let currents = record.analog_channels(AnalogType::Current);
// 提取数字通道(保护动作信号)
let trips = record.digital_channels(DigitalType::Trip);
println!("保护动作序列:");
for trip in &trips {
println!(" {} @ {:?}", trip relay, trip.timestamp);
}
多源录波对齐
use eneros_diag_record::{RecordAligner, TimeSource};
// 多台装置录波对齐(基于 GPS 时标)
let aligner = RecordAligner::new()
.reference(TimeSource::Gps)
.tolerance(Duration::milliseconds(1));
let aligned = aligner.align(vec![record1, record2, record3]).await?;
// 对齐后可跨装置对比波形
for ch in aligned.channels("Bus5.Voltage") {
println!("装置 {}: 峰值 {:.2} kV", ch.device_id, ch.peak_value() / 1000.0);
}
录波数据特征
| 特征 | 计算方法 | 说明 |
|---|---|---|
| 有效值 | 滑窗 RMS | 周期分量 |
| 峰值 | 绝对最大 | 瞬时值 |
| 频率 | 过零检测 | 偏差 |
| 谐波 | FFT | THD |
| 对称分量 | 对称分量法 | 正/负/零序 |
| 直流分量 | 衰减拟合 | 时间常数 |
2. 波形识别引擎
新增 eneros-diag-waveform crate,基于 ML 模型从波形中自动识别故障类型与特征。
故障类型识别
use eneros_diag_waveform::{WaveformAnalyzer, FaultClassifier, FaultType};
let analyzer = WaveformAnalyzer::new(&ctx)
.classifier(FaultClassifier::cnn("fault-cnn-v4"))
.build().await?;
// 分析录波波形
let result = analyzer.analyze(&record).await?;
println!("故障类型: {:?}", result.fault_type);
println!("置信度: {:.1}%", result.confidence * 100.0);
println!("故障相: {:?}", result.faulted_phases);
println!("故障起始时刻: {:?}", result.fault_onset);
println!("故障持续时间: {:?}", result.fault_duration);
println!("故障电流峰值: {:.2} kA", result.peak_fault_current / 1000.0);
故障类型矩阵
| 故障类型 | 代码 | 识别准确率 | 典型特征 |
|---|---|---|---|
| 三相短路 | ABC | 99.5% | 三相电流同时增大 |
| 单相接地 | AG | 98.8% | 零序电流显著 |
| 两相短路 | AB | 98.2% | 两相电流增大 |
| 两相接地 | ABG | 97.5% | 零序+负序 |
| 断线故障 | OPEN | 96.0% | 电流骤降 |
| 高阻接地 | HIF | 94.2% | 间歇性电流 |
| 振荡 | OSC | 97.8% | 功角摆动 |
| 谐振 | RES | 95.5% | 谐波放大 |
波形特征提取
// 提取波形特征向量
let features = analyzer.extract_features(&record);
println!("特征向量维度: {}", features.dim());
println!("关键特征:");
println!(" 零序电流占比: {:.3}", features.zero_seq_ratio);
println!(" 负序电流占比: {:.3}", features.neg_seq_ratio);
println!(" 突变量: {:.3}", features.sudden_change);
println!(" 谐波含量: {:.3}", features.harmonic_content);
println!(" 衰减时间常数: {:.3}s", features.dc_time_constant);
// 特征可视化(用于诊断报告)
let plot = analyzer.plot_waveform(&record, &result);
plot.save("fault_waveform.png").await?;
3. 故障定位算法
新增 eneros-diag-location crate,提供多种故障定位算法,精确计算故障点的位置。
定位算法对比
| 算法 | 数据需求 | 精度 | 适用场景 |
|---|---|---|---|
| 阻抗法 | 单端 | ±2% | 简单快速 |
| 双端法 | 双端 | ±0.5% | 高精度 |
| 行波法 | 双端 | ±0.2% | 超高压 |
| 故障分析 | 多源 | ±1% | 复杂网络 |
| AI 定位 | 历史+实时 | ±0.8% | 复杂故障 |
故障定位 API
use eneros_diag_location::{FaultLocator, LocationMethod, LocationResult};
let locator = FaultLocator::new(&ctx)
.method(LocationMethod::DoubleEnded)
.network(&network)
.build().await?;
// 基于双端测量定位
let location: LocationResult = locator.locate(&record, &record_remote).await?;
println!("故障线路: {}", location.branch_id);
println!("故障距离: {:.2f} km ({:.1}%)",
location.distance_km, location.percentage * 100.0);
println!("定位误差估计: ±{:.2f} km", location.error_estimate);
println!("定位方法: {:?}", location.method);
单端阻抗法
// 基于单端电气量的阻抗法定位
let locator = FaultLocator::new(&ctx)
.method(LocationMethod::Impedance {
algorithm: ImpedanceAlgorithm::Reactance,
compensation: true, // 考虑对端助增
})
.build().await?;
let location = locator.locate_single_ended(&record).await?;
println!("测量阻抗: {:.2f} Ω", location.measured_impedance);
println!("故障距离: {:.2f} km", location.distance_km);
行波法定位
// 基于行波的精确定位
let locator = FaultLocator::new(&ctx)
.method(LocationMethod::TravelingWave {
sampling_rate: 1_000_000, // 1 MHz
wave_speed: 2.98e8, // 光速
})
.build().await?;
let location = locator.locate_traveling_wave(&record, &record_remote).await?;
println!("行波到达时间差: {:.3f} μs", location.time_diff_us);
println!("故障距离: {:.2f} km", location.distance_km);
4. 诊断报告生成
新增 eneros-diag-report crate,自动生成结构化的故障诊断报告,含 AI 分析总结。
报告生成
use eneros_diag_report::{ReportGenerator, ReportConfig, ReportTemplate};
let generator = ReportGenerator::new(&ctx)
.config(ReportConfig {
template: ReportTemplate::Standard,
include_waveform_plots: true,
include_sequence_diagram: true,
include_replay: true,
language: Language::ZhCN,
})
.build().await?;
// 生成诊断报告
let report = generator.generate(&fault_event).await?;
println!("报告 ID: {}", report.id);
println!("故障时间: {}", report.fault_time);
println!("故障类型: {:?}", report.fault_type);
println!("故障位置: {}", report.location_description);
println!("诊断结论: {}", report.conclusion);
// 导出报告
report.save_pdf("fault_report_20260613.pdf").await?;
report.save_html("fault_report_20260613.html").await?;
AI 总结生成
// 使用 LLM 生成诊断总结
let summary = generator.generate_summary(&report).await?;
println!("AI 诊断总结:");
println!("{}", summary);
// 示例输出:
// "2026年6月13日 14:23:05,110kV 线路 L-3 发生 A 相接地故障。
// 故障点位于距首端 12.3 km 处(线路全长 25 km,占比 49.2%)。
// 故障电流峰值 4.82 kA,零序电流显著,判定为单相接地故障。
// 保护装置正确动作,故障在 80ms 内隔离。
// 故障原因分析:结合气象数据,故障期间该区域有雷暴活动,
// 推测为雷击导致绝缘子闪络。建议巡检故障点附近绝缘子。"
报告内容结构
| 章节 | 内容 | 来源 |
|---|---|---|
| 基本信息 | 时间/地点/天气 | 系统 |
| 故障概况 | 类型/相别/持续时间 | 波形识别 |
| 故障定位 | 距离/百分比/误差 | 定位算法 |
| 保护动作 | 动作序列/时限 | 录波数字通道 |
| 波形分析 | 电压/电流曲线 | 录波数据 |
| 仿真对比 | 实际 vs 仿真 | 仿真引擎 |
| 原因分析 | 可能原因/概率 | 知识图谱 |
| 处置建议 | 后续动作 | 规则+LLM |
| AI 总结 | 自然语言总结 | LLM |
5. 故障知识图谱
新增 eneros-diag crate(诊断核心),构建电力故障知识图谱,实现故障原因追溯与经验积累。
知识图谱查询
use eneros_diag::{KnowledgeGraph, FaultCase, CauseNode};
let kg = KnowledgeGraph::new(&ctx);
// 查询相似故障案例
let similar = kg.find_similar(¤t_fault)
.limit(10)
.execute().await?;
println!("相似故障案例:");
for case in &similar {
println!(" {} ({:?}): 相似度 {:.1}%",
case.id, case.fault_type, case.similarity * 100.0);
println!(" 原因: {}", case.root_cause);
println!(" 处置: {}", case.resolution);
}
故障成因分析
// 基于知识图谱的成因推理
let causes = kg.infer_causes(¤t_fault).await?;
println!("可能成因(按概率排序):");
for cause in &causes {
println!(" {} (概率 {:.1}%)", cause.description, cause.probability * 100.0);
if let Some(evidence) = &cause.evidence {
println!(" 证据: {}", evidence);
}
}
知识图谱结构
| 节点类型 | 数量 | 说明 |
|---|---|---|
| 故障类型 | 12 | 标准分类 |
| 故障原因 | 48 | 雷击/鸟害/老化等 |
| 故障征兆 | 35 | 电气特征 |
| 设备类型 | 28 | 关联设备 |
| 历史案例 | 5000+ | 积累案例 |
改进
- 时序引擎:录波数据专用存储路径,写入吞吐提升 5 倍
- ML 运行时:CNN 模型推理支持 GPU 加速,识别延迟降至 50ms
- 仿真引擎:故障仿真场景模板化,复现效率提升 3 倍
- 安全网关:诊断报告访问增加权限控制
- 可观测性:诊断全链路接入追踪系统
Bug 修复
- 修复
eneros-diag-recordCOMTRADE 解析在非标准格式时崩溃的问题(#3903) - 修复
eneros-diag-waveformCNN 模型在短时扰动下误判的问题(#3910) - 修复
eneros-diag-location行波法在双端时钟不同步时定位偏差的问题(#3916) - 修复
eneros-diag-reportPDF 生成在中文渲染时乱码的问题(#3922) - 修复
eneros-diag知识图谱查询在大规模案例下超时的问题(#3928)
破坏性变更
ComtradeParser::parse:返回类型从Record改为Result<Record>FaultLocator::locate:参数从&Record改为&Record, &Record(双端)ReportGenerator::generate:参数从&Fault改为&FaultEvent
升级指南
- 更新
Cargo.toml中的eneros依赖至0.39.0 - 运行
eneros diag init初始化诊断引擎 - 在
eneros.toml中配置录波文件路径与 ML 模型 - 导入历史故障案例至知识图谱
致谢
感谢 40 位贡献者提交的 610+ 个 commit,以及继电保护专家提供的故障样本验证。