跳到主内容

v0.13.0 版本说明

EnerOS v0.13.0

发布日期:2025年01月05日 版本代号:Twin Git Tag:v0.13.0 支持状态:稳定(Stable) Crate 总数:30(新增 4 个) 测试用例数:4120+(新增 540)

版本概述

EnerOS v0.13.0「Twin」是 EnerOS 进入「虚实融合」阶段的核心版本,本版本的核心目标是引入数字孪生引擎(Digital Twin Engine),为物理电网构建高保真实时镜像,使调度员、Agent 与分析任务能够在数字孪生体上进行状态观测、历史回放与 What-if 分析,而不影响真实电网运行。

电力系统是典型的「不能在真实系统上试错」的领域——开关操作、发电机出力调整、负荷切除等操作一旦执行即产生物理后果,错误操作可能导致大面积停电。传统方案依赖离线仿真工具(如 PSS/E、BPA),但离线仿真的数据滞后于实时状态,且无法与在线 Agent 协同。v0.13.0 将数字孪生能力下沉为操作系统内核一等公民,使孪生体始终与物理电网保持秒级内同步,且可被 Agent 直接调用进行决策预演。

本版本引入了 eneros-twin(孪生引擎核心)、eneros-twin-sync(实时镜像同步)、eneros-twin-replay(历史回放)、eneros-twin-whatif(What-if 分析)四个新 crate。设计哲学是「孪生即镜像,镜像即可验」——孪生体不是简单的数据副本,而是包含完整电气模型、物理约束、设备特性的可执行镜像,任何在孪生体上的操作都会经过与真实系统相同的物理约束校验。

关键数据

指标v0.12.0v0.13.0提升
孪生体同步延迟N/A80ms实时级
历史回放精度N/A99.97%高保真
What-if 计算耗时离线分钟级1.2s在线级
状态估计精度92%99.2%+7.2pp
孪生体规模N/A10万节点省级电网

新特性

1. 数字孪生引擎

引入 eneros-twin crate,提供完整的数字孪生体生命周期管理。孪生体是物理电网的可执行镜像,包含拓扑模型、设备参数、实时状态、历史轨迹四类数据,并内置物理约束引擎确保孪生体状态始终满足电气定律。

孪生体创建

use eneros_twin::{Twin, TwinId, TwinConfig};
use eneros_topology::Network;

// 基于现有拓扑创建孪生体
let twin = Twin::new(TwinId::from("grid-province-a"))
    .source_network(&network)
    .config(TwinConfig {
        fidelity: Fidelity::High,
        sync_mode: SyncMode::Realtime,
        state_estimation: true,
        physics_engine: PhysicsEngine::NewtonRaphson,
        history_depth: Duration::days(30),
    })?;

// 启动孪生体
twin.start().await?;

孪生体保真等级

保真等级模型精度状态更新物理约束适用场景
Low拓扑级5s拓扑连通性概览监控
Medium等值电路1s潮流平衡调度培训
High详细设备200ms完整约束决策预演
Ultra元器件级50ms电磁暂态故障分析

孪生体状态查询

// 查询孪生体当前状态
let state = twin.current_state()?;
println!("总线 1 电压: {:.3} pu", state.bus(1).voltage);
println!("线路 12-14 有功: {:.1} MW", state.line(12, 14).p_mw);

// 查询设备状态
let transformer = state.transformer(7);
println!("变压器分接头: {}", transformer.tap_position);
println!("变压器负载率: {:.1}%", transformer.loading * 100.0);

2. 实时镜像同步

引入 eneros-twin-sync crate,将物理电网的实时遥测数据持续同步到孪生体,保持孪生体与物理电网的状态一致性。同步采用增量更新 + 状态估计混合模式,在数据缺失时通过状态估计填补。

同步配置

use eneros_twin_sync::{SyncEngine, SyncConfig};

let sync = SyncEngine::new(&twin)
    .config(SyncConfig {
        sync_interval: Duration::milliseconds(200),
        state_estimation: true,
        bad_data_detection: BadDataDetection::ChiSquare,
        observable_check: true,
        pseudo_measurement: true,
    })?;

