lib60870-IEC 60870-5-101 / 104 C源代码库用户指南-版本2.3.0--第一部分
https://github.com/mz-automation/lib60870
介绍
lib60870是针对客户端(主站)和服务器(从站或受控站)的IEC 60870-5-101 / 104协议的功能丰富且经过实践验证的实现。该库实现了IEC 60870-5-101 / 104规范的所有数据类型。lib60870在标准C中实现,并且与C99标准兼容。它被设计为易于使用。
客户端/服务器API严格是异步的。您使用非阻塞函数发送请求,并且必须处理回调函数中的响应和其他事件。
以下是受支持的功能列表:
-
CS 101(IEC 60870-5-101)平衡和不平衡串行模式
-
CS 104(IEC 60870-5-104)客户端和服务器TCP / IP通信
-
CS 104支持加密和认证的TLS通信
-
CS 104使用CS 101应用层
-
CS 104从站:支持冗余组
-
主站/客户端支持反向发送系统命令,过程命令,参数命令和数据消息。
-
从站/服务器支持以监视方向发送数据消息,并以相反方向发送命令
-
支持的ASDU类型列表可以在附件中找到
-
该库支持用户定义的私有ASDU类型
-
库扩展的插件界面
注意: CS代表“配套标准”,并指定IEC 60870-5标准系列中定义的通信协议和服务的变体。
该库使用“面向对象”编程风格。它基于抽象数据类型(ADT)和对这些数据类型进行操作的功能。通常,对于API用户而言,数据类型(保存数据的数据结构)的实际实现是隐藏的。在几乎所有情况下,都不需要(也不建议)API用户直接访问这些数据结构。
应用层消息
将通过作为库API核心部分的CS101_ASDU ADT的示例来说明这种编程风格。此数据类型表示CS101 / CS104协议的应用层消息。缩写ASDU代表“应用程序服务数据单元”。要创建新的ASDU对象,必须将CS101_ASDU_create函数用作该对象的构造函数。
CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_INTERROGATED_BY_STATION, 0, 1, false, false);
此功能具有各种参数,以反映ASDU的不同属性。这是CS101_ASDU_create函数的签名:
CS101_ASDU CS101_ASDU_create(CS101_AppLayerParameters parameters, bool isSequence, CS101_CauseOfTransmission cot, int oa, int ca, bool isTest, bool isNegative);
第一个参数,如果是CS101_AppLayerParameters类型的另一个对象,它表示主协议和从协议之间共享的应用程序层参数。如果双方没有相同的参数,则他们将无法从另一方了解ASDU。
第二个参数isSequence,指示ASDU包含一系列连续的信息对象(如果为true)或一个或多个独立的信息对象(如果为false)。一系列连续的信息对象意味着ASDU仅包含一个信息对象地址(IOA)。连续的信息对象的地址为IOA,IOA + 1,IOA + 2 ......
第三个参数指示传输原因(COT)。告诉对方发送消息的原因。可能的值可能是CS101_COT_PERIODIC周期性的消息,CS101_COT_SPONTANEOUS自发消息。
其他参数是oa,代表发起方地址,ca代表ASDU的公共地址,isTest指示消息是测试消息,isNegative指示消息是对另一个消息的否定确认。
使用新的ASDU对象的句柄(在我们的示例中为newAsdu),我们可以调用各种函数之一来获取或设置ASDU的数据。例如,您可以使用CS101_ASDU_isTest或CS101_ASDU_setTest函数获取或设置测试标志值。这些函数的第一个参数始终是ASDU对象的句柄。
bool isTest = CS101_ASDU_isTest(newAsdu);
创建可用的ASDU对象的重要功能是CS101_ASDU_addInformationObject函数。使用此功能,您可以将信息对象实例添加到ASDU。
InformationObject io =(InformationObject)MeasuredValueScaled_create(NULL,100,-1,IEC60870_QUALITY_GOOD);
CS101_ASDU_addInformationObject(newAsdu,io);
可以多次调用此函数,以将更多信息对象添加到ASDU对象。它具有一个布尔值返回值,该值指示是否已成功添加信息对象(返回值true)。ASDU有效负载已满时,添加信息对象可能会失败。在这种情况下,该函数将返回false。
最后,当应用程序创建ASDU对象并且不再需要它时,必须使用CS101_ASDU_destroy函数将其释放。
CS101_ASDU_destroy(newAsdu);