跳到主内容

v0.35.0 版本说明

EnerOS v0.35.0

发布日期:2026-04-11
版本代号:Edge
Git Tag:v0.35.0
支持状态:稳定(Stable)
Crate 总数:78(新增 6 个)
测试用例数:10000+(新增 700)

概述

EnerOS v0.35.0「Edge」是边缘计算专题版本,将 EnerOS 的运行范围从中心化数据中心扩展到变电站、配电房、杆塔等电网边缘节点。本版本使 EnerOS 能够在资源受限的边缘设备上运行轻量级运行时,支撑就地化数据采集、实时控制、离线自治与数据同步等场景。

Edge 版本的核心设计哲学是「边缘自治 + 云边协同」——边缘节点在网络正常时作为中心集群的延伸,在网络中断时自动切换到离线自治模式,保障保护与控制功能不中断;网络恢复后自动将离线期间产生的数据增量同步回中心。这使得 EnerOS 能够适应电网「广域分布、弱网环境、实时要求高」的物理特征。

本版本引入五大核心能力:轻量级运行时边缘节点管理离线自治模式数据同步引擎云边协同框架。所有能力均通过 eneros-edgeeneros-edge-runtimeeneros-edge-managereneros-edge-offlineeneros-edge-sync 五个新 crate 实现。

关键数据

指标数值说明
边缘运行时内存占用48 MB最小配置
边缘运行时二进制大小12 MBstripped
离线切换时间< 50ms网络中断检测
数据同步吞吐10 万点/秒云边之间
新增 Crate6边缘相关
新增测试700+含 130 个端到端

新特性

1. 轻量级运行时

新增 eneros-edge-runtime crate,提供资源受限环境下的轻量级 EnerOS 运行时。通过特性裁剪、内存池预分配、无分配热路径等手段,将运行时内存占用控制在 48MB 以内,适配 ARM Cortex-A 系列边缘设备。

运行时配置档

配置档内存CPU适用设备功能子集
nano48 MB1 核数据采集终端时序+拓扑只读
micro128 MB2 核配电终端+保护+控制
small256 MB4 核变电站网关+Agent+ML推理
standard512 MB4 核+区域中心全功能

轻量级运行时初始化

use eneros_edge_runtime::{EdgeRuntime, EdgeConfig, Profile};

let runtime = EdgeRuntime::new(EdgeConfig {
    profile: Profile::Micro,
    node_id: EdgeNodeId::from("feeder-rtu-042"),
    data_dir: "/data/eneros",
    max_memory: 128 * 1024 * 1024,  // 128 MB
    max_agents: 8,
    features: FeatureSet {
        topology: true,
        timeseries: true,
        powerflow: false,      // 微型配置禁用潮流
        constraint: true,
        agent: true,
        ml: false,             // 微型配置禁用 ML
        llm: false,            // 微型配置禁用 LLM
    },
}).await?;

runtime.start().await?;

内存优化策略

// 无分配热路径:时序数据写入零分配
let writer = runtime.timeseries_writer()
    .preallocated_buffer(4096)   // 预分配缓冲区
    .zero_copy(true);             // 零拷贝写入

// 数据采集循环不触发堆分配
loop {
    let sample = pmu.read().await;  // 栈上分配
    writer.write(&sample)?;          // 零拷贝
}

资源占用对比

组件标准运行时边缘运行时(micro)裁剪比例
内核服务256 MB48 MB81%
Agent 运行时128 MB32 MB75%
时序引擎512 MB24 MB95%
ML/LLM1 GB0 MB100%
总计~1.9 GB~104 MB95%

2. 边缘节点管理

新增 eneros-edge-manager crate,提供边缘节点的注册、发现、健康监控、远程配置、OTA 升级等全生命周期管理。

节点注册与发现

use eneros_edge_manager::{EdgeManager, EdgeNode, NodeStatus};

let manager = EdgeManager::new(&center_ctx);

// 注册边缘节点
let node = EdgeNode::new("feeder-rtu-042")
    .location("110kV SS-04 配电室")
    .profile(Profile::Micro)
    .capabilities(vec![Capability::DataAcquisition, Capability::Protection])
    .network("10.20.30.42:7890")
    .register(&manager).await?;

