跳到主内容

Power-Native First

核心概念

Power-Native First

Power-Native First 是 EnerOS 最核心的设计哲学:电力系统的领域知识不是外挂的库或配置文件,而是操作系统内核的原生抽象。这意味着电网拓扑、潮流计算、安全约束、设备模型、时序数据等电力领域的核心概念,与文件系统、进程管理、网络栈等传统操作系统概念一样,享有内核态的一等公民地位。

设计动机

传统电力软件的困境

传统电力软件将电网领域知识置于应用层,导致了一系列长期难以解决的问题:

  • 重复建模:每个应用(EMS、DMS、SCADA、配电自动化)都维护自己的电网模型,数据冗余且不一致
  • 校验遗漏:物理约束校验散落在各应用中,部署时容易遗漏,事故后才暴露
  • Agent 孤岛:智能体无法共享统一的电网世界观,跨应用协作需要复杂的接口对接
  • 性能损耗:每次操作都需要在应用层重建电网上下文,无法利用内核态优化
  • 演进困难:电网模型变更需要同步修改多个应用,迭代周期长

Power-Native 的解决思路

EnerOS 将电力领域知识下沉到操作系统内核,所有上层应用通过系统调用访问同一份电网抽象:

┌──────────────────────────────────────────────────┐
│              应用层 (Agents)                      │
│  DispatchAgent / SelfHealingAgent / TradingAgent │
├──────────────────────────────────────────────────┤
│              Agent 运行时                         │
│  eneros-agent / eneros-tool / eneros-reasoning   │
├──────────────────────────────────────────────────┤
│         电力原生内核 (Power-Native Core)          │
│  ├─ NetworkGraph      (拓扑图)                    │
│  ├─ PowerFlowSolver   (潮流求解器)                │
│  ├─ ConstraintEngine  (约束引擎)                  │
│  ├─ EquipmentLibrary  (设备模型库)                │
│  ├─ TimeSeriesEngine  (时序存储)                  │
│  └─ TopologyAwareBus  (事件总线)                  │
├──────────────────────────────────────────────────┤
│              基础设施层                           │
│  eneros-os / eneros-trust / eneros-multiregion   │
└──────────────────────────────────────────────────┘

电力原生的四大支柱

1. 电网拓扑一等公民

电网拓扑不再是磁盘上的 CIM/XML 文件或应用内存中的数据结构,而是内核态的图结构。所有 Agent、所有应用共享同一份拓扑视图,并感知其变更。

内核拓扑数据结构

use eneros_topology::{NetworkGraph, Bus, Branch, BusType, Voltage};

// 拓扑图是内核一等公民,进程启动时即加载
let mut network = NetworkGraph::new();

// 添加母线(节点)
network.add_bus(Bus::new(1, BusType::PQ, Voltage::new(1.0, 0.0)))?;
network.add_bus(Bus::new(2, BusType::PV, Voltage::new(1.02, 0.0)))?;
network.add_bus(Bus::new(3, BusType::Slack, Voltage::new(1.05, 0.0)))?;

// 添加支路(边)
network.add_branch(Branch::new(1, 2, BranchParams::line(r=0.01, x=0.05, b=0.02)))?;
network.add_branch(Branch::new(2, 3, BranchParams::transformer(r=0.0, x=0.1, ratio=1.0)))?;

// 内核维护拓扑一致性:增删改自动触发连通性分析
let topology = network.topology();
let islands = topology.find_islands();
let reachable = topology.reachable(bus_id_1, bus_id_2);

// 所有 Agent 共享同一拓扑视图,修改实时广播
let snapshot = network.snapshot(); // CoW 快照,零拷贝读取

拓扑感知的系统调用

// Agent 通过系统调用访问拓扑,无需自己重建
impl Agent for DispatchAgent {
    async fn run(&mut self, ctx: &mut AgentContext) -> AgentResult<()> {
        // 获取所在电气岛
        let island = ctx.syscall(TopologySyscall::GetIsland {
            bus: self.bus_id,
        }).await?;

        // 枚举岛内所有发电机
        let generators = ctx.syscall(TopologySyscall::ListGenerators {
            island_id: island.id,
        }).await?;

        // 执行经济调度
        let dispatch = self.economic_dispatch(&generators, &island.load)?;
        ctx.syscall(TopologySyscall::ApplyDispatch(dispatch)).await?;

        Ok(())
    }
}

2. 物理约束即法律

物理约束(电压越限、支路过载、频率偏差)不是应用层可选的校验步骤,而是内核强制执行的法律。任何违反约束的操作在内核态被直接拒绝,必要时投影到最近可行解。

use eneros_constraint::{ConstraintEngine, Constraint, Violation};

