能源管理系统EMS与IEC61850
接上上文,板上运行提示缺少某些库,可能是因为交叉编译工具版本太高了。后续使用vitis自带的交叉编译工具编译,然后放入Xilinx开发板运行成功。
EMS,即能源管理系统,是储能“3s”之一。设计和制造一个储能EMS系统需要考虑包括系统架构设计、功能需求、软件开发、硬件选型等多个方面:
- 需求分析:确定系统的功能需求和性能指标,包括对储能系统的监测、控制、优化等方面的需求,同时考虑系统的可扩展性和适应性;
- 架构设计:设计系统的整体架构,包括前端数据采集、后端数据处理、控制算法、用户界面等部分的组成结构,确定系统各模块之间的交互和通信方式;
- 软件开发:开发系统的软件部分,包括数据采集、数据处理、控制算法、用户界面等功能模块的开发;
- 硬件选型:选择合适的硬件设备,包括传感器、控制器、通信设备等,确保硬件设备能够满足系统的性能和功能要求,并与软件系统相兼容;
- 测试部署:验证系统的功能和性能是否符合设计要求,确保各个模块之间的协调运行和数据的准确性,再部署到实际的储能系统中,进行现场调试和优化。
目前行业内做EMS开发的公司有杭州高特、杭州协能、山东德联和研华等公司。博主本人是做嵌入式开发出身,莫名其妙进入储能行业后第一个项目就是EMS。在第一步时就十分懵逼:以前都是实现某项功能、完成某个成果才算工作量,不理解为什么这类工作搜集材料整理个需求文档就算完成工作了?挣扎了大半年之后好像对这种解决方案类的工作有一些理解了,努力尝试“以系统的整体架构入手去思考问题”。
第一步需求分析,这一步要做的工作就是根据电站设计的指标和需求整理一堆excel和Visio文档,一般是要有多年经验的老员工才能干,半转行的应届生一般干不了。
第二步架构设计,以一个五层结构的EMS系统为例,从下到上可以是:硬件层(PC)、操作系统层(Linux,Windows)、支撑平台层(数据库、网络通信)、数学建模层(预测模型、系统模型等)及应用软件层(SCADA、应用软件)。需要完成全系统的功能分解及信息流规划,模块间通信协议、接口及线缆种类、规格等。
前端数据采集,包括光伏、风力、储能电芯、电网及负荷、PCS等模块的数据。采集后实时显示在用户界面,并使用这些数据进行系统状态估计、控制保护及实现所需其他功能(如自动发电控制、负荷预测、发电预测与经济调度等)。
模块内的通信方式以串行通信(IIC\SPI)和CAN通信为主,模块之间则以61850,modbus,104等协议为主。
第三步软件开发的工作量十分庞大,一般由专业的EMS完成底层代码开发,用户进行二次开发。
第四步类似一、二步,需要对整个系统以及常用的硬件设备非常熟悉才能干的了。
最后一步,整体测试验证、项目落地运行。
以上这些啰啰嗦嗦,讲了一堆宏观的内容,但是到了实际工作分配后,却不知道第一步要干什么。以前是做嵌入式的,实在不想去搞项目管理,还是想把工作内容与软件开发结合起来。考虑到现实情况能做的实在太少,上网查了几篇论文,看了几篇博客,发现有个开源的通信工程代码libiec61850,还有详细的文档介绍。于是下载了源码学习了一下,顺便移植到Xilinx开发板上运行,与上位机联调。
IEC61850
登录网站libiec61850.com,下载源码到本地。
工程可以在Windows、Linux下运行,包括x86及ARM架构,可以和IEDScout通信。网站上有介绍文档和API说明。在Linux虚拟机内编译后,选择client_example2和server_example_goose。进入.c文件后,修改网络接口名称、IP地址和mac地址,保存编译,然后以sudo运行server和client。可以看到服务端与客户端分别输出如下:
可以看到服务端和客户端正常运行。客户端展示了如何访问一个未知设备上的数据模型,这个数据模型在服务端文件夹内的cid文件中。这是61850的IED 模型配置文件,下面来仔细解读一下这个文件。
cid文件
读懂这个文件需要一定的XML语法知识,可以参考61850-6文档。打开文件,将其分为三部分解读。
1、通信配置
第5~36行communication部分是文件的通信配置部分。communication下是子网和接入点部分,其中接入点处定义了IED名称和接入点名称,在后面部分会用到。
接入点下的address设置IP地址、子网掩码和网关。
OSI-TSEL:表示 OSI 模型中的 TSEL(Transport Service Access Point Selector)为 0001,用于在传输层标识服务访问点。
OSI-PSEL:表示 OSI 模型中的 PSEL(Presentation Service Access Point Selector)为 00000001,用于在表示层标识服务访问点。
OSI-SSEL:表示 OSI 模型中的 SSEL(Session Service Access Point Selector)为 0001,用于在会话层标识服务访问点。
GSE表示 GSE 实例的 ldInst 为 "GenericIO",cbName 为 "gcbEvents",分别指定了逻辑设备名称和控制块名称。Address为地址信息,MinTime和MaxTime一般为毫秒。
2、IED
Services部分描述了服务端IED实例支持的服务。
AccessPoint是通信配置部分出现过的接入点,里面包含来一个LDevice逻辑设备GenericIO,逻辑设备内部有三个逻辑节点,分别是LN0、LPHD和GGIO。
LN0内部定义了四个数据集DataSet,两个报告控制块ReportControl,两个GSEControl和一个数据对象DO。
DataSet(数据集):用于定义一组数据对象,这些数据对象通常包含监测点、测量值、状态等信息。可用于定义需要传输的数据集合,以便在电力系统中进行监测、控制和管理。
ReportControl(报告控制):用于定义报告生成和传输的控制参数,包括报告生成周期、报告传输方式、报告对象等。可以用于配置系统生成和传输报告的行为,以便及时获取系统状态和事件信息。
GSEControl(GSE控制):用于控制 GSE(Generic Substation Events)数据的生成和传输,包括 GSE 数据的采集周期、传输方式、优先级等。可以用于配置 GSE 数据的采集和传输参数,以便及时获取系统中的事件信息。
GGIO内部定义了一个Mod和四个SPCSO。SPCSO代表generic single point controllable status output是否使能,ctlModel均为direct-with-normal-security。关于这个值的具体含义可以参考61850-7-2。
3、数据类型模板
最后一部分是DataTypeTemplates,在这里定义的模板才能被第二部分使用。包括了逻辑节点、数据对象、数据属性和枚举类型。
Xilinx开发板测试
最后来在Xilinx开发板上运行代码,与电脑虚拟机之间使用61850协议互相通信。连接开发板需要用到电源线、网线和串口线(也可以用ssh协议,这样就不用串口)。
首先需要安装交叉编译环境,可参考前几节文章内容,在ARM官网下载,或者直接使用vitis自带的交叉编译工具链。如果报错command not found,运行以下命令:
apt-get install gcc-arm-linux-gnueabi
sudo apt-get install gcc-arm*
安装完成后,安装libiec61850官网说明,make时附带参数TARGET=LINUX-ARM,即可编译完成ARM格式的可执行文件。使用file命令校验:
可以看到文件无误。虚拟机运行服务端程序server_example_goose,客户端仍然选择client_example2,使用ssh命令传输到开发板上运行,输出结果如下:
看到输出结果与虚拟机内输出相同,程序运行无误。
同时也可以使用wireshark观察交互的数据包:
后续可以把Xilinx开发板换成BMS,电脑换成EMS、工控机,多尝试使用几个61850服务,感受协议在电力系统中的使用方式。