当前位置: 首页 > 工具软件 > lib_sp > 使用案例 >

lib60870-IEC 60870-5-101 / 104 C源代码库用户指南-版本2.3.0 -第三部分

百里阳平
2023-12-01

 

CS104(TCP / IP)特定问题

服务器模式

服务器提供三种不同的模式:

默认模式(CS104_MODE_SINGLE_REDUNDANCY_GROUP)仅允许单个活动客户端连接。活动客户端连接是发送ASDU的连接。所有其他连接均为备用连接。事件只有一个队列。当没有客户端连接或没有连接处于活动状态时,也会存储事件。

第二种模式(CS104_MODE_CONNECTION_IS_REDUNDANCY_GROUP)允许多个活动客户端连接。每个连接都有其自己的事件队列。关闭客户端连接后,事件队列将被删除。当一个以上的客户端必须访问应用程序数据时,必须使用此模式。

第三种模式(CS104_MODE_MULTIPLE_REDUNDANCY_GROUPS)是最灵活的模式,它允许定义特定的冗余组。这些冗余组是共享同一事件队列的客户端组。对于每个冗余组,都有一个单独的事件队列实例。

可以使用CS104_Slave_setServerMode函数设置服务器模式。

CS104_Slave_setServerMode(slave, CS104_MODE_CONNECTION_IS_REDUNDANCY_GROUP);

限制客户端连接数

可以使用CS104_Slave_setMaxOpenConnections函数来限制客户端的数量。

CS104_Slave_setMaxOpenConnections(slave, 2);

在这种情况下,服务器将仅允许两个并发客户端连接。

设置本地端口和IP地址

IEC 60870-5-104的默认TCP端口为2404。可以使用CS104_Slave_setLocalPort函数更改该端口。

CS104_Slave_setLocalPort(slave, 2405);

默认情况下,服务器侦听所有本地IP地址。使用CS104_Slave_setLocalAddress函数,可以限制服务器侦听单个本地IP地址。

CS104_Slave_setLocalAddress(slave, "192.168.1.50");

使用此设置,CS104服务器将仅在分配了IP地址192.168.1.50的本地接口上进行侦听。

设置连接请求处理程序以限制访问和跟踪连接

CS104_ConnectionRequestHandler可以用来限制对服务器的访问。使用返回值,应用程序可以允许或拒绝客户端的连接尝试。

一个CS104_ConnectionRequestHandler可以通过设置CS104_Slave_setConnectionRequestHandler功能。第二个参数是用户提供的任意对象,该对象将在调用时传递给处理程序。如果不需要,可以将其设置为NULL

CS104_Slave_setConnectionRequestHandler(slave,connectionRequestHandler,NULL);

在处理程序中,您可以根据允许的客户端白名单来检查客户端IP地址,也可以实施黑名单。

示例如何实现ConnectionRequestHandler
static bool connectionRequestHandler(void* parameter, const char* ipAddress)
{
  /* Allow only known IP addresses! */
  /* You can implement your allowed client whitelist here */
  if (strcmp(ipAddress, "127.0.0.1") == 0) {
    return true;
  else
    return false;
}

 

使用TLS创建安全连接

CS 104标准也可以与TLS一起使用,以实现安全和经过身份验证的连接。

为了使用TLS,必须配置相关的参数,证书和私钥。

该配置存储在TLSConfiguration对象中。可以使用TLSConfiguration_create函数创建新的配置对象。

示例如何创建具有TLS支持的CS 104从站
TLSConfiguration tlsConfig = TLSConfiguration_create();

TLSConfiguration_setChainValidation(tlsConfig, false);
TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig, true);

TLSConfiguration_setOwnKeyFromFile(tlsConfig, "server-key.pem", NULL);
TLSConfiguration_setOwnCertificateFromFile(tlsConfig, "server.cer");
TLSConfiguration_addCACertificateFromFile(tlsConfig, "root.cer");