// 发现所有在线节点
let nodes = manager.list_nodes(NodeStatus::Online).await?;
for n in &nodes {
    println!("{} @ {} ({}): CPU {:.0}%, MEM {:.0}MB",
        n.id, n.location, n.profile,
        n.health.cpu_usage * 100.0, n.health.memory_used_mb);
}

节点健康监控

指标采集频率告警阈值说明
CPU 使用率10s> 85%持续 60s
内存使用率10s> 90%持续 30s
磁盘使用率60s> 85%持续 5min
网络延迟5s> 500ms持续 10s
时钟偏差60s> 100msNTP 同步

远程配置下发

// 向边缘节点下发配置
manager.deploy_config("feeder-rtu-042", ConfigPatch {
    topology_source: "snapshot-20260411.bin",
    protection_settings: ProtectionSettings {
        overcurrent_pickup: 1200.0,  // A
        overcurrent_delay: Duration::milliseconds(500),
    },
    collection_points: vec![
        CollectionPoint::new("bus_5_voltage", 50.0),   // 50 Hz
        CollectionPoint::new("line_3_current", 50.0),
    ],
}).await?;

OTA 升级

// 批量 OTA 升级
let rollout = manager.ota_rollout()
    .target_nodes(vec!["feeder-rtu-042", "feeder-rtu-043"])
    .package("eneros-edge-0.35.1.bin")
    .strategy(RolloutStrategy::Canary {
        canary_count: 1,
        observation_period: Duration::minutes(30),
    })
    .rollback_on_failure(true)
    .execute().await?;

3. 离线自治模式

新增 eneros-edge-offline crate,使边缘节点在网络中断时能够继续运行保护与控制功能,并在网络恢复后无缝回切。

离线切换

use eneros_edge_offline::{OfflineManager, OfflinePolicy};

let offline_mgr = OfflineManager::new(&runtime)
    .policy(OfflinePolicy {
        detection_timeout: Duration::seconds(3),   // 3 秒无心跳判定离线
        switch_latency: Duration::milliseconds(50), // 切换目标 < 50ms
        autonomy_scope: AutonomyScope::LocalOnly,   // 仅本地自治
        max_offline_duration: Duration::hours(72),  // 最长离线 72 小时
    })
    .build().await?;

// 监听网络状态
offline_mgr.on_state_change(|state| {
    match state {
        OfflineState::Online => log::info!("云边连接正常"),
        OfflineState::Degraded => log::warn!("网络质量下降,准备切换"),
        OfflineState::Offline => {
            log::warn!("进入离线自治模式");
            // 本地保护与控制继续运行
            // 数据写入本地 WAL,待恢复后同步
        }
        OfflineState::Recovering => log::info!("网络恢复,同步数据中"),
    }
}).await?;

离线能力矩阵

功能在线模式离线模式说明
数据采集完整完整不受影响
保护逻辑完整完整本地实时执行
本地控制完整完整自治范围内
全局调度完整冻结使用最后方案
AI 推理云端本地轻量降级模式
历史查询完整本地缓存有限范围
告警上报实时缓存恢复后补发

离线数据持久化

// 离线期间数据写入本地 WAL
let offline_store = offline_mgr.local_store();
offline_store.configure(OfflineStoreConfig {
    max_size: 500 * 1024 * 1024,  // 500 MB
    rotation: RotationPolicy::Size(50 * 1024 * 1024),
    compression: Compression::Zstd,
});

// 离线时自动写入
offline_mgr.on_offline(|ctx| {
    // 重定向时序写入到本地 WAL
    ctx.redirect_timeseries_to_local();
    // 保护事件缓存
    ctx.buffer_protection_events();
});

4. 数据同步引擎

新增 eneros-edge-sync crate,在网络恢复后将边缘节点离线期间产生的数据增量同步回中心,并处理冲突。

同步策略

策略说明适用场景
增量同步仅同步变更数据默认
全量校验校验全量数据一致性定期
双向同步云边双向数据合并协同场景
冲突解决最后写入优先 / 源优先可配置

