lib60870-IEC 60870-5-101 / 104 协议对总查询的处理
生活随笔
收集整理的這篇文章主要介紹了
lib60870-IEC 60870-5-101 / 104 协议对总查询的处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、描述
服務器端使用InterrogationHandler回調函數來處理Interrogation請求。根據QOI(詢問限定符)的值,返回不同的信息對象。對于一個簡單的系統,僅處理 總查詢 請求就足夠了(QOI = 20)。QOI值21-36用于詢問組(1-16)。由從屬實施者將信息對象分配給詢問組。 服務器用ACT_CON響應響應來自客戶端的ACTIVATION請求,然后是ASDU,其中ASDU包含代表站質詢或COT的信息對象,其中CS101_COT_INTERROGATED_BY_STATION代表相應的質詢組(例如,質詢組1的CS101_COT_INTERROGATED_BY_GROUP_1)。發送完所有信息對象后,服務器必須發送初始查詢命令消息,其中COT = CS101_COT_ACTIVATION_TERMINATION,以指示查詢數據的傳輸已完成。 2、代碼 static bool interrogationHandler(void* parameter, IMasterConnection connection, CS101_ASDU asdu, uint8_t qoi) {printf("Received interrogation for group %i\n", qoi);if (qoi == 20) { /* only handle station interrogation *//*! 1、響應client的 CS101_COT_ACTIVATION 請求 */CS101_AppLayerParameters alParams = IMasterConnection_getApplicationLayerParameters(connection);IMasterConnection_sendACT_CON(connection, asdu, false);/* The CS101 specification only allows information objects without timestamp in GI responses *//*! 2、發送ASDU, 其中COT設置為CS101_COT_INTERROGATED_BY_STATION,從站總召 *//*! 以下用M_ME_NB_1(MeasuredValueScaled_create),創建三個點對數據,分別為(100,-1),(101,23),(102,2300) */CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_INTERROGATED_BY_STATION, 0, 1, false, false);InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 100, -1, IEC60870_QUALITY_GOOD);CS101_ASDU_addInformationObject(newAsdu, io);CS101_ASDU_addInformationObject(newAsdu, (InformationObject)MeasuredValueScaled_create((MeasuredValueScaled) io, 101, 23, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject)MeasuredValueScaled_create((MeasuredValueScaled) io, 102, 2300, IEC60870_QUALITY_GOOD));/*! 發送 三個M_ME_NB_1數據 */InformationObject_destroy(io);IMasterConnection_sendASDU(connection, newAsdu);CS101_ASDU_destroy(newAsdu);/*! 以下用M_SP_NA_1(SinglePointInformation_create),創建2個數據,分別為(104,true),(104,false) */newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_INTERROGATED_BY_STATION,0, 1, false, false);io = (InformationObject) SinglePointInformation_create(NULL, 104, true, IEC60870_QUALITY_GOOD);CS101_ASDU_addInformationObject(newAsdu, io);CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 105, false, IEC60870_QUALITY_GOOD));/*! 發送兩個M_SP_NA_1數據 */ InformationObject_destroy(io);IMasterConnection_sendASDU(connection, newAsdu);CS101_ASDU_destroy(newAsdu);/*! 以下用M_SP_NA_1(SinglePointInformation_create),創建8個數據 */newAsdu = CS101_ASDU_create(alParams, true, CS101_COT_INTERROGATED_BY_STATION,0, 1, false, false);CS101_ASDU_addInformationObject(newAsdu, io = (InformationObject) SinglePointInformation_create(NULL, 300, true, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 301, false, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 302, true, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 303, false, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 304, true, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 305, false, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 306, true, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 307, false, IEC60870_QUALITY_GOOD));/*! 發送8個數據 */InformationObject_destroy(io);IMasterConnection_sendASDU(connection, newAsdu);CS101_ASDU_destroy(newAsdu);/*! 增加其他響應數據*//*! 結束響應必須發送 CS101_COT_ACTIVATION_TERMINATION */IMasterConnection_sendACT_TERM(connection, asdu);}else {IMasterConnection_sendACT_CON(connection, asdu, true);}return true; }3、應用
服務器端處理研制的集群廣域控制器的總召數據,采用M_ME_NC_1,短浮點遙測值,不帶時標,帶品質描述,調用MeasuredValueShort_create創建io。
如: CS101_ASDU?CS101_ASDU_create(CS101_AppLayerParameters parameters,(應用層參數)bool isSequence,(序列)CS101_CauseOfTransmission cot,(傳送原因)int oa,(消息對象地址)int ca(應用服務數據單元公共地址),bool isTest, (是否測試幀)bool isNegative); /*!? 以下用M_ME_NC_1(MeasuredValueShort_create),創建4個數據 */newAsdu = CS101_ASDU_create(alParams, true, CS101_COT_INTERROGATED_BY_STATION,?0, 1, false, false);CS101_ASDU_addInformationObject(newAsdu, (InformationObject)MeasuredValueShort_create((MeasuredValueShort) io, 6000, 6010.1, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject)MeasuredValueShort_create(( MeasuredValueShort) io, 6001,?6011.1, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject)MeasuredValueShort_create(( MeasuredValueShort) io, 6001,?6012.1, IEC60870_QUALITY_GOOD));CS101_ASDU_addInformationObject(newAsdu, (InformationObject)MeasuredValueShort_create(( MeasuredValueShort) io, 6003,?6013.1, IEC60870_QUALITY_GOOD));/*!? 發送8個數據 */InformationObject_destroy(io);IMasterConnection_sendASDU(connection, newAsdu);CS101_ASDU_destroy(newAsdu);?
注意。單次的點表必須按照順序發送,如果不連續,需要拆分多次單獨發送。總結
以上是生活随笔為你收集整理的lib60870-IEC 60870-5-101 / 104 协议对总查询的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python继承方式是基于原型吗_【Py
- 下一篇: linux查看镜像的详细信息,docke