EnerOS v0.22.0 版本说明
发布日期:2025-07-13 版本代号:Physics Git Tag:v0.22.0 支持状态:稳定(Stable) Crate 总数:52(新增 4 个) 测试用例数:6600+(新增 500+)
概述
EnerOS v0.22.0「Physics」是物理约束决策专项版本,将电力系统的物理约束从「事后校验」升级为「事前感知、事中约束、事后回溯」的全生命周期决策框架。电力系统区别于通用 IT 系统的根本特征在于其受物理定律支配:基尔霍夫定律约束潮流分布,热力学定律约束设备载流能力,电压稳定极限约束运行边界。v0.22.0 将这些物理约束内建为决策引擎的一等输入,使得 Agent 的每一次决策都天然符合物理可行性。
本版本引入了四大核心能力:物理约束决策框架(Physics-Constrained Decision)、潮流约束感知(Power Flow Constraint Awareness)、电压稳定约束(Voltage Stability Constraint)、热稳定约束(Thermal Stability Constraint),并集成了约束优化求解器(Constraint Optimization Solver),支持线性规划(LP)、二次规划(QP)、混合整数线性规划(MILP)三类求解。
设计哲学上,v0.22.0 强化了「约束即法律」原则:任何 Agent 的决策建议在执行前都必须经过 ConstraintEngine 的强制投影,违反物理约束的动作会被自动修正或拒绝。这使得 EnerOS 在引入 AI 决策的不确定性时仍能保证电网运行安全。
关键数据
| 指标 | 数值 | 说明 |
|---|---|---|
| 约束类型 | 12 类 | 电压/电流/频率/热稳定等 |
| 约束校验延迟 | < 10μs | 单条约束内核态 |
| LP 求解(1000 变量) | 8ms | 单纯形法 |
| QP 求解(500 变量) | 15ms | 内点法 |
| MILP 求解(100 二元) | 120ms | 分支定界 |
| 新增 Crate | 4 | 物理约束相关 |
| 新增测试 | 500+ | 含 IEEE 标准算例 |
新特性
1. 物理约束决策框架
引入 eneros-physics-decision Crate,提供统一的物理约束决策框架。所有 Agent 决策均通过 PhysicsAwareDecision 包装,自动注入当前电网运行状态与约束边界。
决策包装器
use eneros_physics_decision::{PhysicsAwareDecision, DecisionContext};
let ctx = DecisionContext::from_snapshot(&network_snapshot)
.with_voltage_limits(VoltageLimits {
normal: (0.95, 1.05), // pu
emergency: (0.90, 1.07),
})
.with_thermal_limits(thermal_limits_from_equipment(&library));
let decision = PhysicsAwareDecision::new(Action::AdjustGenerator {
gen_id: 1,
target_mw: 200.0,
}).with_context(&ctx);
// 执行前自动校验物理约束
match decision.validate().await {
Ok(projected) => ctx.syscall(Execute(projected)).await?,
Err(violations) => {
for v in violations {
log::warn!("约束违反: {} 越限 {:.2}%", v.constraint, v.margin_pct);
}
}
}
约束类型清单
| 约束类别 | 约束项 | 校验方式 |
|---|---|---|
| 电压约束 | 母线电压上下限 | 解析 |
| 电压约束 | 电压变化率 | 解析 |
| 电流约束 | 线路载流量 | 解析 |
| 电流约束 | 变压器过载 | 解析 |
| 频率约束 | 系统频率偏差 | 解析 |
| 频率约束 | 频率变化率 | 解析 |
| 热稳定约束 | 设备温升 | 数值积分 |
| 热稳定约束 | 累积热量 | 数值积分 |
| 稳定约束 | 暂态稳定裕度 | 仿真 |
| 稳定约束 | 小信号阻尼比 | 特征值 |
| 备用约束 | 旋转备用容量 | 解析 |
| 拓扑约束 | 电气岛连通性 | 图论 |
2. 潮流约束感知
引入 eneros-powerflow-aware Crate,使 Agent 在决策时感知潮流分布约束。任何动作(如调整发电机出力、切除负荷、操作开关)都会触发潮流灵敏度分析,评估对全网潮流的影响。
潮流灵敏度
use eneros_powerflow_aware::{Sensitivity, PowerflowAware};
let aware = PowerflowAware::new(&network);
// 计算发电机出力对线路潮流的灵敏度
let sens: Sensitivity = aware.sensitivity()
.factor(Variable::GeneratorMW(1))
.on(Monitor::LineFlow(line_id))
.compute().await?;
// 灵敏度系数:发电机 1 每 1MW 调整对线路 i 潮流的影响
println!("灵敏度系数: {:.6}", sens.coefficient);
潮流约束校验
// 调整发电机出力前,校验是否会导致线路越限
let action = Action::AdjustGenerator { gen_id: 1, target_mw: 250.0 };
let impact = aware.impact_of(&action).await?;
if impact.max_line_loading > 0.95 {
return Err(DecisionError::ThermalViolation {
line: impact.bottleneck_line,
loading: impact.max_line_loading,
});
}
潮流约束指标
| 指标 | 阈值 | 触发动作 |
|---|---|---|
| 线路负载率 | > 95% | 告警 |
| 线路负载率 | > 100% | 阻断 |
| 变压器负载率 | > 90% | 告警 |
| 母线电压偏差 | > 5% | 告警 |
| 母线电压偏差 | > 7% | 阻断 |
3. 电压稳定约束
引入 eneros-voltage-stability Crate,提供电压稳定裕度评估与约束。基于 PV/QV 曲线与连续潮流(CPF)方法,实时计算系统电压稳定裕度。
稳定裕度计算
use eneros_voltage_stability::{VoltageStability, LoadingMargin};
let vs = VoltageStability::new(&network);
// 计算 P-V 曲线与稳定裕度
let margin: LoadingMargin = vs.loading_margin()
.at_bus(bus_id)
.direction(LoadIncrease::Proportional)
.compute().await?;
println!("负荷裕度: {:.1} MW ({:.1}%)", margin.mw, margin.percentage);
if margin.percentage < 15.0 {
return Err(DecisionError::VoltageUnstable {
margin: margin.percentage,
});
}
灵敏度指标
// 计算电压稳定指标(L-index)
let l_index = vs.l_index(bus_id).await?;
// L < 0.0 稳定,L = 1.0 临界
// 计算最小奇异值
let min_svd = vs.min_singular_value().await?;
// 越大越稳定
电压稳定等级
| 等级 | 裕度 | 状态 | 响应 |
|---|---|---|---|
| A | > 20% | 充裕 | 正常调度 |
| B | 15-20% | 良好 | 监控 |
| C | 10-15% | 警戒 | 准备调节 |
| D | 5-10% | 警告 | 主动调节 |
| E | < 5% | 紧急 | 紧急控制 |
4. 热稳定约束
引入 eneros-thermal-stability Crate,提供设备热稳定约束。基于设备热模型(IEEE 738 标准),实时计算线路、变压器的温升与累积热量。
热模型
use eneros_thermal_stability::{ThermalModel, Conductor};
let conductor = Conductor::from_library("LGJ-400/35");
let model = ThermalModel::new(&conductor)
.ambient_temp(35.0) // 环境温度 ℃
.wind_speed(0.5) // 风速 m/s
.solar_radiation(800.0); // 太阳辐射 W/m²
// 计算当前载流下的稳态温度
let steady_temp = model.steady_state_temp(current_amp: 600.0).await?;
// 计算短时过载允许时间
let allowed = model.emergency_rating(
current_amp: 800.0,
max_temp: 80.0,
duration: Duration::minutes(15),
).await?;
println!("允许过载时间: {:?}", allowed.duration);
动态载流量
// 基于气象数据的动态热定额(DLR)
let dlr = model.dynamic_line_rating(&weather).await?;
println!("动态载流量: {:.0} A", dlr.ampacity);
热稳定参数表
| 导线型号 | 稳态载流(A) | 紧急载流(A) | 允许温度(℃) |
|---|---|---|---|
| LGJ-240/30 | 410 | 550 | 70 |
| LGJ-300/25 | 480 | 640 | 70 |
| LGJ-400/35 | 580 | 780 | 70 |
| LGJ-500/45 | 660 | 880 | 70 |
| LGJ-630/55 | 760 | 1020 | 70 |
5. 约束优化求解器
引入 eneros-constraint-solver Crate,集成 LP/QP/MILP 求解器,支持经济调度、最优潮流、机组组合等约束优化问题。
LP 求解(经济调度)
use eneros_constraint_solver::{Problem, Solver, Variable, Constraint, Objective};
let mut problem = Problem::new();
// 决策变量:各发电机出力
let g1 = problem.add_var(Variable::continuous().bounds(0.0, 100.0));
let g2 = problem.add_var(Variable::continuous().bounds(0.0, 200.0));
let g3 = problem.add_var(Variable::continuous().bounds(0.0, 150.0));
// 约束:负荷平衡
problem.add_constraint(Constraint::equal(
vec![(g1, 1.0), (g2, 1.0), (g3, 1.0)],
350.0, // 总负荷 350MW
));
// 约束:备用容量
problem.add_constraint(Constraint::greater_equal(
vec![(g1, 1.0), (g2, 1.0), (g3, 1.0)],
380.0, // 备用 30MW
));
// 目标:成本最小化
problem.set_objective(Objective::minimize(vec![
(g1, 30.0), // 成本系数
(g2, 25.0),
(g3, 40.0),
]));
let solution = Solver::simplex().solve(&problem).await?;
println!("最优出力: G1={:.1}, G2={:.1}, G3={:.1}",
solution.value(g1), solution.value(g2), solution.value(g3));
QP 求解(最优潮流)
// 最优潮流:最小化网损
let opf = OpfProblem::new(&network)
.objective(Objective::MinLoss)
.constraints(Constraints::all()) // 电压/电流/热稳定
.solver(Solver::interior_point());
let result = opf.solve().await?;
求解器性能
| 问题类型 | 规模 | 求解时间 | 算法 |
|---|---|---|---|
| LP | 1000 变量 | 8ms | 单纯形 |
| LP | 10000 变量 | 45ms | 对偶单纯形 |
| QP | 500 变量 | 15ms | 内点法 |
| QP | 5000 变量 | 85ms | 内点法 |
| MILP | 100 二元 | 120ms | 分支定界 |
| MILP | 1000 二元 | 1.2s | 分支定界 + 启发式 |
改进
- 约束缓存:约束校验结果按拓扑指纹缓存,重复校验从 10μs 降至 1μs
- 增量校验:仅校验受影响区域,大电网校验时间减少 70%
- 并行求解:QP 求解器支持多线程,4 核下加速 3.2 倍
- 约束解释:违反约束时输出人类可读的解释,便于运维排查
Bug 修复
- 修复
eneros-constraint在电气岛分裂时约束边界未更新的问题(#2205) - 修复
eneros-powerflow牛顿法在病态系统下不收敛的问题(#2209) - 修复
eneros-thermal环境温度突变的数值振荡问题(#2214) - 修复
eneros-constraint-solverMILP 求解器在退化情况下的死循环(#2219)
破坏性变更
Constraint::check返回类型:从Result<bool>改为Result<ConstraintReport>,包含详细越限信息PowerflowSolver::solve:新增constraints: &ConstraintSet参数,默认可传&ConstraintSet::default()
升级指南
- 执行
cargo update -p eneros-physics-decision - 更新
Constraint::check调用以适配新的ConstraintReport返回类型 - 为
PowerflowSolver::solve提供ConstraintSet参数 - 参考
docs/migration/v0.22.0.md获取详细迁移步骤