IEC60870-5-104项目应用
前言
提示:IEC60870-5-104源码架构详细讲解请参考将军之前的系列文章
IEC60870-5-104 协议广泛应用于电力自动化系统,用于远程监控和控制电力设备。将军将介绍如何在项目中集成 IEC60870-5-104 协议库(lib60870-2.3.2)
关于 IEC60870-5-104 协议详细源码架构请移步👇
IEC60870-5-104 协议源码架构详细分析-CSDN博客
1.准备工作
在开始集成之前,需要确保开发环境已安装以下工具:
如果使用Java开发集成请确保:
Java Development Kit (JDK):建议使用 JDK 8 及以上版本。
Apache Maven:用于项目管理和构建。
也可集成到C++项目中:
lib60870-2.3.2 库:可以从官方仓库下载。
将库集成到项目中。
2.实现步骤
要通过集成的IEC104协议库实现IEC104服务器(Slave),可以按照以下步骤进行操作。以下是将军基于IEC104协议源码总结的:
2.1引入必要的库和头文件
在实现IEC104服务器时,需要包含相关的库和头文件,这些库提供了IEC104协议的基本功能和操作:
示例:
1.#include "cs104_slave.h"
2.#include "hal_thread.h"
3.#include "hal_time.h"
2.2创建服务器实例
使用CS104_Slave_create函数创建一个服务器实例,传递所需的参数,比如消息队列的大小:
示例:
1.CS104_Slave slave = CS104_Slave_create(10, 10);
第一个参数是发送队列的大小,第二个参数是接收队列的大小。
2.3配置服务器的本地地址
通过CS104_Slave_setLocalAddress函数设置服务器的本地地址。通常可以设置为"0.0.0.0",表示不指定特定的IP地址。
示例:
1.CS104_Slave_setLocalAddress(slave, "0.0.0.0");
2.4设置服务器模式
使用CS104_Slave_setServerMode设置服务器工作模式。可以选择单冗余组模式或其他模式。代码中使用的是单冗余组模式:
示例:
1.CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
2.5获取应用层和连接参数
使用CS104_Slave_getAppLayerParameters获取应用层参数,CS104_Slave_getConnectionParameters获取连接参数。这些参数用于后续创建ASDU(应用服务数据单元)和调整连接行为。
示例:
1.CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(slave);
2.CS104_APCIParameters apciParams = CS104_Slave_getConnectionParameters(slave);
2.6配置回调函数
在IEC104协议中,服务器需要处理多种请求,例如时钟同步、查询命令、ASDU消息等。通过设置回调函数来处理这些请求。
2.6.1时钟同步处理:
CS104_Slave_setClockSyncHandler设置时钟同步命令的回调函数。
示例:
1.CS104_Slave_setClockSyncHandler(slave, clockSyncHandler, NULL);
2.6.2查询命令处理:
CS104_Slave_setInterrogationHandler设置查询命令的回调函数。
示例:
1.CS104_Slave_setInterrogationHandler(slave, interrogationHandler, NULL);
2.6.3ASDU消息处理:
CS104_Slave_setASDUHandler设置ASDU类型消息的回调函数。
示例:
1.CS104_Slave_setASDUHandler(slave, asduHandler, NULL);
2.6.4连接请求处理:
CS104_Slave_setConnectionRequestHandler设置处理连接请求的回调函数。
示例:
1.CS104_Slave_setConnectionRequestHandler(slave, connectionRequestHandler, NULL);
2.6.5连接事件处理:
CS104_Slave_setConnectionEventHandler设置连接事件的回调函数。
示例:
1.CS104_Slave_setConnectionEventHandler(slave, connectionEventHandler, NULL);
2.7启动服务器服务
使用CS104_Slave_start启动服务器服务。启动后服务器将开始监听并响应来自主站的请求。
示例:
1.CS104_Slave_start(slave);
通过CS104_Slave_isRunning检查服务器是否成功启动。
示例:
1.if (CS104_Slave_isRunning(slave) == false) {
2. printf("Starting server failed!\n");
3. goto exit_program;
4.}
2.8循环任务
在循环任务中,可以周期性地生成ASDU并将其发送到主站。例如,周期性发送一个测量值对象:
其中:
CS101_ASDU_create用于创建一个新的ASDU。
CS104_Slave_enqueueASDU将ASDU添加到服务器的事件队列。
示例:
1.CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_PERIODIC, 0, 1, false, false);
2.CS104_Slave_enqueueASDU(slave, newAsdu);
2.9停止服务器服务
当需要停止服务器时,调用CS104_Slave_stop停止服务,并销毁服务器实例:
示例:
1.CS104_Slave_stop(slave);
2.CS104_Slave_destroy(slave);
2.10信号处理
通过捕获Ctrl+C信号(SIGINT)来控制服务器的停止。当收到中断信号时,将running标志设置为false,从而退出循环任务。
示例:
1.signal(SIGINT, sigint_handler);
总结
实现一个IEC104服务器的关键步骤包括:
① 创建服务器实例,设置连接参数和工作模式。
② 设置回调函数,处理各种IEC104协议请求。
③ 启动服务器,并在循环任务中周期性处理消息和发送数据。
④ 处理连接和事件,根据需要发送响应。
⑤ 停止服务器服务,并释放相关资源。
通过以上步骤,便可以使用集成的IEC104协议库实现一个功能完整的IEC104服务器。