// 约束引擎绑定到内核拓扑,自动校验所有写操作
let constraint_engine = ConstraintEngine::new(&network);

// 注册约束(也可通过配置文件批量加载)
constraint_engine.register(Constraint::voltage()
    .min(0.95).max(1.05)
    .buses(network.all_buses()))?;

constraint_engine.register(Constraint::thermal()
    .branch(branch_id)
    .limit_mva(100.0))?;

constraint_engine.register(Constraint::frequency()
    .min_hz(49.5).max_hz(50.5))?;

// 任何 Agent 命令经过内核时自动校验
let command = Command::SetGeneration { bus: 1, mw: 80.0 };
match constraint_engine.check(&command) {
    CheckResult::Ok => { /* 通过,执行 */ }
    CheckResult::Violated(v) => {
        // 自动投影到最近可行解
        let feasible = constraint_engine.project(&command)?;
        log::warn!("命令被投影: {:?} -> {:?}", command, feasible);
    }
    CheckResult::Rejected(reason) => {
        return Err(EnerOSError::ConstraintRejected(reason));
    }
}

3. 设备模型标准化

EnerOS 内置统一的设备模型库,覆盖电力系统主流设备类型,所有 Agent 共享同一套参数化模型:

设备类型模型关键参数适用场景
传输线π 型等值电路R, X, B/2, 长度输电网潮流
变压器理想变比 + 励磁支路变比, R, X, 励磁电导/电纳变电站潮流
发电机同步电机 6 阶模型Xd, Xq, Xd’, Xq’, Td0’, Tq0’, H, D暂态稳定
负荷ZIP + 指数模型Z% , I%, P%, 指数 α, β静态/动态负荷
SVC静止无功补偿器K, T, Xc, Xl, Vref电压无功控制
风机双馈/直驱风机Cp(λ,β), 电气参数新能源接入
use eneros_equipment::{EquipmentLibrary, LineParams, TransformerParams};

let library = EquipmentLibrary::new();

// 标准化设备参数
let line = library.create_line(LineParams {
    r_per_km: 0.08,
    x_per_km: 0.40,
    b_per_km: 2.5e-6,
    length_km: 50.0,
    rating_mva: 100.0,
    nominal_kv: 110.0,
})?;

let transformer = library.create_transformer(TransformerParams {
    sn_mva: 63.0,
    vn_hv_kv: 110.0,
    vn_lv_kv: 10.0,
    uk_percent: 10.5,
    pk_kw: 280.0,
    i0_percent: 0.5,
    p0_kw: 50.0,
})?;

// 设备模型自动注入拓扑
network.add_branch(Branch::from_equipment(line.id(), bus_a, bus_b))?;
network.add_branch(Branch::from_equipment(transformer.id(), bus_c, bus_d))?;

4. 时序数据原生

电力系统的所有运行状态(电压、电流、功率、频率)本质上都是时序数据。EnerOS 将时序存储引擎内建为内核组件,提供纳秒级精度的写入与查询,无需依赖 InfluxDB、TimescaleDB 等外部数据库。

use eneros_timeseries::{TimeSeriesEngine, Measurement, Aggregation, Duration};

// 时序引擎是内核组件,启动即就绪
let ts = TimeSeriesEngine::open("data/eneros.db")?;

// 高吞吐写入(批量接口)
ts.batch_write(&[
    Measurement::new("bus_1_voltage",    1.02,  now!()),
    Measurement::new("bus_1_frequency", 50.00,  now!()),
    Measurement::new("line_1_power",    45.50,  now!()),
    Measurement::new("bus_2_voltage",    0.99,  now!()),
])?;

// 聚合查询 + 降采样一体化
let result = ts.query()
    .point("bus_1_voltage")
    .range(now!() - Duration::hours(24), now!())
    .aggregation(Aggregation::Avg, Duration::minutes(15))
    .downsample(Downsample::LTTB, 1000)
    .execute()?;

// Agent 直接通过系统调用查询
let history = ctx.syscall(TimeSeriesSyscall::Query {
    point: "total_load",
    range: (now!() - Duration::days(7), now!()),
}).await?;

完整对比:传统 vs Power-Native

维度传统电力软件EnerOS Power-Native
拓扑建模应用层数据结构(CIM/XML)内核一等公民(图结构)
拓扑一致性各应用手动同步内核自动维护
约束校验应用层可选,易遗漏内核强制执行
约束投影不支持或需自实现内核自动投影
设备模型各应用自定义统一模型库
时序数据外部数据库(InfluxDB 等)内核存储引擎
Agent 共享需手动同步自动共享同一视图
安全合规外挂模块内核强制
跨应用协作复杂接口对接系统调用即可
性能应用层重建上下文内核态零拷贝

