跳到主内容

v0.19.0 版本说明

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 连接数102420482x
数据点数50万200万4x
GOOSE 订阅延迟N/A4ms实时级
模型配置自动化手工点表SCL 自动显著提升
协议覆盖104104+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-104IEC 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 文件类型

扩展名类型说明
.icdIED 能力描述单 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_ied
  • Network::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 网络配置」章节。