跳到主内容

v0.39.0 版本说明

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-diageneros-diag-recordeneros-diag-waveformeneros-diag-locationeneros-diag-report 五个新 crate 实现。

关键数据

指标数值说明
故障类型识别准确率98.3%含 12 种故障
故障定位误差< 0.5%线路长度
录波分析耗时3.2s单次故障
诊断报告生成8s含 AI 总结
新增 Crate6诊断相关
新增测试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周期分量
峰值绝对最大瞬时值
频率过零检测偏差
谐波FFTTHD
对称分量对称分量法正/负/零序
直流分量衰减拟合时间常数

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);

故障类型矩阵

故障类型代码识别准确率典型特征
三相短路ABC99.5%三相电流同时增大
单相接地AG98.8%零序电流显著
两相短路AB98.2%两相电流增大
两相接地ABG97.5%零序+负序
断线故障OPEN96.0%电流骤降
高阻接地HIF94.2%间歇性电流
振荡OSC97.8%功角摆动
谐振RES95.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(&current_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(&current_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-record COMTRADE 解析在非标准格式时崩溃的问题(#3903)
  • 修复 eneros-diag-waveform CNN 模型在短时扰动下误判的问题(#3910)
  • 修复 eneros-diag-location 行波法在双端时钟不同步时定位偏差的问题(#3916)
  • 修复 eneros-diag-report PDF 生成在中文渲染时乱码的问题(#3922)
  • 修复 eneros-diag 知识图谱查询在大规模案例下超时的问题(#3928)

破坏性变更

  • ComtradeParser::parse:返回类型从 Record 改为 Result<Record>
  • FaultLocator::locate:参数从 &Record 改为 &Record, &Record(双端)
  • ReportGenerator::generate:参数从 &Fault 改为 &FaultEvent

升级指南

  1. 更新 Cargo.toml 中的 eneros 依赖至 0.39.0
  2. 运行 eneros diag init 初始化诊断引擎
  3. eneros.toml 中配置录波文件路径与 ML 模型
  4. 导入历史故障案例至知识图谱

致谢

感谢 40 位贡献者提交的 610+ 个 commit,以及继电保护专家提供的故障样本验证。