// 绑定遥测数据源
sync.bind_source(telemetry_stream).await?;

状态估计

use eneros_twin_sync::StateEstimator;

let estimator = StateEstimator::new(&twin)
    .method(EstimationMethod::Wls)  // 加权最小二乘
    .max_iterations(20)
    .convergence_tolerance(1e-6);

// 执行状态估计
let result = estimator.estimate().await?;
println!("估计精度: {:.2f}%", result.accuracy * 100.0);
println!("不良数据: {} 个", result.bad_data_count);

同步性能指标

数据源数据点数同步周期端到端延迟丢点率
SCADA 遥测480001s80ms< 0.01%
PMU 相量120020ms25ms< 0.05%
故障录波256事件触发50ms0%

3. 状态快照

孪生体支持周期性与按需状态快照,将完整电网状态序列化为不可变快照,用于历史回放与对比分析。快照采用列式压缩存储,单次快照仅占 2-8MB。

快照操作

use eneros_twin::snapshot::{Snapshot, SnapshotId};

// 创建手动快照
let snapshot = twin.snapshot()
    .tag("pre-dispatch-check")
    .metadata("operator", "zhang")
    .capture()
    .await?;

// 列出历史快照
let snapshots: Vec<Snapshot> = twin.snapshots()
    .range(now() - Duration::hours(24), now())
    .list()?;

// 从快照恢复孪生体状态
twin.restore(&snapshot).await?;

快照存储策略

快照类型触发方式保留时长压缩比单次大小
实时快照每 200ms7 天8:12-4MB
分钟快照每 1min90 天12:14-6MB
小时快照每 1h1 年15:16-8MB
事件快照操作前永久10:14-6MB

4. 历史回放

引入 eneros-twin-replay crate,支持从任意历史时间点回放电网运行过程,可调节回放速度、视角与粒度,用于事故分析、培训演练与合规审计。

回放控制

use eneros_twin_replay::{Replay, ReplayConfig, Speed};

let replay = Replay::new(&twin)
    .config(ReplayConfig {
        start_time: "2025-01-03T14:30:00Z".parse()?,
        end_time: "2025-01-03T15:00:00Z".parse()?,
        speed: Speed::Realtime,
        focus_area: Some(BusId::from(110).into()),
    })?;

// 开始回放
replay.play().await?;

// 暂停 / 快进 / 倒退
replay.pause().await?;
replay.set_speed(Speed::Fast(10.0)).await?;
replay.seek("2025-01-03T14:45:00Z").await?;

回放事件追踪

// 监听回放期间的事件
replay.on_event(|event| {
    match event {
        ReplayEvent::SwitchOperated(switch_id, state) => {
            log::info!("开关 {} 操作至 {}", switch_id, state);
        }
        ReplayEvent::FaultDetected(fault) => {
            log::warn!("检测到故障: {:?}", fault);
        }
        ReplayEvent::VoltageViolation(bus, value) => {
            log::warn!("母线 {} 电压越限: {:.3} pu", bus, value);
        }
    }
});

5. What-if 分析

引入 eneros-twin-whatif crate,支持在孪生体上进行假设性操作并预测其后果,且不影响真实电网。What-if 分析是 Agent 决策预演的核心能力——Agent 在执行真实操作前,先在孪生体上验证操作的安全性。

What-if 场景

use eneros_twin_whatif::{WhatIf, Scenario, Action};

// 构造一个 What-if 场景
let scenario = Scenario::new("open-line-12-14")
    .initial_state(&twin.current_state()?)
    .action(Action::OpenLine { from: 12, to: 14 })
    .action(Action::AdjustGeneration { bus: 5, delta_mw: 50.0 })
    .duration(Duration::minutes(10))
    .step(Duration::seconds(1));

// 执行 What-if 分析
let result = WhatIf::run(&scenario).await?;

// 查看预测结果
println!("潮流是否收敛: {}", result.converged);
println!("最大电压偏差: {:.3} pu", result.max_voltage_deviation);
println!("越限设备数: {}", result.violations.len());

for violation in &result.violations {
    println!("  - {:?}: {:.3} (限值 {:.3})",
        violation.equipment, violation.value, violation.limit);
}

What-if 决策预演

// Agent 在执行真实操作前进行预演
async fn safe_dispatch(ctx: &Context, cmd: DispatchCommand) -> Result<()> {
    // 1. 在孪生体上预演
    let scenario = Scenario::from_current(&ctx.twin)
        .action(Action::Dispatch(cmd.clone()))
        .duration(Duration::minutes(5));
    
    let result = WhatIf::run(&scenario).await?;
    
    // 2. 校验预演结果是否安全
    if !result.is_safe() {
        return Err(DispatchError::UnsafePrediction(result.violations));
    }
    
    // 3. 预演通过,执行真实操作
    ctx.syscall(ExecuteDispatch(cmd)).await?;
    Ok(())
}

What-if 性能指标

场景规模节点数模拟时长计算耗时加速比
小型10010min80ms7500x
中型100010min450ms1333x
大型1000010min1.2s500x
省级5000010min6.8s88x

改进

  • 拓扑引擎eneros-topology 支持增量拓扑变更通知,孪生体可在 50ms 内感知物理拓扑变化
  • 状态估计:引入 PMU 相量数据融合,状态估计精度从 92% 提升至 99.2%
  • 存储压缩:孪生体快照采用 ZSTD 列式压缩,存储占用降低 70%
  • API:新增 GraphQL 孪生体查询接口,支持复杂状态检索

Bug 修复

  • 修复 eneros-twin 在拓扑变更时状态估计发散的问题(#1305)
  • 修复 eneros-twin-sync PMU 数据乱序到达导致状态跳变的问题(#1312)
  • 修复 eneros-twin-replay 跨快照回放时事件丢失的问题(#1319)
  • 修复 eneros-twin-whatif 在大电网下潮流不收敛的问题(#1325)

破坏性变更

  • Twin::new 必须指定 source_network:原默认空网络行为移除
  • Snapshot::capture 改为 async:原同步签名迁移至 capture_blocking
  • StateEstimator::estimate:返回类型新增 bad_data 字段

性能提升

  • 孪生体同步延迟从 500ms 降至 80ms(提升 6.3 倍)
  • What-if 计算耗时从离线分钟级降至 1.2s(在线级)
  • 状态估计精度从 92% 提升至 99.2%
  • 快照存储压缩比从 4:1 提升至 12:1

贡献者

本版本由 24 位贡献者共同完成,提交 412 次。特别感谢:

  • @twin-engine:数字孪生引擎核心架构
  • @state-estimator:WLS 状态估计与 PMU 融合
  • @replay-master:历史回放与事件追踪
  • @whatif-arch:What-if 分析与决策预演

升级指南

从 v0.12.0 升级

1. 更新依赖

# Cargo.toml
[dependencies]
eneros-twin = { version = "0.13", features = ["high-fidelity"] }
eneros-twin-sync = { version = "0.13" }
eneros-twin-replay = { version = "0.13" }
eneros-twin-whatif = { version = "0.13" }

2. 初始化孪生体

use eneros_twin::Twin;

// 基于现有拓扑创建默认孪生体
let twin = Twin::new(TwinId::from("default"))
    .source_network(&network)
    .config(TwinConfig {
        fidelity: Fidelity::High,
        sync_mode: SyncMode::Realtime,
        ..Default::default()
    })?;

twin.start().await?;

3. 启用状态估计

# eneros.toml
[twin]
enabled = true
fidelity = "high"
state_estimation = true
estimation_method = "wls"
history_depth_days = 30

4. 配置 Agent 决策预演

建议为关键操作类 Agent 启用 What-if 预演,确保操作安全性:

Agent::new("dispatcher", tenant)
    .preflight_check(PreflightConfig {
        what_if_enabled: true,
        scenario_duration: Duration::minutes(5),
        safety_threshold: 0.99,
    })
    .spawn()?;