EnerOS v0.19.0
发布日期:2025年05月11日 版本代号:IEC61850 Git Tag:v0.19.0 支持状态:稳定(Stable) Crate 总数:54(新增 4 个) 测试用例数:7480+(新增 560)
版本概述
EnerOS v0.19.0「IEC61850」是 EnerOS 在「变电站自动化」方向上的核心版本,本版本的核心目标是引入 IEC 61850 标准支持,包括 MMS(Manufacturing Message Specification)协议栈、IED(Intelligent Electronic Device)模型映射、GOOSE(Generic Object Oriented Substation Event)订阅与 SCL(Substation Configuration Language)配置文件解析,使 EnerOS 能够作为变电站层主站与符合 IEC 61850 标准的智能电子设备直接互操作。
IEC 61850 是变电站自动化的国际标准,相比传统 IEC 60870-5-104,它采用面向对象的信息模型,将变电站设备抽象为逻辑节点(Logical Node)、逻辑设备(Logical Device)、数据对象(Data Object),并通过 MMS 协议进行客户端-服务器通信、GOOSE 协议进行设备间快速横向通信、SMV 协议传输采样值。IEC 61850 已成为新一代智能变电站的事实标准,国家电网与南方电网的新建变电站均要求支持。
本版本引入了 eneros-iec61850(IEC 61850 核心)、eneros-iec61850-mms(MMS 协议栈)、eneros-iec61850-goose(GOOSE 订阅)、eneros-iec61850-scl(SCL 解析)四个新 crate。设计哲学是「模型原生,协议原生」——IEC 61850 的信息模型在 Rust 中以强类型表达,SCL 配置文件解析后直接映射为 EnerOS 拓扑节点,避免手工点表配置的低效与易错。
关键数据
| 指标 | v0.18.0(仅 IEC 104) | v0.19.0(IEC 61850) | 提升 |
|---|---|---|---|
| IED 连接数 | 1024 | 2048 | 2x |
| 数据点数 | 50万 | 200万 | 4x |
| GOOSE 订阅延迟 | N/A | 4ms | 实时级 |
| 模型配置自动化 | 手工点表 | SCL 自动 | 显著提升 |
| 协议覆盖 | 104 | 104+61850 | 全场景 |
新特性
1. IEC 61850 支持
引入 eneros-iec61850 crate,作为 IEC 61850 子系统的统一入口,管理 IED 连接、模型映射、数据采集与控制。IEC 61850 子系统与 EnerOS 拓扑引擎深度集成,SCL 配置文件解析后自动构建电网拓扑,无需手工维护点表。
IEC 61850 客户端
use eneros_iec61850::{Iec61850Client, ClientConfig};
let mut client = Iec61850Client::new(ClientConfig {
max_connections: 2048,
mms_port: 102,
goose_enabled: true,
smv_enabled: false,
time_sync: true,
auto_discovery: true,
})?;
// 连接到 IED
client.connect_ied("ied-1", "10.20.30.5:102").await?;
// 自动发现 IED 模型
let device_model = client.discover_model("ied-1").await?;
println!("逻辑设备数: {}", device_model.logical_devices.len());
client.start().await?;
IEC 61850 与 IEC 104 对比
| 维度 | IEC 60870-5-104 | IEC 61850 |
|---|---|---|
| 信息模型 | 点表 | 面向对象 |
| 配置方式 | 手工点表 | SCL 自动 |
| 横向通信 | 不支持 | GOOSE |
| 采样值传输 | 不支持 | SMV |
| 模型语义 | 弱 | 强 |
| 适用场景 | 调度主站 | 变电站内 |
2. MMS 协议栈
引入 eneros-iec61850-mms crate,实现 MMS(Manufacturing Message Specification)协议栈,作为 IEC 61850 客户端-服务器通信的核心协议。MMS 基于 TCP/IP,承载 IEC 61850 的读写、报告、控制等操作。
MMS 通信模型
use eneros_iec61850_mms::{MmsClient, MmsRequest, ReadResult};
let mms = MmsClient::new("ied-1", "10.20.30.5:102").await?;
// 读取数据对象
let result: ReadResult = mms.read("LD0/LLN0.Health.stVal").await?;
println!("IED 健康状态: {:?}", result.value);
// 读取多个数据对象
let results = mms.read_multiple(&[
"LD0/LLN0.Health.stVal",
"LD0/PTUV.phsA.cVal.mag.f",
"LD0/PTUV.phsB.cVal.mag.f",
"LD0/PTUV.phsC.cVal.mag.f",
]).await?;
// 写入控制对象(带选择)
mms.select("LD0/XCBR1.Pos.Oper").await?;
mms.operate("LD0/XCBR1.Pos.Oper", Value::Bool(true)).await?;
// 订阅报告
mms.enable_report("rcb_01").await?;
MMS 数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| Boolean | 布尔 | true/false |
| Integer | 整数 | 1024 |
| Float | 浮点 | 220.5 |
| String | 字符串 | ”Healthy” |
| Timestamp | 时标 | 2025-05-11T10:00:00Z |
| Quality | 质量 | Validity::Good |
| Array | 数组 | [1.0, 2.0, 3.0] |
| Struct | 结构 | 复合数据 |
报告控制块(RCB)
use eneros_iec61850_mms::{ReportControlBlock, TriggerOption};
// 配置报告控制块
let rcb = ReportControlBlock::new("rcb_01")
.dataset("LD0/LLN0.dsStatData")
.trigger_options(TriggerOption::DATA_CHANGED | TriggerOption::QUALITY_CHANGED)
.integrity_period(Duration::seconds(5))
.buffered(true)
.buf_time(Duration::milliseconds(0));
mms.configure_rcb(&rcb).await?;
// 接收报告
mms.on_report(|report| {
for entry in &report.entries {
println!("{}: {:?} @ {:?}", entry.path, entry.value, entry.timestamp);
}
});
3. IED 模型映射
IEC 61850 的信息模型(逻辑节点、逻辑设备、数据对象)自动映射为 EnerOS 拓扑节点与数据点,使 IED 数据直接融入 EnerOS 统一模型,无需人工转换。
信息模型结构
use eneros_iec61850::{IedModel, LogicalDevice, LogicalNode, DataObject};
// IED 模型层次结构
let ied = IedModel::new("ied-1")
.logical_device(LogicalDevice::new("LD0")
.logical_node(LogicalNode::new("LLN0") // 逻辑节点零
.data_object(DataObject::new("Health").with_data_set("dsHealth")))
.logical_node(LogicalNode::new("PTUV") // 电压互感器
.data_object(DataObject::new("phsA").with_data_attribute("cVal.mag.f"))
.data_object(DataObject::new("phsB").with_data_attribute("cVal.mag.f"))
.data_object(DataObject::new("phsC").with_data_attribute("cVal.mag.f")))
.logical_node(LogicalNode::new("XCBR1") // 断路器
.data_object(DataObject::new("Pos").with_data_attribute("stVal"))));
模型映射到 EnerOS 拓扑
use eneros_iec61850::mapping::TopologyMapper;
// 将 IED 模型映射为 EnerOS 拓扑节点
let mapper = TopologyMapper::new(&network, &client);
// 自动映射
let mapping = mapper.map_ied("ied-1", &ied_model).await?;
// 映射结果
println!("IED ied-1 映射 {} 个逻辑节点到拓扑", mapping.node_count);
// LD0/PTUV -> 拓扑节点 "母线PT"
// LD0/XCBR1 -> 拓扑节点 "断路器1"
逻辑节点类型映射
| IEC 61850 逻辑节点 | 含义 | EnerOS 映射 |
|---|---|---|
| LLN0 | 逻辑节点零 | IED 健康状态 |
| PTUV | 电压互感器 | 母线电压点 |
| XCBR | 断路器 | 断路器设备 |
| XSWI | 隔离开关 | 隔离开关设备 |
| MMXU | 测量单元 | 综合测量点 |
| PTOC | 过流保护 | 保护装置 |
| PTOV | 过压保护 | 保护装置 |
| RBRF | 母差保护 | 保护装置 |
4. GOOSE 订阅
引入 eneros-iec61850-goose crate,实现 GOOSE 协议的订阅与解析。GOOSE 是 IEC 61850 的横向通信协议,基于组播以太网,用于设备间快速事件通知,典型延迟低于 4ms,是变电站保护联动的关键协议。
GOOSE 订阅
use eneros_iec61850_goose::{GooseSubscriber, GooseConfig};
let subscriber = GooseSubscriber::new(GooseConfig {
interface: "eth0",
multicast_groups: vec!["01:0c:cd:01:00:01".parse()?],
filter: GooseFilter::by_app_id(vec![0x0001, 0x0002]),
})?;
// 订阅 GOOSE 消息
subscriber.subscribe(|message| {
println!("GOOSE 来自: {}", message.source);
println!("应用 ID: 0x{:04x}", message.app_id);
println!("状态号: {}", message.st_num);
println!("序列号: {}", message.sq_num);
for entry in &message.dataset {
println!(" {}: {:?}", entry.path, entry.value);
}
})?;
subscriber.start().await?;
GOOSE 消息结构
| 字段 | 说明 | 长度 |
|---|---|---|
| App ID | 应用标识 | 2 字节 |
| StNum | 状态号(每次状态变化+1) | 4 字节 |
| SqNum | 序列号(同一状态重发+1) | 4 字节 |
| Time | 事件时标 | 8 字节 |
| Dataset | 数据集 | 可变 |
GOOSE 性能指标
| 指标 | 数值 | 说明 |
|---|---|---|
| 端到端延迟 | < 4ms | 设备间 |
| 重新发布间隔 | 1ms-60s | 可配置 |
| 心跳间隔 | 60s | 默认 |
| 状态变化触发 | 立即 | 优先级最高 |
| 数据集大小 | 最多 256 项 | 足够 |
5. SCL 配置文件解析
引入 eneros-iec61850-scl crate,解析 IEC 61850 的 SCL(Substation Configuration Language)配置文件,自动提取变电站结构、IED 配置、通信参数,无需手工配置点表。
SCL 解析
use eneros_iec61850_scl::{SclParser, SclFile};
// 解析 SCL 文件
let scl = SclParser::parse_file("/config/substation.scd")?;
// 提取变电站结构
let substation = scl.substation("SUB1")?;
println!("电压等级数: {}", substation.voltage_levels.len());
for vl in &substation.voltage_levels {
println!("电压等级: {} kV", vl.nominal_voltage);
for bay in &vl.bays {
println!(" 间隔: {}", bay.name);
for equipment in &bay.equipments {
println!(" 设备: {} ({:?})", equipment.name, equipment.kind);
}
}
}
// 提取 IED 配置
for ied in scl.ieds() {
println!("IED: {} ({})", ied.name, ied.manufacturer);
println!(" IP: {}", ied.communication_address()?);
println!(" 逻辑设备数: {}", ied.logical_devices.len());
}
SCL 文件类型
| 扩展名 | 类型 | 说明 |
|---|---|---|
| .icd | IED 能力描述 | 单 IED 配置 |
| .scd | 变电站配置描述 | 全站配置 |
| .cid | 实例化 IED 配置 | IED 实际运行配置 |
| .ssd | 系统规范描述 | 一次系统规范 |
| .sed | 系统交换描述 | 工程间交换 |
自动拓扑构建
use eneros_iec61850_scl::topology::TopologyBuilder;
// 从 SCL 自动构建拓扑
let builder = TopologyBuilder::from_scl(&scl)?;
let network = builder.build().await?;
println!("自动构建拓扑:");
println!(" 节点数: {}", network.node_count());
println!(" 边数: {}", network.edge_count());
println!(" IED 数: {}", network.ied_count());
// 自动配置 SCADA 连接
for ied in scl.ieds() {
let addr = ied.communication_address()?;
client.connect_ied(&ied.name, &addr).await?;
}
改进
- 拓扑引擎:支持从 SCL 自动构建拓扑,减少手工配置工作量 90%
- 时序存储:支持 IEC 61850 数据的高频写入,吞吐提升 3 倍
- 孪生体:孪生体直接订阅 IEC 61850 数据,状态保真度提升
- 仪表盘:新增 IEC 61850 监控面板,展示 IED 树状结构与 GOOSE 通信状态
Bug 修复
- 修复
eneros-iec61850-mms在大数据集读取时缓冲区溢出的问题(#1908) - 修复
eneros-iec61850-goose在高负载下丢包的问题(#1914) - 修复
eneros-iec61850-scl解析命名空间冲突的问题(#1920) - 修复
eneros-iec61850在 IED 重连后报告订阅丢失的问题(#1926)
破坏性变更
Gateway::add_iec61850:迁移至Iec61850Client::connect_iedNetwork::from_scl:返回类型改为Result<Network>,需?ReportControlBlock::new:新增dataset必填参数
性能提升
- IED 连接数从 1024 提升至 2048(提升 2 倍)
- 数据点数从 50 万提升至 200 万(提升 4 倍)
- GOOSE 订阅延迟稳定在 4ms 以内
- SCL 解析耗时从分钟级降至秒级
贡献者
本版本由 24 位贡献者共同完成,提交 418 次。特别感谢:
- @iec61850-arch:IEC 61850 子系统架构
- @mms-implementer:MMS 协议栈 Rust 实现
- @goose-master:GOOSE 订阅与组播处理
- @scl-parser:SCL 配置文件解析器
升级指南
从 v0.18.0 升级
1. 更新依赖
# Cargo.toml
[dependencies]
eneros-iec61850 = { version = "0.19" }
eneros-iec61850-mms = { version = "0.19" }
eneros-iec61850-goose = { version = "0.19" }
eneros-iec61850-scl = { version = "0.19" }
2. 加载 SCL 配置
use eneros_iec61850_scl::SclParser;
use eneros_iec61850_scl::topology::TopologyBuilder;
// 解析 SCL 并自动构建拓扑
let scl = SclParser::parse_file("/config/substation.scd")?;
let network = TopologyBuilder::from_scl(&scl)?.build().await?;
3. 启用 IEC 61850
# eneros.toml
[iec61850]
enabled = true
mms_port = 102
goose_interface = "eth0"
goose_enabled = true
time_sync = true
4. 混合协议部署
生产环境通常需要同时支持 IEC 61850(新变电站)与 IEC 60870-5-104(老变电站),EnerOS 支持混合协议部署:
// 同时启动 SCADA 主站(IEC 104)与 IEC 61850 客户端
let scada = ScadaMaster::new(scada_config)?;
let iec61850 = Iec61850Client::new(iec61850_config)?;
scada.start().await?;
iec61850.start().await?;
// 两者的数据统一进入 EnerOS 管道
pipeline.subscribe_all().for_each(|event| {
// 统一处理
}).await?;
5. GOOSE 部署注意
GOOSE 基于二层组播以太网,部署时需确保网络设备支持 IGMP Snooping,并正确配置组播组。跨子网 GOOSE 需通过 GMRP 或静态组播配置实现,详见运维手册「IEC 61850 网络配置」章节。