性能对比

在标准测试环境(4 核 / 8GB / Ubuntu 22.04,IEEE 118-bus 系统)下的对比:

操作传统方案EnerOS Power-Native提升
拓扑加载500-1000ms(XML 解析)< 5ms(内核二进制)100x
拓扑分析(118 节点)50-100ms< 1ms50x
潮流计算(牛顿法)100-300ms< 30ms5x
约束校验(单条指令)1-5ms(应用层)< 10μs(内核态)500x
时序写入1-5万点/秒(网络往返)100万点/秒(内核态)50x
Agent 上下文构建50-200ms(重建模型)< 10μs(系统调用)5000x
跨应用事件广播10-50ms(消息队列)< 10μs(内核总线)1000x

适用场景

Power-Native 架构特别适合以下场景:

  • 大型互联电网:跨区域、跨电压等级的统一建模与协同控制
  • 新能源高比例接入:风电、光伏的随机性需要实时潮流与约束校验
  • 配网智能化:分布式能源、储能、电动汽车的协同管理
  • 数字孪生:物理电网与孪生体的实时同步与镜像推演
  • 多 Agent 协作:调度、自愈、交易等多智能体共享电网世界观
  • 电力市场运营:基于实时拓扑与潮流的市场出清与结算

限制与权衡

Power-Native 架构并非银弹,存在以下权衡:

权衡点说明缓解策略
内核复杂度高电力领域知识进内核,内核代码量增加严格模块化,56 个 crate 解耦
部署门槛需要电力领域知识才能正确配置提供标准模型库与配置模板
通用性降低专为电力场景优化,不适合通用 IoT通过插件框架扩展非电力场景
内存占用内核常驻拓扑与时序缓存支持内存上限配置与 LRU 淘汰
跨平台限制实时域依赖 PREEMPT_RT 或裸机通用域可独立部署于普通 Linux
升级复杂度内核升级需要协调所有 AgentCoW 快照保证热升级一致性

内核架构层次

Power-Native 内核的层次化设计:

┌─────────────────────────────────────────┐
│  系统调用接口 (Syscall ABI)              │  ← Agent 通过 syscall 访问
├─────────────────────────────────────────┤
│  电力原生服务层                          │
│  ├─ TopologyService   (拓扑读写)         │
│  ├─ PowerFlowService  (潮流计算)         │
│  ├─ ConstraintService (约束校验)         │
│  ├─ EquipmentService  (设备模型)         │
│  └─ TimeSeriesService (时序存储)         │
├─────────────────────────────────────────┤
│  电力领域内核                            │
│  ├─ NetworkGraph      (CIM 图结构)       │
│  ├─ Solver            (牛顿/PQ 分解)     │
│  ├─ ConstraintEngine  (约束投影器)       │
│  ├─ EquipmentLibrary  (设备原型库)       │
│  └─ TimeSeriesEngine  (LSM-WAL 存储)     │
├─────────────────────────────────────────┤
│  通用 OS 抽象层                          │
│  └─ Scheduler / Memory / IPC / Network  │
└─────────────────────────────────────────┘

系统调用示例

Agent 通过系统调用访问内核电力服务,无需自己重建任何领域模型:

use eneros_os::syscall::*;

// 拓扑查询
let bus = ctx.syscall(GetBus { id: bus_id }).await?;
let neighbors = ctx.syscall(GetNeighbors { bus: bus_id }).await?;
let island = ctx.syscall(GetIsland { bus: bus_id }).await?;

// 潮流触发
let result = ctx.syscall(SolvePowerFlow {
    method: PowerFlowMethod::NewtonRaphson,
    max_iter: 20,
    tolerance: 1e-6,
}).await?;

// 约束校验
let check = ctx.syscall(CheckConstraint {
    command: command.clone(),
}).await?;

// 时序查询
let series = ctx.syscall(QueryTimeSeries {
    point: "bus_1_voltage",
    range: (start, end),
    aggregation: Some((Aggregation::Avg, Duration::minutes(5))),
}).await?;

// 设备操作
ctx.syscall(SetTapPosition { transformer_id, position: 5 }).await?;
ctx.syscall(SetGeneratorOutput { bus: 1, mw: 80.0 }).await?;

与传统 OS 对比

概念通用 OSEnerOS Power-Native
一等公民文件、进程、套接字母线、支路、设备、约束
系统调用open/read/write/socketGetBus/SolvePowerFlow/CheckConstraint
调度对象进程/线程Agent(绑定电气节点)
强制保护内存隔离、权限位物理约束强制执行
持久化文件系统时序存储引擎
事件机制信号、epoll拓扑感知事件总线

下一步