TLSConfiguration_addAllowedCertificateFromFile(tlsConfig, "client1.cer");

/* create a new slave/server instance */
CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig);

 

lib60870-C的特定主题

调试输出

可以通过将CONFIG_DEBUG_OUTPUT设置为1来启用到控制台的调试输出。这将默认启用调试输出。可以使用函数Lib60870_enableDebugOutput禁用调试输出。调试输出功能的默认实现将打印到控制台(使用printf)。如果需要重定向输出,最简单的方法是更改lib60870_common.c中调试输出lib60870_debug_print函数的实现

大端平台

该库包含一个C头文件,用于在使用GCC编译器时确定平台字节顺序(src / inc / internal / platform_endian.h)。这取决于C编译器提供的定义。在某些较旧的大字节序平台(如PowerPC或Coldfire)上,取决于编译器,这可能会失败。您可能需要定义

PLATFORM_IS_BIGENDIAN 1

编译库代码时。

例如放

-DPLATFORM_IS_BIGENDIAN = 1

在平台字节顺序为big endian时在GCC命令行上显示。

库编译时的配置选项

一些配置选项在库代码的编译时已固定。这些选项可以在文件lib60870_config.h中找到。

编译时选项包括对特定CS 104冗余模式的支持,对线程和信号量的支持(当库使用线程时需要),CS 104从站的最大TCP连接数以及其他。

 

参考信息

 

CS 104具体参数

以下参数存储在CS104_ConnectionParameters对象中。

表4. IEC 60870-5-104参数
参数描述

k

I格式,未经确认的APDU数。发送者将在k个未确认的I消息后停止发送。

w

I格式,未经确认的APDU数。接收者将在收到w条消息后确认最新消息

t0

建立连接的超时时间(以s为单位)

t1

以I / U格式传输的APDU的超时时间(以秒为单位)。如果超时没有经过确认,连接将被关闭。发送方使用它来确定接收方是否未能确认消息。

t2

确认消息超时(以s为单位)。接收者使用此超时时间来确定必须发送消息确认的时间。

t3

连接空闲时发送测试电报的超时

 

支持的消息类型

该库支持以下ASDU(应用程序服务数据单元)类型。

表3. IEC 60870-5-101 / 104消息类型
讯息类型描述CC#

M_SP_NA_1(1)

单点信息(布尔)

+

+

M_SP_TA_1(2)

CP24Time2a的单点信息(BOOLEAN)

+

+

M_DP_NA_1(3)

双点信息(开/关/瞬态)

+

+

M_DP_TA_1(4)

CP24Time2a的双点信息(ON / OFF /瞬态)

+

+

M_ST_NA_1(5)

脚步位置信息(-64…63,是瞬态的)

+

+

M_ST_TA_1(6)

CP24Time2a的步位置信息(-64…63,是瞬态的)

+

+

M_BO_NA_1(7)

Bitstring32(32位位串)

+

+

M_BO_TA_1(8)

使用CP24Time2a的Bitstring32(32位位串)

+

+

M_ME_NA_1(9)

标准化测量值(-1.0…+1.0)

+

+

M_ME_TA_1(10)

用CP24Time2a归一化的测量值(-1.0…+1.0)

+

+

M_ME_NB_1(11)

标定的测量值(-32768…+32767)

+

+

M_ME_TB_1(12)

使用CP24Time2a的标定测量值(-32768…+32767)

+

+

M_ME_NC_1(13)

短测量值(FLOAT32)

+

+

M_ME_TC_1(14)

CP24Time2a的短测量值(FLOAT32)

+

+

M_IT_NA_1(15)

综合总计(带有质量指标的INT32)

+

+

M_IT_TA_1(16)

CP24Time2a的累计总计(带有质量指标的INT32)

+

+

M_EP_TA_1(17)

保护设备事件

+

+

M_EP_TB_1(18)

保护设备的打包启动事件

+

+

M_EP_TC_1(19)

