跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

libIEC61850 开源 IEC 61850 协议库使用指南

libIEC61850 是开源 IEC 61850 协议库,基于 C 语言实现,支持 MMS、GOOSE 及 SV 协议。介绍其核心特性、环境搭建、构建方法及服务器与客户端示例。内容包括错误处理、资源管理、线程安全及 TLS 加密配置等最佳实践,适用于电力自动化系统开发。

锁机制发布于 2026/3/23更新于 2026/5/2222K 浏览

项目概述

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);
     ;
}
<stdio.h>
#include <math.h>
#include "static_model.h"
static
int
0
static
NULL
void
sigint_handler
(int signalId)
0
static
controlHandlerForBinaryOutput
(ControlAction action, void* parameter, MmsValue* value, bool test)
if
return
if
printf
"received binary control command: "
if
printf
"on\n"
else
printf
"off\n"
else
return
uint64_t
return
int
main
(int argc, char** argv)
int
102
printf
"Using libIEC61850 version %s\n"
/* 创建服务器配置对象 */
/* 设置报告缓冲区大小 */
200000
/* 创建 IEC 61850 服务器实例 */
NULL
/* 设置服务器标识信息 */
"MZ"
"basic io"
"1.6.0"
/* 安装控制处理器 */
/* 启动服务器监听 */
1
while
/* 更新模拟量测量值 */
float
1000.f
100
/* 停止服务器并清理资源 */
return
0
客户端示例

以下是一个简单的 IEC 61850 客户端示例,展示如何连接服务器并读取数据:

#include "iec61850_client.h"
#include <stdlib.h>
#include <stdio.h>
#include "hal_thread.h"

int main(int argc, char** argv) {
    char* hostname = argc > 1 ? argv[1] : "localhost";
    int tcpPort = argc > 2 ? atoi(argv[2]) : 102;
    IedClientError error;
    IedConnection con = IedConnection_create();
    printf("Connecting to %s:%i\n", hostname, tcpPort);
    IedConnection_connect(con, &error, hostname, tcpPort);
    if (error == IED_ERROR_OK) {
        printf("Connected successfully\n");
        /* 读取模拟量测量值 */
        MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX);
        if (value != NULL && MmsValue_getType(value) == MMS_FLOAT) {
            float fval = MmsValue_toFloat(value);
            printf("Read float value: %f\n", fval);
            MmsValue_delete(value);
        }
        IedConnection_close(con);
    } else {
        printf("Failed to connect (error code: %i)\n", error);
    }
    IedConnection_destroy(con);
    return 0;
}

运行示例程序

构建完成后,可以运行示例程序进行测试:

cd examples/server_example_basic_io
sudo ./server_example_basic_io

在另一个终端中运行客户端:

cd examples/iec61850_client_example1
./client_example1

TLS 支持配置

libIEC61850 支持 TLS 加密通信,可以使用 mbedTLS 库来实现:

使用 mbedTLS 2.28
make WITH_MBEDTLS=1
使用 mbedTLS 3.6
make WITH_MBEDTLS3=1

使用 CMake 构建时,如果 third_party/mbedtls 目录中存在相应的 mbedtls 版本,会自动启用 TLS 支持。

最佳实践建议

1. 错误处理

在实际应用中,务必添加完善的错误处理机制。所有 libIEC61850 API 函数都会返回错误代码,应该检查这些代码以确保操作成功。

2. 资源管理

及时释放分配的资源,使用相应的 destroy 或 delete 函数来避免内存泄漏。

3. 线程安全

在多线程环境中使用 libIEC61850 时,注意线程同步问题。服务器 API 通常提供数据模型锁定机制来确保线程安全。

4. 性能优化

根据实际应用场景调整配置参数,如报告缓冲区大小、最大连接数等,以达到最佳性能。

5. 安全性考虑

在生产环境中,始终启用 TLS 加密通信,并妥善管理证书和密钥。

许可证信息

libIEC61850 采用 GNU General Public License v3.0 许可证。对于商业项目,厂商提供商业许可证和支持选项。

技术支持与贡献

该库由 MZ Automation GmbH 提供商业支持和技术服务。如果您希望为项目做出贡献,请联系 [email protected] 获取贡献者许可协议。

通过遵循本指南,您可以快速开始使用 libIEC61850 库来开发符合 IEC 61850 标准的电力自动化系统应用程序。库中提供的丰富示例代码是学习和理解 API 用法的绝佳资源。

目录

  1. 项目概述
  2. 核心特性
  3. 环境搭建与构建
  4. 克隆仓库
  5. 使用 CMake 构建
  6. 构建示例程序
  7. 快速入门示例
  8. 服务器端示例
  9. 客户端示例
  10. 运行示例程序
  11. TLS 支持配置
  12. 使用 mbedTLS 2.28
  13. 使用 mbedTLS 3.6
  14. 最佳实践建议
  15. 1. 错误处理
  16. 2. 资源管理
  17. 3. 线程安全
  18. 4. 性能优化
  19. 5. 安全性考虑
  20. 许可证信息
  21. 技术支持与贡献
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Go Map 底层原理详解
  • Web 可访问性最佳实践:确保所有用户平等访问
  • WebView 并发初始化竞争风险分析
  • VR 与 AR 技术深度解析:原理、应用与未来趋势
  • Formality 原语(Primitive)概念解析
  • AI 大模型应用开发体系化学习路线
  • 基于 Jetson Nano 与 YOLOv5s 的无人机道路抛洒物实时检测系统
  • HTTPS 协议原理详解:加密机制与证书认证
  • Xilinx FPGA 实现 RISC-V 五级流水线 CPU 设计实战
  • 大语言模型智能体推理(Agentic Reasoning)核心架构解析
  • 图结构邻接表实现:DFS、BFS 及 Dijkstra 算法详解
  • Java 线性表实现:带头尾指针的链表 LinkedList
  • Clawdbot 在 Ubuntu 服务器上的部署与配置指南
  • macOS 命令行工具详解与使用指南
  • Python OpenID Connect 部署指南:快速搭建认证服务
  • OpenClaw 本地部署指南:WSL2 + Ubuntu + Node.js 22+ 环境搭建
  • OpenClaw Skills 扩展:nanobot 通过 webhook 对接钉钉/飞书实现跨平台消息同步
  • 从 vw/vh 到 clamp(),前端响应式设计的痛点与进化
  • Java SE 多线程并发:锁策略、JUC 与原理
  • Python 基于 Playwright 的自动化环境配置指南(Windows 与 Linux)

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online