项目概述
libIEC61850 是由 MZ Automation 开发的开放源码库,主要用于实现 IEC 61850 标准中的通信协议。该库完全符合 IEC 61850 标准,支持 MMS(制造报文规范)、GOOSE(通用面向对象变电站事件)及 SV(采样值)等关键协议。
libIEC61850 提供了客户端和服务器端的应用编程接口(API),采用 C 语言(符合 C99 标准)开发,确保最大程度的可移植性。它可以在嵌入式系统和运行 Linux、Windows、MacOS 的 PC 上使用,已成功应用于多个商业软件产品和设备中。
核心特性
- 协议支持完整:支持 MMS 客户端/服务器、GOOSE(IEC 61850-8-1)、采样值(SV - IEC 61850-9-2)
- 报告功能强大:支持缓冲和非缓冲报告、在线报告控制块配置
- 数据服务全面:数据访问服务(获取数据、设置数据)、在线数据模型发现和浏览
- 数据集服务:所有数据集服务(获取值、设置值、浏览)、动态数据集服务(创建和删除)
- 日志服务灵活:提供连接自定义数据库的抽象接口,附带 sqlite 实现
- 文件服务完善:MMS 文件服务(浏览、获取文件、设置文件、删除/重命名文件)
- 安全特性:支持 TLS 加密通信(IEC 62351-3/4),保护数据传输过程
- 多语言支持:提供 C 和 C#/.NET API 接口
环境搭建与构建
克隆仓库
git clone https://github.com/MZAutomation/libiec61850.git
cd libiec61850
使用 CMake 构建
mkdir build
cd build
cmake ..
make
sudo make install # 安装至系统目录
构建示例程序
在项目根目录下执行:
make examples
构建成功后,可以在项目根目录和 build 目录中找到二进制文件和静态库文件(libiec61850.a)。
快速入门示例
服务器端示例
以下是一个基本的 IEC 61850 服务器示例,展示如何创建服务器实例并处理控制命令:
#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include
running = ;
IedServer iedServer = ;
{
running = ;
}
ControlHandlerResult {
(test) CONTROL_RESULT_FAILED;
(MmsValue_getType(value) == MMS_BOOLEAN) {
();
(MmsValue_getBoolean(value)) ();
();
} CONTROL_RESULT_FAILED;
timeStamp = Hal_getTimeInMs();
IedServer_updateUTCTimeAttributeValue(iedServer, parameter, timeStamp);
IedServer_updateAttributeValue(iedServer, parameter, value);
CONTROL_RESULT_OK;
}
{
tcpPort = ;
(, LibIEC61850_getVersionString());
IedServerConfig config = IedServerConfig_create();
IedServerConfig_setReportBufferSize(config, );
iedServer = IedServer_createWithConfig(&iedModel, , config);
IedServerConfig_destroy(config);
IedServer_setServerIdentity(iedServer, , , );
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO1);
IedServer_start(iedServer, tcpPort);
running = ;
signal(SIGINT, sigint_handler);
(running) {
value = sinf(Hal_getTimeInMs() / );
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, value);
Thread_sleep();
}
IedServer_stop(iedServer);
IedServer_destroy(iedServer);
;
}

