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-edge、eneros-edge-runtime、eneros-edge-manager、eneros-edge-offline、eneros-edge-sync 五个新 crate 实现。
关键数据
| 指标 | 数值 | 说明 |
|---|---|---|
| 边缘运行时内存占用 | 48 MB | 最小配置 |
| 边缘运行时二进制大小 | 12 MB | stripped |
| 离线切换时间 | < 50ms | 网络中断检测 |
| 数据同步吞吐 | 10 万点/秒 | 云边之间 |
| 新增 Crate | 6 | 边缘相关 |
| 新增测试 | 700+ | 含 130 个端到端 |
新特性
1. 轻量级运行时
新增 eneros-edge-runtime crate,提供资源受限环境下的轻量级 EnerOS 运行时。通过特性裁剪、内存池预分配、无分配热路径等手段,将运行时内存占用控制在 48MB 以内,适配 ARM Cortex-A 系列边缘设备。
运行时配置档
| 配置档 | 内存 | CPU | 适用设备 | 功能子集 |
|---|---|---|---|---|
| nano | 48 MB | 1 核 | 数据采集终端 | 时序+拓扑只读 |
| micro | 128 MB | 2 核 | 配电终端 | +保护+控制 |
| small | 256 MB | 4 核 | 变电站网关 | +Agent+ML推理 |
| standard | 512 MB | 4 核+ | 区域中心 | 全功能 |
轻量级运行时初始化
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 MB | 48 MB | 81% |
| Agent 运行时 | 128 MB | 32 MB | 75% |
| 时序引擎 | 512 MB | 24 MB | 95% |
| ML/LLM | 1 GB | 0 MB | 100% |
| 总计 | ~1.9 GB | ~104 MB | 95% |
2. 边缘节点管理
新增 eneros-edge-manager crate,提供边缘节点的注册、发现、健康监控、远程配置、OTA 升级等全生命周期管理。
节点注册与发现
use eneros_edge_manager::{EdgeManager, EdgeNode, NodeStatus};
let manager = EdgeManager::new(¢er_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 | > 100ms | NTP 同步 |
远程配置下发
// 向边缘节点下发配置
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, ¢er_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改为EdgeConfigOfflineManager:switch_to_offline重命名为activate_autonomySyncEngine:sync_all拆分为start_incremental和start_full
升级指南
- 更新
Cargo.toml中的eneros依赖至0.35.0 - 在边缘设备上部署
eneros-edge-runtime二进制 - 在中心集群配置
eneros-edge-manager连接信息 - 运行
eneros edge register注册边缘节点
致谢
感谢 32 位贡献者提交的 480+ 个 commit,以及边缘设备厂商提供的硬件测试支持。