数据同步 API

use eneros_edge_sync::{SyncEngine, SyncConfig, ConflictResolver};

let sync = SyncEngine::new(&edge_runtime, &center_connection)
    .config(SyncConfig {
        batch_size: 4096,
        parallelism: 4,
        compression: Compression::Zstd,
        conflict_resolver: ConflictResolver::EdgeWins,  // 边缘数据优先
        checkpoint_interval: Duration::minutes(5),
    })
    .build().await?;

// 网络恢复后自动同步
sync.on_recover(|| {
    sync.start_incremental().await?;
}).await?;

// 同步进度监控
sync.on_progress(|progress| {
    println!("同步进度: {:.1}% ({}/{} 条)",
        progress.percentage, progress.synced, progress.total);
}).await?;

冲突处理

// 自定义冲突解决器
let resolver = ConflictResolver::custom(|conflict| {
    match conflict.data_type {
        DataType::Timeseries => {
            // 时序数据:取边缘值(更接近源头)
            Resolution::UseEdge(conflict.edge_value)
        }
        DataType::Topology => {
            // 拓扑数据:取中心值(权威源)
            Resolution::UseCenter(conflict.center_value)
        }
        DataType::Configuration => {
            // 配置数据:合并
            Resolution::Merge(conflict.merge()?)
        }
    }
});

5. 云边协同框架

新增 eneros-edge crate(边缘核心),提供云边任务协同、模型下发、联合推理等能力。

任务卸载

use eneros_edge::{CloudEdgeCoordinator, TaskOffload};

let coordinator = CloudEdgeCoordinator::new(&edge_runtime);

// 边缘资源不足时,将任务卸载到云端
coordinator.on_resource_pressure(|pressure| {
    if pressure.memory > 0.85 {
        // 将 ML 推理任务卸载到云端
        coordinator.offload(TaskType::MlInference).await?;
    }
});

// 云端下发任务到边缘
coordinator.on_remote_task(|task| {
    match task {
        RemoteTask::Inspect(bus_id) => {
            edge_runtime.execute_inspection(bus_id).await?;
        }
        RemoteTask::UpdateModel(name, version) => {
            coordinator.download_model(name, version).await?;
        }
    }
}).await?;

协同模式对比

模式计算数据延迟适用场景
纯边缘边缘边缘最低实时控制
边缘+云端分工分层混合
纯云端云端云端大数据分析
联邦协同不出域隐私保护

改进

  • 时序引擎:边缘模式支持 RocksDB 后端,写入性能提升 2 倍
  • 拓扑加载:二进制快照格式优化,加载时间减少 40%
  • Agent 运行时:边缘 Agent 支持休眠/唤醒,降低空闲功耗
  • 安全网关:云边通信强制 mTLS 双向认证
  • 可观测性:边缘节点指标接入中心 Prometheus 集群

Bug 修复

  • 修复 eneros-edge-runtime 在 ARMv7 设备上内存对齐导致崩溃的问题(#3503)
  • 修复 eneros-edge-manager 节点发现在 NAT 环境下失败的问题(#3510)
  • 修复 eneros-edge-offline 离线切换时未保存最后已知拓扑的问题(#3516)
  • 修复 eneros-edge-sync 大量数据同步时内存峰值过高的问题(#3522)
  • 修复 eneros-edge 云边任务卸载在弱网下超时未重试的问题(#3528)

破坏性变更

  • EdgeRuntime::new:参数从 &str 改为 EdgeConfig
  • OfflineManagerswitch_to_offline 重命名为 activate_autonomy
  • SyncEnginesync_all 拆分为 start_incrementalstart_full

升级指南

  1. 更新 Cargo.toml 中的 eneros 依赖至 0.35.0
  2. 在边缘设备上部署 eneros-edge-runtime 二进制
  3. 在中心集群配置 eneros-edge-manager 连接信息
  4. 运行 eneros edge register 注册边缘节点

致谢

感谢 32 位贡献者提交的 480+ 个 commit,以及边缘设备厂商提供的硬件测试支持。