包装输出电路信息

+

+

M_PS_NA_1(20)

带SCD的单点包装

+

+

M_ME_ND_1(21)

归一化的测量值(-1.0…+1.0)无质量

+

+

M_SP_TB_1(30)

使用CP56Time2a的单点信息(BOOLEAN)

+

+

M_DP_TB_1(31)

CP56Time2a的双点信息(开/关/瞬态)

+

+

M_ST_TB_1(32)

使用CP56Time2a的步位置信息(-64…63是瞬态的)

+

+

M_BO_TB_1(33)

使用CP56Time2a的Bitstring32(32位位串)

+

+

M_ME_TD_1(34)

用CP56Time2a归一化的测量值(-1.0…+1.0)

+

+

M_ME_TE_1(35)

使用CP56Time2a的缩放测量值(-32768…+32767)

+

+

M_ME_TF_1(36)

使用CP56Time2a的短测量值(FLOAT32)

+

+

M_IT_TB_1(37)

使用CP56Time2a的累计总计(带有质量指标的INT32)

+

+

M_EP_TD_1(38)

使用CP56Time2a保护设备的事件

+

+

M_EP_TE_1(39)

CP56Time2a保护设备的打包启动事件

+

+

M_EP_TF_1(40)

CP56Time2a的打包输出电路信息

+

+

C_SC_NA_1(45)

单指令(BOOLEAN)

+

+

C_DC_NA_1(46)

双指令(ON / OFF /瞬态)

+

+

C_RC_NA_1(47)

步骤指令

+

+

C_SE_NA_1(48)

设定值指令,归一化值(-1.0…+1.0)

+

+

C_SE_NB_1(49)

设定值命令,标定值(-32768…+32767)

+

+

C_SE_NC_1(50)

设定值命令,短值(FLOAT32)

+

+

C_BO_NA_1(51)

位串命令(32位位串)

+

+

C_SC_TA_1(58)

带有CP56Time2a的单个命令(BOOLEAN)

+

+

C_DC_TA_1(59)

CP56Time2a的双指令(ON / OFF /瞬态)

+

+

C_RC_TA_1(60)

CP56Time2a的步进命令

+

+

C_SE_TA_1(61)

设定值命令,使用CP56Time2a的归一化值(-1.0…+1.0)

+

+

C_SE_TB_1(62)

设定值命令,带有CP56Time2a的标定值(-32768…+32767)

+

+

C_SE_TC_1(63)

设定值命令,带CP56Time2a的短值(FLOAT32)

+

+

C_BO_TA_1(64)

使用CP56Time2a的位串命令(32位位串)

+

+

M_EI_NA_1(70)

初始化结束

+

+

C_IC_NA_1(100)

询问命令

+

+

C_CI_NA_1(101)

反询问命令

+

+

C_RD_NA_1(102)

读命令

+

+

C_CS_NA_1(103)

时钟同步命令

+

+

C_TS_NA_1(104)

测试指令

+

+

C_RP_NA_1(105)

重置过程命令

+

+

C_CD_NA_1(106)

延迟采集命令

+

+

C_TS_TA_1(107)

使用CP56Time2a的测试命令

+

+

P_ME_NA_1(110)

测量值参数,归一化值

+

+

P_ME_NB_1(111)

测量值参数,标定值

+

+

P_ME_NC_1(112)

测量值参数,短浮点数

+

+

P_AC_NA_1(113)

激活参数

+

+

F_FR_NA_1(120)

准备好文件

+

+

F_SR_NA_1(121)

准备就绪

+

+

F_SC_NA_1(122)

呼叫/选择目录/文件/部分

+

+

F_LS_NA_1(123)

最后一段

+

+

F_AF_NA_1(124)

ACK文件/节

+

+

F_SG_NA_1(125)

文件段

+

+

F_DR_TA_1(126)

文件目录

+

+

F_SC_NB_1(127)

查询日志

+

+

 

 

 类似资料: