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.0 | v0.13.0 | 提升 |
|---|---|---|---|
| 孪生体同步延迟 | N/A | 80ms | 实时级 |
| 历史回放精度 | N/A | 99.97% | 高保真 |
| What-if 计算耗时 | 离线分钟级 | 1.2s | 在线级 |
| 状态估计精度 | 92% | 99.2% | +7.2pp |
| 孪生体规模 | N/A | 10万节点 | 省级电网 |
新特性
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 遥测 | 48000 | 1s | 80ms | < 0.01% |
| PMU 相量 | 1200 | 20ms | 25ms | < 0.05% |
| 故障录波 | 256 | 事件触发 | 50ms | 0% |
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?;
快照存储策略
| 快照类型 | 触发方式 | 保留时长 | 压缩比 | 单次大小 |
|---|---|---|---|---|
| 实时快照 | 每 200ms | 7 天 | 8:1 | 2-4MB |
| 分钟快照 | 每 1min | 90 天 | 12:1 | 4-6MB |
| 小时快照 | 每 1h | 1 年 | 15:1 | 6-8MB |
| 事件快照 | 操作前 | 永久 | 10:1 | 4-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 性能指标
| 场景规模 | 节点数 | 模拟时长 | 计算耗时 | 加速比 |
|---|---|---|---|---|
| 小型 | 100 | 10min | 80ms | 7500x |
| 中型 | 1000 | 10min | 450ms | 1333x |
| 大型 | 10000 | 10min | 1.2s | 500x |
| 省级 | 50000 | 10min | 6.8s | 88x |
改进
- 拓扑引擎:
eneros-topology支持增量拓扑变更通知,孪生体可在 50ms 内感知物理拓扑变化 - 状态估计:引入 PMU 相量数据融合,状态估计精度从 92% 提升至 99.2%
- 存储压缩:孪生体快照采用 ZSTD 列式压缩,存储占用降低 70%
- API:新增 GraphQL 孪生体查询接口,支持复杂状态检索
Bug 修复
- 修复
eneros-twin在拓扑变更时状态估计发散的问题(#1305) - 修复
eneros-twin-syncPMU 数据乱序到达导致状态跳变的问题(#1312) - 修复
eneros-twin-replay跨快照回放时事件丢失的问题(#1319) - 修复
eneros-twin-whatif在大电网下潮流不收敛的问题(#1325)
破坏性变更
Twin::new必须指定 source_network:原默认空网络行为移除Snapshot::capture改为 async:原同步签名迁移至capture_blockingStateEstimator::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()?;