From 25d825468383dad52fadbaab5bf63471c999f139 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 5 Nov 2015 18:10:54 +0100 Subject: [PATCH 01/33] - added prefix "IEC61850_" to IEC data types - old type declarations are available with CONFIG_IEC61850_USE_COMPAT_TYPE_DECLARATIONS --- CMakeLists.txt | 4 +- config/stack_config.h | 2 +- demos/beaglebone/static_model.c | 310 +++++----- examples/server_example1/static_model.c | 182 +++--- examples/server_example2/static_model.c | 430 ++++++------- examples/server_example3/static_model.c | 242 ++++---- examples/server_example4/static_model.c | 226 +++---- examples/server_example5/static_model.c | 430 ++++++------- .../server_example_61400_25/static_model.c | 572 +++++++++--------- .../static_model.c | 64 +- .../server_example_control/static_model.c | 550 ++++++++--------- examples/server_example_goose/static_model.c | 226 +++---- .../static_model.c | 142 ++--- .../server_example_threadless/static_model.c | 228 +++---- src/iec61850/inc/iec61850_model.h | 95 ++- src/iec61850/server/mms_mapping/mms_mapping.c | 58 +- src/iec61850/server/model/cdc.c | 310 +++++----- .../server/model/config_file_parser.c | 38 +- tools/model_generator/genmodel.jar | Bin 75505 -> 75518 bytes .../tools/StaticModelGenerator.java | 2 +- 20 files changed, 2073 insertions(+), 2038 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 13296b57..a4902a2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ endif() project(libiec61850) set(LIB_VERSION_MAJOR "0") -set(LIB_VERSION_MINOR "8") -set(LIB_VERSION_PATCH "7") +set(LIB_VERSION_MINOR "9") +set(LIB_VERSION_PATCH "0") # feature checks include(CheckLibraryExists) diff --git a/config/stack_config.h b/config/stack_config.h index 53c649fc..26207ee5 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -141,7 +141,7 @@ /* default results for MMS identify service */ #define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" #define CONFIG_DEFAULT_MMS_MODEL_NAME "LIBIEC61850" -#define CONFIG_DEFAULT_MMS_REVISION "0.8.7" +#define CONFIG_DEFAULT_MMS_REVISION "0.9.0" /* MMS virtual file store base path - where file services are looking for files */ #define CONFIG_VIRTUAL_FILESTORE_BASEPATH "./vmd-filestore/" diff --git a/demos/beaglebone/static_model.c b/demos/beaglebone/static_model.c index 993db3ec..ae7b9539 100644 --- a/demos/beaglebone/static_model.c +++ b/demos/beaglebone/static_model.c @@ -96,7 +96,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -109,7 +109,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -122,7 +122,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -144,7 +144,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -157,7 +157,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -170,7 +170,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -183,7 +183,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -205,7 +205,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -218,7 +218,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -231,7 +231,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -253,7 +253,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -266,7 +266,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -279,7 +279,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -292,7 +292,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -305,7 +305,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -335,7 +335,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -357,7 +357,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -370,7 +370,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -383,7 +383,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -405,7 +405,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -418,7 +418,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -431,7 +431,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -461,7 +461,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -474,7 +474,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -487,7 +487,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -509,7 +509,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -522,7 +522,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -535,7 +535,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -548,7 +548,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -570,7 +570,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -583,7 +583,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -596,7 +596,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -618,7 +618,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -631,7 +631,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -644,7 +644,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -666,7 +666,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -679,7 +679,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -692,7 +692,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -705,7 +705,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -727,7 +727,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -740,7 +740,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -753,7 +753,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -766,7 +766,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -788,7 +788,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -801,7 +801,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -814,7 +814,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -827,7 +827,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -849,7 +849,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -862,7 +862,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -875,7 +875,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -888,7 +888,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -910,7 +910,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -923,7 +923,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -936,7 +936,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -949,7 +949,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -962,7 +962,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -975,7 +975,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -988,7 +988,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1001,7 +1001,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1014,7 +1014,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1027,7 +1027,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1040,7 +1040,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1053,7 +1053,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1066,7 +1066,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1088,7 +1088,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1101,7 +1101,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1114,7 +1114,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO = { NULL, 0, IEC61850_FC_CO, - VISIBLE_STRING_64, + IEC61850_VISIBLE_STRING_64, 0, NULL, 0}; @@ -1127,7 +1127,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1140,7 +1140,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1153,7 +1153,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1166,7 +1166,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1179,7 +1179,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1192,7 +1192,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1205,7 +1205,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1218,7 +1218,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1231,7 +1231,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1244,7 +1244,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1257,7 +1257,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - INT8, + IEC61850_INT8, 0, NULL, 0}; @@ -1270,7 +1270,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1283,7 +1283,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1296,7 +1296,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1309,7 +1309,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1322,7 +1322,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1335,7 +1335,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1348,7 +1348,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1361,7 +1361,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1383,7 +1383,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1396,7 +1396,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1409,7 +1409,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1422,7 +1422,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1435,7 +1435,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1448,7 +1448,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1461,7 +1461,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1474,7 +1474,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1487,7 +1487,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1500,7 +1500,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1513,7 +1513,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1526,7 +1526,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1539,7 +1539,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1561,7 +1561,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_stVal = { NULL, 0, IEC61850_FC_ST, - CODEDENUM, + IEC61850_CODEDENUM, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1574,7 +1574,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1587,7 +1587,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1600,7 +1600,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1613,7 +1613,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1626,7 +1626,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1639,7 +1639,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1652,7 +1652,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1665,7 +1665,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1678,7 +1678,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1691,7 +1691,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1704,7 +1704,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1717,7 +1717,7 @@ DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1739,7 +1739,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1752,7 +1752,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1765,7 +1765,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1787,7 +1787,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1800,7 +1800,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1813,7 +1813,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1835,7 +1835,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1848,7 +1848,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1861,7 +1861,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1883,7 +1883,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1896,7 +1896,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1909,7 +1909,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1939,7 +1939,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1952,7 +1952,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1965,7 +1965,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1987,7 +1987,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2000,7 +2000,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2013,7 +2013,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2026,7 +2026,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2048,7 +2048,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_general = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2061,7 +2061,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_dirGeneral = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2074,7 +2074,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2087,7 +2087,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2109,7 +2109,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_general = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2122,7 +2122,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2135,7 +2135,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2157,7 +2157,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpDlTmms_setVal = { NULL, 0, IEC61850_FC_SP, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2170,7 +2170,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpDlTmms_dataNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2192,7 +2192,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_RsDlTmms_setVal = { NULL, 0, IEC61850_FC_SP, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2205,7 +2205,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_RsDlTmms_dataNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2227,7 +2227,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2240,7 +2240,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2253,7 +2253,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2266,7 +2266,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper = { (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2279,7 +2279,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2292,7 +2292,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin = { (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2305,7 +2305,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2318,7 +2318,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2331,7 +2331,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2344,7 +2344,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2357,7 +2357,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2370,7 +2370,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -2383,7 +2383,7 @@ DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; diff --git a/examples/server_example1/static_model.c b/examples/server_example1/static_model.c index 88e51ab6..c6b25442 100644 --- a/examples/server_example1/static_model.c +++ b/examples/server_example1/static_model.c @@ -218,7 +218,7 @@ DataAttribute iedModel_Device1_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -231,7 +231,7 @@ DataAttribute iedModel_Device1_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -244,7 +244,7 @@ DataAttribute iedModel_Device1_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -266,7 +266,7 @@ DataAttribute iedModel_Device1_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -279,7 +279,7 @@ DataAttribute iedModel_Device1_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -292,7 +292,7 @@ DataAttribute iedModel_Device1_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -314,7 +314,7 @@ DataAttribute iedModel_Device1_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -327,7 +327,7 @@ DataAttribute iedModel_Device1_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -340,7 +340,7 @@ DataAttribute iedModel_Device1_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -362,7 +362,7 @@ DataAttribute iedModel_Device1_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -375,7 +375,7 @@ DataAttribute iedModel_Device1_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -388,7 +388,7 @@ DataAttribute iedModel_Device1_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -401,7 +401,7 @@ DataAttribute iedModel_Device1_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -414,7 +414,7 @@ DataAttribute iedModel_Device1_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -444,7 +444,7 @@ DataAttribute iedModel_Device1_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -466,7 +466,7 @@ DataAttribute iedModel_Device1_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -479,7 +479,7 @@ DataAttribute iedModel_Device1_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -492,7 +492,7 @@ DataAttribute iedModel_Device1_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -514,7 +514,7 @@ DataAttribute iedModel_Device1_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -527,7 +527,7 @@ DataAttribute iedModel_Device1_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -540,7 +540,7 @@ DataAttribute iedModel_Device1_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -570,7 +570,7 @@ DataAttribute iedModel_Device1_DGEN1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -583,7 +583,7 @@ DataAttribute iedModel_Device1_DGEN1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -596,7 +596,7 @@ DataAttribute iedModel_Device1_DGEN1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -618,7 +618,7 @@ DataAttribute iedModel_Device1_DGEN1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -631,7 +631,7 @@ DataAttribute iedModel_Device1_DGEN1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -644,7 +644,7 @@ DataAttribute iedModel_Device1_DGEN1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -666,7 +666,7 @@ DataAttribute iedModel_Device1_DGEN1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -679,7 +679,7 @@ DataAttribute iedModel_Device1_DGEN1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -692,7 +692,7 @@ DataAttribute iedModel_Device1_DGEN1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -714,7 +714,7 @@ DataAttribute iedModel_Device1_DGEN1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -727,7 +727,7 @@ DataAttribute iedModel_Device1_DGEN1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -740,7 +740,7 @@ DataAttribute iedModel_Device1_DGEN1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -762,7 +762,7 @@ DataAttribute iedModel_Device1_DGEN1_OpTmh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -775,7 +775,7 @@ DataAttribute iedModel_Device1_DGEN1_OpTmh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -788,7 +788,7 @@ DataAttribute iedModel_Device1_DGEN1_OpTmh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -810,7 +810,7 @@ DataAttribute iedModel_Device1_DGEN1_GnOpSt_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -823,7 +823,7 @@ DataAttribute iedModel_Device1_DGEN1_GnOpSt_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -836,7 +836,7 @@ DataAttribute iedModel_Device1_DGEN1_GnOpSt_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -858,7 +858,7 @@ DataAttribute iedModel_Device1_DGEN1_OpTmsRs_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -871,7 +871,7 @@ DataAttribute iedModel_Device1_DGEN1_OpTmsRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -884,7 +884,7 @@ DataAttribute iedModel_Device1_DGEN1_OpTmsRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -906,7 +906,7 @@ DataAttribute iedModel_Device1_DGEN1_TotWh_mag = { (ModelNode*) &iedModel_Device1_DGEN1_TotWh_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -919,7 +919,7 @@ DataAttribute iedModel_Device1_DGEN1_TotWh_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -932,7 +932,7 @@ DataAttribute iedModel_Device1_DGEN1_TotWh_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -945,7 +945,7 @@ DataAttribute iedModel_Device1_DGEN1_TotWh_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -975,7 +975,7 @@ DataAttribute iedModel_Device1_DSCH1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -988,7 +988,7 @@ DataAttribute iedModel_Device1_DSCH1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1001,7 +1001,7 @@ DataAttribute iedModel_Device1_DSCH1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1023,7 +1023,7 @@ DataAttribute iedModel_Device1_DSCH1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1036,7 +1036,7 @@ DataAttribute iedModel_Device1_DSCH1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1049,7 +1049,7 @@ DataAttribute iedModel_Device1_DSCH1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1071,7 +1071,7 @@ DataAttribute iedModel_Device1_DSCH1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1084,7 +1084,7 @@ DataAttribute iedModel_Device1_DSCH1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1097,7 +1097,7 @@ DataAttribute iedModel_Device1_DSCH1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1119,7 +1119,7 @@ DataAttribute iedModel_Device1_DSCH1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1132,7 +1132,7 @@ DataAttribute iedModel_Device1_DSCH1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1145,7 +1145,7 @@ DataAttribute iedModel_Device1_DSCH1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1167,7 +1167,7 @@ DataAttribute iedModel_Device1_DSCH1_SchdSt_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1180,7 +1180,7 @@ DataAttribute iedModel_Device1_DSCH1_SchdSt_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1193,7 +1193,7 @@ DataAttribute iedModel_Device1_DSCH1_SchdSt_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1242,7 +1242,7 @@ DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_val = { NULL, 255, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1255,7 +1255,7 @@ DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_time = { NULL, 255, IEC61850_FC_SP, - TIMESTAMP, + IEC61850_TIMESTAMP, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1285,7 +1285,7 @@ DataAttribute iedModel_Device1_MMXU1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1298,7 +1298,7 @@ DataAttribute iedModel_Device1_MMXU1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1311,7 +1311,7 @@ DataAttribute iedModel_Device1_MMXU1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1333,7 +1333,7 @@ DataAttribute iedModel_Device1_MMXU1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1346,7 +1346,7 @@ DataAttribute iedModel_Device1_MMXU1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1359,7 +1359,7 @@ DataAttribute iedModel_Device1_MMXU1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1381,7 +1381,7 @@ DataAttribute iedModel_Device1_MMXU1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1394,7 +1394,7 @@ DataAttribute iedModel_Device1_MMXU1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1407,7 +1407,7 @@ DataAttribute iedModel_Device1_MMXU1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1429,7 +1429,7 @@ DataAttribute iedModel_Device1_MMXU1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1442,7 +1442,7 @@ DataAttribute iedModel_Device1_MMXU1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1455,7 +1455,7 @@ DataAttribute iedModel_Device1_MMXU1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1485,7 +1485,7 @@ DataAttribute iedModel_Device1_MMXU2_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1498,7 +1498,7 @@ DataAttribute iedModel_Device1_MMXU2_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1511,7 +1511,7 @@ DataAttribute iedModel_Device1_MMXU2_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1533,7 +1533,7 @@ DataAttribute iedModel_Device1_MMXU2_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1546,7 +1546,7 @@ DataAttribute iedModel_Device1_MMXU2_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1559,7 +1559,7 @@ DataAttribute iedModel_Device1_MMXU2_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1581,7 +1581,7 @@ DataAttribute iedModel_Device1_MMXU2_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1594,7 +1594,7 @@ DataAttribute iedModel_Device1_MMXU2_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1607,7 +1607,7 @@ DataAttribute iedModel_Device1_MMXU2_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1629,7 +1629,7 @@ DataAttribute iedModel_Device1_MMXU2_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1642,7 +1642,7 @@ DataAttribute iedModel_Device1_MMXU2_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1655,7 +1655,7 @@ DataAttribute iedModel_Device1_MMXU2_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1677,7 +1677,7 @@ DataAttribute iedModel_Device1_MMXU2_TotW_mag = { (ModelNode*) &iedModel_Device1_MMXU2_TotW_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1690,7 +1690,7 @@ DataAttribute iedModel_Device1_MMXU2_TotW_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1703,7 +1703,7 @@ DataAttribute iedModel_Device1_MMXU2_TotW_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1716,7 +1716,7 @@ DataAttribute iedModel_Device1_MMXU2_TotW_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; diff --git a/examples/server_example2/static_model.c b/examples/server_example2/static_model.c index fdc336cb..ae61c9d5 100644 --- a/examples/server_example2/static_model.c +++ b/examples/server_example2/static_model.c @@ -404,7 +404,7 @@ DataAttribute iedModel_Inverter_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -417,7 +417,7 @@ DataAttribute iedModel_Inverter_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -430,7 +430,7 @@ DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -452,7 +452,7 @@ DataAttribute iedModel_Inverter_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -465,7 +465,7 @@ DataAttribute iedModel_Inverter_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -478,7 +478,7 @@ DataAttribute iedModel_Inverter_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -500,7 +500,7 @@ DataAttribute iedModel_Inverter_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -513,7 +513,7 @@ DataAttribute iedModel_Inverter_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -526,7 +526,7 @@ DataAttribute iedModel_Inverter_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -548,7 +548,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -561,7 +561,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -574,7 +574,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -587,7 +587,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -600,7 +600,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -630,7 +630,7 @@ DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -652,7 +652,7 @@ DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -665,7 +665,7 @@ DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -678,7 +678,7 @@ DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -700,7 +700,7 @@ DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -713,7 +713,7 @@ DataAttribute iedModel_Inverter_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -726,7 +726,7 @@ DataAttribute iedModel_Inverter_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -756,7 +756,7 @@ DataAttribute iedModel_Inverter_ZINV1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -769,7 +769,7 @@ DataAttribute iedModel_Inverter_ZINV1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -782,7 +782,7 @@ DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -804,7 +804,7 @@ DataAttribute iedModel_Inverter_ZINV1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -817,7 +817,7 @@ DataAttribute iedModel_Inverter_ZINV1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -830,7 +830,7 @@ DataAttribute iedModel_Inverter_ZINV1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -852,7 +852,7 @@ DataAttribute iedModel_Inverter_ZINV1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -865,7 +865,7 @@ DataAttribute iedModel_Inverter_ZINV1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -878,7 +878,7 @@ DataAttribute iedModel_Inverter_ZINV1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -900,7 +900,7 @@ DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -913,7 +913,7 @@ DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -926,7 +926,7 @@ DataAttribute iedModel_Inverter_ZINV1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -948,7 +948,7 @@ DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag = { (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag_f, 0, IEC61850_FC_SP, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -961,7 +961,7 @@ DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f = { NULL, 0, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -974,7 +974,7 @@ DataAttribute iedModel_Inverter_ZINV1_WRtg_units = { (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units_SIUnit, 0, IEC61850_FC_CF, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -987,7 +987,7 @@ DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1009,7 +1009,7 @@ DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag = { (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag_f, 0, IEC61850_FC_SP, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1022,7 +1022,7 @@ DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f = { NULL, 0, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -1035,7 +1035,7 @@ DataAttribute iedModel_Inverter_ZINV1_VarRtg_units = { (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units_SIUnit, 0, IEC61850_FC_CF, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1048,7 +1048,7 @@ DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1070,7 +1070,7 @@ DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal = { NULL, 0, IEC61850_FC_SP, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -1092,7 +1092,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag = { (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag_f, 0, IEC61850_FC_SP, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1105,7 +1105,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f = { NULL, 0, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -1118,7 +1118,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutWSet_units = { (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units_SIUnit, 0, IEC61850_FC_CF, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1131,7 +1131,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1153,7 +1153,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag = { (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag_f, 0, IEC61850_FC_SP, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1166,7 +1166,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f = { NULL, 0, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -1179,7 +1179,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units = { (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit, 0, IEC61850_FC_CF, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1192,7 +1192,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1222,7 +1222,7 @@ DataAttribute iedModel_Inverter_MMXU1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1235,7 +1235,7 @@ DataAttribute iedModel_Inverter_MMXU1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1248,7 +1248,7 @@ DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1270,7 +1270,7 @@ DataAttribute iedModel_Inverter_MMXU1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1283,7 +1283,7 @@ DataAttribute iedModel_Inverter_MMXU1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1296,7 +1296,7 @@ DataAttribute iedModel_Inverter_MMXU1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1318,7 +1318,7 @@ DataAttribute iedModel_Inverter_MMXU1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1331,7 +1331,7 @@ DataAttribute iedModel_Inverter_MMXU1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1344,7 +1344,7 @@ DataAttribute iedModel_Inverter_MMXU1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1366,7 +1366,7 @@ DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1379,7 +1379,7 @@ DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1392,7 +1392,7 @@ DataAttribute iedModel_Inverter_MMXU1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1414,7 +1414,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotW_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1427,7 +1427,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1440,7 +1440,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotW_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1453,7 +1453,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotW_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1475,7 +1475,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1488,7 +1488,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1501,7 +1501,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVAr_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1514,7 +1514,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVAr_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1536,7 +1536,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVA_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1549,7 +1549,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1562,7 +1562,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1575,7 +1575,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1597,7 +1597,7 @@ DataAttribute iedModel_Inverter_MMXU1_Hz_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1610,7 +1610,7 @@ DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1623,7 +1623,7 @@ DataAttribute iedModel_Inverter_MMXU1_Hz_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1636,7 +1636,7 @@ DataAttribute iedModel_Inverter_MMXU1_Hz_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1667,7 +1667,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1680,7 +1680,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1693,7 +1693,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1706,7 +1706,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1719,7 +1719,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1741,7 +1741,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1754,7 +1754,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1767,7 +1767,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1780,7 +1780,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1793,7 +1793,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1815,7 +1815,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1828,7 +1828,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1841,7 +1841,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1854,7 +1854,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1867,7 +1867,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1889,7 +1889,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1902,7 +1902,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1915,7 +1915,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1928,7 +1928,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1941,7 +1941,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1972,7 +1972,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1985,7 +1985,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1998,7 +1998,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2011,7 +2011,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2024,7 +2024,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2046,7 +2046,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2059,7 +2059,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2072,7 +2072,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2085,7 +2085,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2098,7 +2098,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2120,7 +2120,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2133,7 +2133,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2146,7 +2146,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2159,7 +2159,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2172,7 +2172,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2194,7 +2194,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2207,7 +2207,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2220,7 +2220,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2233,7 +2233,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2246,7 +2246,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2277,7 +2277,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2290,7 +2290,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2303,7 +2303,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2316,7 +2316,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2329,7 +2329,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2351,7 +2351,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2364,7 +2364,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2377,7 +2377,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2390,7 +2390,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2403,7 +2403,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2425,7 +2425,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2438,7 +2438,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2451,7 +2451,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2464,7 +2464,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2477,7 +2477,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2516,7 +2516,7 @@ DataAttribute iedModel_Battery_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2529,7 +2529,7 @@ DataAttribute iedModel_Battery_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2542,7 +2542,7 @@ DataAttribute iedModel_Battery_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2564,7 +2564,7 @@ DataAttribute iedModel_Battery_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2577,7 +2577,7 @@ DataAttribute iedModel_Battery_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2590,7 +2590,7 @@ DataAttribute iedModel_Battery_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2612,7 +2612,7 @@ DataAttribute iedModel_Battery_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2625,7 +2625,7 @@ DataAttribute iedModel_Battery_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2638,7 +2638,7 @@ DataAttribute iedModel_Battery_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2660,7 +2660,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2673,7 +2673,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2686,7 +2686,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2699,7 +2699,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2712,7 +2712,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2742,7 +2742,7 @@ DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2764,7 +2764,7 @@ DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2777,7 +2777,7 @@ DataAttribute iedModel_Battery_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2790,7 +2790,7 @@ DataAttribute iedModel_Battery_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2812,7 +2812,7 @@ DataAttribute iedModel_Battery_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2825,7 +2825,7 @@ DataAttribute iedModel_Battery_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2838,7 +2838,7 @@ DataAttribute iedModel_Battery_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2868,7 +2868,7 @@ DataAttribute iedModel_Battery_ZBAT1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2881,7 +2881,7 @@ DataAttribute iedModel_Battery_ZBAT1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2894,7 +2894,7 @@ DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2916,7 +2916,7 @@ DataAttribute iedModel_Battery_ZBAT1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2929,7 +2929,7 @@ DataAttribute iedModel_Battery_ZBAT1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2942,7 +2942,7 @@ DataAttribute iedModel_Battery_ZBAT1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2964,7 +2964,7 @@ DataAttribute iedModel_Battery_ZBAT1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2977,7 +2977,7 @@ DataAttribute iedModel_Battery_ZBAT1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2990,7 +2990,7 @@ DataAttribute iedModel_Battery_ZBAT1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3012,7 +3012,7 @@ DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3025,7 +3025,7 @@ DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3038,7 +3038,7 @@ DataAttribute iedModel_Battery_ZBAT1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3060,7 +3060,7 @@ DataAttribute iedModel_Battery_ZBAT1_Vol_mag = { (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3073,7 +3073,7 @@ DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3086,7 +3086,7 @@ DataAttribute iedModel_Battery_ZBAT1_Vol_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3099,7 +3099,7 @@ DataAttribute iedModel_Battery_ZBAT1_Vol_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3121,7 +3121,7 @@ DataAttribute iedModel_Battery_ZBAT1_Amp_mag = { (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3134,7 +3134,7 @@ DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3147,7 +3147,7 @@ DataAttribute iedModel_Battery_ZBAT1_Amp_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3160,7 +3160,7 @@ DataAttribute iedModel_Battery_ZBAT1_Amp_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3190,7 +3190,7 @@ DataAttribute iedModel_Battery_ZBTC1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3203,7 +3203,7 @@ DataAttribute iedModel_Battery_ZBTC1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3216,7 +3216,7 @@ DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3238,7 +3238,7 @@ DataAttribute iedModel_Battery_ZBTC1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3251,7 +3251,7 @@ DataAttribute iedModel_Battery_ZBTC1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3264,7 +3264,7 @@ DataAttribute iedModel_Battery_ZBTC1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3286,7 +3286,7 @@ DataAttribute iedModel_Battery_ZBTC1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3299,7 +3299,7 @@ DataAttribute iedModel_Battery_ZBTC1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3312,7 +3312,7 @@ DataAttribute iedModel_Battery_ZBTC1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3334,7 +3334,7 @@ DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3347,7 +3347,7 @@ DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3360,7 +3360,7 @@ DataAttribute iedModel_Battery_ZBTC1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3409,7 +3409,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaV_mag = { (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3422,7 +3422,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3435,7 +3435,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaV_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3448,7 +3448,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaV_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3470,7 +3470,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaA_mag = { (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3483,7 +3483,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3496,7 +3496,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3509,7 +3509,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3548,7 +3548,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3561,7 +3561,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3574,7 +3574,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3596,7 +3596,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3609,7 +3609,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3622,7 +3622,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3644,7 +3644,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3657,7 +3657,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3670,7 +3670,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3692,7 +3692,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3705,7 +3705,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3718,7 +3718,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3731,7 +3731,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3744,7 +3744,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3774,7 +3774,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3796,7 +3796,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3809,7 +3809,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3822,7 +3822,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3844,7 +3844,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3857,7 +3857,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3870,7 +3870,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; diff --git a/examples/server_example3/static_model.c b/examples/server_example3/static_model.c index 9208a9fb..8080ff9d 100644 --- a/examples/server_example3/static_model.c +++ b/examples/server_example3/static_model.c @@ -248,7 +248,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -261,7 +261,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -274,7 +274,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -287,7 +287,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -309,7 +309,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -322,7 +322,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -335,7 +335,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -357,7 +357,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -370,7 +370,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -383,7 +383,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -405,7 +405,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -418,7 +418,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -431,7 +431,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -444,7 +444,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -457,7 +457,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -487,7 +487,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -509,7 +509,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -522,7 +522,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -535,7 +535,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -557,7 +557,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -570,7 +570,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -583,7 +583,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -613,7 +613,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -626,7 +626,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -639,7 +639,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -661,7 +661,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -674,7 +674,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -687,7 +687,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -709,7 +709,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -722,7 +722,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -735,7 +735,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -757,7 +757,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -770,7 +770,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -783,7 +783,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -805,7 +805,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -818,7 +818,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -831,7 +831,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -844,7 +844,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -866,7 +866,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -879,7 +879,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -892,7 +892,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -905,7 +905,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -927,7 +927,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -940,7 +940,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -953,7 +953,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -966,7 +966,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -988,7 +988,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1001,7 +1001,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1014,7 +1014,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1027,7 +1027,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1049,7 +1049,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1062,7 +1062,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1075,7 +1075,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1088,7 +1088,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1101,7 +1101,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1114,7 +1114,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1127,7 +1127,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1140,7 +1140,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1153,7 +1153,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1166,7 +1166,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1179,7 +1179,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1192,7 +1192,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1205,7 +1205,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1227,7 +1227,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1240,7 +1240,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1253,7 +1253,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1266,7 +1266,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1279,7 +1279,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1292,7 +1292,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1305,7 +1305,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1318,7 +1318,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1331,7 +1331,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1344,7 +1344,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1357,7 +1357,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1370,7 +1370,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1383,7 +1383,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1405,7 +1405,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1418,7 +1418,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1431,7 +1431,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1444,7 +1444,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1457,7 +1457,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1470,7 +1470,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1483,7 +1483,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1496,7 +1496,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1509,7 +1509,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1522,7 +1522,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1535,7 +1535,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1548,7 +1548,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1561,7 +1561,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1583,7 +1583,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1596,7 +1596,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1609,7 +1609,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1622,7 +1622,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1635,7 +1635,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1648,7 +1648,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1661,7 +1661,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1674,7 +1674,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1687,7 +1687,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1700,7 +1700,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1713,7 +1713,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1726,7 +1726,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1739,7 +1739,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1761,7 +1761,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1774,7 +1774,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1787,7 +1787,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1809,7 +1809,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1822,7 +1822,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1835,7 +1835,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1857,7 +1857,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1870,7 +1870,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1883,7 +1883,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1905,7 +1905,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1918,7 +1918,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1931,7 +1931,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1944,13 +1944,13 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report4; extern ReportControlBlock iedModel_GenericIO_LLN0_report5; extern ReportControlBlock iedModel_GenericIO_LLN0_report6; -ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; -ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2}; -ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3}; -ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report4}; -ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, &iedModel_GenericIO_LLN0_report5}; -ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, &iedModel_GenericIO_LLN0_report6}; -ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, NULL}; +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; +ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2}; +ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3}; +ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report4}; +ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 111, 50, 1000, &iedModel_GenericIO_LLN0_report5}; +ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 111, 50, 1000, &iedModel_GenericIO_LLN0_report6}; +ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 111, 50, 1000, NULL}; diff --git a/examples/server_example4/static_model.c b/examples/server_example4/static_model.c index c391fde0..d5334bcf 100644 --- a/examples/server_example4/static_model.c +++ b/examples/server_example4/static_model.c @@ -238,7 +238,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -251,7 +251,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -264,7 +264,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -286,7 +286,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -299,7 +299,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -312,7 +312,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -334,7 +334,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -347,7 +347,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -360,7 +360,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -382,7 +382,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -395,7 +395,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -408,7 +408,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -421,7 +421,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -434,7 +434,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -464,7 +464,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -486,7 +486,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -499,7 +499,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -512,7 +512,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -534,7 +534,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -547,7 +547,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -560,7 +560,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -590,7 +590,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -603,7 +603,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -616,7 +616,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -638,7 +638,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -651,7 +651,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -664,7 +664,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -686,7 +686,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -699,7 +699,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -712,7 +712,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -734,7 +734,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -747,7 +747,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -760,7 +760,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -782,7 +782,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -795,7 +795,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -808,7 +808,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -821,7 +821,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -843,7 +843,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -856,7 +856,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -869,7 +869,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -882,7 +882,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -904,7 +904,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -917,7 +917,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -930,7 +930,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -943,7 +943,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -965,7 +965,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -978,7 +978,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -991,7 +991,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1004,7 +1004,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1026,7 +1026,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1039,7 +1039,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1052,7 +1052,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1065,7 +1065,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1078,7 +1078,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1091,7 +1091,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1104,7 +1104,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1117,7 +1117,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1130,7 +1130,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1143,7 +1143,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1156,7 +1156,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1169,7 +1169,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1182,7 +1182,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1204,7 +1204,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1217,7 +1217,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1230,7 +1230,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1243,7 +1243,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1256,7 +1256,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1269,7 +1269,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1282,7 +1282,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1295,7 +1295,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1308,7 +1308,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1321,7 +1321,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1334,7 +1334,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1347,7 +1347,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1360,7 +1360,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1382,7 +1382,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1395,7 +1395,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1408,7 +1408,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1421,7 +1421,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1434,7 +1434,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1447,7 +1447,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1460,7 +1460,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1473,7 +1473,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1486,7 +1486,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1499,7 +1499,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1512,7 +1512,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1525,7 +1525,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1538,7 +1538,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1560,7 +1560,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1573,7 +1573,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1586,7 +1586,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1599,7 +1599,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1612,7 +1612,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1625,7 +1625,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1638,7 +1638,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1651,7 +1651,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1664,7 +1664,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1677,7 +1677,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1690,7 +1690,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1703,7 +1703,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1716,7 +1716,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1738,7 +1738,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1751,7 +1751,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1764,7 +1764,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1786,7 +1786,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1799,7 +1799,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1812,7 +1812,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1834,7 +1834,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1847,7 +1847,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1860,7 +1860,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1882,7 +1882,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1895,7 +1895,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1908,7 +1908,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; diff --git a/examples/server_example5/static_model.c b/examples/server_example5/static_model.c index fdc336cb..ae61c9d5 100644 --- a/examples/server_example5/static_model.c +++ b/examples/server_example5/static_model.c @@ -404,7 +404,7 @@ DataAttribute iedModel_Inverter_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -417,7 +417,7 @@ DataAttribute iedModel_Inverter_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -430,7 +430,7 @@ DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -452,7 +452,7 @@ DataAttribute iedModel_Inverter_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -465,7 +465,7 @@ DataAttribute iedModel_Inverter_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -478,7 +478,7 @@ DataAttribute iedModel_Inverter_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -500,7 +500,7 @@ DataAttribute iedModel_Inverter_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -513,7 +513,7 @@ DataAttribute iedModel_Inverter_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -526,7 +526,7 @@ DataAttribute iedModel_Inverter_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -548,7 +548,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -561,7 +561,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -574,7 +574,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -587,7 +587,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -600,7 +600,7 @@ DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -630,7 +630,7 @@ DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -652,7 +652,7 @@ DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -665,7 +665,7 @@ DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -678,7 +678,7 @@ DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -700,7 +700,7 @@ DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -713,7 +713,7 @@ DataAttribute iedModel_Inverter_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -726,7 +726,7 @@ DataAttribute iedModel_Inverter_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -756,7 +756,7 @@ DataAttribute iedModel_Inverter_ZINV1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -769,7 +769,7 @@ DataAttribute iedModel_Inverter_ZINV1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -782,7 +782,7 @@ DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -804,7 +804,7 @@ DataAttribute iedModel_Inverter_ZINV1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -817,7 +817,7 @@ DataAttribute iedModel_Inverter_ZINV1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -830,7 +830,7 @@ DataAttribute iedModel_Inverter_ZINV1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -852,7 +852,7 @@ DataAttribute iedModel_Inverter_ZINV1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -865,7 +865,7 @@ DataAttribute iedModel_Inverter_ZINV1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -878,7 +878,7 @@ DataAttribute iedModel_Inverter_ZINV1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -900,7 +900,7 @@ DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -913,7 +913,7 @@ DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -926,7 +926,7 @@ DataAttribute iedModel_Inverter_ZINV1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -948,7 +948,7 @@ DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag = { (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag_f, 0, IEC61850_FC_SP, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -961,7 +961,7 @@ DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f = { NULL, 0, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -974,7 +974,7 @@ DataAttribute iedModel_Inverter_ZINV1_WRtg_units = { (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units_SIUnit, 0, IEC61850_FC_CF, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -987,7 +987,7 @@ DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1009,7 +1009,7 @@ DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag = { (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag_f, 0, IEC61850_FC_SP, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1022,7 +1022,7 @@ DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f = { NULL, 0, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -1035,7 +1035,7 @@ DataAttribute iedModel_Inverter_ZINV1_VarRtg_units = { (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units_SIUnit, 0, IEC61850_FC_CF, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1048,7 +1048,7 @@ DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1070,7 +1070,7 @@ DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal = { NULL, 0, IEC61850_FC_SP, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -1092,7 +1092,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag = { (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag_f, 0, IEC61850_FC_SP, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1105,7 +1105,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f = { NULL, 0, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -1118,7 +1118,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutWSet_units = { (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units_SIUnit, 0, IEC61850_FC_CF, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1131,7 +1131,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1153,7 +1153,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag = { (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag_f, 0, IEC61850_FC_SP, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1166,7 +1166,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f = { NULL, 0, IEC61850_FC_SP, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -1179,7 +1179,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units = { (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit, 0, IEC61850_FC_CF, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1192,7 +1192,7 @@ DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1222,7 +1222,7 @@ DataAttribute iedModel_Inverter_MMXU1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1235,7 +1235,7 @@ DataAttribute iedModel_Inverter_MMXU1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1248,7 +1248,7 @@ DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1270,7 +1270,7 @@ DataAttribute iedModel_Inverter_MMXU1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1283,7 +1283,7 @@ DataAttribute iedModel_Inverter_MMXU1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1296,7 +1296,7 @@ DataAttribute iedModel_Inverter_MMXU1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1318,7 +1318,7 @@ DataAttribute iedModel_Inverter_MMXU1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1331,7 +1331,7 @@ DataAttribute iedModel_Inverter_MMXU1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1344,7 +1344,7 @@ DataAttribute iedModel_Inverter_MMXU1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1366,7 +1366,7 @@ DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1379,7 +1379,7 @@ DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1392,7 +1392,7 @@ DataAttribute iedModel_Inverter_MMXU1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1414,7 +1414,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotW_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1427,7 +1427,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1440,7 +1440,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotW_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1453,7 +1453,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotW_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1475,7 +1475,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1488,7 +1488,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1501,7 +1501,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVAr_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1514,7 +1514,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVAr_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1536,7 +1536,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVA_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1549,7 +1549,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1562,7 +1562,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1575,7 +1575,7 @@ DataAttribute iedModel_Inverter_MMXU1_TotVA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1597,7 +1597,7 @@ DataAttribute iedModel_Inverter_MMXU1_Hz_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1610,7 +1610,7 @@ DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1623,7 +1623,7 @@ DataAttribute iedModel_Inverter_MMXU1_Hz_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1636,7 +1636,7 @@ DataAttribute iedModel_Inverter_MMXU1_Hz_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1667,7 +1667,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1680,7 +1680,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1693,7 +1693,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1706,7 +1706,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1719,7 +1719,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1741,7 +1741,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1754,7 +1754,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1767,7 +1767,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1780,7 +1780,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1793,7 +1793,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1815,7 +1815,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1828,7 +1828,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1841,7 +1841,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1854,7 +1854,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1867,7 +1867,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1889,7 +1889,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1902,7 +1902,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1915,7 +1915,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1928,7 +1928,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1941,7 +1941,7 @@ DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1972,7 +1972,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1985,7 +1985,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1998,7 +1998,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2011,7 +2011,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2024,7 +2024,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2046,7 +2046,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2059,7 +2059,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2072,7 +2072,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2085,7 +2085,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2098,7 +2098,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsB_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2120,7 +2120,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2133,7 +2133,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2146,7 +2146,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2159,7 +2159,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2172,7 +2172,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_phsC_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2194,7 +2194,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2207,7 +2207,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2220,7 +2220,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2233,7 +2233,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2246,7 +2246,7 @@ DataAttribute iedModel_Inverter_MMXU1_A_neut_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2277,7 +2277,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2290,7 +2290,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2303,7 +2303,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2316,7 +2316,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2329,7 +2329,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2351,7 +2351,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2364,7 +2364,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2377,7 +2377,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2390,7 +2390,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2403,7 +2403,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsB_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2425,7 +2425,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2438,7 +2438,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag = { (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2451,7 +2451,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2464,7 +2464,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2477,7 +2477,7 @@ DataAttribute iedModel_Inverter_MMXU1_W_phsC_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2516,7 +2516,7 @@ DataAttribute iedModel_Battery_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2529,7 +2529,7 @@ DataAttribute iedModel_Battery_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2542,7 +2542,7 @@ DataAttribute iedModel_Battery_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2564,7 +2564,7 @@ DataAttribute iedModel_Battery_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2577,7 +2577,7 @@ DataAttribute iedModel_Battery_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2590,7 +2590,7 @@ DataAttribute iedModel_Battery_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2612,7 +2612,7 @@ DataAttribute iedModel_Battery_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2625,7 +2625,7 @@ DataAttribute iedModel_Battery_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2638,7 +2638,7 @@ DataAttribute iedModel_Battery_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2660,7 +2660,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2673,7 +2673,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2686,7 +2686,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2699,7 +2699,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2712,7 +2712,7 @@ DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2742,7 +2742,7 @@ DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -2764,7 +2764,7 @@ DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2777,7 +2777,7 @@ DataAttribute iedModel_Battery_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2790,7 +2790,7 @@ DataAttribute iedModel_Battery_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2812,7 +2812,7 @@ DataAttribute iedModel_Battery_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2825,7 +2825,7 @@ DataAttribute iedModel_Battery_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2838,7 +2838,7 @@ DataAttribute iedModel_Battery_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2868,7 +2868,7 @@ DataAttribute iedModel_Battery_ZBAT1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2881,7 +2881,7 @@ DataAttribute iedModel_Battery_ZBAT1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2894,7 +2894,7 @@ DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2916,7 +2916,7 @@ DataAttribute iedModel_Battery_ZBAT1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2929,7 +2929,7 @@ DataAttribute iedModel_Battery_ZBAT1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2942,7 +2942,7 @@ DataAttribute iedModel_Battery_ZBAT1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2964,7 +2964,7 @@ DataAttribute iedModel_Battery_ZBAT1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2977,7 +2977,7 @@ DataAttribute iedModel_Battery_ZBAT1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2990,7 +2990,7 @@ DataAttribute iedModel_Battery_ZBAT1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3012,7 +3012,7 @@ DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3025,7 +3025,7 @@ DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3038,7 +3038,7 @@ DataAttribute iedModel_Battery_ZBAT1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3060,7 +3060,7 @@ DataAttribute iedModel_Battery_ZBAT1_Vol_mag = { (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3073,7 +3073,7 @@ DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3086,7 +3086,7 @@ DataAttribute iedModel_Battery_ZBAT1_Vol_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3099,7 +3099,7 @@ DataAttribute iedModel_Battery_ZBAT1_Vol_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3121,7 +3121,7 @@ DataAttribute iedModel_Battery_ZBAT1_Amp_mag = { (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3134,7 +3134,7 @@ DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3147,7 +3147,7 @@ DataAttribute iedModel_Battery_ZBAT1_Amp_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3160,7 +3160,7 @@ DataAttribute iedModel_Battery_ZBAT1_Amp_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3190,7 +3190,7 @@ DataAttribute iedModel_Battery_ZBTC1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3203,7 +3203,7 @@ DataAttribute iedModel_Battery_ZBTC1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3216,7 +3216,7 @@ DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3238,7 +3238,7 @@ DataAttribute iedModel_Battery_ZBTC1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3251,7 +3251,7 @@ DataAttribute iedModel_Battery_ZBTC1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3264,7 +3264,7 @@ DataAttribute iedModel_Battery_ZBTC1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3286,7 +3286,7 @@ DataAttribute iedModel_Battery_ZBTC1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3299,7 +3299,7 @@ DataAttribute iedModel_Battery_ZBTC1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3312,7 +3312,7 @@ DataAttribute iedModel_Battery_ZBTC1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3334,7 +3334,7 @@ DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3347,7 +3347,7 @@ DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3360,7 +3360,7 @@ DataAttribute iedModel_Battery_ZBTC1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3409,7 +3409,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaV_mag = { (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3422,7 +3422,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3435,7 +3435,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaV_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3448,7 +3448,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaV_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3470,7 +3470,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaA_mag = { (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3483,7 +3483,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3496,7 +3496,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaA_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3509,7 +3509,7 @@ DataAttribute iedModel_Battery_ZBTC1_ChaA_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3548,7 +3548,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3561,7 +3561,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3574,7 +3574,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3596,7 +3596,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3609,7 +3609,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3622,7 +3622,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3644,7 +3644,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3657,7 +3657,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3670,7 +3670,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3692,7 +3692,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3705,7 +3705,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3718,7 +3718,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3731,7 +3731,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3744,7 +3744,7 @@ DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3774,7 +3774,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -3796,7 +3796,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3809,7 +3809,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3822,7 +3822,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3844,7 +3844,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3857,7 +3857,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3870,7 +3870,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; diff --git a/examples/server_example_61400_25/static_model.c b/examples/server_example_61400_25/static_model.c index ba022fdc..68f61f2f 100644 --- a/examples/server_example_61400_25/static_model.c +++ b/examples/server_example_61400_25/static_model.c @@ -375,7 +375,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper = { (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -388,7 +388,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -401,7 +401,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -414,7 +414,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin = { (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -427,7 +427,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -440,7 +440,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -453,7 +453,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -466,7 +466,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -479,7 +479,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -492,7 +492,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -505,7 +505,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -518,7 +518,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -531,7 +531,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -544,7 +544,7 @@ DataAttribute iedModel_WTG_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -566,7 +566,7 @@ DataAttribute iedModel_WTG_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -579,7 +579,7 @@ DataAttribute iedModel_WTG_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -592,7 +592,7 @@ DataAttribute iedModel_WTG_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -614,7 +614,7 @@ DataAttribute iedModel_WTG_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -627,7 +627,7 @@ DataAttribute iedModel_WTG_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -640,7 +640,7 @@ DataAttribute iedModel_WTG_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -662,7 +662,7 @@ DataAttribute iedModel_WTG_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -675,7 +675,7 @@ DataAttribute iedModel_WTG_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -688,7 +688,7 @@ DataAttribute iedModel_WTG_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -718,7 +718,7 @@ DataAttribute iedModel_WTG_LPHD1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -731,7 +731,7 @@ DataAttribute iedModel_WTG_LPHD1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -744,7 +744,7 @@ DataAttribute iedModel_WTG_LPHD1_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -766,7 +766,7 @@ DataAttribute iedModel_WTG_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -779,7 +779,7 @@ DataAttribute iedModel_WTG_LPHD1_PhyNam_hwRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -792,7 +792,7 @@ DataAttribute iedModel_WTG_LPHD1_PhyNam_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -805,7 +805,7 @@ DataAttribute iedModel_WTG_LPHD1_PhyNam_serNum = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -818,7 +818,7 @@ DataAttribute iedModel_WTG_LPHD1_PhyNam_model = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -840,7 +840,7 @@ DataAttribute iedModel_WTG_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -853,7 +853,7 @@ DataAttribute iedModel_WTG_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -866,7 +866,7 @@ DataAttribute iedModel_WTG_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -888,7 +888,7 @@ DataAttribute iedModel_WTG_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -901,7 +901,7 @@ DataAttribute iedModel_WTG_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -914,7 +914,7 @@ DataAttribute iedModel_WTG_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -944,7 +944,7 @@ DataAttribute iedModel_WTG_WTUR1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -957,7 +957,7 @@ DataAttribute iedModel_WTG_WTUR1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -970,7 +970,7 @@ DataAttribute iedModel_WTG_WTUR1_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -1001,7 +1001,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1014,7 +1014,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1027,7 +1027,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1040,7 +1040,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1053,7 +1053,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1066,7 +1066,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1079,7 +1079,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1092,7 +1092,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1105,7 +1105,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1118,7 +1118,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1131,7 +1131,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1144,7 +1144,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1157,7 +1157,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1170,7 +1170,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1183,7 +1183,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboTimeout = { NULL, 0, IEC61850_FC_CF, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -1196,7 +1196,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboClass = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1218,7 +1218,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1231,7 +1231,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -1244,7 +1244,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1257,7 +1257,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1270,7 +1270,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1283,7 +1283,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1296,7 +1296,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1309,7 +1309,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1322,7 +1322,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1335,7 +1335,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1348,7 +1348,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1361,7 +1361,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1374,7 +1374,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1387,7 +1387,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1409,7 +1409,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1422,7 +1422,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1435,7 +1435,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1457,7 +1457,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1470,7 +1470,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1483,7 +1483,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1496,7 +1496,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_ctTot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -1509,7 +1509,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_dly = { NULL, 32, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -1522,7 +1522,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_mly = { NULL, 13, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -1535,7 +1535,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_yly = { NULL, 21, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -1548,7 +1548,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_tot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -1561,7 +1561,7 @@ DataAttribute iedModel_WTG_WTUR1_TotWh_rsPer = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1592,7 +1592,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1605,7 +1605,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1618,7 +1618,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1640,7 +1640,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1653,7 +1653,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1666,7 +1666,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1697,7 +1697,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1710,7 +1710,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1723,7 +1723,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1736,7 +1736,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1749,7 +1749,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1762,7 +1762,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1775,7 +1775,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1788,7 +1788,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1801,7 +1801,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1814,7 +1814,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1827,7 +1827,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1840,7 +1840,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1853,7 +1853,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1866,7 +1866,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1879,7 +1879,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboTimeout = { NULL, 0, IEC61850_FC_CF, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -1892,7 +1892,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboClass = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1914,7 +1914,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1927,7 +1927,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -1940,7 +1940,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1953,7 +1953,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1966,7 +1966,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1979,7 +1979,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1992,7 +1992,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2005,7 +2005,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2018,7 +2018,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2031,7 +2031,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -2044,7 +2044,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2057,7 +2057,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2070,7 +2070,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2083,7 +2083,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2105,7 +2105,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2118,7 +2118,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2131,7 +2131,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2153,7 +2153,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2166,7 +2166,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2179,7 +2179,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2192,7 +2192,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tmTot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2205,7 +2205,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_dly = { NULL, 32, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2218,7 +2218,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_mly = { NULL, 13, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2231,7 +2231,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_yly = { NULL, 21, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2244,7 +2244,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2257,7 +2257,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_rsPer = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2288,7 +2288,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2301,7 +2301,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2314,7 +2314,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2327,7 +2327,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2340,7 +2340,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2353,7 +2353,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2366,7 +2366,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2379,7 +2379,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2392,7 +2392,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2405,7 +2405,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -2418,7 +2418,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2431,7 +2431,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2444,7 +2444,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2457,7 +2457,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2470,7 +2470,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboTimeout = { NULL, 0, IEC61850_FC_CF, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2483,7 +2483,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboClass = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2505,7 +2505,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2518,7 +2518,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -2531,7 +2531,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2544,7 +2544,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2557,7 +2557,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2570,7 +2570,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2583,7 +2583,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2596,7 +2596,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2609,7 +2609,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2622,7 +2622,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -2635,7 +2635,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2648,7 +2648,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2661,7 +2661,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2674,7 +2674,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2696,7 +2696,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2709,7 +2709,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2722,7 +2722,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2744,7 +2744,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2757,7 +2757,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2770,7 +2770,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2783,7 +2783,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_ctTot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2796,7 +2796,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_dly = { NULL, 32, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2809,7 +2809,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_mly = { NULL, 13, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2822,7 +2822,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_yly = { NULL, 21, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2835,7 +2835,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_tot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2848,7 +2848,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_rsPer = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2861,7 +2861,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_preTmms = { NULL, 0, IEC61850_FC_CF, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2874,7 +2874,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_pstTmms = { NULL, 0, IEC61850_FC_CF, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -2887,7 +2887,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_smpTmms = { NULL, 0, IEC61850_FC_CF, - INT16U, + IEC61850_INT16U, 0, NULL, 0}; @@ -2900,7 +2900,7 @@ DataAttribute iedModel_WTG_WTUR1_TurSt_datSetMx = { NULL, 0, IEC61850_FC_CF, - VISIBLE_STRING_129, + IEC61850_VISIBLE_STRING_129, 0, NULL, 0}; @@ -2922,7 +2922,7 @@ DataAttribute iedModel_WTG_WTUR1_W_instMag = { (ModelNode*) &iedModel_WTG_WTUR1_W_instMag_i, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2935,7 +2935,7 @@ DataAttribute iedModel_WTG_WTUR1_W_instMag_i = { NULL, 0, IEC61850_FC_MX, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -2948,7 +2948,7 @@ DataAttribute iedModel_WTG_WTUR1_W_instMag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -2961,7 +2961,7 @@ DataAttribute iedModel_WTG_WTUR1_W_mag = { (ModelNode*) &iedModel_WTG_WTUR1_W_mag_i, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2974,7 +2974,7 @@ DataAttribute iedModel_WTG_WTUR1_W_mag_i = { NULL, 0, IEC61850_FC_MX, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2987,7 +2987,7 @@ DataAttribute iedModel_WTG_WTUR1_W_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3000,7 +3000,7 @@ DataAttribute iedModel_WTG_WTUR1_W_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3013,7 +3013,7 @@ DataAttribute iedModel_WTG_WTUR1_W_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3044,7 +3044,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3057,7 +3057,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -3070,7 +3070,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3083,7 +3083,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3096,7 +3096,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3109,7 +3109,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3122,7 +3122,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3135,7 +3135,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3148,7 +3148,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3161,7 +3161,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -3174,7 +3174,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3187,7 +3187,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3200,7 +3200,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3213,7 +3213,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3235,7 +3235,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3248,7 +3248,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3261,7 +3261,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3292,7 +3292,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3305,7 +3305,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3318,7 +3318,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3331,7 +3331,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3344,7 +3344,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3357,7 +3357,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3370,7 +3370,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3383,7 +3383,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3396,7 +3396,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3409,7 +3409,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -3422,7 +3422,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3435,7 +3435,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3448,7 +3448,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3461,7 +3461,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3474,7 +3474,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboTimeout = { NULL, 0, IEC61850_FC_CF, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -3487,7 +3487,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboClass = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3509,7 +3509,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3522,7 +3522,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -3535,7 +3535,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3548,7 +3548,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3561,7 +3561,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3574,7 +3574,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3587,7 +3587,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3600,7 +3600,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3613,7 +3613,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3626,7 +3626,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -3639,7 +3639,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3652,7 +3652,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3665,7 +3665,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3678,7 +3678,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3700,7 +3700,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3713,7 +3713,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3726,7 +3726,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3748,7 +3748,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3761,7 +3761,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3774,7 +3774,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3787,7 +3787,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tmTot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -3800,7 +3800,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_dly = { NULL, 32, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -3813,7 +3813,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_mly = { NULL, 13, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -3826,7 +3826,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_yly = { NULL, 21, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -3839,7 +3839,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -3852,7 +3852,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_rsPer = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3883,7 +3883,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3896,7 +3896,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3909,7 +3909,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3922,7 +3922,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3935,7 +3935,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3948,7 +3948,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3961,7 +3961,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3974,7 +3974,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3987,7 +3987,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -4000,7 +4000,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -4013,7 +4013,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -4026,7 +4026,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -4039,7 +4039,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4052,7 +4052,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -4065,7 +4065,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboTimeout = { NULL, 0, IEC61850_FC_CF, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -4078,7 +4078,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboClass = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -4100,7 +4100,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -4113,7 +4113,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - INT32, + IEC61850_INT32, 0, NULL, 0}; @@ -4126,7 +4126,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4139,7 +4139,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin = { (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -4152,7 +4152,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -4165,7 +4165,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -4178,7 +4178,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -4191,7 +4191,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4204,7 +4204,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -4217,7 +4217,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -4230,7 +4230,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -4243,7 +4243,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -4256,7 +4256,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4269,7 +4269,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -4291,7 +4291,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -4304,7 +4304,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -4317,7 +4317,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4339,7 +4339,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -4352,7 +4352,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -4365,7 +4365,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4378,7 +4378,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_ctTot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -4391,7 +4391,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_dly = { NULL, 32, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -4404,7 +4404,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_mly = { NULL, 13, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -4417,7 +4417,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_yly = { NULL, 21, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -4430,7 +4430,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_tot = { NULL, 0, IEC61850_FC_ST, - INT32U, + IEC61850_INT32U, 0, NULL, 0}; @@ -4443,7 +4443,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_rsPer = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -4456,7 +4456,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmAcs = { NULL, 0, IEC61850_FC_CF, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; diff --git a/examples/server_example_complex_array/static_model.c b/examples/server_example_complex_array/static_model.c index 458b189f..71cad7d6 100644 --- a/examples/server_example_complex_array/static_model.c +++ b/examples/server_example_complex_array/static_model.c @@ -89,7 +89,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -102,7 +102,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -115,7 +115,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -137,7 +137,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -150,7 +150,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -163,7 +163,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -185,7 +185,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -198,7 +198,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -211,7 +211,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -233,7 +233,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -246,7 +246,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -259,7 +259,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -272,7 +272,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -285,7 +285,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -315,7 +315,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -337,7 +337,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -350,7 +350,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -363,7 +363,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -385,7 +385,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -398,7 +398,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -411,7 +411,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -450,7 +450,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal = { (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; @@ -463,7 +463,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag = { (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; @@ -476,7 +476,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; @@ -489,7 +489,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang = { (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; @@ -502,7 +502,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; @@ -515,7 +515,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -528,7 +528,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -541,7 +541,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_numHar = { NULL, 0, IEC61850_FC_CF, - INT16U, + IEC61850_INT16U, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -554,7 +554,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc = { NULL, 0, IEC61850_FC_CF, - INT16U, + IEC61850_INT16U, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -567,7 +567,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm = { NULL, 0, IEC61850_FC_CF, - INT16U, + IEC61850_INT16U, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -580,7 +580,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency = { NULL, 0, IEC61850_FC_CF, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; diff --git a/examples/server_example_control/static_model.c b/examples/server_example_control/static_model.c index fe058594..8bd02ad2 100644 --- a/examples/server_example_control/static_model.c +++ b/examples/server_example_control/static_model.c @@ -351,7 +351,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -364,7 +364,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -377,7 +377,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -399,7 +399,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -412,7 +412,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -425,7 +425,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -447,7 +447,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -460,7 +460,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -473,7 +473,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -495,7 +495,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -508,7 +508,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -521,7 +521,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -534,7 +534,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -547,7 +547,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -577,7 +577,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -599,7 +599,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -612,7 +612,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -625,7 +625,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -647,7 +647,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -660,7 +660,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -673,7 +673,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -703,7 +703,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -716,7 +716,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -729,7 +729,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -751,7 +751,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -764,7 +764,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -777,7 +777,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -799,7 +799,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -812,7 +812,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -825,7 +825,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -847,7 +847,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -860,7 +860,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -873,7 +873,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -895,7 +895,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -908,7 +908,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -921,7 +921,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -934,7 +934,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -956,7 +956,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -969,7 +969,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -982,7 +982,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -995,7 +995,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1017,7 +1017,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1030,7 +1030,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1043,7 +1043,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1056,7 +1056,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1078,7 +1078,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1091,7 +1091,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1104,7 +1104,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1117,7 +1117,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1139,7 +1139,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1152,7 +1152,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1165,7 +1165,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1178,7 +1178,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1191,7 +1191,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1204,7 +1204,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1217,7 +1217,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1230,7 +1230,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1243,7 +1243,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1256,7 +1256,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1269,7 +1269,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1282,7 +1282,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1295,7 +1295,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1317,7 +1317,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO = { NULL, 0, IEC61850_FC_CO, - VISIBLE_STRING_64, + IEC61850_VISIBLE_STRING_64, 0, NULL, 0}; @@ -1330,7 +1330,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1343,7 +1343,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1356,7 +1356,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1369,7 +1369,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1382,7 +1382,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1395,7 +1395,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1408,7 +1408,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1421,7 +1421,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1434,7 +1434,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1447,7 +1447,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1460,7 +1460,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1473,7 +1473,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1486,7 +1486,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1499,7 +1499,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1512,7 +1512,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1525,7 +1525,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1538,7 +1538,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1551,7 +1551,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1564,7 +1564,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1577,7 +1577,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1590,7 +1590,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1603,7 +1603,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_sboClass = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1625,7 +1625,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1638,7 +1638,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1651,7 +1651,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1664,7 +1664,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1677,7 +1677,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1690,7 +1690,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1703,7 +1703,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1716,7 +1716,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1729,7 +1729,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1742,7 +1742,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1755,7 +1755,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1768,7 +1768,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1781,7 +1781,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1794,7 +1794,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1807,7 +1807,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1820,7 +1820,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1833,7 +1833,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1846,7 +1846,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1859,7 +1859,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1872,7 +1872,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1885,7 +1885,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1907,7 +1907,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1920,7 +1920,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1933,7 +1933,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1946,7 +1946,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1959,7 +1959,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1972,7 +1972,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1985,7 +1985,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1998,7 +1998,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2011,7 +2011,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -2024,7 +2024,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2037,7 +2037,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2050,7 +2050,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2063,7 +2063,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2076,7 +2076,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2089,7 +2089,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2102,7 +2102,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2115,7 +2115,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2128,7 +2128,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -2141,7 +2141,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2154,7 +2154,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2167,7 +2167,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2180,7 +2180,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2193,7 +2193,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2206,7 +2206,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2219,7 +2219,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2232,7 +2232,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2245,7 +2245,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2258,7 +2258,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2271,7 +2271,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2284,7 +2284,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2306,7 +2306,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2319,7 +2319,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2332,7 +2332,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2345,7 +2345,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2358,7 +2358,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2371,7 +2371,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2384,7 +2384,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2397,7 +2397,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2410,7 +2410,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2423,7 +2423,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -2436,7 +2436,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2449,7 +2449,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2462,7 +2462,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2475,7 +2475,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2488,7 +2488,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2501,7 +2501,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2514,7 +2514,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2527,7 +2527,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2540,7 +2540,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2553,7 +2553,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2566,7 +2566,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2579,7 +2579,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2601,7 +2601,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_SBO = { NULL, 0, IEC61850_FC_CO, - VISIBLE_STRING_64, + IEC61850_VISIBLE_STRING_64, 0, NULL, 0}; @@ -2614,7 +2614,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2627,7 +2627,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2640,7 +2640,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2653,7 +2653,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2666,7 +2666,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2679,7 +2679,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2692,7 +2692,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2705,7 +2705,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2718,7 +2718,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2731,7 +2731,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -2744,7 +2744,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2757,7 +2757,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2770,7 +2770,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2783,7 +2783,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2796,7 +2796,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2809,7 +2809,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -2822,7 +2822,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -2835,7 +2835,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2848,7 +2848,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2861,7 +2861,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -2874,7 +2874,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -2887,7 +2887,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2900,7 +2900,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2922,7 +2922,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2935,7 +2935,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -2948,7 +2948,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -2961,7 +2961,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -2974,7 +2974,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -2987,7 +2987,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3000,7 +3000,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3013,7 +3013,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3026,7 +3026,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3039,7 +3039,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -3052,7 +3052,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3065,7 +3065,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3078,7 +3078,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3091,7 +3091,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3104,7 +3104,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3117,7 +3117,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3130,7 +3130,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3143,7 +3143,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3156,7 +3156,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3169,7 +3169,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3182,7 +3182,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3195,7 +3195,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3208,7 +3208,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3230,7 +3230,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3243,7 +3243,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3256,7 +3256,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3269,7 +3269,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3282,7 +3282,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3295,7 +3295,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3308,7 +3308,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3321,7 +3321,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3334,7 +3334,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3347,7 +3347,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -3360,7 +3360,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3373,7 +3373,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3386,7 +3386,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3399,7 +3399,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3412,7 +3412,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3425,7 +3425,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3438,7 +3438,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3451,7 +3451,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3464,7 +3464,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3477,7 +3477,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -3490,7 +3490,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3503,7 +3503,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3516,7 +3516,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3529,7 +3529,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3542,7 +3542,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3555,7 +3555,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3568,7 +3568,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3581,7 +3581,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3594,7 +3594,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3607,7 +3607,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_origin_orCat, 0, IEC61850_FC_ST, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3620,7 +3620,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orCat = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3633,7 +3633,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orIdent = { NULL, 0, IEC61850_FC_ST, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3646,7 +3646,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlNum = { NULL, 0, IEC61850_FC_ST, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3659,7 +3659,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3672,7 +3672,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3685,7 +3685,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3698,7 +3698,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3720,7 +3720,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3733,7 +3733,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3746,7 +3746,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3759,7 +3759,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3772,7 +3772,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3785,7 +3785,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3798,7 +3798,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3811,7 +3811,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3824,7 +3824,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -3837,7 +3837,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3850,7 +3850,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3863,7 +3863,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -3876,7 +3876,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -3889,7 +3889,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -3902,7 +3902,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -3915,7 +3915,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3928,7 +3928,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -3941,7 +3941,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -3954,7 +3954,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -3967,7 +3967,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -3980,7 +3980,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -4002,7 +4002,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -4015,7 +4015,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -4028,7 +4028,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4050,7 +4050,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -4063,7 +4063,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -4076,7 +4076,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4098,7 +4098,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -4111,7 +4111,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -4124,7 +4124,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -4146,7 +4146,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -4159,7 +4159,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -4172,7 +4172,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; diff --git a/examples/server_example_goose/static_model.c b/examples/server_example_goose/static_model.c index 8c60853e..64549d37 100644 --- a/examples/server_example_goose/static_model.c +++ b/examples/server_example_goose/static_model.c @@ -292,7 +292,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -305,7 +305,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -318,7 +318,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -340,7 +340,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -353,7 +353,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -366,7 +366,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -388,7 +388,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -401,7 +401,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -414,7 +414,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -436,7 +436,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -449,7 +449,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -462,7 +462,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -475,7 +475,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -488,7 +488,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -518,7 +518,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -540,7 +540,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -553,7 +553,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -566,7 +566,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -588,7 +588,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -601,7 +601,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -614,7 +614,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -644,7 +644,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -657,7 +657,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -670,7 +670,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -692,7 +692,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -705,7 +705,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -718,7 +718,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -740,7 +740,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -753,7 +753,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -766,7 +766,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -788,7 +788,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -801,7 +801,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -814,7 +814,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -836,7 +836,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -849,7 +849,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -862,7 +862,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -875,7 +875,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -897,7 +897,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -910,7 +910,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -923,7 +923,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -936,7 +936,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -958,7 +958,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -971,7 +971,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -984,7 +984,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -997,7 +997,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1019,7 +1019,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1032,7 +1032,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1045,7 +1045,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1058,7 +1058,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1080,7 +1080,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1093,7 +1093,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1106,7 +1106,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1119,7 +1119,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1132,7 +1132,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1145,7 +1145,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1158,7 +1158,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1171,7 +1171,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1184,7 +1184,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1197,7 +1197,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1210,7 +1210,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1223,7 +1223,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1236,7 +1236,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1258,7 +1258,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1271,7 +1271,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1284,7 +1284,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1297,7 +1297,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1310,7 +1310,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1323,7 +1323,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1336,7 +1336,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1349,7 +1349,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1362,7 +1362,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1375,7 +1375,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1388,7 +1388,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1401,7 +1401,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1414,7 +1414,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1436,7 +1436,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1449,7 +1449,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1462,7 +1462,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1475,7 +1475,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1488,7 +1488,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1501,7 +1501,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1514,7 +1514,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1527,7 +1527,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1540,7 +1540,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1553,7 +1553,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1566,7 +1566,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1579,7 +1579,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1592,7 +1592,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1614,7 +1614,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1627,7 +1627,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1640,7 +1640,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1653,7 +1653,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1666,7 +1666,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1679,7 +1679,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1692,7 +1692,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1705,7 +1705,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1718,7 +1718,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1731,7 +1731,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1744,7 +1744,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1757,7 +1757,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1770,7 +1770,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1792,7 +1792,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1805,7 +1805,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1818,7 +1818,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1840,7 +1840,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1853,7 +1853,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1866,7 +1866,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1888,7 +1888,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1901,7 +1901,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1914,7 +1914,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1936,7 +1936,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1949,7 +1949,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1962,7 +1962,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; diff --git a/examples/server_example_setting_groups/static_model.c b/examples/server_example_setting_groups/static_model.c index af840569..d02d95fe 100644 --- a/examples/server_example_setting_groups/static_model.c +++ b/examples/server_example_setting_groups/static_model.c @@ -134,7 +134,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper = { (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -147,7 +147,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -160,7 +160,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -173,7 +173,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin = { (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -186,7 +186,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -199,7 +199,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -212,7 +212,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -225,7 +225,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -238,7 +238,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -251,7 +251,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -264,7 +264,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -277,7 +277,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -290,7 +290,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -303,7 +303,7 @@ DataAttribute iedModel_PROT_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -325,7 +325,7 @@ DataAttribute iedModel_PROT_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -338,7 +338,7 @@ DataAttribute iedModel_PROT_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -351,7 +351,7 @@ DataAttribute iedModel_PROT_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -373,7 +373,7 @@ DataAttribute iedModel_PROT_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -386,7 +386,7 @@ DataAttribute iedModel_PROT_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -399,7 +399,7 @@ DataAttribute iedModel_PROT_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -421,7 +421,7 @@ DataAttribute iedModel_PROT_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -434,7 +434,7 @@ DataAttribute iedModel_PROT_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -447,7 +447,7 @@ DataAttribute iedModel_PROT_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -460,7 +460,7 @@ DataAttribute iedModel_PROT_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -473,7 +473,7 @@ DataAttribute iedModel_PROT_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -503,7 +503,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -516,7 +516,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyNam_hwRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -529,7 +529,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyNam_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -542,7 +542,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyNam_serNum = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -555,7 +555,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyNam_model = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -568,7 +568,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyNam_location = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -590,7 +590,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -603,7 +603,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -616,7 +616,7 @@ DataAttribute iedModel_PROT_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -638,7 +638,7 @@ DataAttribute iedModel_PROT_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -651,7 +651,7 @@ DataAttribute iedModel_PROT_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -664,7 +664,7 @@ DataAttribute iedModel_PROT_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -694,7 +694,7 @@ DataAttribute iedModel_PROT_PTOC1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -707,7 +707,7 @@ DataAttribute iedModel_PROT_PTOC1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -720,7 +720,7 @@ DataAttribute iedModel_PROT_PTOC1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -742,7 +742,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper = { (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -755,7 +755,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -768,7 +768,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_operTm = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -781,7 +781,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin = { (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -794,7 +794,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -807,7 +807,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -820,7 +820,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -833,7 +833,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -846,7 +846,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -859,7 +859,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -872,7 +872,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_stVal = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -885,7 +885,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -898,7 +898,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -911,7 +911,7 @@ DataAttribute iedModel_PROT_PTOC1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -933,7 +933,7 @@ DataAttribute iedModel_PROT_PTOC1_Str_general = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -946,7 +946,7 @@ DataAttribute iedModel_PROT_PTOC1_Str_dirGeneral = { NULL, 0, IEC61850_FC_ST, - ENUMERATED, + IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -959,7 +959,7 @@ DataAttribute iedModel_PROT_PTOC1_Str_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -972,7 +972,7 @@ DataAttribute iedModel_PROT_PTOC1_Str_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -994,7 +994,7 @@ DataAttribute iedModel_PROT_PTOC1_Op_general = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1007,7 +1007,7 @@ DataAttribute iedModel_PROT_PTOC1_Op_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1020,7 +1020,7 @@ DataAttribute iedModel_PROT_PTOC1_Op_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1042,7 +1042,7 @@ DataAttribute iedModel_PROT_PTOC1_StrVal_setMag = { (ModelNode*) &iedModel_PROT_PTOC1_StrVal_setMag_f, 0, IEC61850_FC_SG, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1055,7 +1055,7 @@ DataAttribute iedModel_PROT_PTOC1_StrVal_setMag_f = { NULL, 0, IEC61850_FC_SG, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -1068,7 +1068,7 @@ DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag = { (ModelNode*) &iedModel_SE_PROT_PTOC1_StrVal_setMag_f, 0, IEC61850_FC_SE, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1081,7 +1081,7 @@ DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag_f = { NULL, 0, IEC61850_FC_SE, - FLOAT32, + IEC61850_FLOAT32, 0, NULL, 0}; @@ -1103,7 +1103,7 @@ DataAttribute iedModel_PROT_PTOC1_OpDlTmms_setVal = { NULL, 0, IEC61850_FC_SG, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1116,7 +1116,7 @@ DataAttribute iedModel_SE_PROT_PTOC1_OpDlTmms_setVal = { NULL, 0, IEC61850_FC_SE, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1138,7 +1138,7 @@ DataAttribute iedModel_PROT_PTOC1_RsDlTmms_setVal = { NULL, 0, IEC61850_FC_SG, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1151,7 +1151,7 @@ DataAttribute iedModel_SE_PROT_PTOC1_RsDlTmms_setVal = { NULL, 0, IEC61850_FC_SE, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1173,7 +1173,7 @@ DataAttribute iedModel_PROT_PTOC1_RstTms_setVal = { NULL, 0, IEC61850_FC_SG, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1186,7 +1186,7 @@ DataAttribute iedModel_SE_PROT_PTOC1_RstTms_setVal = { NULL, 0, IEC61850_FC_SE, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; diff --git a/examples/server_example_threadless/static_model.c b/examples/server_example_threadless/static_model.c index 10cab577..b1bd317e 100644 --- a/examples/server_example_threadless/static_model.c +++ b/examples/server_example_threadless/static_model.c @@ -293,7 +293,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -306,7 +306,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -319,7 +319,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -332,7 +332,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -354,7 +354,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -367,7 +367,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -380,7 +380,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -402,7 +402,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -415,7 +415,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -428,7 +428,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -450,7 +450,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -463,7 +463,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -476,7 +476,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -489,7 +489,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -502,7 +502,7 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { NULL, 0, IEC61850_FC_EX, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -532,7 +532,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -554,7 +554,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -567,7 +567,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -580,7 +580,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -602,7 +602,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -615,7 +615,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -628,7 +628,7 @@ DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -658,7 +658,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -671,7 +671,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -684,7 +684,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -706,7 +706,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -719,7 +719,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -732,7 +732,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -754,7 +754,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { NULL, 0, IEC61850_FC_ST, - INT32, + IEC61850_INT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -767,7 +767,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -780,7 +780,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -802,7 +802,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -815,7 +815,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -828,7 +828,7 @@ DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { NULL, 0, IEC61850_FC_DC, - VISIBLE_STRING_255, + IEC61850_VISIBLE_STRING_255, 0, NULL, 0}; @@ -850,7 +850,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -863,7 +863,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -876,7 +876,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -889,7 +889,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -911,7 +911,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -924,7 +924,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -937,7 +937,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -950,7 +950,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -972,7 +972,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -985,7 +985,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -998,7 +998,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1011,7 +1011,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1033,7 +1033,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, 0, IEC61850_FC_MX, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1046,7 +1046,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { NULL, 0, IEC61850_FC_MX, - FLOAT32, + IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1059,7 +1059,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { NULL, 0, IEC61850_FC_MX, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1072,7 +1072,7 @@ DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { NULL, 0, IEC61850_FC_MX, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1094,7 +1094,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1107,7 +1107,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1120,7 +1120,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1133,7 +1133,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1146,7 +1146,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1159,7 +1159,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1172,7 +1172,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1185,7 +1185,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1198,7 +1198,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1211,7 +1211,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1224,7 +1224,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1237,7 +1237,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1250,7 +1250,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1272,7 +1272,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1285,7 +1285,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1298,7 +1298,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1311,7 +1311,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1324,7 +1324,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1337,7 +1337,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1350,7 +1350,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1363,7 +1363,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1376,7 +1376,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1389,7 +1389,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1402,7 +1402,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1415,7 +1415,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1428,7 +1428,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1450,7 +1450,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1463,7 +1463,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1476,7 +1476,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1489,7 +1489,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1502,7 +1502,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1515,7 +1515,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1528,7 +1528,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1541,7 +1541,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1554,7 +1554,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1567,7 +1567,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1580,7 +1580,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1593,7 +1593,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1606,7 +1606,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1628,7 +1628,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1641,7 +1641,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1654,7 +1654,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1667,7 +1667,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1680,7 +1680,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, 0, IEC61850_FC_CO, - CONSTRUCTED, + IEC61850_CONSTRUCTED, 0, NULL, 0}; @@ -1693,7 +1693,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { NULL, 0, IEC61850_FC_CO, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1706,7 +1706,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { NULL, 0, IEC61850_FC_CO, - OCTET_STRING_64, + IEC61850_OCTET_STRING_64, 0, NULL, 0}; @@ -1719,7 +1719,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { NULL, 0, IEC61850_FC_CO, - INT8U, + IEC61850_INT8U, 0, NULL, 0}; @@ -1732,7 +1732,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { NULL, 0, IEC61850_FC_CO, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1745,7 +1745,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { NULL, 0, IEC61850_FC_CO, - BOOLEAN, + IEC61850_BOOLEAN, 0, NULL, 0}; @@ -1758,7 +1758,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { NULL, 0, IEC61850_FC_CO, - CHECK, + IEC61850_CHECK, 0, NULL, 0}; @@ -1771,7 +1771,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { NULL, 0, IEC61850_FC_CF, - ENUMERATED, + IEC61850_ENUMERATED, 0, NULL, 0}; @@ -1784,7 +1784,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1806,7 +1806,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1819,7 +1819,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1832,7 +1832,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1854,7 +1854,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1867,7 +1867,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1880,7 +1880,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1902,7 +1902,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1915,7 +1915,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1928,7 +1928,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; @@ -1950,7 +1950,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { NULL, 0, IEC61850_FC_ST, - BOOLEAN, + IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, NULL, 0}; @@ -1963,7 +1963,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { NULL, 0, IEC61850_FC_ST, - QUALITY, + IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; @@ -1976,7 +1976,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { NULL, 0, IEC61850_FC_ST, - TIMESTAMP, + IEC61850_TIMESTAMP, 0, NULL, 0}; diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index 665a2491..a94204d7 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -82,36 +82,71 @@ typedef struct sGSEControlBlock GSEControlBlock; typedef enum { - BOOLEAN = 0,/* int */ - INT8 = 1, /* int8_t */ - INT16 = 2, /* int16_t */ - INT32 = 3, /* int32_t */ - INT64 = 4, /* int64_t */ - INT128 = 5, /* no native mapping! */ - INT8U = 6, /* uint8_t */ - INT16U = 7, /* uint16_t */ - INT24U = 8, /* uint32_t */ - INT32U = 9, /* uint32_t */ - FLOAT32 = 10, /* float */ - FLOAT64 = 11, /* double */ - ENUMERATED = 12, - OCTET_STRING_64 = 13, - OCTET_STRING_6 = 14, - OCTET_STRING_8 = 15, - VISIBLE_STRING_32 = 16, - VISIBLE_STRING_64 = 17, - VISIBLE_STRING_65 = 18, - VISIBLE_STRING_129 = 19, - VISIBLE_STRING_255 = 20, - UNICODE_STRING_255 = 21, - TIMESTAMP = 22, - QUALITY = 23, - CHECK = 24, - CODEDENUM = 25, - GENERIC_BITSTRING = 26, - CONSTRUCTED = 27, - ENTRY_TIME = 28, - PHYCOMADDR = 29 + IEC61850_BOOLEAN = 0,/* int */ + IEC61850_INT8 = 1, /* int8_t */ + IEC61850_INT16 = 2, /* int16_t */ + IEC61850_INT32 = 3, /* int32_t */ + IEC61850_INT64 = 4, /* int64_t */ + IEC61850_INT128 = 5, /* no native mapping! */ + IEC61850_INT8U = 6, /* uint8_t */ + IEC61850_INT16U = 7, /* uint16_t */ + IEC61850_INT24U = 8, /* uint32_t */ + IEC61850_INT32U = 9, /* uint32_t */ + IEC61850_FLOAT32 = 10, /* float */ + IEC61850_FLOAT64 = 11, /* double */ + IEC61850_ENUMERATED = 12, + IEC61850_OCTET_STRING_64 = 13, + IEC61850_OCTET_STRING_6 = 14, + IEC61850_OCTET_STRING_8 = 15, + IEC61850_VISIBLE_STRING_32 = 16, + IEC61850_VISIBLE_STRING_64 = 17, + IEC61850_VISIBLE_STRING_65 = 18, + IEC61850_VISIBLE_STRING_129 = 19, + IEC61850_VISIBLE_STRING_255 = 20, + IEC61850_UNICODE_STRING_255 = 21, + IEC61850_TIMESTAMP = 22, + IEC61850_QUALITY = 23, + IEC61850_CHECK = 24, + IEC61850_CODEDENUM = 25, + IEC61850_GENERIC_BITSTRING = 26, + IEC61850_CONSTRUCTED = 27, + IEC61850_ENTRY_TIME = 28, + IEC61850_PHYCOMADDR = 29 + + +#if (CONFIG_IEC61850_USE_COMPAT_TYPE_DECLARATIONS == 1) + , + BOOLEAN = 0,/* int */ + INT8 = 1, /* int8_t */ + INT16 = 2, /* int16_t */ + INT32 = 3, /* int32_t */ + INT64 = 4, /* int64_t */ + INT128 = 5, /* no native mapping! */ + INT8U = 6, /* uint8_t */ + INT16U = 7, /* uint16_t */ + INT24U = 8, /* uint32_t */ + INT32U = 9, /* uint32_t */ + FLOAT32 = 10, /* float */ + FLOAT64 = 11, /* double */ + ENUMERATED = 12, + OCTET_STRING_64 = 13, + OCTET_STRING_6 = 14, + OCTET_STRING_8 = 15, + VISIBLE_STRING_32 = 16, + VISIBLE_STRING_64 = 17, + VISIBLE_STRING_65 = 18, + VISIBLE_STRING_129 = 19, + VISIBLE_STRING_255 = 20, + UNICODE_STRING_255 = 21, + TIMESTAMP = 22, + QUALITY = 23, + CHECK = 24, + CODEDENUM = 25, + GENERIC_BITSTRING = 26, + CONSTRUCTED = 27, + ENTRY_TIME = 28, + PHYCOMADDR = 29 +#endif } DataAttributeType; typedef enum { diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index b4e2246f..40064194 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -154,118 +154,118 @@ createNamedVariableFromDataAttribute(DataAttribute* attribute) } else { switch (attribute->type) { - case BOOLEAN: + case IEC61850_BOOLEAN: namedVariable->type = MMS_BOOLEAN; break; - case INT8: + case IEC61850_INT8: namedVariable->typeSpec.integer = 8; namedVariable->type = MMS_INTEGER; break; - case INT16: + case IEC61850_INT16: namedVariable->typeSpec.integer = 16; namedVariable->type = MMS_INTEGER; break; - case INT32: + case IEC61850_INT32: namedVariable->typeSpec.integer = 32; namedVariable->type = MMS_INTEGER; break; - case INT64: + case IEC61850_INT64: namedVariable->typeSpec.integer = 64; namedVariable->type = MMS_INTEGER; break; - case INT128: + case IEC61850_INT128: namedVariable->typeSpec.integer = 128; namedVariable->type = MMS_INTEGER; break; - case INT8U: + case IEC61850_INT8U: namedVariable->typeSpec.unsignedInteger = 8; namedVariable->type = MMS_UNSIGNED; break; - case INT16U: + case IEC61850_INT16U: namedVariable->typeSpec.unsignedInteger = 16; namedVariable->type = MMS_UNSIGNED; break; - case INT24U: + case IEC61850_INT24U: namedVariable->typeSpec.unsignedInteger = 24; namedVariable->type = MMS_UNSIGNED; break; - case INT32U: + case IEC61850_INT32U: namedVariable->typeSpec.unsignedInteger = 32; namedVariable->type = MMS_UNSIGNED; break; - case FLOAT32: + case IEC61850_FLOAT32: namedVariable->typeSpec.floatingpoint.formatWidth = 32; namedVariable->typeSpec.floatingpoint.exponentWidth = 8; namedVariable->type = MMS_FLOAT; break; - case FLOAT64: + case IEC61850_FLOAT64: namedVariable->typeSpec.floatingpoint.formatWidth = 64; namedVariable->typeSpec.floatingpoint.exponentWidth = 11; namedVariable->type = MMS_FLOAT; break; - case ENUMERATED: + case IEC61850_ENUMERATED: namedVariable->typeSpec.integer = 8; /* 8 bit integer should be enough for all enumerations */ namedVariable->type = MMS_INTEGER; break; - case CHECK: + case IEC61850_CHECK: namedVariable->typeSpec.bitString = -2; namedVariable->type = MMS_BIT_STRING; break; - case CODEDENUM: + case IEC61850_CODEDENUM: namedVariable->typeSpec.bitString = 2; namedVariable->type = MMS_BIT_STRING; break; - case OCTET_STRING_6: + case IEC61850_OCTET_STRING_6: namedVariable->typeSpec.octetString = -6; namedVariable->type = MMS_OCTET_STRING; break; - case OCTET_STRING_8: + case IEC61850_OCTET_STRING_8: namedVariable->typeSpec.octetString = 8; namedVariable->type = MMS_OCTET_STRING; break; - case OCTET_STRING_64: + case IEC61850_OCTET_STRING_64: namedVariable->typeSpec.octetString = -64; namedVariable->type = MMS_OCTET_STRING; break; - case VISIBLE_STRING_32: + case IEC61850_VISIBLE_STRING_32: namedVariable->typeSpec.visibleString = -129; namedVariable->type = MMS_VISIBLE_STRING; break; - case VISIBLE_STRING_64: + case IEC61850_VISIBLE_STRING_64: namedVariable->typeSpec.visibleString = -129; namedVariable->type = MMS_VISIBLE_STRING; break; - case VISIBLE_STRING_65: + case IEC61850_VISIBLE_STRING_65: namedVariable->typeSpec.visibleString = -129; namedVariable->type = MMS_VISIBLE_STRING; break; - case VISIBLE_STRING_129: + case IEC61850_VISIBLE_STRING_129: namedVariable->typeSpec.visibleString = -129; namedVariable->type = MMS_VISIBLE_STRING; break; - case VISIBLE_STRING_255: + case IEC61850_VISIBLE_STRING_255: namedVariable->typeSpec.visibleString = -255; namedVariable->type = MMS_VISIBLE_STRING; break; - case UNICODE_STRING_255: + case IEC61850_UNICODE_STRING_255: namedVariable->typeSpec.mmsString = -255; namedVariable->type = MMS_STRING; break; - case GENERIC_BITSTRING: + case IEC61850_GENERIC_BITSTRING: namedVariable->type = MMS_BIT_STRING; break; - case TIMESTAMP: + case IEC61850_TIMESTAMP: namedVariable->type = MMS_UTC_TIME; break; - case QUALITY: + case IEC61850_QUALITY: namedVariable->typeSpec.bitString = -13; // -13 = up to 13 bits namedVariable->type = MMS_BIT_STRING; break; - case ENTRY_TIME: + case IEC61850_ENTRY_TIME: namedVariable->type = MMS_BINARY_TIME; namedVariable->typeSpec.binaryTime = 6; break; - case PHYCOMADDR: + case IEC61850_PHYCOMADDR: MmsMapping_createPhyComAddrStructure(namedVariable); break; default: diff --git a/src/iec61850/server/model/cdc.c b/src/iec61850/server/model/cdc.c index 9391b998..eb6806e9 100644 --- a/src/iec61850/server/model/cdc.c +++ b/src/iec61850/server/model/cdc.c @@ -35,12 +35,12 @@ DataAttribute* CAC_AnalogueValue_create(const char* name, ModelNode* parent, FunctionalConstraint fc, uint8_t triggerOptions, bool isIntegerNotFloat) { - DataAttribute* analogeValue = DataAttribute_create(name, parent, CONSTRUCTED, fc, triggerOptions, 0, 0); + DataAttribute* analogeValue = DataAttribute_create(name, parent, IEC61850_CONSTRUCTED, fc, triggerOptions, 0, 0); if (isIntegerNotFloat) - DataAttribute_create("i", (ModelNode*) analogeValue, INT32, fc, triggerOptions, 0, 0); + DataAttribute_create("i", (ModelNode*) analogeValue, IEC61850_INT32, fc, triggerOptions, 0, 0); else - DataAttribute_create("f", (ModelNode*) analogeValue, FLOAT32, fc, triggerOptions, 0, 0); + DataAttribute_create("f", (ModelNode*) analogeValue, IEC61850_FLOAT32, fc, triggerOptions, 0, 0); return analogeValue; } @@ -48,12 +48,12 @@ CAC_AnalogueValue_create(const char* name, ModelNode* parent, FunctionalConstrai DataAttribute* CAC_ValWithTrans_create(const char* name, ModelNode* parent, FunctionalConstraint fc, uint8_t triggerOptions, bool hasTransientIndicator) { - DataAttribute* valWithTrans = DataAttribute_create(name, parent, CONSTRUCTED, fc, triggerOptions, 0, 0); + DataAttribute* valWithTrans = DataAttribute_create(name, parent, IEC61850_CONSTRUCTED, fc, triggerOptions, 0, 0); - DataAttribute_create("posVal", (ModelNode*) valWithTrans, INT8, fc, triggerOptions, 0, 0); + DataAttribute_create("posVal", (ModelNode*) valWithTrans, IEC61850_INT8, fc, triggerOptions, 0, 0); if (hasTransientIndicator) - DataAttribute_create("transInd", (ModelNode*) valWithTrans, BOOLEAN, fc, triggerOptions, 0, 0); + DataAttribute_create("transInd", (ModelNode*) valWithTrans, IEC61850_BOOLEAN, fc, triggerOptions, 0, 0); return valWithTrans; } @@ -64,7 +64,7 @@ CAC_ValWithTrans_create(const char* name, ModelNode* parent, FunctionalConstrain DataAttribute* CAC_Vector_create(const char* name, ModelNode* parent, uint32_t options, FunctionalConstraint fc, uint8_t triggerOptions) { - DataAttribute* vector = DataAttribute_create(name, parent, CONSTRUCTED, fc, triggerOptions, 0, 0); + DataAttribute* vector = DataAttribute_create(name, parent, IEC61850_CONSTRUCTED, fc, triggerOptions, 0, 0); CAC_AnalogueValue_create("mag", (ModelNode*) vector, fc, triggerOptions, false); @@ -77,13 +77,13 @@ CAC_Vector_create(const char* name, ModelNode* parent, uint32_t options, Functio DataAttribute* CAC_Point_create(const char* name, ModelNode* parent, FunctionalConstraint fc, uint8_t triggerOptions, bool hasZVal) { - DataAttribute* point = DataAttribute_create(name, parent, CONSTRUCTED, fc, triggerOptions, 0, 0); + DataAttribute* point = DataAttribute_create(name, parent, IEC61850_CONSTRUCTED, fc, triggerOptions, 0, 0); - DataAttribute_create("xVal", (ModelNode*) point, FLOAT32, fc, triggerOptions, 0, 0); - DataAttribute_create("yVal", (ModelNode*) point, FLOAT32, fc, triggerOptions, 0, 0); + DataAttribute_create("xVal", (ModelNode*) point, IEC61850_FLOAT32, fc, triggerOptions, 0, 0); + DataAttribute_create("yVal", (ModelNode*) point, IEC61850_FLOAT32, fc, triggerOptions, 0, 0); if (hasZVal) - DataAttribute_create("zVal", (ModelNode*) point, FLOAT32, fc, triggerOptions, 0, 0); + DataAttribute_create("zVal", (ModelNode*) point, IEC61850_FLOAT32, fc, triggerOptions, 0, 0); return point; } @@ -91,10 +91,10 @@ CAC_Point_create(const char* name, ModelNode* parent, FunctionalConstraint fc, u DataAttribute* CAC_ScaledValueConfig_create(const char* name, ModelNode* parent) { - DataAttribute* scaling = DataAttribute_create(name, parent, CONSTRUCTED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute* scaling = DataAttribute_create(name, parent, IEC61850_CONSTRUCTED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("scaleFactor", (ModelNode*) scaling, FLOAT32, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("offset", (ModelNode*) scaling, FLOAT32, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("scaleFactor", (ModelNode*) scaling, IEC61850_FLOAT32, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("offset", (ModelNode*) scaling, IEC61850_FLOAT32, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); return scaling; } @@ -102,12 +102,12 @@ CAC_ScaledValueConfig_create(const char* name, ModelNode* parent) DataAttribute* CAC_Unit_create(const char* name, ModelNode* parent, bool hasMagnitude) { - DataAttribute* unit = DataAttribute_create(name, parent, CONSTRUCTED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute* unit = DataAttribute_create(name, parent, IEC61850_CONSTRUCTED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("SIUnit", (ModelNode*) unit, ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("SIUnit", (ModelNode*) unit, IEC61850_ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); if (hasMagnitude) - DataAttribute_create("multiplier", (ModelNode*) unit, ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("multiplier", (ModelNode*) unit, IEC61850_ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); return unit; } @@ -119,10 +119,10 @@ CAC_Unit_create(const char* name, ModelNode* parent, bool hasMagnitude) static void addOriginator(char* name, ModelNode* parent, FunctionalConstraint fc) { - DataAttribute* origin = DataAttribute_create(name, parent, CONSTRUCTED, fc, 0 ,0 ,0); + DataAttribute* origin = DataAttribute_create(name, parent, IEC61850_CONSTRUCTED, fc, 0 ,0 ,0); - DataAttribute_create("orCat", (ModelNode*) origin, ENUMERATED, fc, 0, 0, 0); - DataAttribute_create("orIdent", (ModelNode*) origin, OCTET_STRING_64, fc, 0, 0, 0); + DataAttribute_create("orCat", (ModelNode*) origin, IEC61850_ENUMERATED, fc, 0, 0, 0); + DataAttribute_create("orIdent", (ModelNode*) origin, IEC61850_OCTET_STRING_64, fc, 0, 0, 0); } @@ -132,38 +132,38 @@ addGenericOperateElements(DataAttribute* oper, DataAttributeType type, bool isTi DataAttribute_create("ctlVal", (ModelNode*) oper, type, IEC61850_FC_CO, 0, 0, 0); if (isTimeActivated) - DataAttribute_create("operTm", (ModelNode*) oper, TIMESTAMP, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("operTm", (ModelNode*) oper, IEC61850_TIMESTAMP, IEC61850_FC_CO, 0, 0, 0); addOriginator("origin", (ModelNode*) oper, IEC61850_FC_CO); - DataAttribute_create("ctlNum", (ModelNode*) oper, INT8U, IEC61850_FC_CO, 0, 0, 0); - DataAttribute_create("T", (ModelNode*) oper, TIMESTAMP, IEC61850_FC_CO, 0, 0, 0); - DataAttribute_create("Test", (ModelNode*) oper, BOOLEAN, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("ctlNum", (ModelNode*) oper, IEC61850_INT8U, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("T", (ModelNode*) oper, IEC61850_TIMESTAMP, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("Test", (ModelNode*) oper, IEC61850_BOOLEAN, IEC61850_FC_CO, 0, 0, 0); if (hasCheck) - DataAttribute_create("Check", (ModelNode*) oper, CHECK, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("Check", (ModelNode*) oper, IEC61850_CHECK, IEC61850_FC_CO, 0, 0, 0); } static void addCommonOperateElements(DataAttribute* oper, bool isTimeActivated, bool hasCheck) { if (isTimeActivated) - DataAttribute_create("operTm", (ModelNode*) oper, TIMESTAMP, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("operTm", (ModelNode*) oper, IEC61850_TIMESTAMP, IEC61850_FC_CO, 0, 0, 0); addOriginator("origin", (ModelNode*) oper, IEC61850_FC_CO); - DataAttribute_create("ctlNum", (ModelNode*) oper, INT8U, IEC61850_FC_CO, 0, 0, 0); - DataAttribute_create("T", (ModelNode*) oper, TIMESTAMP, IEC61850_FC_CO, 0, 0, 0); - DataAttribute_create("Test", (ModelNode*) oper, BOOLEAN, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("ctlNum", (ModelNode*) oper, IEC61850_INT8U, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("T", (ModelNode*) oper, IEC61850_TIMESTAMP, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("Test", (ModelNode*) oper, IEC61850_BOOLEAN, IEC61850_FC_CO, 0, 0, 0); if (hasCheck) - DataAttribute_create("Check", (ModelNode*) oper, CHECK, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("Check", (ModelNode*) oper, IEC61850_CHECK, IEC61850_FC_CO, 0, 0, 0); } static DataAttribute* CDA_Oper(ModelNode* parent, DataAttributeType type, bool isTImeActivated) { - DataAttribute* oper = DataAttribute_create("Oper", parent, CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); + DataAttribute* oper = DataAttribute_create("Oper", parent, IEC61850_CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); addGenericOperateElements(oper, type, isTImeActivated, true); @@ -173,7 +173,7 @@ CDA_Oper(ModelNode* parent, DataAttributeType type, bool isTImeActivated) static DataAttribute* CDA_SBOw(ModelNode* parent, DataAttributeType type, bool isTImeActivated) { - DataAttribute* oper = DataAttribute_create("SBOw", parent, CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); + DataAttribute* oper = DataAttribute_create("SBOw", parent, IEC61850_CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); addGenericOperateElements(oper, type, isTImeActivated, true); @@ -183,7 +183,7 @@ CDA_SBOw(ModelNode* parent, DataAttributeType type, bool isTImeActivated) static DataAttribute* CDA_Cancel(ModelNode* parent, DataAttributeType type, bool isTImeActivated) { - DataAttribute* oper = DataAttribute_create("Cancel", parent, CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); + DataAttribute* oper = DataAttribute_create("Cancel", parent, IEC61850_CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); addGenericOperateElements(oper, type, isTImeActivated, false); @@ -199,8 +199,8 @@ CDA_Cancel(ModelNode* parent, DataAttributeType type, bool isTImeActivated) static void CDC_addTimeQuality(DataObject* dataObject, FunctionalConstraint fc) { - DataAttribute_create("q", (ModelNode*) dataObject, QUALITY, fc, TRG_OPT_QUALITY_CHANGED, 0, 0); - DataAttribute_create("t", (ModelNode*) dataObject, TIMESTAMP, fc, 0, 0, 0); + DataAttribute_create("q", (ModelNode*) dataObject, IEC61850_QUALITY, fc, TRG_OPT_QUALITY_CHANGED, 0, 0); + DataAttribute_create("t", (ModelNode*) dataObject, IEC61850_TIMESTAMP, fc, 0, 0, 0); } static void @@ -213,21 +213,21 @@ CDC_addStatusToDataObject(DataObject* dataObject, DataAttributeType statusType) static void CDC_addOptionPicsSubst(DataObject* dataObject, DataAttributeType type) { - DataAttribute_create("subEna", (ModelNode*) dataObject, BOOLEAN, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subEna", (ModelNode*) dataObject, IEC61850_BOOLEAN, IEC61850_FC_SV, 0, 0, 0); DataAttribute_create("subVal", (ModelNode*) dataObject, type, IEC61850_FC_SV, 0, 0, 0); - DataAttribute_create("subQ", (ModelNode*) dataObject, QUALITY, IEC61850_FC_SV, 0, 0, 0); - DataAttribute_create("subID", (ModelNode*) dataObject, VISIBLE_STRING_64, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subQ", (ModelNode*) dataObject, IEC61850_QUALITY, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subID", (ModelNode*) dataObject, IEC61850_VISIBLE_STRING_64, IEC61850_FC_SV, 0, 0, 0); } static void CDC_addOptionPicsSubstValWithTrans(DataObject* dataObject, bool hasTransientIndicator) { - DataAttribute_create("subEna", (ModelNode*) dataObject, BOOLEAN, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subEna", (ModelNode*) dataObject, IEC61850_BOOLEAN, IEC61850_FC_SV, 0, 0, 0); CAC_ValWithTrans_create("subVal", (ModelNode*) dataObject, IEC61850_FC_SV, 0, hasTransientIndicator); - DataAttribute_create("subQ", (ModelNode*) dataObject, QUALITY, IEC61850_FC_SV, 0, 0, 0); - DataAttribute_create("subID", (ModelNode*) dataObject, VISIBLE_STRING_64, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subQ", (ModelNode*) dataObject, IEC61850_QUALITY, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subID", (ModelNode*) dataObject, IEC61850_VISIBLE_STRING_64, IEC61850_FC_SV, 0, 0, 0); } /* Add optional attributes for extension (name spaces) and textual descriptions */ @@ -236,18 +236,18 @@ CDC_addStandardOptions(DataObject* dataObject, uint32_t options) { /* Standard options ? */ if (options & CDC_OPTION_DESC) - DataAttribute_create("d",(ModelNode*) dataObject, VISIBLE_STRING_255, IEC61850_FC_DC, 0, 0, 0); + DataAttribute_create("d",(ModelNode*) dataObject, IEC61850_VISIBLE_STRING_255, IEC61850_FC_DC, 0, 0, 0); if (options & CDC_OPTION_DESC_UNICODE) - DataAttribute_create("dU", (ModelNode*) dataObject, UNICODE_STRING_255, IEC61850_FC_DC, 0, 0, 0); + DataAttribute_create("dU", (ModelNode*) dataObject, IEC61850_UNICODE_STRING_255, IEC61850_FC_DC, 0, 0, 0); if (options & CDC_OPTION_AC_DLNDA) { - DataAttribute_create("cdcNs", (ModelNode*) dataObject, VISIBLE_STRING_255, IEC61850_FC_EX, 0, 0, 0); - DataAttribute_create("cdcName", (ModelNode*) dataObject, VISIBLE_STRING_255, IEC61850_FC_EX, 0, 0, 0); + DataAttribute_create("cdcNs", (ModelNode*) dataObject, IEC61850_VISIBLE_STRING_255, IEC61850_FC_EX, 0, 0, 0); + DataAttribute_create("cdcName", (ModelNode*) dataObject, IEC61850_VISIBLE_STRING_255, IEC61850_FC_EX, 0, 0, 0); } if (options & CDC_OPTION_AC_DLN) - DataAttribute_create("dataNs", (ModelNode*) dataObject, VISIBLE_STRING_255, IEC61850_FC_EX, 0, 0, 0); + DataAttribute_create("dataNs", (ModelNode*) dataObject, IEC61850_VISIBLE_STRING_255, IEC61850_FC_EX, 0, 0, 0); } /************************************************ @@ -259,13 +259,13 @@ CDC_SPS_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newSPS = DataObject_create(dataObjectName, parent, 0); - CDC_addStatusToDataObject(newSPS, BOOLEAN); + CDC_addStatusToDataObject(newSPS, IEC61850_BOOLEAN); if (options & CDC_OPTION_PICS_SUBST) - CDC_addOptionPicsSubst(newSPS, BOOLEAN); + CDC_addOptionPicsSubst(newSPS, IEC61850_BOOLEAN); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newSPS, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newSPS, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); CDC_addStandardOptions(newSPS, options); @@ -277,13 +277,13 @@ CDC_DPS_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newDPS = DataObject_create(dataObjectName, parent, 0); - CDC_addStatusToDataObject(newDPS, CODEDENUM); + CDC_addStatusToDataObject(newDPS, IEC61850_CODEDENUM); if (options & CDC_OPTION_PICS_SUBST) - CDC_addOptionPicsSubst(newDPS, CODEDENUM); + CDC_addOptionPicsSubst(newDPS, IEC61850_CODEDENUM); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newDPS, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newDPS, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); CDC_addStandardOptions(newDPS, options); @@ -295,13 +295,13 @@ CDC_INS_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newINS = DataObject_create(dataObjectName, parent, 0); - CDC_addStatusToDataObject(newINS, INT32); + CDC_addStatusToDataObject(newINS, IEC61850_INT32); if (options & CDC_OPTION_PICS_SUBST) - CDC_addOptionPicsSubst(newINS, INT32); + CDC_addOptionPicsSubst(newINS, IEC61850_INT32); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newINS, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newINS, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); CDC_addStandardOptions(newINS, options); @@ -314,13 +314,13 @@ CDC_ENS_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newENS = DataObject_create(dataObjectName, parent, 0); - CDC_addStatusToDataObject(newENS, ENUMERATED); + CDC_addStatusToDataObject(newENS, IEC61850_ENUMERATED); if (options & CDC_OPTION_PICS_SUBST) - CDC_addOptionPicsSubst(newENS, ENUMERATED); + CDC_addOptionPicsSubst(newENS, IEC61850_ENUMERATED); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newENS, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newENS, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); CDC_addStandardOptions(newENS, options); @@ -332,25 +332,25 @@ CDC_BCR_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newBCR = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("actVal", (ModelNode*) newBCR, INT64, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("actVal", (ModelNode*) newBCR, IEC61850_INT64, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_FROZEN_VALUE) { - DataAttribute_create("frVal", (ModelNode*) newBCR, INT64, IEC61850_FC_ST, TRG_OPT_DATA_UPDATE, 0, 0); - DataAttribute_create("frTm", (ModelNode*) newBCR, TIMESTAMP, IEC61850_FC_ST, 0, 0, 0); + DataAttribute_create("frVal", (ModelNode*) newBCR, IEC61850_INT64, IEC61850_FC_ST, TRG_OPT_DATA_UPDATE, 0, 0); + DataAttribute_create("frTm", (ModelNode*) newBCR, IEC61850_TIMESTAMP, IEC61850_FC_ST, 0, 0, 0); } CDC_addTimeQuality(newBCR, IEC61850_FC_ST); if (options & CDC_OPTION_UNIT) - DataAttribute_create("units", (ModelNode*) newBCR, ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("units", (ModelNode*) newBCR, IEC61850_ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("pulsQty", (ModelNode*) newBCR, FLOAT32, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("pulsQty", (ModelNode*) newBCR, IEC61850_FLOAT32, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_FROZEN_VALUE) { - DataAttribute_create("frEna", (ModelNode*) newBCR, BOOLEAN, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("strTm", (ModelNode*) newBCR, TIMESTAMP, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("frPd", (ModelNode*) newBCR, INT32, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("frRs", (ModelNode*) newBCR, BOOLEAN, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("frEna", (ModelNode*) newBCR, IEC61850_BOOLEAN, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("strTm", (ModelNode*) newBCR, IEC61850_TIMESTAMP, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("frPd", (ModelNode*) newBCR, IEC61850_INT32, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("frRs", (ModelNode*) newBCR, IEC61850_BOOLEAN, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); } CDC_addStandardOptions(newBCR, options); @@ -363,15 +363,15 @@ CDC_SEC_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newSEC = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("cnt", (ModelNode*) newSEC, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("sev", (ModelNode*) newSEC, ENUMERATED, IEC61850_FC_ST, 0, 0, 0); - DataAttribute_create("t", (ModelNode*) newSEC, TIMESTAMP, IEC61850_FC_ST, 0, 0, 0); + DataAttribute_create("cnt", (ModelNode*) newSEC, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("sev", (ModelNode*) newSEC, IEC61850_ENUMERATED, IEC61850_FC_ST, 0, 0, 0); + DataAttribute_create("t", (ModelNode*) newSEC, IEC61850_TIMESTAMP, IEC61850_FC_ST, 0, 0, 0); if (options & CDC_OPTION_ADDR) - DataAttribute_create("addr", (ModelNode*) newSEC, OCTET_STRING_64, IEC61850_FC_ST, 0, 0, 0); + DataAttribute_create("addr", (ModelNode*) newSEC, IEC61850_OCTET_STRING_64, IEC61850_FC_ST, 0, 0, 0); if (options & CDC_OPTION_ADDINFO) - DataAttribute_create("addInfo", (ModelNode*) newSEC, VISIBLE_STRING_64, IEC61850_FC_ST, 0, 0, 0); + DataAttribute_create("addInfo", (ModelNode*) newSEC, IEC61850_VISIBLE_STRING_64, IEC61850_FC_ST, 0, 0, 0); CDC_addStandardOptions(newSEC, options); @@ -397,7 +397,7 @@ CDC_MV_create(const char* dataObjectName, ModelNode* parent, uint32_t options, b CAC_AnalogueValue_create("mag", (ModelNode*) newMV, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED | TRG_OPT_DATA_UPDATE, isIntegerNotFloat); if (options & CDC_OPTION_RANGE) - DataAttribute_create("range", (ModelNode*) newMV, ENUMERATED, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("range", (ModelNode*) newMV, IEC61850_ENUMERATED, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addTimeQuality(newMV, IEC61850_FC_MX); @@ -424,10 +424,10 @@ CDC_CMV_create(const char* dataObjectName, ModelNode* parent, uint32_t options) CAC_Vector_create("cVal", (ModelNode*) newMV, options, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED | TRG_OPT_DATA_UPDATE); if (options & CDC_OPTION_RANGE) - DataAttribute_create("range", (ModelNode*) newMV, ENUMERATED, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("range", (ModelNode*) newMV, IEC61850_ENUMERATED, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_RANGE_ANG) - DataAttribute_create("rangeAng", (ModelNode*) newMV, ENUMERATED, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("rangeAng", (ModelNode*) newMV, IEC61850_ENUMERATED, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addTimeQuality(newMV, IEC61850_FC_MX); @@ -477,17 +477,17 @@ CDC_HST_create(const char* dataObjectName, ModelNode* parent, uint32_t options, { DataObject* newHST = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("hstVal", (ModelNode*) newHST, INT32, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED | TRG_OPT_DATA_UPDATE, maxPts, 0); + DataAttribute_create("hstVal", (ModelNode*) newHST, IEC61850_INT32, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED | TRG_OPT_DATA_UPDATE, maxPts, 0); CDC_addTimeQuality(newHST, IEC61850_FC_ST); - DataAttribute_create("numPts", (ModelNode*) newHST, INT16U, IEC61850_FC_CF, 0, 0, 0); + DataAttribute_create("numPts", (ModelNode*) newHST, IEC61850_INT16U, IEC61850_FC_CF, 0, 0, 0); //TODO add mandatory attribute "hstRangeC" CAC_Unit_create("units", (ModelNode*) newHST, options & CDC_OPTION_UNIT_MULTIPLIER); - DataAttribute_create("maxPts", (ModelNode*) newHST, INT16U, IEC61850_FC_CF, 0, 0, 0); + DataAttribute_create("maxPts", (ModelNode*) newHST, IEC61850_INT16U, IEC61850_FC_CF, 0, 0, 0); CDC_addStandardOptions(newHST, options); @@ -499,7 +499,7 @@ static void addControls(DataObject* parent, DataAttributeType type, uint32_t controlOptions) { DataAttribute* ctlModel = - DataAttribute_create("ctlModel", (ModelNode*) parent, ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("ctlModel", (ModelNode*) parent, IEC61850_ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); int controlModel = controlOptions & 0x07; @@ -508,7 +508,7 @@ addControls(DataObject* parent, DataAttributeType type, uint32_t controlOptions) if (controlModel > 0) { if (controlModel == CDC_CTL_MODEL_SBO_NORMAL) - DataAttribute_create("SBO", (ModelNode*) parent, VISIBLE_STRING_129, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("SBO", (ModelNode*) parent, IEC61850_VISIBLE_STRING_129, IEC61850_FC_CO, 0, 0, 0); bool isTimeActivated = false; @@ -533,7 +533,7 @@ addOriginatorAndCtlNumOptions(ModelNode* parent, uint32_t controlOptions) addOriginator("origin", parent, IEC61850_FC_ST); if (controlOptions & CDC_CTL_OPTION_CTL_NUM) - DataAttribute_create("ctlNum", parent, INT8U, IEC61850_FC_ST, 0, 0, 0); + DataAttribute_create("ctlNum", parent, IEC61850_INT8U, IEC61850_FC_ST, 0, 0, 0); } /** @@ -552,15 +552,15 @@ CDC_SPC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addOriginatorAndCtlNumOptions((ModelNode*) newSPC, controlOptions); - CDC_addStatusToDataObject(newSPC, BOOLEAN); + CDC_addStatusToDataObject(newSPC, IEC61850_BOOLEAN); - addControls(newSPC, BOOLEAN, controlOptions); + addControls(newSPC, IEC61850_BOOLEAN, controlOptions); if (options & CDC_OPTION_PICS_SUBST) - CDC_addOptionPicsSubst(newSPC, BOOLEAN); + CDC_addOptionPicsSubst(newSPC, IEC61850_BOOLEAN); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newSPC, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newSPC, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); CDC_addStandardOptions(newSPC, options); @@ -583,15 +583,15 @@ CDC_DPC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addOriginatorAndCtlNumOptions((ModelNode*) newDPC, controlOptions); - CDC_addStatusToDataObject(newDPC, CODEDENUM); + CDC_addStatusToDataObject(newDPC, IEC61850_CODEDENUM); - addControls(newDPC, BOOLEAN, controlOptions); + addControls(newDPC, IEC61850_BOOLEAN, controlOptions); if (options & CDC_OPTION_PICS_SUBST) - CDC_addOptionPicsSubst(newDPC, CODEDENUM); + CDC_addOptionPicsSubst(newDPC, IEC61850_CODEDENUM); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newDPC, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newDPC, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); CDC_addStandardOptions(newDPC, options); @@ -602,7 +602,7 @@ static void addAnalogControls(DataObject* parent, uint32_t controlOptions, bool isIntegerNotFloat) { DataAttribute* ctlModel = - DataAttribute_create("ctlModel", (ModelNode*) parent, ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("ctlModel", (ModelNode*) parent, IEC61850_ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); int controlModel = controlOptions & 0x07; @@ -611,7 +611,7 @@ addAnalogControls(DataObject* parent, uint32_t controlOptions, bool isIntegerNot if (controlModel != CDC_CTL_MODEL_NONE) { if (controlModel == CDC_CTL_MODEL_SBO_NORMAL) - DataAttribute_create("SBO", (ModelNode*) parent, VISIBLE_STRING_129, IEC61850_FC_CO, 0, 0, 0); + DataAttribute_create("SBO", (ModelNode*) parent, IEC61850_VISIBLE_STRING_129, IEC61850_FC_CO, 0, 0, 0); bool isTimeActivated = false; @@ -619,21 +619,21 @@ addAnalogControls(DataObject* parent, uint32_t controlOptions, bool isIntegerNot isTimeActivated = true; if (controlModel == CDC_CTL_MODEL_SBO_ENHANCED) { - DataAttribute* sBOw = DataAttribute_create("SBOw", (ModelNode*) parent, CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); + DataAttribute* sBOw = DataAttribute_create("SBOw", (ModelNode*) parent, IEC61850_CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); CAC_AnalogueValue_create("ctlVal", (ModelNode*) sBOw, IEC61850_FC_CO, 0, isIntegerNotFloat); addCommonOperateElements(sBOw, isTimeActivated, true); } - DataAttribute* oper = DataAttribute_create("Oper", (ModelNode*) parent, CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); + DataAttribute* oper = DataAttribute_create("Oper", (ModelNode*) parent, IEC61850_CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); CAC_AnalogueValue_create("ctlVal", (ModelNode*) oper, IEC61850_FC_CO, 0, isIntegerNotFloat); addCommonOperateElements(oper, isTimeActivated, true); if (controlOptions & CDC_CTL_MODEL_HAS_CANCEL) { - DataAttribute* cancel = DataAttribute_create("SBOw", (ModelNode*) parent, CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); + DataAttribute* cancel = DataAttribute_create("SBOw", (ModelNode*) parent, IEC61850_CONSTRUCTED, IEC61850_FC_CO, 0, 0, 0); CAC_AnalogueValue_create("ctlVal", (ModelNode*) cancel, IEC61850_FC_CO, 0, isIntegerNotFloat); @@ -652,33 +652,33 @@ CDC_APC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addOriginator("origin", (ModelNode*) newAPC, IEC61850_FC_MX); if (controlOptions & CDC_CTL_OPTION_CTL_NUM) - DataAttribute_create("ctlNum", (ModelNode*) newAPC, INT8U, IEC61850_FC_MX, 0, 0, 0); + DataAttribute_create("ctlNum", (ModelNode*) newAPC, IEC61850_INT8U, IEC61850_FC_MX, 0, 0, 0); CAC_AnalogueValue_create("mxVal", (ModelNode*) newAPC, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, isIntegerNotFloat); CDC_addTimeQuality(newAPC, IEC61850_FC_MX); if (controlOptions & CDC_CTL_OPTION_ST_SELD) - DataAttribute_create("stSeld", (ModelNode*) newAPC, BOOLEAN, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("stSeld", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); if (controlOptions & CDC_CTL_OPTION_OP_RCVD) - DataAttribute_create("opRcvd", (ModelNode*) newAPC, BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("opRcvd", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); if (controlOptions & CDC_CTL_OPTION_OP_OK) - DataAttribute_create("opOk", (ModelNode*) newAPC, BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("opOk", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); if (controlOptions & CDC_CTL_OPTION_T_OP_OK) - DataAttribute_create("tOpOk", (ModelNode*) newAPC, BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("tOpOk", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_PICS_SUBST) { - DataAttribute_create("subEna", (ModelNode*) newAPC, BOOLEAN, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subEna", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_SV, 0, 0, 0); CAC_AnalogueValue_create("subVal", (ModelNode*) newAPC, IEC61850_FC_SV, 0, isIntegerNotFloat); - DataAttribute_create("subQ", (ModelNode*) newAPC, QUALITY, IEC61850_FC_SV, 0, 0, 0); - DataAttribute_create("subID", (ModelNode*) newAPC, VISIBLE_STRING_64, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subQ", (ModelNode*) newAPC, IEC61850_QUALITY, IEC61850_FC_SV, 0, 0, 0); + DataAttribute_create("subID", (ModelNode*) newAPC, IEC61850_VISIBLE_STRING_64, IEC61850_FC_SV, 0, 0, 0); } if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newAPC, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); addAnalogControls(newAPC, controlOptions, isIntegerNotFloat); @@ -695,24 +695,24 @@ CDC_INC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addOriginatorAndCtlNumOptions((ModelNode*) newINC, controlOptions); - CDC_addStatusToDataObject(newINC, INT32); + CDC_addStatusToDataObject(newINC, IEC61850_INT32); - addControls(newINC, INT32, controlOptions); + addControls(newINC, IEC61850_INT32, controlOptions); if (options & CDC_OPTION_PICS_SUBST) - CDC_addOptionPicsSubst(newINC, INT32); + CDC_addOptionPicsSubst(newINC, IEC61850_INT32); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newINC, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newINC, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); if (options & CDC_OPTION_MIN) - DataAttribute_create("minVal", (ModelNode*) newINC, INT32, IEC61850_FC_CF, 0, 0, 0); + DataAttribute_create("minVal", (ModelNode*) newINC, IEC61850_INT32, IEC61850_FC_CF, 0, 0, 0); if (options & CDC_OPTION_MAX) - DataAttribute_create("maxVal", (ModelNode*) newINC, INT32, IEC61850_FC_CF, 0, 0, 0); + DataAttribute_create("maxVal", (ModelNode*) newINC, IEC61850_INT32, IEC61850_FC_CF, 0, 0, 0); if (options & CDC_OPTION_STEP_SIZE) - DataAttribute_create("stepSize", (ModelNode*) newINC, INT32U, IEC61850_FC_CF, 0, 0, 0); + DataAttribute_create("stepSize", (ModelNode*) newINC, IEC61850_INT32U, IEC61850_FC_CF, 0, 0, 0); CDC_addStandardOptions(newINC, options); @@ -726,15 +726,15 @@ CDC_ENC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addOriginatorAndCtlNumOptions((ModelNode*) newENC, controlOptions); - CDC_addStatusToDataObject(newENC, ENUMERATED); + CDC_addStatusToDataObject(newENC, IEC61850_ENUMERATED); - addControls(newENC, ENUMERATED, controlOptions); + addControls(newENC, IEC61850_ENUMERATED, controlOptions); if (options & CDC_OPTION_PICS_SUBST) - CDC_addOptionPicsSubst(newENC, ENUMERATED); + CDC_addOptionPicsSubst(newENC, IEC61850_ENUMERATED); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newENC, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newENC, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); CDC_addStandardOptions(newENC, options); @@ -751,15 +751,15 @@ CDC_BSC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, CAC_ValWithTrans_create("valWTr", (ModelNode*) newBSC, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, hasTransientIndicator); CDC_addTimeQuality(newBSC, IEC61850_FC_ST); - DataAttribute_create("persistent", (ModelNode*) newBSC, BOOLEAN, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("persistent", (ModelNode*) newBSC, IEC61850_BOOLEAN, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); - addControls(newBSC, CODEDENUM, controlOptions); + addControls(newBSC, IEC61850_CODEDENUM, controlOptions); if (options & CDC_OPTION_PICS_SUBST) CDC_addOptionPicsSubstValWithTrans(newBSC, hasTransientIndicator); if (options & CDC_OPTION_BLK_ENA) - DataAttribute_create("blkEna", (ModelNode*) newBSC, BOOLEAN, IEC61850_FC_BL, 0, 0, 0); + DataAttribute_create("blkEna", (ModelNode*) newBSC, IEC61850_BOOLEAN, IEC61850_FC_BL, 0, 0, 0); CDC_addStandardOptions(newBSC, options); @@ -771,8 +771,8 @@ CDC_LPL_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newLPL = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("vendor", (ModelNode*) newLPL, VISIBLE_STRING_255, IEC61850_FC_DC, 0, 0, 0); - DataAttribute_create("swRev", (ModelNode*) newLPL, VISIBLE_STRING_255, IEC61850_FC_DC, 0, 0, 0); + DataAttribute_create("vendor", (ModelNode*) newLPL, IEC61850_VISIBLE_STRING_255, IEC61850_FC_DC, 0, 0, 0); + DataAttribute_create("swRev", (ModelNode*) newLPL, IEC61850_VISIBLE_STRING_255, IEC61850_FC_DC, 0, 0, 0); CDC_addStandardOptions(newLPL, options); @@ -785,27 +785,27 @@ CDC_ACD_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newACD = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("general", (ModelNode*) newACD, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("dirGeneral", (ModelNode*) newACD, ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("general", (ModelNode*) newACD, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("dirGeneral", (ModelNode*) newACD, IEC61850_ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_PHASE_A) { - DataAttribute_create("phsA", (ModelNode*) newACD, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("dirPhsA", (ModelNode*) newACD, ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("phsA", (ModelNode*) newACD, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("dirPhsA", (ModelNode*) newACD, IEC61850_ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); } if (options & CDC_OPTION_PHASE_B) { - DataAttribute_create("phsB", (ModelNode*) newACD, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("dirPhsB", (ModelNode*) newACD, ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("phsB", (ModelNode*) newACD, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("dirPhsB", (ModelNode*) newACD, IEC61850_ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); } if (options & CDC_OPTION_PHASE_C) { - DataAttribute_create("phsC", (ModelNode*) newACD, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("dirPhsC", (ModelNode*) newACD, ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("phsC", (ModelNode*) newACD, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("dirPhsC", (ModelNode*) newACD, IEC61850_ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); } if (options & CDC_OPTION_PHASE_NEUT) { - DataAttribute_create("neut", (ModelNode*) newACD, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); - DataAttribute_create("dirNeut", (ModelNode*) newACD, ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("neut", (ModelNode*) newACD, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("dirNeut", (ModelNode*) newACD, IEC61850_ENUMERATED, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); } CDC_addTimeQuality(newACD, IEC61850_FC_ST); @@ -820,19 +820,19 @@ CDC_ACT_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newACT = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("general", (ModelNode*) newACT, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("general", (ModelNode*) newACT, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_PHASE_A) - DataAttribute_create("phsA", (ModelNode*) newACT, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("phsA", (ModelNode*) newACT, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_PHASE_B) - DataAttribute_create("phsB", (ModelNode*) newACT, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("phsB", (ModelNode*) newACT, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_PHASE_C) - DataAttribute_create("phsC", (ModelNode*) newACT, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("phsC", (ModelNode*) newACT, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_PHASE_NEUT) - DataAttribute_create("neut", (ModelNode*) newACT, BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("neut", (ModelNode*) newACT, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addTimeQuality(newACT, IEC61850_FC_ST); @@ -856,7 +856,7 @@ CDC_WYE_create(const char* dataObjectName, ModelNode* parent, uint32_t options) CDC_CMV_create("res", (ModelNode*) newWYE, options); if (options & CDC_OPTION_ANGLE_REF) - DataAttribute_create("angRef", (ModelNode*) newWYE, ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("angRef", (ModelNode*) newWYE, IEC61850_ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addStandardOptions(newWYE, options); @@ -875,7 +875,7 @@ CDC_DEL_create(const char* dataObjectName, ModelNode* parent, uint32_t options) CDC_CMV_create("phsCA", (ModelNode*) newDEL, options); if (options & CDC_OPTION_ANGLE_REF) - DataAttribute_create("angRef", (ModelNode*) newDEL, ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("angRef", (ModelNode*) newDEL, IEC61850_ENUMERATED, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addStandardOptions(newDEL, options); @@ -888,7 +888,7 @@ CDC_SPG_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newSPG = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("setVal", (ModelNode*) newSPG, BOOLEAN, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("setVal", (ModelNode*) newSPG, IEC61850_BOOLEAN, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addStandardOptions(newSPG, options); @@ -900,7 +900,7 @@ CDC_ENG_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newENG = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("setVal", (ModelNode*) newENG, ENUMERATED, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("setVal", (ModelNode*) newENG, IEC61850_ENUMERATED, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addStandardOptions(newENG, options); @@ -912,19 +912,19 @@ CDC_ING_create(const char* dataObjectName, ModelNode* parent, uint32_t options) { DataObject* newING = DataObject_create(dataObjectName, parent, 0); - DataAttribute_create("setVal", (ModelNode*) newING, INT32, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("setVal", (ModelNode*) newING, IEC61850_INT32, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_UNIT) CAC_Unit_create("units", (ModelNode*) newING, options & CDC_OPTION_UNIT_MULTIPLIER); if (options & CDC_OPTION_MIN) - DataAttribute_create("minVal", (ModelNode*) newING, INT32, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("minVal", (ModelNode*) newING, IEC61850_INT32, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_MAX) - DataAttribute_create("maxVal", (ModelNode*) newING, INT32, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("maxVal", (ModelNode*) newING, IEC61850_INT32, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); if (options & CDC_OPTION_STEP_SIZE) - DataAttribute_create("stepSize", (ModelNode*) newING, INT32U, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("stepSize", (ModelNode*) newING, IEC61850_INT32U, IEC61850_FC_SP, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addStandardOptions(newING, options); @@ -997,10 +997,10 @@ CDC_SPV_create(const char* dataObjectName, ModelNode* parent, uint32_t options, CAC_AnalogueValue_create("maxVal", (ModelNode*) newSPV, IEC61850_FC_CF, TRG_OPT_DATA_CHANGED, false); if (wpOptions & CDC_OPTION_61400_SP_ACS) - DataAttribute_create("spAcs", (ModelNode*) newSPV, CODEDENUM, IEC61850_FC_CF, 0, 0, 0); + DataAttribute_create("spAcs", (ModelNode*) newSPV, IEC61850_CODEDENUM, IEC61850_FC_CF, 0, 0, 0); if (wpOptions & CDC_OPTION_61400_CHA_PER_RS) - DataAttribute_create("chaPerRs", (ModelNode*) newSPV, CODEDENUM, IEC61850_FC_CF, 0, 0, 0); + DataAttribute_create("chaPerRs", (ModelNode*) newSPV, IEC61850_CODEDENUM, IEC61850_FC_CF, 0, 0, 0); CDC_addStandardOptions(newSPV, options); @@ -1064,7 +1064,7 @@ CDC_CMD_create(const char* dataObjectName, ModelNode* parent, CDC_INS_create("oldSt", (ModelNode*) newCMD, 0); if (wpOptions & CDC_OPTION_61400_CM_ACS) - DataAttribute_create("cmAcs", (ModelNode*) newCMD, INT8U, IEC61850_FC_CF, 0, 0, 0); + DataAttribute_create("cmAcs", (ModelNode*) newCMD, IEC61850_INT8U, IEC61850_FC_CF, 0, 0, 0); CDC_addStandardOptions(newCMD, options); @@ -1094,19 +1094,19 @@ CDC_CTE_create(const char* dataObjectName, ModelNode* parent, CDC_INS_create("oldCtVal", (ModelNode*) newCTE, 0); if (wpOptions & CDC_OPTION_61400_TM_TOT) - DataAttribute_create("ctTot", (ModelNode*) newCTE, INT32U, IEC61850_FC_ST, 0, 0, 0); + DataAttribute_create("ctTot", (ModelNode*) newCTE, IEC61850_INT32U, IEC61850_FC_ST, 0, 0, 0); if (wpOptions & CDC_OPTION_61400_COUNTING_DAILY) - DataAttribute_create("dly", (ModelNode*) newCTE, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 32, 0); + DataAttribute_create("dly", (ModelNode*) newCTE, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 32, 0); if (wpOptions & CDC_OPTION_61400_COUNTING_MONTHLY) - DataAttribute_create("mly", (ModelNode*) newCTE, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 13, 0); + DataAttribute_create("mly", (ModelNode*) newCTE, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 13, 0); if (wpOptions & CDC_OPTION_61400_COUNTING_YEARLY) - DataAttribute_create("mly", (ModelNode*) newCTE, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 21, 0); + DataAttribute_create("mly", (ModelNode*) newCTE, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 21, 0); if (wpOptions & CDC_OPTION_61400_COUNTING_TOTAL) - DataAttribute_create("tot", (ModelNode*) newCTE, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("tot", (ModelNode*) newCTE, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addStandardOptions(newCTE, options); @@ -1133,19 +1133,19 @@ CDC_TMS_create(const char* dataObjectName, ModelNode* parent, CDC_INS_create("oldTmVal", (ModelNode*) newTMS, 0); if (wpOptions & CDC_OPTION_61400_TM_TOT) - DataAttribute_create("tmTot", (ModelNode*) newTMS, INT32U, IEC61850_FC_ST, 0, 0, 0); + DataAttribute_create("tmTot", (ModelNode*) newTMS, IEC61850_INT32U, IEC61850_FC_ST, 0, 0, 0); if (wpOptions & CDC_OPTION_61400_COUNTING_DAILY) - DataAttribute_create("dly", (ModelNode*) newTMS, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 32, 0); + DataAttribute_create("dly", (ModelNode*) newTMS, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 32, 0); if (wpOptions & CDC_OPTION_61400_COUNTING_MONTHLY) - DataAttribute_create("mly", (ModelNode*) newTMS, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 13, 0); + DataAttribute_create("mly", (ModelNode*) newTMS, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 13, 0); if (wpOptions & CDC_OPTION_61400_COUNTING_YEARLY) - DataAttribute_create("mly", (ModelNode*) newTMS, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 21, 0); + DataAttribute_create("mly", (ModelNode*) newTMS, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 21, 0); if (wpOptions & CDC_OPTION_61400_COUNTING_TOTAL) - DataAttribute_create("tot", (ModelNode*) newTMS, INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + DataAttribute_create("tot", (ModelNode*) newTMS, IEC61850_INT32U, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); CDC_addStandardOptions(newTMS, options); diff --git a/src/iec61850/server/model/config_file_parser.c b/src/iec61850/server/model/config_file_parser.c index fef92d37..1157ec6a 100644 --- a/src/iec61850/server/model/config_file_parser.c +++ b/src/iec61850/server/model/config_file_parser.c @@ -292,7 +292,7 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) if (valueIndicator != NULL) { switch (dataAttribute->type) { - case UNICODE_STRING_255: + case IEC61850_UNICODE_STRING_255: { char* stringStart = valueIndicator + 2; terminateString(stringStart, '"'); @@ -300,11 +300,11 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) } break; - case VISIBLE_STRING_255: - case VISIBLE_STRING_129: - case VISIBLE_STRING_65: - case VISIBLE_STRING_64: - case VISIBLE_STRING_32: + case IEC61850_VISIBLE_STRING_255: + case IEC61850_VISIBLE_STRING_129: + case IEC61850_VISIBLE_STRING_65: + case IEC61850_VISIBLE_STRING_64: + case IEC61850_VISIBLE_STRING_32: { char* stringStart = valueIndicator + 2; terminateString(stringStart, '"'); @@ -312,12 +312,12 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) } break; - case INT8: - case INT16: - case INT32: - case INT64: - case INT128: - case ENUMERATED: + case IEC61850_INT8: + case IEC61850_INT16: + case IEC61850_INT32: + case IEC61850_INT64: + case IEC61850_INT128: + case IEC61850_ENUMERATED: { int32_t intValue; if (sscanf(valueIndicator + 1, "%i", &intValue) != 1) goto exit_error; @@ -325,10 +325,10 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) } break; - case INT8U: - case INT16U: - case INT24U: - case INT32U: + case IEC61850_INT8U: + case IEC61850_INT16U: + case IEC61850_INT24U: + case IEC61850_INT32U: { uint32_t uintValue; if (sscanf(valueIndicator + 1, "%u", &uintValue) != 1) goto exit_error; @@ -336,7 +336,7 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) } break; - case FLOAT32: + case IEC61850_FLOAT32: { float floatValue; if (sscanf(valueIndicator + 1, "%f", &floatValue) != 1) goto exit_error; @@ -344,7 +344,7 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) } break; - case FLOAT64: + case IEC61850_FLOAT64: { double doubleValue; if (sscanf(valueIndicator + 1, "%lf", &doubleValue) != 1) goto exit_error; @@ -352,7 +352,7 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) } break; - case BOOLEAN: + case IEC61850_BOOLEAN: { int boolean; if (sscanf(valueIndicator + 1, "%i", &boolean) != 1) goto exit_error; diff --git a/tools/model_generator/genmodel.jar b/tools/model_generator/genmodel.jar index 28621faca4cc0ec1cdfc367cefa5dbdb50a985a6..2fdd70a9fcc6871f282799fafd8bf47bf71da6fa 100644 GIT binary patch delta 14097 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 z zn_9Jg0$^hL>75LwsATq6T|Bc1iwx*;omBtbtqBR$;A1Wb8B=XI8Rg+>%-t zTTrFyyU$wmxa@gEI%E|@?ES3#iM&IcTl!W7E*UO)d}^K`vd=!?0u`q%c0wbIBtput|uOAC#WxGS@rAIcGH#UdfT9#1Qcu(>LaY{4q&-M;yp!pZu+%9#W$L6BZ5PnQ??Co=)6h)Z!8v?5K5%p zQTFHdeP`Mq$~=$frC|_d6!-~gScckD)JFuud&LAb0Rqrrzjb<_ zz>!`k%A`J)#G%qTMI|0{k$1;BvZm*Bvd zVq^ZI5Bi|lQ~*?{G8KRja*=Qbr^IaLfEGRgFxJFhX#eNLx(H;ggbJqm=^b1ltTpEd z&IPL|VEAv*54mw6w6RZMSfwdwkDRcg8WMPKAQNjGu>D#pcuQcI&7y$+rhG~VK!tg> z5dCF&^lRy8L4ljqW;vh_W_(y(pENccc`!r6=>T{z!Rf!mFtypqzZr^ZIACfE{>cAF zIVW8C@8yZVf+yCh|EFLSSk-m_oZ;b!J-o*-(>?#c`7xV$puZUaxG?$?tiSc}UM>Bt zAMf|*-?XcLBp#L3(E^I#{0$H1^56VTpf<|{mBa+#Lur@+C=E_%fTI88;crmI1eCy= z(eSV&B;k?JXG8!Iw1+zk@{e~3px#6Pu}5ZTBM|_;f}uZ%0MFnED=|O{{_u_%0D?aZ z69bIk4;&-_W9)}0`Tq_CG?@gT3AgM8_=Da9o+lq5yZEJgDm6#S~#fmFm;HeP7fe2JRDx^ zQj-AhA(VZ63j4uLqC>zMDV`C;$X- z3%qRBP>5zIHT%DcmJeSa;nGJ!K#+gvG55bxnm)QyK92QY#m1Bm>_m}J01bc^VibuE z-K7O!!DU0;D|g>LaCAIyJpC8PWXz*GJM`vZZ-5KIr+OgCNPsgdQT@Yg{|J7Cz`=*H zr-74FJfW%)Kt@0iL4WxA7b)5&2=6B`C=K;LP3NY52+z%d(lG$2p*GY25_mkJBbi9g zgQ)kY2nYiIiiZ?D#6N|OQv(R#3x^-sEXw2Ig3N2Y|J{P7WEuc`rl2oq9&$w2K+R|Y zG*BO!f7%-Vh!)nuQOHp(HuM|KKbrO)EvHS7)iXgPn=zm%4@(4|4Uq_g>F7Zh=piH5 zzjSdyO=$t*@HS=9K7@bh_}lA_4y^y*>(3h_{04eMHn+;B+ zLH9tkIt6d-!)`?hZ;fOZ!j2Cj0>a)yd;iTLF#G5U@tnnnXM|G#=pQK17vKi91$55; zH8%2_>QAN%9tuKxX!OI!-v4+tE<@IqxuKuv|7lA3BU8f~oat^258f?!PgH%AonJi& zqIeMW??q?_rDgc%S76HU5KXZMk2c*S{XgT|`Dhak5)ZALN%BH jQt)=XZ5DsG{Ll`S2giSJ11r!fW`F_;4bj5}f$;wTAk7X= diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index c35b8392..b1ed816e 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -539,7 +539,7 @@ public class StaticModelGenerator { cOut.println(" " + dataAttribute.getCount() + ","); cOut.println(" IEC61850_FC_" + dataAttribute.getFc().toString() + ","); - cOut.println(" " + dataAttribute.getType() + ","); + cOut.println(" IEC61850_" + dataAttribute.getType() + ","); /* print trigger options */ cOut.print(" 0"); From 8482cfce9b77dbd2d9a4068aeff938c255150f6a Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 9 Nov 2015 17:42:13 +0100 Subject: [PATCH 02/33] - server side support for SV control blocks - WIP --- config/stack_config.h | 4 +- config/stack_config.h.cmake | 3 + dotnet/reporting/Settings.cs | 28 ++ .../inc/libiec61850_platform_includes.h | 6 +- src/iec61850/inc/iec61850_dynamic_model.h | 37 ++- src/iec61850/inc/iec61850_model.h | 28 +- .../inc_private/mms_mapping_internal.h | 5 + src/iec61850/inc_private/mms_sv.h | 31 +++ src/iec61850/server/mms_mapping/mms_goose.c | 4 +- src/iec61850/server/mms_mapping/mms_mapping.c | 73 ++++- src/iec61850/server/mms_mapping/mms_sv.c | 251 ++++++++++++++++++ .../server/model/config_file_parser.c | 8 +- src/iec61850/server/model/dynamic_model.c | 42 ++- src/vs/libiec61850-wo-goose.def | 5 +- src/vs/libiec61850.def | 3 + .../scl/communication/ConnectedAP.java | 27 +- .../libiec61850/scl/communication/GSE.java | 6 +- .../{GSEAddress.java => PhyComAddress.java} | 4 +- .../libiec61850/scl/communication/SMV.java | 61 +++++ .../com/libiec61850/scl/model/GSEControl.java | 57 ++-- .../libiec61850/scl/model/LogicalNode.java | 9 + .../scl/model/SampledValueControl.java | 89 +++++++ .../com/libiec61850/scl/model/SmvOpts.java | 41 +++ .../tools/DynamicModelGenerator.java | 4 +- .../tools/StaticModelGenerator.java | 4 +- 25 files changed, 772 insertions(+), 58 deletions(-) create mode 100644 dotnet/reporting/Settings.cs create mode 100644 src/iec61850/inc_private/mms_sv.h create mode 100644 src/iec61850/server/mms_mapping/mms_sv.c rename tools/model_generator/src/com/libiec61850/scl/communication/{GSEAddress.java => PhyComAddress.java} (96%) create mode 100644 tools/model_generator/src/com/libiec61850/scl/communication/SMV.java create mode 100644 tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java create mode 100644 tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java diff --git a/config/stack_config.h b/config/stack_config.h index 26207ee5..e6a12ed1 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -67,12 +67,14 @@ /* Ethernet interface ID for GOOSE and SV */ #define CONFIG_ETHERNET_INTERFACE_ID "eth0" //#define CONFIG_ETHERNET_INTERFACE_ID "vboxnet0" -//#define CONFIG_ETHERNET_INTERFACE_ID "eth-f" //#define CONFIG_ETHERNET_INTERFACE_ID "en0" // OS X uses enX in place of ethX as ethernet NIC names. /* Set to 1 to include GOOSE support in the build. Otherwise set to 0 */ #define CONFIG_INCLUDE_GOOSE_SUPPORT 1 +/* Set to 1 to include Sampled Values support in the build. Otherwise set to 0 */ +#define CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT 1 + #ifdef _WIN32 /* GOOSE will be disabled for Windows if ethernet support (winpcap) is not available */ diff --git a/config/stack_config.h.cmake b/config/stack_config.h.cmake index 011cbf82..36b7ff3e 100644 --- a/config/stack_config.h.cmake +++ b/config/stack_config.h.cmake @@ -71,6 +71,9 @@ /* Set to 1 to include GOOSE support in the build. Otherwise set to 0 */ #cmakedefine01 CONFIG_INCLUDE_GOOSE_SUPPORT +/* Set to 1 to include Sampled Values support in the build. Otherwise set to 0 */ +#cmakedefine01 CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT + #ifdef _WIN32 /* GOOSE will be disabled for Windows if ethernet support (winpcap) is not available */ diff --git a/dotnet/reporting/Settings.cs b/dotnet/reporting/Settings.cs new file mode 100644 index 00000000..99fcfeb5 --- /dev/null +++ b/dotnet/reporting/Settings.cs @@ -0,0 +1,28 @@ +namespace reporting.Properties { + + + // This class allows you to handle specific events on the settings class: + // The SettingChanging event is raised before a setting's value is changed. + // The PropertyChanged event is raised after a setting's value is changed. + // The SettingsLoaded event is raised after the setting values are loaded. + // The SettingsSaving event is raised before the setting values are saved. + internal sealed partial class Settings { + + public Settings() { + // // To add event handlers for saving and changing settings, uncomment the lines below: + // + // this.SettingChanging += this.SettingChangingEventHandler; + // + // this.SettingsSaving += this.SettingsSavingEventHandler; + // + } + + private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { + // Add code to handle the SettingChangingEvent event here. + } + + private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { + // Add code to handle the SettingsSaving event here. + } + } +} diff --git a/src/common/inc/libiec61850_platform_includes.h b/src/common/inc/libiec61850_platform_includes.h index 9a9f9097..f4de6b94 100644 --- a/src/common/inc/libiec61850_platform_includes.h +++ b/src/common/inc/libiec61850_platform_includes.h @@ -15,7 +15,7 @@ #include "platform_endian.h" -#define LIBIEC61850_VERSION "0.8.7" +#define LIBIEC61850_VERSION "0.9.0" #ifndef CONFIG_DEFAULT_MMS_VENDOR_NAME #define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" @@ -29,6 +29,10 @@ #define CONFIG_DEFAULT_MMS_REVISION LIBIEC61850_VERSION #endif +#ifndef CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT +#define CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT 0 +#endif + #if (DEBUG != 1) #define NDEBUG 1 #endif diff --git a/src/iec61850/inc/iec61850_dynamic_model.h b/src/iec61850/inc/iec61850_dynamic_model.h index 77725334..967c764f 100644 --- a/src/iec61850/inc/iec61850_dynamic_model.h +++ b/src/iec61850/inc/iec61850_dynamic_model.h @@ -183,7 +183,7 @@ SettingGroupControlBlock_create(LogicalNode* parent, uint8_t actSG, uint8_t numO * \param parent the parent LN * \param appId the application ID of the GoCB * \param dataSet the data set reference to be used by the GoCB - * \param confRef the configuration revision + * \param confRev the configuration revision * \param fixedOffs indicates if GOOSE publisher shall use fixed offsets (NOT YET SUPPORTED) * \param minTime minimum GOOSE retransmission time (-1 if not specified - uses stack default then) * \param maxTime GOOSE retransmission time in stable state (-1 if not specified - uses stack default then) @@ -191,15 +191,40 @@ SettingGroupControlBlock_create(LogicalNode* parent, uint8_t actSG, uint8_t numO * \return the new GoCB instance */ GSEControlBlock* -GSEControlBlock_create(const char* name, LogicalNode* parent, char* appId, char* dataSet, uint32_t confRef, +GSEControlBlock_create(const char* name, LogicalNode* parent, char* appId, char* dataSet, uint32_t confRev, bool fixedOffs, int minTime, int maxTime); /** - * \brief create a PhyComAddress object and add it to a GoCB + * \brief create a new Multicast/Unicast Sampled Value (SV) control block (SvCB) + * + * Create a new Sampled Value control block (SvCB) and add it to the given logical node (LN) + * + * \param name name of the SvCB relative to the parent LN + * \param parent the parent LN + * \param svID the application ID of the SvCB + * \param dataSet the data set reference to be used by the SVCB + * \param confRev the configuration revision + * \param smpMod the sampling mode used + * \param smpRate the sampling rate used + * \param optFlds the optional element configuration + * + * \return the new SvCB instance + */ +SVControlBlock* +SVControlBlock_create(const char* name, LogicalNode* parent, char* svID, char* dataSet, uint32_t confRev, uint8_t smpMod, + uint16_t smpRate, uint8_t optFlds, bool isUnicast); + +void +SVControlBlock_addPhyComAddress(SVControlBlock* self, PhyComAddress* phyComAddress); + +void +GSEControlBlock_addPhyComAddress(GSEControlBlock* self, PhyComAddress* phyComAddress); + +/** + * \brief create a PhyComAddress object * - * A PhyComAddress object contains all required addressing informations for a GOOSE publisher. + * A PhyComAddress object contains all required addressing information for a GOOSE publisher. * - * \param parent the parent GSEControlBlock object * \param vlanPriority the priority field of the VLAN tag * \param vlanId the ID field of the VLAN tag * \param appId the application identifier @@ -208,7 +233,7 @@ GSEControlBlock_create(const char* name, LogicalNode* parent, char* appId, char* * \return the new PhyComAddress object */ PhyComAddress* -PhyComAddress_create(GSEControlBlock* parent, uint8_t vlanPriority, uint16_t vlanId, uint16_t appId, uint8_t dstAddress[]); +PhyComAddress_create(uint8_t vlanPriority, uint16_t vlanId, uint16_t appId, uint8_t dstAddress[]); /** * \brief create a new data set diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index a94204d7..258c9b10 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -80,6 +80,8 @@ typedef struct sSettingGroupControlBlock SettingGroupControlBlock; typedef struct sGSEControlBlock GSEControlBlock; +typedef struct sSVControlBlock SVControlBlock; + typedef enum { IEC61850_BOOLEAN = 0,/* int */ @@ -162,6 +164,7 @@ struct sIedModel { DataSet* dataSets; ReportControlBlock* rcbs; GSEControlBlock* gseCBs; + SVControlBlock* svCBs; SettingGroupControlBlock* sgcbs; void (*initializer) (void); }; @@ -279,7 +282,7 @@ struct sGSEControlBlock { char* name; char* appId; char* dataSetName; /* pre loaded with relative name in logical node */ - uint32_t confRef; /* ConfRef - configuration revision */ + uint32_t confRev; /* ConfRev - configuration revision */ bool fixedOffs; /* fixed offsets */ PhyComAddress* address; /* GSE communication parameters */ int minTime; /* optional minTime parameter --> -1 if not present */ @@ -287,6 +290,29 @@ struct sGSEControlBlock { GSEControlBlock* sibling; /* next control block in list or NULL if this is the last entry */ }; +struct sSVControlBlock { + LogicalNode* parent; + char* name; + + char* svId; /* MsvUD/UsvID */ + char* dataSetName; /* pre loaded with relative name in logical node */ + + uint8_t optFlds; + + uint8_t smpMod; + uint16_t smpRate; + + uint32_t confRev; /* ConfRev - configuration revision */ + + PhyComAddress* dstAddress; /* SV communication parameters */ + + bool isUnicast; + + int noASDU; + + SVControlBlock* sibling; /* next control block in list or NULL if this is the last entry */ +}; + /** * \brief get the number of direct children of a model node * diff --git a/src/iec61850/inc_private/mms_mapping_internal.h b/src/iec61850/inc_private/mms_mapping_internal.h index a23fe8e9..ef09bb24 100644 --- a/src/iec61850/inc_private/mms_mapping_internal.h +++ b/src/iec61850/inc_private/mms_mapping_internal.h @@ -40,6 +40,11 @@ struct sMmsMapping { const char* gooseInterfaceId; #endif +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + LinkedList svControls; + const char* svInterfaceId; +#endif + LinkedList controlObjects; LinkedList observedObjects; LinkedList attributeAccessHandlers; diff --git a/src/iec61850/inc_private/mms_sv.h b/src/iec61850/inc_private/mms_sv.h new file mode 100644 index 00000000..4af77fe5 --- /dev/null +++ b/src/iec61850/inc_private/mms_sv.h @@ -0,0 +1,31 @@ +/* + * mms_sv.h + * + * Copyright 2015 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#ifndef LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ +#define LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ + +MmsVariableSpecification* +LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, + LogicalNode* logicalNode, int svCount, bool unicast); + +#endif /* LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ */ diff --git a/src/iec61850/server/mms_mapping/mms_goose.c b/src/iec61850/server/mms_mapping/mms_goose.c index 85428f30..4df30eba 100644 --- a/src/iec61850/server/mms_mapping/mms_goose.c +++ b/src/iec61850/server/mms_mapping/mms_goose.c @@ -550,7 +550,7 @@ GOOSE_createGOOSEControlBlocks(MmsMapping* self, MmsDomain* domain, MmsValue* confRef = MmsValue_getElement(gseValues, 3); - MmsValue_setUint32(confRef, gooseControlBlock->confRef); + MmsValue_setUint32(confRef, gooseControlBlock->confRev); mmsGCB->dataSet = NULL; @@ -587,5 +587,5 @@ GOOSE_createGOOSEControlBlocks(MmsMapping* self, MmsDomain* domain, return namedVariable; } -#endif +#endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 40064194..0a488866 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -766,9 +766,8 @@ countGSEControlBlocksForLogicalNode(MmsMapping* self, LogicalNode* logicalNode) GSEControlBlock* gcb = self->model->gseCBs; while (gcb != NULL) { - if (gcb->parent == logicalNode) { + if (gcb->parent == logicalNode) gseCount++; - } gcb = gcb->sibling; } @@ -778,6 +777,27 @@ countGSEControlBlocksForLogicalNode(MmsMapping* self, LogicalNode* logicalNode) #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + +static int +countSVControlBlocksForLogicalNode(MmsMapping* self, LogicalNode* logicalNode, bool unicast) +{ + int svCount = 0; + + SVControlBlock* svCb = self->model->svCBs; + + while (svCb != NULL) { + if ((svCb->parent == logicalNode) && (svCb->isUnicast == unicast)) + svCount++; + + svCb = svCb->sibling; + } + + return svCount; +} + +#endif /* (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) */ + static SettingGroupControlBlock* checkForSgcb(MmsMapping* self, LogicalNode* logicalNode) { @@ -862,6 +882,28 @@ createNamedVariableFromLogicalNode(MmsMapping* self, MmsDomain* domain, #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + + int msvcbCount = countSVControlBlocksForLogicalNode(self, logicalNode, false); + + if (msvcbCount > 0) { + if (DEBUG_IED_SERVER) + printf(" and %i MSV control blocks\n", msvcbCount); + + componentCount++; + } + + int usvcbCount = countSVControlBlocksForLogicalNode(self, logicalNode, true); + + if (usvcbCount > 0) { + if (DEBUG_IED_SERVER) + printf(" and %i USV control blocks\n", usvcbCount); + + componentCount++; + } + +#endif /* (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) */ + namedVariable->typeSpec.structure.elements = (MmsVariableSpecification**) GLOBAL_CALLOC(componentCount, sizeof(MmsVariableSpecification*)); @@ -961,6 +1003,24 @@ createNamedVariableFromLogicalNode(MmsMapping* self, MmsDomain* domain, currentComponent++; } +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + + /* Add MS and US named variables */ + if (msvcbCount > 0) { + namedVariable->typeSpec.structure.elements[currentComponent] = + LIBIEC61850_SV_creatSVControlBlocks(self, domain, logicalNode, msvcbCount, false); + + currentComponent++; + } + + if (usvcbCount > 0) { + namedVariable->typeSpec.structure.elements[currentComponent] = + LIBIEC61850_SV_creatSVControlBlocks(self, domain, logicalNode, msvcbCount, true); + + currentComponent++; + } +#endif + if (LogicalNode_hasFCData(logicalNode, IEC61850_FC_EX)) { namedVariable->typeSpec.structure.elements[currentComponent] = createFCNamedVariable(logicalNode, IEC61850_FC_EX); @@ -1138,6 +1198,11 @@ MmsMapping_create(IedModel* model) self->gooseInterfaceId = NULL; #endif +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + self->svControls = LinkedList_create(); + self->svInterfaceId = NULL; +#endif + #if (CONFIG_IEC61850_CONTROL_SERVICE == 1) self->controlObjects = LinkedList_create(); #endif @@ -1177,6 +1242,10 @@ MmsMapping_destroy(MmsMapping* self) LinkedList_destroyDeep(self->gseControls, (LinkedListValueDeleteFunction) MmsGooseControlBlock_destroy); #endif +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + LinkedList_destroyDeep(self->svControls, (LinkedListValueDeleteFunction) MmsSvControlBlock_destroy); +#endif + #if (CONFIG_IEC61850_CONTROL_SERVICE == 1) LinkedList_destroyDeep(self->controlObjects, (LinkedListValueDeleteFunction) ControlObject_destroy); #endif diff --git a/src/iec61850/server/mms_mapping/mms_sv.c b/src/iec61850/server/mms_mapping/mms_sv.c new file mode 100644 index 00000000..56e8674b --- /dev/null +++ b/src/iec61850/server/mms_mapping/mms_sv.c @@ -0,0 +1,251 @@ +/* + * mms_sv.c + * + * Copyright 2015 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#include "stack_config.h" + +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + +#include "libiec61850_platform_includes.h" +#include "mms_mapping.h" +#include "linked_list.h" +#include "array_list.h" + +#include "mms_mapping_internal.h" + + +static GSEControlBlock* +getSVCBForLogicalNodeWithIndex(MmsMapping* self, LogicalNode* logicalNode, int index, bool isUnicast) +{ + int svCount = 0; + + SVControlBlock* svcb = self->model->svCBs; + + /* Iterate list of SvCBs */ + while (svcb != NULL ) { + if ((svcb->parent == logicalNode) && (svcb->isUnicast == isUnicast)) { + if (svCount == index) + return svcb; + + svCount++; + } + + svcb = svcb->sibling; + } + + return NULL ; +} + + +static MmsVariableSpecification* +createSVControlBlockMmsStructure(char* gcbName, bool isUnicast) +{ + MmsVariableSpecification* gcb = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + gcb->name = copyString(gcbName); + gcb->type = MMS_STRUCTURE; + + int elementCount; + + if (isUnicast) + elementCount = 10; + else + elementCount = 9; + + gcb->typeSpec.structure.elementCount = elementCount; + gcb->typeSpec.structure.elements = (MmsVariableSpecification**) + GLOBAL_CALLOC(elementCount, sizeof(MmsVariableSpecification*)); + + int currentElement = 0; + + MmsVariableSpecification* namedVariable; + + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("SvEna"); + namedVariable->type = MMS_BOOLEAN; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + + if (isUnicast) { + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("Resv"); + namedVariable->type = MMS_BOOLEAN; + } + + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + if (isUnicast) + namedVariable->name = copyString("UsvID"); + else + namedVariable->name = copyString("MsvID"); + namedVariable->typeSpec.visibleString = -129; + namedVariable->type = MMS_VISIBLE_STRING; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("DatSet"); + namedVariable->typeSpec.visibleString = -129; + namedVariable->type = MMS_VISIBLE_STRING; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("ConfRev"); + namedVariable->type = MMS_INTEGER; + namedVariable->typeSpec.integer = 32; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("SmpRate"); + namedVariable->type = MMS_INTEGER; + namedVariable->typeSpec.unsignedInteger = 32; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("OptFlds"); + namedVariable->type = MMS_BIT_STRING; + namedVariable->typeSpec.bitString = 5; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("DstAddress"); + MmsMapping_createPhyComAddrStructure(namedVariable); + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("noASDU"); + namedVariable->type = MMS_INTEGER; + namedVariable->typeSpec.integer = 32; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + + return gcb; +} + + + +MmsVariableSpecification* +LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, + LogicalNode* logicalNode, int svCount, bool unicast) +{ + MmsVariableSpecification* namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, + sizeof(MmsVariableSpecification)); + + if (unicast) + namedVariable->name = copyString("US"); + else + namedVariable->name = copyString("MS"); + + namedVariable->type = MMS_STRUCTURE; + + namedVariable->typeSpec.structure.elementCount = svCount; + namedVariable->typeSpec.structure.elements = (MmsVariableSpecification**) GLOBAL_CALLOC(svCount, + sizeof(MmsVariableSpecification*)); + + int currentSVCB = 0; + + while (currentSVCB < svCount) { + SVControlBlock* svControlBlock = getSVCBForLogicalNodeWithIndex( + self, logicalNode, currentSVCB, unicast); + + MmsVariableSpecification* svTypeSpec = createSVControlBlockMmsStructure(svControlBlock->name, unicast); + + MmsValue* svValues = MmsValue_newStructure(svTypeSpec); + + namedVariable->typeSpec.structure.elements[currentSVCB] = svTypeSpec; + + int currentIndex; + + if (unicast) + currentIndex = 2; + else + currentIndex = 1; + + /* SvID */ + MmsValue* svID = MmsValue_getElement(svValues, currentIndex++); + MmsValue_setVisibleString(svID, svControlBlock->svId); + + /* DatSet */ + MmsValue* dataSetRef = MmsValue_getElement(svValues, currentIndex++); + MmsValue_setVisibleString(dataSetRef, svControlBlock->dataSetName); + + /* ConfRev */ + MmsValue* confRev = MmsValue_getElement(svValues, currentIndex++); + MmsValue_setInt32(confRev, svControlBlock->confRev); + + /* SmpRate */ + MmsValue* smpRate = MmsValue_getElement(svValues, currentIndex++); + MmsValue_setInt32(smpRate, svControlBlock->smpRate); + + /* OptFlds */ + MmsValue* optFlds = MmsValue_getElement(svValues, currentIndex++); + MmsValue_setBitStringFromInteger(optFlds, svControlBlock->optFlds); + + /* SmpMod */ + MmsValue* smpMod = MmsValue_getElement(svValues, currentIndex++); + MmsValue_setInt32(smpRate, svControlBlock->smpMod); + + /* Set communication parameters - DstAddress */ + uint8_t priority = CONFIG_GOOSE_DEFAULT_PRIORITY; + uint8_t dstAddr[] = CONFIG_GOOSE_DEFAULT_DST_ADDRESS; + uint16_t vid = CONFIG_GOOSE_DEFAULT_VLAN_ID; + uint16_t appId = CONFIG_GOOSE_DEFAULT_APPID; + + if (svControlBlock->dstAddress != NULL) { + priority = svControlBlock->dstAddress->vlanPriority; + vid = svControlBlock->dstAddress->vlanId; + appId = svControlBlock->dstAddress->appId; + + int i; + for (i = 0; i < 6; i++) { + dstAddr[i] = svControlBlock->dstAddress->dstAddress[i]; + } + } + + MmsValue* dstAddress = MmsValue_getElement(svValues, currentIndex++); + + MmsValue* addr = MmsValue_getElement(dstAddress, 0); + MmsValue_setOctetString(addr, dstAddr, 6); + + MmsValue* prio = MmsValue_getElement(dstAddress, 1); + MmsValue_setUint8(prio, priority); + + MmsValue* vlanId = MmsValue_getElement(dstAddress, 2); + MmsValue_setUint16(vlanId, vid); + + MmsValue* appIdVal = MmsValue_getElement(dstAddress, 3); + MmsValue_setUint16(appIdVal, appId); + + /* noASDU */ + MmsValue* noASDU = MmsValue_getElement(svValues, currentIndex++); + MmsValue_setInt32(noASDU, svControlBlock->noASDU); + + currentSVCB++; + } + + return namedVariable; +} + +#endif /* (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) */ diff --git a/src/iec61850/server/model/config_file_parser.c b/src/iec61850/server/model/config_file_parser.c index 1157ec6a..e34258dc 100644 --- a/src/iec61850/server/model/config_file_parser.c +++ b/src/iec61850/server/model/config_file_parser.c @@ -395,8 +395,12 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) if (StringUtils_createBufferFromHexString(nameString, (uint8_t*) nameString2) != 6) goto exit_error; - PhyComAddress_create(currentGoCB, (uint8_t) vlanPrio, (uint16_t) vlanId, (uint16_t) appId, - (uint8_t*) nameString2); + + PhyComAddress* dstAddress = + PhyComAddress_create((uint8_t) vlanPrio, (uint16_t) vlanId, (uint16_t) appId, + (uint8_t*) nameString2); + + GSEControlBlock_addPhyComAddress(currentGoCB, dstAddress); } else diff --git a/src/iec61850/server/model/dynamic_model.c b/src/iec61850/server/model/dynamic_model.c index 09a719e9..206e7b87 100644 --- a/src/iec61850/server/model/dynamic_model.c +++ b/src/iec61850/server/model/dynamic_model.c @@ -327,7 +327,7 @@ GSEControlBlock_create(const char* name, LogicalNode* parent, char* appId, char* else self->dataSetName = NULL; - self->confRef = confRef; + self->confRev = confRef; self->fixedOffs = fixedOffs; self->minTime = minTime; self->maxTime = maxTime; @@ -342,14 +342,47 @@ GSEControlBlock_create(const char* name, LogicalNode* parent, char* appId, char* return self; } -static void +SVControlBlock* +SVControlBlock_create(const char* name, LogicalNode* parent, char* svID, char* dataSet, uint32_t confRev, uint8_t smpMod, + uint16_t smpRate, uint8_t optFlds, bool isUnicast) +{ + SVControlBlock* self = (SVControlBlock*) GLOBAL_MALLOC(sizeof(SVControlBlock)); + + self->name = copyString(name); + self->parent = parent; + + self->svId = copyString(svID); /* Is there a default value? */ + + if (dataSet) + self->dataSetName = copyString(dataSet); + else + self->dataSetName = NULL; + + self->confRev = confRev; + + self->smpMod = smpMod; + self->smpRate = smpRate; + + self->optFlds = optFlds; + self->isUnicast = isUnicast; + + return self; +} + +void +SVControlBlock_addPhyComAddress(SVControlBlock* self, PhyComAddress* phyComAddress) +{ + self->dstAddress = phyComAddress; +} + +void GSEControlBlock_addPhyComAddress(GSEControlBlock* self, PhyComAddress* phyComAddress) { self->address = phyComAddress; } PhyComAddress* -PhyComAddress_create(GSEControlBlock* parent, uint8_t vlanPriority, uint16_t vlanId, uint16_t appId, uint8_t dstAddress[]) +PhyComAddress_create(uint8_t vlanPriority, uint16_t vlanId, uint16_t appId, uint8_t dstAddress[]) { PhyComAddress* self = (PhyComAddress*) GLOBAL_MALLOC(sizeof(PhyComAddress)); @@ -359,9 +392,6 @@ PhyComAddress_create(GSEControlBlock* parent, uint8_t vlanPriority, uint16_t vla memcpy(self->dstAddress, dstAddress, 6); - if (parent != NULL) - GSEControlBlock_addPhyComAddress(parent, self); - return self; } diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 9b30b7d0..f1cdcb39 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -494,4 +494,7 @@ EXPORTS LogicalDevice_getChildByMmsVariableName LogicalNode_getDataSet ClientReport_getDataSetName - MmsValue_getStringSize \ No newline at end of file + MmsValue_getStringSize + SVControlBlock_create + SVControlBlock_addPhyComAddress + GSEControlBlock_addPhyComAddress diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index a88a7fc5..aca168eb 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -519,3 +519,6 @@ EXPORTS LogicalNode_getDataSet ClientReport_getDataSetName MmsValue_getStringSize + SVControlBlock_create + SVControlBlock_addPhyComAddress + GSEControlBlock_addPhyComAddress diff --git a/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java b/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java index 46579aaf..2aceca49 100644 --- a/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java +++ b/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java @@ -35,6 +35,7 @@ public class ConnectedAP { private String apName; private List gses; + private List smvs; public ConnectedAP(Node node) throws SclParserException { iedName = ParserUtils.parseAttribute(node, "iedName"); @@ -50,6 +51,14 @@ public class ConnectedAP { for (Node gseNode : gseNodes) { gses.add(new GSE(gseNode)); } + + smvs = new LinkedList(); + + List smvNodes = ParserUtils.getChildNodesWithTag(node, "SMV"); + + for (Node smvNode : smvNodes) { + smvs.add(new SMV(smvNode)); + } } public String getIedName() { @@ -64,7 +73,11 @@ public class ConnectedAP { return gses; } - public GSEAddress lookupGSEAddress(String logicalDeviceName, String name) { + public List getSmvs() { + return smvs; + } + + public PhyComAddress lookupGSEAddress(String logicalDeviceName, String name) { for (GSE gse : this.getGses()) { if (gse.getLdInst().equals(logicalDeviceName)) { @@ -75,5 +88,17 @@ public class ConnectedAP { return null; } + + public PhyComAddress lookupSMVAddress(String logicalDeviceName, String name) { + + for (SMV smv : this.getSmvs()) { + if (smv.getLdInst().equals(logicalDeviceName)) { + if (smv.getCbName().equals(name)) + return smv.getAddress(); + } + } + + return null; + } } diff --git a/tools/model_generator/src/com/libiec61850/scl/communication/GSE.java b/tools/model_generator/src/com/libiec61850/scl/communication/GSE.java index 1bb0427b..eb56e1bf 100644 --- a/tools/model_generator/src/com/libiec61850/scl/communication/GSE.java +++ b/tools/model_generator/src/com/libiec61850/scl/communication/GSE.java @@ -31,7 +31,7 @@ public class GSE { private String ldInst; private String cbName; - private GSEAddress address; + private PhyComAddress address; public GSE(Node gseNode) throws SclParserException { ldInst = ParserUtils.parseAttribute(gseNode, "ldInst"); @@ -45,7 +45,7 @@ public class GSE { if (addressNode == null) throw new SclParserException(gseNode, "GSE is missing address definition!"); - address = new GSEAddress(addressNode); + address = new PhyComAddress(addressNode); } public String getLdInst() { @@ -56,7 +56,7 @@ public class GSE { return cbName; } - public GSEAddress getAddress() { + public PhyComAddress getAddress() { return address; } diff --git a/tools/model_generator/src/com/libiec61850/scl/communication/GSEAddress.java b/tools/model_generator/src/com/libiec61850/scl/communication/PhyComAddress.java similarity index 96% rename from tools/model_generator/src/com/libiec61850/scl/communication/GSEAddress.java rename to tools/model_generator/src/com/libiec61850/scl/communication/PhyComAddress.java index 151033ea..c4ff7e10 100644 --- a/tools/model_generator/src/com/libiec61850/scl/communication/GSEAddress.java +++ b/tools/model_generator/src/com/libiec61850/scl/communication/PhyComAddress.java @@ -29,14 +29,14 @@ import org.w3c.dom.Node; import com.libiec61850.scl.ParserUtils; import com.libiec61850.scl.SclParserException; -public class GSEAddress { +public class PhyComAddress { private Integer vlanId = null; private Integer vlanPriority = null; private Integer appId = null; private int[] macAddress = null; - public GSEAddress(Node addressNode) throws DOMException, SclParserException { + public PhyComAddress(Node addressNode) throws DOMException, SclParserException { List pNodes = ParserUtils.getChildNodesWithTag(addressNode, "P"); diff --git a/tools/model_generator/src/com/libiec61850/scl/communication/SMV.java b/tools/model_generator/src/com/libiec61850/scl/communication/SMV.java new file mode 100644 index 00000000..71012cf8 --- /dev/null +++ b/tools/model_generator/src/com/libiec61850/scl/communication/SMV.java @@ -0,0 +1,61 @@ +package com.libiec61850.scl.communication; + +import org.w3c.dom.Node; + +import com.libiec61850.scl.ParserUtils; +import com.libiec61850.scl.SclParserException; + +/* + * Copyright 2015 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +public class SMV { + private String ldInst; + private String cbName; + + private PhyComAddress address; + + public SMV(Node gseNode) throws SclParserException { + ldInst = ParserUtils.parseAttribute(gseNode, "ldInst"); + cbName = ParserUtils.parseAttribute(gseNode, "cbName"); + + if ((ldInst == null) || (cbName == null)) + throw new SclParserException(gseNode, "SMV is missing required attribute"); + + Node addressNode = ParserUtils.getChildNodeWithTag(gseNode, "Address"); + + if (addressNode == null) + throw new SclParserException(gseNode, "SMV is missing address definition!"); + + address = new PhyComAddress(addressNode); + } + + public String getLdInst() { + return ldInst; + } + + public String getCbName() { + return cbName; + } + + public PhyComAddress getAddress() { + return address; + } +} diff --git a/tools/model_generator/src/com/libiec61850/scl/model/GSEControl.java b/tools/model_generator/src/com/libiec61850/scl/model/GSEControl.java index 40ee837e..73309921 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/GSEControl.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/GSEControl.java @@ -36,40 +36,45 @@ public class GSEControl { private boolean fixedOffs = false; private int minTime = -1; private int maxTime = -1; - + public GSEControl(Node gseControlNode) throws SclParserException { this.name = ParserUtils.parseAttribute(gseControlNode, "name"); this.desc = ParserUtils.parseAttribute(gseControlNode, "desc"); this.dataSet = ParserUtils.parseAttribute(gseControlNode, "datSet"); - - String confRevString = ParserUtils.parseAttribute(gseControlNode, "confRev"); - + + String confRevString = ParserUtils.parseAttribute(gseControlNode, + "confRev"); + if (confRevString != null) this.confRev = new Integer(confRevString); - + this.appID = ParserUtils.parseAttribute(gseControlNode, "appID"); - - Boolean fixedOffs = ParserUtils.parseBooleanAttribute(gseControlNode, "fixedOffs"); - - if (fixedOffs != null) - this.fixedOffs = fixedOffs; - - String minTimeStr = ParserUtils.parseAttribute(gseControlNode, "minTime"); - String maxTimeStr = ParserUtils.parseAttribute(gseControlNode, "maxTime"); - - if (minTimeStr != null) - minTime = new Integer(minTimeStr); - - if (maxTimeStr != null) - maxTime = new Integer(maxTimeStr); - - String typeString = ParserUtils.parseAttribute(gseControlNode, "type"); - - if (typeString != null) - if (!typeString.equals("GOOSE")) - throw new SclParserException(gseControlNode, "GSEControl of type " + typeString + " not supported!"); - + + Boolean fixedOffs = ParserUtils.parseBooleanAttribute(gseControlNode, + "fixedOffs"); + + if (fixedOffs != null) + this.fixedOffs = fixedOffs; + + String minTimeStr = ParserUtils.parseAttribute(gseControlNode, + "minTime"); + String maxTimeStr = ParserUtils.parseAttribute(gseControlNode, + "maxTime"); + + if (minTimeStr != null) + minTime = new Integer(minTimeStr); + + if (maxTimeStr != null) + maxTime = new Integer(maxTimeStr); + + String typeString = ParserUtils.parseAttribute(gseControlNode, "type"); + + if (typeString != null) + if (!typeString.equals("GOOSE")) + throw new SclParserException(gseControlNode, + "GSEControl of type " + typeString + " not supported!"); + } public String getName() { diff --git a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java index 8fa7c58c..5d34675f 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java @@ -47,6 +47,7 @@ public class LogicalNode implements DataModelNode { private List dataSets; private List reportControlBlocks; private List gseControlBlocks; + private List smvControlBlocks; private List logControlBlocks; private List logs; private List settingGroupControlBlocks; @@ -113,6 +114,10 @@ public class LogicalNode implements DataModelNode { for (Node gseControlNode : gseControlNodes) gseControlBlocks.add(new GSEControl(gseControlNode)); + /* Parse Sampled Values (SV) control block definitions */ + smvControlBlocks = new LinkedList(); + + /* Parse log control block definitions */ logControlBlocks = new LinkedList(); @@ -261,6 +266,10 @@ public class LogicalNode implements DataModelNode { return gseControlBlocks; } + public List getSampledValueControlBlocks() { + return smvControlBlocks; + } + public List getSettingGroupControlBlocks() { return settingGroupControlBlocks; } diff --git a/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java b/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java new file mode 100644 index 00000000..77993e77 --- /dev/null +++ b/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java @@ -0,0 +1,89 @@ +package com.libiec61850.scl.model; + +import org.w3c.dom.Node; + +import com.libiec61850.scl.ParserUtils; +import com.libiec61850.scl.SclParserException; + +public class SampledValueControl { + + private String name; + private String desc = null; + private String datSet; + private int confRev = 1; + private String smvID; + private int smpRate; + private int nofASDU; + private boolean multicast; + private SmvOpts smvOpts; + + + + public SampledValueControl(Node smvControlNode) throws SclParserException { + this.name = ParserUtils.parseAttribute(smvControlNode, "name"); + this.desc = ParserUtils.parseAttribute(smvControlNode, "desc"); + this.datSet = ParserUtils.parseAttribute(smvControlNode, "datSet"); + + String confRevString = ParserUtils.parseAttribute(smvControlNode, "confRev"); + + if (confRevString != null) + this.confRev = new Integer(confRevString); + + this.smvID = ParserUtils.parseAttribute(smvControlNode, "smvID"); + + this.multicast = ParserUtils.parseBooleanAttribute(smvControlNode, "multicast"); + + String smpRateString = ParserUtils.parseAttribute(smvControlNode, "smpRate"); + + if (smpRateString != null) + this.smpRate = new Integer(smpRateString); + + String nofASDUString = ParserUtils.parseAttribute(smvControlNode, "nofASDU"); + + if (nofASDUString != null) + this.nofASDU = new Integer(nofASDUString); + + Node smvOptsNode = ParserUtils.getChildNodeWithTag(smvControlNode, "SmvOpts"); + + this.smvOpts = new SmvOpts(smvOptsNode); + } + + + + public String getName() { + return name; + } + + public String getDesc() { + return desc; + } + + public String getDatSet() { + return datSet; + } + + public int getConfRev() { + return confRev; + } + + public String getSmvID() { + return smvID; + } + + public int getSmpRate() { + return smpRate; + } + + public int getNofASDI() { + return nofASDU; + } + + public boolean isMulticast() { + return multicast; + } + + public SmvOpts getSmvOpts() { + return smvOpts; + } + +} diff --git a/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java b/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java new file mode 100644 index 00000000..1dcd59ad --- /dev/null +++ b/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java @@ -0,0 +1,41 @@ +package com.libiec61850.scl.model; + +import org.w3c.dom.Node; + +import com.libiec61850.scl.ParserUtils; +import com.libiec61850.scl.SclParserException; + +public class SmvOpts { + + + private boolean refreshTime = false; + private boolean sampleRate = false; + private boolean dataSet = false; + private boolean security = false; + private boolean sampleSynchronized = false; + + public SmvOpts(Node smvOptsNode) throws SclParserException { + + Boolean refreshTime = ParserUtils.parseBooleanAttribute(smvOptsNode, "refreshTime"); + if (refreshTime != null) + this.refreshTime = refreshTime; + + Boolean sampleRate = ParserUtils.parseBooleanAttribute(smvOptsNode, "sampleRate"); + if (sampleRate != null) + this.sampleRate = sampleRate; + + Boolean dataSet = ParserUtils.parseBooleanAttribute(smvOptsNode, "dataSet"); + if (dataSet != null) + this.dataSet = dataSet; + + Boolean security = ParserUtils.parseBooleanAttribute(smvOptsNode, "security"); + if (security != null) + this.security = security; + + Boolean sampleSynchronized = ParserUtils.parseBooleanAttribute(smvOptsNode, "sampleSynchronized"); + if (sampleSynchronized != null) + this.sampleSynchronized = sampleSynchronized; + + } + +} diff --git a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java index ac47251c..1297c623 100644 --- a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java @@ -35,7 +35,7 @@ import com.libiec61850.scl.DataAttributeDefinition; import com.libiec61850.scl.SclParser; import com.libiec61850.scl.SclParserException; import com.libiec61850.scl.communication.ConnectedAP; -import com.libiec61850.scl.communication.GSEAddress; +import com.libiec61850.scl.communication.PhyComAddress; import com.libiec61850.scl.model.AccessPoint; import com.libiec61850.scl.model.DataAttribute; import com.libiec61850.scl.model.DataModelValue; @@ -145,7 +145,7 @@ public class DynamicModelGenerator { for (GSEControl gcb : logicalNode.getGSEControlBlocks()) { LogicalDevice ld = logicalNode.getParentLogicalDevice(); - GSEAddress gseAddress = null; + PhyComAddress gseAddress = null; if (connectedAP != null) gseAddress = connectedAP.lookupGSEAddress(ld.getInst(), gcb.getName()); diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index b1ed816e..a7e3ff42 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -37,7 +37,7 @@ import com.libiec61850.scl.SclParserException; import com.libiec61850.scl.communication.Communication; import com.libiec61850.scl.communication.ConnectedAP; import com.libiec61850.scl.communication.GSE; -import com.libiec61850.scl.communication.GSEAddress; +import com.libiec61850.scl.communication.PhyComAddress; import com.libiec61850.scl.communication.SubNetwork; import com.libiec61850.scl.model.AccessPoint; import com.libiec61850.scl.model.DataAttribute; @@ -753,7 +753,7 @@ public class StaticModelGenerator { for (GSEControl gseControlBlock : gseControlBlocks) { - GSEAddress gseAddress = connectedAP.lookupGSEAddress(logicalDeviceName, gseControlBlock.getName()); + PhyComAddress gseAddress = connectedAP.lookupGSEAddress(logicalDeviceName, gseControlBlock.getName()); String gseString = ""; From 0193902da1a707ab6994ecc3bcb717bd68c9c5c5 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 10 Nov 2015 17:41:45 +0100 Subject: [PATCH 03/33] - M/U SVCB implementation WIP - added example project for IEC 61850-9-2 LE --- .../iec61850_9_2_LE_example/CMakeLists.txt | 21 + examples/iec61850_9_2_LE_example/Makefile | 24 + .../iec61850_9_2_LE_example/server_example2.c | 86 ++ .../iec61850_9_2_LE_example/static_model.c | 1009 +++++++++++++++++ .../iec61850_9_2_LE_example/static_model.h | 161 +++ examples/iec61850_9_2_LE_example/sv.icd | 148 +++ examples/mms_utility/mms_utility.c | 48 +- src/iec61850/inc/iec61850_model.h | 2 +- src/iec61850/inc_private/mms_sv.h | 12 + src/iec61850/server/impl/ied_server.c | 11 +- src/iec61850/server/mms_mapping/mms_mapping.c | 46 +- src/iec61850/server/mms_mapping/mms_sv.c | 122 +- src/mms/inc/mms_client_connection.h | 3 +- tools/model_generator/genconfig.jar | Bin 75506 -> 78699 bytes tools/model_generator/genmodel.jar | Bin 75518 -> 79544 bytes .../scl/communication/ConnectedAP.java | 10 +- .../libiec61850/scl/model/LogicalNode.java | 5 +- .../scl/model/SampledValueControl.java | 7 +- .../com/libiec61850/scl/model/SmvOpts.java | 23 +- .../tools/StaticModelGenerator.java | 135 ++- 20 files changed, 1845 insertions(+), 28 deletions(-) create mode 100644 examples/iec61850_9_2_LE_example/CMakeLists.txt create mode 100644 examples/iec61850_9_2_LE_example/Makefile create mode 100644 examples/iec61850_9_2_LE_example/server_example2.c create mode 100644 examples/iec61850_9_2_LE_example/static_model.c create mode 100644 examples/iec61850_9_2_LE_example/static_model.h create mode 100644 examples/iec61850_9_2_LE_example/sv.icd diff --git a/examples/iec61850_9_2_LE_example/CMakeLists.txt b/examples/iec61850_9_2_LE_example/CMakeLists.txt new file mode 100644 index 00000000..994caae3 --- /dev/null +++ b/examples/iec61850_9_2_LE_example/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + . +) + +set(server_example2_SRCS + server_example2.c + static_model.c +) + +IF(WIN32) +set_source_files_properties(${server_example2_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(server_example2 + ${server_example2_SRCS} +) + +target_link_libraries(server_example2 + iec61850 +) diff --git a/examples/iec61850_9_2_LE_example/Makefile b/examples/iec61850_9_2_LE_example/Makefile new file mode 100644 index 00000000..3781758b --- /dev/null +++ b/examples/iec61850_9_2_LE_example/Makefile @@ -0,0 +1,24 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = server_example2 +PROJECT_SOURCES = server_example2.c +PROJECT_SOURCES += static_model.c + +PROJECT_ICD_FILE = complexModel.icd + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +model: $(PROJECT_ICD_FILE) + java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDFLAGS) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) + diff --git a/examples/iec61850_9_2_LE_example/server_example2.c b/examples/iec61850_9_2_LE_example/server_example2.c new file mode 100644 index 00000000..662cf501 --- /dev/null +++ b/examples/iec61850_9_2_LE_example/server_example2.c @@ -0,0 +1,86 @@ +/* + * server_example2.c + * + * Copyright 2013 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#include "iec61850_server.h" +#include "hal_thread.h" +#include +#include +#include + + +/* Include the generated header with the model access handles */ +#include "static_model.h" + +/* import IEC 61850 device model created from SCL-File */ +extern IedModel iedModel; + +static int running = 0; + +void sigint_handler(int signalId) +{ + running = 0; +} + +int +main(int argc, char** argv) +{ + IedServer iedServer = IedServer_create(&iedModel); + + // TODO get stored values from persistent storage + + // TODO set initial measurement and status values from process + + /* MMS server will be instructed to start listening to client connections. */ + IedServer_start(iedServer, 102); + + if (!IedServer_isRunning(iedServer)) { + printf("Starting server failed! Exit.\n"); + IedServer_destroy(iedServer); + exit(-1); + } + + running = 1; + + signal(SIGINT, sigint_handler); + + float power = 500.f; + + while (running) { + + uint64_t timeval = Hal_getTimeInMs(); + + IedServer_unlockDataModel(iedServer); + + power += 0.1f; + + Thread_sleep(500); + } + + /* stop MMS server - close TCP server socket and all client sockets */ + IedServer_stop(iedServer); + + /* Cleanup - free all resources */ + IedServer_destroy(iedServer); + + return 0; +} /* main() */ diff --git a/examples/iec61850_9_2_LE_example/static_model.c b/examples/iec61850_9_2_LE_example/static_model.c new file mode 100644 index 00000000..ecc29bfb --- /dev/null +++ b/examples/iec61850_9_2_LE_example/static_model.c @@ -0,0 +1,1009 @@ +/* + * static_model.c + * + * automatically generated from sv.icd + */ +#include "static_model.h" + +static void initializeValues(); + +extern DataSet iedModelds_MUnn_LLN0_PhsMeas1; + + +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda0; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda1; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda2; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda3; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda4; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda5; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda6; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda7; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda0 = { + "1", + false, + "TCTR$MX$Amp", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda1 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda1 = { + "2", + false, + "TCTR$MX$Amp", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda2 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda2 = { + "3", + false, + "TCTR$MX$Amp", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda3 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda3 = { + "4", + false, + "TCTR$MX$Amp", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda4 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda4 = { + "1", + false, + "TVTR$MX$Vol", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda5 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda5 = { + "2", + false, + "TVTR$MX$Vol", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda6 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda6 = { + "3", + false, + "TVTR$MX$Vol", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda7 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda7 = { + "4", + false, + "TVTR$MX$Vol", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_MUnn_LLN0_PhsMeas1 = { + "MUnn", + "LLN0$PhsMeas1", + 8, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda0, + NULL +}; + +LogicalDevice iedModel_MUnn = { + LogicalDeviceModelType, + "MUnn", + (ModelNode*) &iedModel, + NULL, + (ModelNode*) &iedModel_MUnn_LLN0 +}; + +LogicalNode iedModel_MUnn_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TCTR1, + (ModelNode*) &iedModel_MUnn_LLN0_Mod, +}; + +DataObject iedModel_MUnn_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_MUnn_LLN0, + NULL, + (ModelNode*) &iedModel_MUnn_LLN0_Mod_ctlVal, + 0 +}; + +DataAttribute iedModel_MUnn_LLN0_Mod_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_MUnn_LLN0_Mod, + (ModelNode*) &iedModel_MUnn_LLN0_Mod_stVal, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_LLN0_Mod_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_MUnn_LLN0_Mod, + (ModelNode*) &iedModel_MUnn_LLN0_Mod_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_MUnn_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_LLN0_Mod, + (ModelNode*) &iedModel_MUnn_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_MUnn_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_MUnn_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TCTR1 = { + LogicalNodeModelType, + "TCTR1", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TCTR2, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp, +}; + +DataObject iedModel_MUnn_TCTR1_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_MUnn_TCTR1, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_q, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TCTR2 = { + LogicalNodeModelType, + "TCTR2", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TCTR3, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp, +}; + +DataObject iedModel_MUnn_TCTR2_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_MUnn_TCTR2, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_q, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TCTR3 = { + LogicalNodeModelType, + "TCTR3", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TCTR4, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp, +}; + +DataObject iedModel_MUnn_TCTR3_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_MUnn_TCTR3, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_q, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TCTR4 = { + LogicalNodeModelType, + "TCTR4", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TVTR1, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp, +}; + +DataObject iedModel_MUnn_TCTR4_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_MUnn_TCTR4, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_q, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TVTR1 = { + LogicalNodeModelType, + "TVTR1", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TVTR2, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol, +}; + +DataObject iedModel_MUnn_TVTR1_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_MUnn_TVTR1, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_q, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TVTR2 = { + LogicalNodeModelType, + "TVTR2", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TVTR3, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol, +}; + +DataObject iedModel_MUnn_TVTR2_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_MUnn_TVTR2, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_q, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TVTR3 = { + LogicalNodeModelType, + "TVTR3", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TVTR4, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol, +}; + +DataObject iedModel_MUnn_TVTR3_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_MUnn_TVTR3, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_q, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TVTR4 = { + LogicalNodeModelType, + "TVTR4", + (ModelNode*) &iedModel_MUnn, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol, +}; + +DataObject iedModel_MUnn_TVTR4_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_MUnn_TVTR4, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_q, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + + + +extern SVControlBlock iedModel_MUnn_LLN0_smv0; + +static PhyComAddress iedModel_MUnn_LLN0_smv0_address = { + 4, + 1, + 4097, + {0x1, 0xc, 0xcd, 0x4, 0x0, 0x1} +}; + +SVControlBlock iedModel_MUnn_LLN0_smv0 = {&iedModel_MUnn_LLN0, "MSVCB01", "xxxxMUnn01", "PhsMeas1", 2, 0, 80, 1, &iedModel_MUnn_LLN0_smv0_address, true, 1, NULL}; + + + + +IedModel iedModel = { + "TEMPLATE", + &iedModel_MUnn, + &iedModelds_MUnn_LLN0_PhsMeas1, + NULL, + NULL, + &iedModel_MUnn_LLN0_smv0, + NULL, + initializeValues +}; + +static void +initializeValues() +{ + +iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.001); + +iedModel_MUnn_TCTR1_Amp_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.001); + +iedModel_MUnn_TCTR2_Amp_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.001); + +iedModel_MUnn_TCTR3_Amp_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.001); + +iedModel_MUnn_TCTR4_Amp_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.01); + +iedModel_MUnn_TVTR1_Vol_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.01); + +iedModel_MUnn_TVTR2_Vol_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.01); + +iedModel_MUnn_TVTR3_Vol_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.01); + +iedModel_MUnn_TVTR4_Vol_sVC_offset.mmsValue = MmsValue_newFloat(0.0); +} diff --git a/examples/iec61850_9_2_LE_example/static_model.h b/examples/iec61850_9_2_LE_example/static_model.h new file mode 100644 index 00000000..f45de247 --- /dev/null +++ b/examples/iec61850_9_2_LE_example/static_model.h @@ -0,0 +1,161 @@ +/* + * static_model.h + * + * automatically generated from sv.icd + */ + +#ifndef STATIC_MODEL_H_ +#define STATIC_MODEL_H_ + +#include +#include "iec61850_model.h" + +extern IedModel iedModel; +extern LogicalDevice iedModel_MUnn; +extern LogicalNode iedModel_MUnn_LLN0; +extern DataObject iedModel_MUnn_LLN0_Mod; +extern DataAttribute iedModel_MUnn_LLN0_Mod_ctlVal; +extern DataAttribute iedModel_MUnn_LLN0_Mod_stVal; +extern DataAttribute iedModel_MUnn_LLN0_Mod_q; +extern DataAttribute iedModel_MUnn_LLN0_Mod_t; +extern LogicalNode iedModel_MUnn_TCTR1; +extern DataObject iedModel_MUnn_TCTR1_Amp; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_instMag; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_instMag_i; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_q; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_sVC; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_sVC_offset; +extern LogicalNode iedModel_MUnn_TCTR2; +extern DataObject iedModel_MUnn_TCTR2_Amp; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_instMag; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_instMag_i; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_q; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_sVC; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_sVC_offset; +extern LogicalNode iedModel_MUnn_TCTR3; +extern DataObject iedModel_MUnn_TCTR3_Amp; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_instMag; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_instMag_i; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_q; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_sVC; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_sVC_offset; +extern LogicalNode iedModel_MUnn_TCTR4; +extern DataObject iedModel_MUnn_TCTR4_Amp; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_instMag; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_instMag_i; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_q; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_sVC; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_sVC_offset; +extern LogicalNode iedModel_MUnn_TVTR1; +extern DataObject iedModel_MUnn_TVTR1_Vol; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_instMag; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_instMag_i; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_q; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_sVC; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_sVC_offset; +extern LogicalNode iedModel_MUnn_TVTR2; +extern DataObject iedModel_MUnn_TVTR2_Vol; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_instMag; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_instMag_i; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_q; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_sVC; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_sVC_offset; +extern LogicalNode iedModel_MUnn_TVTR3; +extern DataObject iedModel_MUnn_TVTR3_Vol; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_instMag; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_instMag_i; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_q; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_sVC; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_sVC_offset; +extern LogicalNode iedModel_MUnn_TVTR4; +extern DataObject iedModel_MUnn_TVTR4_Vol; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_instMag; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_instMag_i; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_q; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_sVC; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_sVC_offset; + + + +#define IEDMODEL_MUnn (&iedModel_MUnn) +#define IEDMODEL_MUnn_LLN0 (&iedModel_MUnn_LLN0) +#define IEDMODEL_MUnn_LLN0_Mod (&iedModel_MUnn_LLN0_Mod) +#define IEDMODEL_MUnn_LLN0_Mod_ctlVal (&iedModel_MUnn_LLN0_Mod_ctlVal) +#define IEDMODEL_MUnn_LLN0_Mod_stVal (&iedModel_MUnn_LLN0_Mod_stVal) +#define IEDMODEL_MUnn_LLN0_Mod_q (&iedModel_MUnn_LLN0_Mod_q) +#define IEDMODEL_MUnn_LLN0_Mod_t (&iedModel_MUnn_LLN0_Mod_t) +#define IEDMODEL_MUnn_TCTR1 (&iedModel_MUnn_TCTR1) +#define IEDMODEL_MUnn_TCTR1_Amp (&iedModel_MUnn_TCTR1_Amp) +#define IEDMODEL_MUnn_TCTR1_Amp_instMag (&iedModel_MUnn_TCTR1_Amp_instMag) +#define IEDMODEL_MUnn_TCTR1_Amp_instMag_i (&iedModel_MUnn_TCTR1_Amp_instMag_i) +#define IEDMODEL_MUnn_TCTR1_Amp_q (&iedModel_MUnn_TCTR1_Amp_q) +#define IEDMODEL_MUnn_TCTR1_Amp_sVC (&iedModel_MUnn_TCTR1_Amp_sVC) +#define IEDMODEL_MUnn_TCTR1_Amp_sVC_scaleFactor (&iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor) +#define IEDMODEL_MUnn_TCTR1_Amp_sVC_offset (&iedModel_MUnn_TCTR1_Amp_sVC_offset) +#define IEDMODEL_MUnn_TCTR2 (&iedModel_MUnn_TCTR2) +#define IEDMODEL_MUnn_TCTR2_Amp (&iedModel_MUnn_TCTR2_Amp) +#define IEDMODEL_MUnn_TCTR2_Amp_instMag (&iedModel_MUnn_TCTR2_Amp_instMag) +#define IEDMODEL_MUnn_TCTR2_Amp_instMag_i (&iedModel_MUnn_TCTR2_Amp_instMag_i) +#define IEDMODEL_MUnn_TCTR2_Amp_q (&iedModel_MUnn_TCTR2_Amp_q) +#define IEDMODEL_MUnn_TCTR2_Amp_sVC (&iedModel_MUnn_TCTR2_Amp_sVC) +#define IEDMODEL_MUnn_TCTR2_Amp_sVC_scaleFactor (&iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor) +#define IEDMODEL_MUnn_TCTR2_Amp_sVC_offset (&iedModel_MUnn_TCTR2_Amp_sVC_offset) +#define IEDMODEL_MUnn_TCTR3 (&iedModel_MUnn_TCTR3) +#define IEDMODEL_MUnn_TCTR3_Amp (&iedModel_MUnn_TCTR3_Amp) +#define IEDMODEL_MUnn_TCTR3_Amp_instMag (&iedModel_MUnn_TCTR3_Amp_instMag) +#define IEDMODEL_MUnn_TCTR3_Amp_instMag_i (&iedModel_MUnn_TCTR3_Amp_instMag_i) +#define IEDMODEL_MUnn_TCTR3_Amp_q (&iedModel_MUnn_TCTR3_Amp_q) +#define IEDMODEL_MUnn_TCTR3_Amp_sVC (&iedModel_MUnn_TCTR3_Amp_sVC) +#define IEDMODEL_MUnn_TCTR3_Amp_sVC_scaleFactor (&iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor) +#define IEDMODEL_MUnn_TCTR3_Amp_sVC_offset (&iedModel_MUnn_TCTR3_Amp_sVC_offset) +#define IEDMODEL_MUnn_TCTR4 (&iedModel_MUnn_TCTR4) +#define IEDMODEL_MUnn_TCTR4_Amp (&iedModel_MUnn_TCTR4_Amp) +#define IEDMODEL_MUnn_TCTR4_Amp_instMag (&iedModel_MUnn_TCTR4_Amp_instMag) +#define IEDMODEL_MUnn_TCTR4_Amp_instMag_i (&iedModel_MUnn_TCTR4_Amp_instMag_i) +#define IEDMODEL_MUnn_TCTR4_Amp_q (&iedModel_MUnn_TCTR4_Amp_q) +#define IEDMODEL_MUnn_TCTR4_Amp_sVC (&iedModel_MUnn_TCTR4_Amp_sVC) +#define IEDMODEL_MUnn_TCTR4_Amp_sVC_scaleFactor (&iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor) +#define IEDMODEL_MUnn_TCTR4_Amp_sVC_offset (&iedModel_MUnn_TCTR4_Amp_sVC_offset) +#define IEDMODEL_MUnn_TVTR1 (&iedModel_MUnn_TVTR1) +#define IEDMODEL_MUnn_TVTR1_Vol (&iedModel_MUnn_TVTR1_Vol) +#define IEDMODEL_MUnn_TVTR1_Vol_instMag (&iedModel_MUnn_TVTR1_Vol_instMag) +#define IEDMODEL_MUnn_TVTR1_Vol_instMag_i (&iedModel_MUnn_TVTR1_Vol_instMag_i) +#define IEDMODEL_MUnn_TVTR1_Vol_q (&iedModel_MUnn_TVTR1_Vol_q) +#define IEDMODEL_MUnn_TVTR1_Vol_sVC (&iedModel_MUnn_TVTR1_Vol_sVC) +#define IEDMODEL_MUnn_TVTR1_Vol_sVC_scaleFactor (&iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor) +#define IEDMODEL_MUnn_TVTR1_Vol_sVC_offset (&iedModel_MUnn_TVTR1_Vol_sVC_offset) +#define IEDMODEL_MUnn_TVTR2 (&iedModel_MUnn_TVTR2) +#define IEDMODEL_MUnn_TVTR2_Vol (&iedModel_MUnn_TVTR2_Vol) +#define IEDMODEL_MUnn_TVTR2_Vol_instMag (&iedModel_MUnn_TVTR2_Vol_instMag) +#define IEDMODEL_MUnn_TVTR2_Vol_instMag_i (&iedModel_MUnn_TVTR2_Vol_instMag_i) +#define IEDMODEL_MUnn_TVTR2_Vol_q (&iedModel_MUnn_TVTR2_Vol_q) +#define IEDMODEL_MUnn_TVTR2_Vol_sVC (&iedModel_MUnn_TVTR2_Vol_sVC) +#define IEDMODEL_MUnn_TVTR2_Vol_sVC_scaleFactor (&iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor) +#define IEDMODEL_MUnn_TVTR2_Vol_sVC_offset (&iedModel_MUnn_TVTR2_Vol_sVC_offset) +#define IEDMODEL_MUnn_TVTR3 (&iedModel_MUnn_TVTR3) +#define IEDMODEL_MUnn_TVTR3_Vol (&iedModel_MUnn_TVTR3_Vol) +#define IEDMODEL_MUnn_TVTR3_Vol_instMag (&iedModel_MUnn_TVTR3_Vol_instMag) +#define IEDMODEL_MUnn_TVTR3_Vol_instMag_i (&iedModel_MUnn_TVTR3_Vol_instMag_i) +#define IEDMODEL_MUnn_TVTR3_Vol_q (&iedModel_MUnn_TVTR3_Vol_q) +#define IEDMODEL_MUnn_TVTR3_Vol_sVC (&iedModel_MUnn_TVTR3_Vol_sVC) +#define IEDMODEL_MUnn_TVTR3_Vol_sVC_scaleFactor (&iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor) +#define IEDMODEL_MUnn_TVTR3_Vol_sVC_offset (&iedModel_MUnn_TVTR3_Vol_sVC_offset) +#define IEDMODEL_MUnn_TVTR4 (&iedModel_MUnn_TVTR4) +#define IEDMODEL_MUnn_TVTR4_Vol (&iedModel_MUnn_TVTR4_Vol) +#define IEDMODEL_MUnn_TVTR4_Vol_instMag (&iedModel_MUnn_TVTR4_Vol_instMag) +#define IEDMODEL_MUnn_TVTR4_Vol_instMag_i (&iedModel_MUnn_TVTR4_Vol_instMag_i) +#define IEDMODEL_MUnn_TVTR4_Vol_q (&iedModel_MUnn_TVTR4_Vol_q) +#define IEDMODEL_MUnn_TVTR4_Vol_sVC (&iedModel_MUnn_TVTR4_Vol_sVC) +#define IEDMODEL_MUnn_TVTR4_Vol_sVC_scaleFactor (&iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor) +#define IEDMODEL_MUnn_TVTR4_Vol_sVC_offset (&iedModel_MUnn_TVTR4_Vol_sVC_offset) + +#endif /* STATIC_MODEL_H_ */ + diff --git a/examples/iec61850_9_2_LE_example/sv.icd b/examples/iec61850_9_2_LE_example/sv.icd new file mode 100644 index 00000000..78ade53b --- /dev/null +++ b/examples/iec61850_9_2_LE_example/sv.icd @@ -0,0 +1,148 @@ + + + +
+ + + Station bus + 10 + +
+

10.0.0.2

+

255.255.255.0

+

10.0.0.1

+

0001

+

00000001

+

0001

+
+ + +
+

1

+

4

+

01-0c-cd-04-00-01

+

1001

+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.001 + + +0 + + + + +0.01 + + +0 + + + + + diff --git a/examples/mms_utility/mms_utility.c b/examples/mms_utility/mms_utility.c index b59d3337..51976a6f 100644 --- a/examples/mms_utility/mms_utility.c +++ b/examples/mms_utility/mms_utility.c @@ -15,6 +15,8 @@ print_help() printf("-d show list of MMS domains\n"); printf("-i show server identity\n"); printf("-t show domain directory\n"); + printf("-r read domain variable\n"); + printf("-a specify domain for read or write command"); } int main(int argc, char** argv) { @@ -24,14 +26,18 @@ int main(int argc, char** argv) { int maxPduSize = 65000; char* domainName = NULL; + char* variableName = NULL; int readDeviceList = 0; int getDeviceDirectory = 0; int identifyDevice = 0; + int readWriteHasDomain = 0; + int readVariable = 0; + int c; - while ((c = getopt(argc, argv, "idh:p:l:t:")) != -1) + while ((c = getopt(argc, argv, "idh:p:l:t:a:r:")) != -1) switch (c) { case 'h': hostname = copyString(optarg); @@ -52,6 +58,15 @@ int main(int argc, char** argv) { getDeviceDirectory = 1; domainName = copyString(optarg); break; + case 'a': + readWriteHasDomain = 1; + domainName = copyString(optarg); + break; + case 'r': + readVariable = 1; + variableName = copyString(optarg); + break; + default: print_help(); return 0; @@ -103,12 +118,39 @@ int main(int argc, char** argv) { while ((element = LinkedList_getNext(element)) != NULL) { char* name = (char*) element->data; - if (strchr(name, '$') == NULL) - printf(" %s\n", name); + printf(" %s\n", name); } } + if (readVariable) { + if (readWriteHasDomain) { + MmsValue* result = MmsConnection_readVariable(con, &error, domainName, variableName); + + if (error != MMS_ERROR_NONE) { + printf("Reading variable failed: (ERROR %i)\n", error); + } + else { + printf("Read SUCCESS\n"); + + + if (result != NULL) { + char outbuf[1024]; + + MmsValue_printToBuffer(result, outbuf, 1024); + + printf("%s\n", outbuf); + } + else + printf("result: NULL\n"); + } + + } + else + printf("Reading VMD scope variable not yet supported!\n"); + } + + exit: MmsConnection_destroy(con); } diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index 258c9b10..376593b0 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -1,7 +1,7 @@ /* * model.h * - * Copyright 2013, 2014 Michael Zillgith + * Copyright 2013, 2014, 2015 Michael Zillgith * * This file is part of libIEC61850. * diff --git a/src/iec61850/inc_private/mms_sv.h b/src/iec61850/inc_private/mms_sv.h index 4af77fe5..6f59a374 100644 --- a/src/iec61850/inc_private/mms_sv.h +++ b/src/iec61850/inc_private/mms_sv.h @@ -24,8 +24,20 @@ #ifndef LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ #define LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ + +typedef struct sMmsSampledValueControlBlock* MmsSampledValueControlBlock; + +MmsSampledValueControlBlock +MmsSampledValueControlBlock_create(void); + +void +MmsSampledValueControlBlock_destroy(MmsSampledValueControlBlock self); + MmsVariableSpecification* LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, LogicalNode* logicalNode, int svCount, bool unicast); +MmsValue* +LIBIEC61850_SV_readAccessSampledValueControlBlock(MmsMapping* self, MmsDomain* domain, char* variableIdOrig); + #endif /* LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ */ diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index 7652650a..83a3a9ef 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -188,7 +188,16 @@ createMmsServerCache(IedServer self) #endif /* (CONFIG_IEC61850_CONTROL_SERVICE == 1) */ if ((strcmp(fcName, "BR") != 0) && (strcmp(fcName, "RP") != 0) - && (strcmp(fcName, "GO") != 0)) + +#if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) + && (strcmp(fcName, "GO") != 0) +#endif + +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + && (strcmp(fcName, "MS") != 0) && (strcmp(fcName, "US") != 0) +#endif + + ) { char* variableName = createString(3, lnName, "$", fcName); diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 0a488866..7e873698 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1,7 +1,7 @@ /* * mms_mapping.c * - * Copyright 2013, 2014 Michael Zillgith + * Copyright 2013, 2014, 2015 Michael Zillgith * * This file is part of libIEC61850. * @@ -28,6 +28,7 @@ #include "stack_config.h" #include "mms_goose.h" +#include "mms_sv.h" #include "reporting.h" #include "control.h" #include "ied_server_private.h" @@ -1008,14 +1009,14 @@ createNamedVariableFromLogicalNode(MmsMapping* self, MmsDomain* domain, /* Add MS and US named variables */ if (msvcbCount > 0) { namedVariable->typeSpec.structure.elements[currentComponent] = - LIBIEC61850_SV_creatSVControlBlocks(self, domain, logicalNode, msvcbCount, false); + LIBIEC61850_SV_createSVControlBlocks(self, domain, logicalNode, msvcbCount, false); currentComponent++; } if (usvcbCount > 0) { namedVariable->typeSpec.structure.elements[currentComponent] = - LIBIEC61850_SV_creatSVControlBlocks(self, domain, logicalNode, msvcbCount, true); + LIBIEC61850_SV_createSVControlBlocks(self, domain, logicalNode, msvcbCount, true); currentComponent++; } @@ -1243,7 +1244,7 @@ MmsMapping_destroy(MmsMapping* self) #endif #if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) - LinkedList_destroyDeep(self->svControls, (LinkedListValueDeleteFunction) MmsSvControlBlock_destroy); + LinkedList_destroyDeep(self->svControls, (LinkedListValueDeleteFunction) MmsSampledValueControlBlock_destroy); #endif #if (CONFIG_IEC61850_CONTROL_SERVICE == 1) @@ -1353,6 +1354,23 @@ isGooseControlBlock(char* separator) #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ + +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + +static bool +isSampledValueControlBlock(char* separator) +{ + if (strncmp(separator + 1, "MS", 2) == 0) + return true; + + if (strncmp(separator + 1, "US", 2) == 0) + return true; + + return false; +} + +#endif /* (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) */ + char* MmsMapping_getNextNameElement(char* name) { @@ -1679,6 +1697,14 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, } #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + /* Sampled Value control block - MS/US */ + if (isSampledValueControlBlock(separator)) { + //TODO handle write access to SVCB + } +#endif /* (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) */ + + #if (CONFIG_IEC61850_REPORT_SERVICE == 1) /* Report control blocks - BR, RP */ if (isReportControlBlock(separator)) { @@ -2075,6 +2101,7 @@ readAccessGooseControlBlock(MmsMapping* self, MmsDomain* domain, char* variableI #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ + static MmsValue* mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerConnection connection) { @@ -2100,14 +2127,23 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo } #endif - /* GOOSE control blocks - GO */ + #if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) + /* GOOSE control blocks - GO */ if (isGooseControlBlock(separator)) { retValue = readAccessGooseControlBlock(self, domain, variableId); goto exit_function; } #endif +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + /* Sampled Value control blocks - MS/US */ + if (isSampledValueControlBlock(separator)) { + retValue = LIBIEC61850_SV_readAccessSampledValueControlBlock(self, domain, variableId); + goto exit_function; + } +#endif + #if (CONFIG_IEC61850_REPORT_SERVICE == 1) /* Report control blocks - BR, RP */ if (isReportControlBlock(separator)) { diff --git a/src/iec61850/server/mms_mapping/mms_sv.c b/src/iec61850/server/mms_mapping/mms_sv.c index 56e8674b..c4f1c1ce 100644 --- a/src/iec61850/server/mms_mapping/mms_sv.c +++ b/src/iec61850/server/mms_mapping/mms_sv.c @@ -30,10 +30,109 @@ #include "linked_list.h" #include "array_list.h" +#include "mms_sv.h" + #include "mms_mapping_internal.h" +struct sMmsSampledValueControlBlock { + char* name; + bool svEna; + + char* dstAddress; + + MmsDomain* domain; + LogicalNode* logicalNode; + + MmsVariableSpecification* mmsType; + MmsValue* mmsValue; + + //MmsMapping* mmsMapping; +}; + +MmsSampledValueControlBlock +MmsSampledValueControlBlock_create() +{ + MmsSampledValueControlBlock self = (MmsSampledValueControlBlock) GLOBAL_CALLOC(1, sizeof(struct sMmsSampledValueControlBlock)); + + return self; +} + + +void +MmsSampledValueControlBlock_destroy(MmsSampledValueControlBlock self) +{ + MmsValue_delete(self->mmsValue); + + GLOBAL_FREEMEM(self); +} + +static MmsSampledValueControlBlock +lookupSVCB(MmsMapping* self, MmsDomain* domain, char* lnName, char* objectName) +{ + LinkedList element = LinkedList_getNext(self->svControls); + + while (element != NULL) { + MmsSampledValueControlBlock mmsSVCB = (MmsSampledValueControlBlock) element->data; + + if (mmsSVCB->domain == domain) { + if (strcmp(mmsSVCB->logicalNode->name, lnName) == 0) { + if (strcmp(mmsSVCB->name, objectName) == 0) { + return mmsSVCB; + } + } + } + + element = LinkedList_getNext(element); + } + + return NULL; +} + + +MmsValue* +LIBIEC61850_SV_readAccessSampledValueControlBlock(MmsMapping* self, MmsDomain* domain, char* variableIdOrig) +{ + MmsValue* value = NULL; + + char variableId[130]; + + strncpy(variableId, variableIdOrig, 129); + + char* separator = strchr(variableId, '$'); + + *separator = 0; + + char* lnName = variableId; + + if (lnName == NULL) + return NULL; + + char* objectName = MmsMapping_getNextNameElement(separator + 1); -static GSEControlBlock* + if (objectName == NULL) + return NULL; + + char* varName = MmsMapping_getNextNameElement(objectName); + + if (varName != NULL) + *(varName - 1) = 0; + + MmsSampledValueControlBlock mmsSVCB = lookupSVCB(self, domain, lnName, objectName); + + if (mmsSVCB != NULL) { + if (varName != NULL) { + value = MmsValue_getSubElement(mmsSVCB->mmsValue, mmsSVCB->mmsType, varName); + } + else { + value = mmsSVCB->mmsValue; + } + } + + return value; +} + + +static SVControlBlock* getSVCBForLogicalNodeWithIndex(MmsMapping* self, LogicalNode* logicalNode, int index, bool isUnicast) { int svCount = 0; @@ -88,6 +187,8 @@ createSVControlBlockMmsStructure(char* gcbName, bool isUnicast) namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("Resv"); namedVariable->type = MMS_BOOLEAN; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; } namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); @@ -128,6 +229,13 @@ createSVControlBlockMmsStructure(char* gcbName, bool isUnicast) gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("SmpMod"); + namedVariable->type = MMS_INTEGER; + namedVariable->typeSpec.integer = 8; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("DstAddress"); MmsMapping_createPhyComAddrStructure(namedVariable); @@ -205,7 +313,7 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, /* SmpMod */ MmsValue* smpMod = MmsValue_getElement(svValues, currentIndex++); - MmsValue_setInt32(smpRate, svControlBlock->smpMod); + MmsValue_setInt32(smpMod, svControlBlock->smpMod); /* Set communication parameters - DstAddress */ uint8_t priority = CONFIG_GOOSE_DEFAULT_PRIORITY; @@ -242,6 +350,16 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, MmsValue* noASDU = MmsValue_getElement(svValues, currentIndex++); MmsValue_setInt32(noASDU, svControlBlock->noASDU); + MmsSampledValueControlBlock mmsSvCb = MmsSampledValueControlBlock_create(); + + mmsSvCb->mmsValue = svValues; + mmsSvCb->mmsType = svTypeSpec; + mmsSvCb->domain = domain; + mmsSvCb->logicalNode = logicalNode; + mmsSvCb->name = svControlBlock->name; + + LinkedList_add(self->svControls, (void*) mmsSvCb); + currentSVCB++; } diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index d87667e2..621bbb51 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -292,7 +292,8 @@ MmsConnection_getVariableListNamesAssociationSpecific(MmsConnection self, MmsErr * \param itemId name of the variable to be read * * \return Returns a MmsValue object or NULL if the request failed. The MmsValue object can - * either be a simple value or a complex value or array. + * either be a simple value or a complex value or array. It is also possible that the return value is NULL + * even if mmsError = MMS_ERROR_NON. This is the case when the servers returns an empty result list. */ MmsValue* MmsConnection_readVariable(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId); diff --git a/tools/model_generator/genconfig.jar b/tools/model_generator/genconfig.jar index 3a36f546cb36137d86762913311c85d342a55ab9..9e3e43d5ede294468f6e815bf79c9a53658a62d3 100644 GIT binary patch delta 30589 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 Q(0{|wsR|~AE@GJf1F)$uuK)l5 delta 27390 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�i`NNFMSGLv^eU- zJrVtgz&A~b-RG@%Yw>tC&it^IaqpyJZ{Mx#xIIEHx;$|7N9xuI6;`izY6=*i_S5_M z8<<8k8L#?=rRP7*kmq46G#**^@oo-oFFRW04H7Q6m`ZUs3mfLIVg>t zIUK{oGn>BT?N9eheuSTxs(v2f>1{@~*O6d;F(q>%R~`xr4MX=BBYe8bdIN*&-(}-# zwxU@bX;9-RKh51=mX8y-BD;4EvW33j;`6U-2&=+l)0^4~JKSw~ifwZ-KGg+DG(feE z*cqLZb|)uc)SZwK$<&Ok$|lsy_5euhK-`aXijK*DNa#tDdMqVD^a4%wKoW|d@ApuD zIO5>U1N~uD?_X#=ZtUqV^#TzQhkEcW1t{SB?q>a+JvgWy8)Kqq9auW&NS;!8#SLca z2vjP^HYaivA;FJx`XA}zRh8cii$G*Qt&z0<9BC#Rndk^V$>`!_c1F<{Es8CR-Pr6} zyo~qS4o0$2-P3)mwRI&~{p6V|{Pd-MzoX@v;{Hq=VmC(el()zOV{K^WU>*9Gg}h}S z>1(JoR^VTCL)?uHjV+Aw9mBRr<0)eV&nt>rcrABEh9x{o!WFDV1dD_10)a}sp>~dm zTLvPv>+SqSRv3AAsCEsjjg~8Fga&4YiJ-ccG85gXE(GzyVv1L0xF~s;E%cYW`gbb+ zk}CflA7IPYj4F)-4^hf2KYRRHx;sY5Mdli7v2SFtkW#Ya`d}S@{d>o0?!U5p>6&tN zp=atwVQRYKACNR82PYGpFd$nboqJvVT*=oeZ&qKRg$fK+oqzIi$rD^wvp7Y=aw!g{ z`rKw#zkgATu}}2TFx-vUdVmmD(1G1Kct{}7pHyD^^4Ir<{_03O7nzIJDcs@5)3Z^l zm~&uDhDR^-21A#$4?GxBJPe=}qAlN!K5(5oXXzkjVcs@e|L3()9GGHW(%ZUSF2|;= zX(Qt$iU+$St=3G|8pOZxufi6wtQDINCKO`tzSEfTl-kGS7c!+t7Jnj9PW0P zYX_HNYx%m~6k&nKFi@_?s&p4J-bd03Piwk+5Hmi~xPK+H)0s&tK4Tg^tk%YD$SG`@ zbihDoWT3);ANIh!(J3A@E4KX4qUy>reMKDuLoUYRRQsCkkJ44#q-=N=Cv$XyT+PGk zvKJWLhNKwmAg@Hj0lz3_YL>N7X=`c~P1q#^9D~}#)ts-x8W21*@m&77y50pas-)dh z?bsceiN3Zj!82{nYIqpdIpRAAj<BPrpvc8V-bYNrdFALttD}J{~mo=_4+#C zz>r^DYAkpDI+#FDEf)seY(?Y{6!r`ZF)Q>4E%TKT59QElSmPSfv73?DpYWBwe~*RF zI!v|3KXa_z0g~`ug>B?&8fA}?WaCRhowSVRXxm%MY2~{nRcuq3c4L$z(;HJK;0}9! zmG;~X4t`cdNC}99hov5*>$?}Osi?`fH)^A+lVAOJCFYqT&gLgfPxK`ic=+a+i`R{v zsaK1adDl)KHohlm%EPM()YY90ujIkiG*h&dF`W%sKyzmp9JI3<_I%A~zy*M$B!jVE zWrCAsMRZijzHzo!i__$_3nP|KF9p*>eseY)a_Akc+e zYjelz-It5Y6aqdE>S(uW-%sBG2ac5l7aAQ>y{(s!eyr*qnAt+q%+p0;g~dI%Vp@5j z3fO?K8?3P#s;Sstb>ClYcC_(sZ~5{cPfzXv;_;$$H)g|h<&(L&6*88wkwE9DKo!p- ziKH#-9-@TQTJ4lW5B|68ld7@>QCkf^xJG6}<*G0PCo-oqkTJqk0BI(S?9IY{9ke?; zEZQtzMh5M7RuhuuFl?JPKXvZB8AFA7KKe}%AV*lqIUAf{<=T+ApMfxw1>Wg zr1kiXm~x!o4=xoXVhJ{qfVh;8=9!PD`kSdd1hgJn9+D|0e1sVywO_ZqRG(;hv9HRI zM)#M0JLJW_geGMCkh3SIdVjPdXEz-1w7;z$*FOmEuSPpEMfCuuBaC@}$vOh#SZ+P$ z#{e%rq{hBxJEX;c8#j`DKZGM0V_=rFnZrQSJ|{nt{TST7yz&U3*x%#OTic0|oD=ol z6vILFjuOK`-6{C4FH7`C6vF{@+_Cw*{IG^y3^c?`?Afk8@iCb_IRa%Fay}loo|5j) zDjP@#p&sf_-mx#S1#N9oTQJaqSiA`Gf-;6njBrgQZx_~E50P~1-aVx1Qz63o1^4Q* z3TlSdY{nB$PCiM9ok9VHRg$9|L!p^p9Lp$`@D>T~isY_-zXH#3*-t4qGpPtw77H`D zj?kP6ucpP^9>T0ynaLUVhjk68Dkst*F#_p1ht0B!ooE+Ftw%M|zfhhT=9FF`?8%E(T9?q=i~I7Q;H4Z5?A(c0|QWC0{fPc}Bp}7y-#byrt`e z9wgMeheYA>JcRxZ$T1ms=v*w#aO^UAx2N7gV1r#gA+{J5u|`puE1U&h&Hwo@;`|6- zf=hZH%I29Zwk^9@cFvZmWg{VT;+oFc0TF=1=lcuq^O_;YMl-2Jg1#jUcs{UsEiG{1 z!meD*n+zvLA*4jxl96c&{$ois0`1IJk0&1>Fpu^uLbQ&waZ3#!JZ1=wA24wX-o8)6 zI%qLIo=f4v2Y$Kl)s6wwCtdN$sPBFa{zJw!zEbo@;b%ePFRZ8BbSj~!d7spD$R@sz+ z3IT_G`23v!6?fu{z{${7wi~A0dkv=b-#+ER$PUTY7HE<-=*0xEd%5|obOK=)4h}i0 z@#WXZF#>ZuEnK3eqPi_hmZ9!ZsTRwOHIJ80@(o4IcxvPrYeF-uZ1@tb=%SV7Hu^I# zN1FWiE)5J~GQ^KO;VraRa}jcY2_##RFn*{j#?2c6=6r(BouJLv&bSM-H)X;J{U+u; zeB_lPbL4M4TV*t$Aeln}DpD=^+GPvB3o<5_Sz;!`eqmI!HKVVysRn5$i%Y662Rqf=jEK(QX9f}n0Z?06=IHMqQF?CW) z0S#@@Ik-XV=}Lx zBZ;C+@yIv8#`cTG!H|5@lc*CnYrB}#Be6>ew;HzPOLrN^Ohg?Ern+h`H&%*W`Y6sC z(ZtPPQOm0ZQZ}IC+LwyW4xr*6|IOsO7G=!kuwE%BJbp)Jh%6K`lnVRUBFSHYP#IF4 zh31eTb%}uH{_euX@}#z^8r=QU{1p0>4%5X9w>tvFk7DjvCwO2+gW6}u7x~C7XfB&5 z^OLmL6h;3_i61xjSIQSfVZg%?{yWA*95N1zF`HWAfSiTsKd%`-KsQRE4+q-(zN=;cTZcIaP+u zd4+VPBFo7HfXd0v$we;|Gh zjaqv#wzG&6C!;~86b2s3*nQ{3#n^K|;_d9Zsn0(#f8hPl&|BnP@kqtj!h)lk08*|t z%2M9(?CkpM^W0ShEPV9+sGHVcC6PII?x=rr$om20{aw-lFG(PHQUO^;G3{}c{5J#pHGY#zT6uZwkoSjX?elMfzvB0cCy-#Q`!kXp3%Lq*M-dxo&U=sO{_ zyXS-mNwjSFe_O_4-4!jQ`j~VFIjP#5E~?wDUOIa zhF1ir)jgtO$_*^T<>`Q-e|MY+n4_4_2pbF1kuA!*>@g8=)<;1*B7Bf^|Ac1aNJx@~ z`L2A=W{I~~4pK>Y_nKc2U?5Sq5wc?5?c4e2wyL*HG_G5`uXV_*92zKr)l^Ny!Q}U_ zXRoxbgKI|Ec1>gRoLjLs{l>m&a&H2Q@h?V5{=c_w;{SSlV*4DHaTESTjl4q44lpgm z8tfZ?;(om%)DCLg{`#DqFL6~|r;H!)2y5N0{(?-?jA}^s?;6KTmsHFs#+F|8?VQ$N zMVI9eQ<4ueW-BEwh_ojMim}-+>*!Y7vxi_~72&;bH5GJUDx8P)sH?{%&d^DQp)MlI z4k~T3aK8{gMiS&~bt4)DMjZhxTe6Tu0`HoW{^{!Upptbo^Tc^qY&VSH_Lhw7>s;+4 zf$t03w4bOViR@9*R*o`ym#aiWm9=EQY}F%a(Rr@NXe7!wDCK1WkLB1aI38`T4p^{zO zcRka#Ohc_X!uNkIJC*l6Rszm`>ot=tByI1%ecP;M7jFr+-20zD43pSMC?WsVi$9Jt zpw!BiD*tLo{_w#0b+D#C_OLi`(*1aC-u)Q-Q<1idy&ppaq?Ved)Kh>@E^iGJ0^hGdST)W)akusywf9`L=C=oE$at;*xmT z7Pf37%FP3sEPD*WL0E%5M)M*7C$yJcy06njqmAd5yI`=S#OlEJ)xeHmvJB$4;JAh8 zlQ`A6cSL7{^Xi;--J#!|zn+M@2kM{-$hzvekc4&0%yaR2Fhbfo$VRYdch3monkCch zq0r|d<3}uR3y*_(OTUmK^z);4=cOM*jY!cXqUnL$vZh10iBM}1!u0_7upVP*U-Ga) z6c%{3#CV(o@+)%K`ZVk~lVRv;^s>MIjM;Z7Mh`Gq5Q(r3@1S{b#pN)+#0sb}%c8Vt zHKJ$^d|3dxl%>%&Bk&Ev)96{_D0V1i(UQZucjero{B*O0YMmoC#w0Z>WP)gB2QEsC zXkx$;*9dV|9r{#J@f3U-U*{lA+A`R_Y=+bcwqa*267@-n1KV?~sv~QsTwOBtsVXrh zuV77+_Rfj~dvj2%^7eTC4VKp`EgpC(8%e`Tcl6bYb|H=@>ax4|IJLV5eZOW#Nuz)$ zC|s+{@{mu%KWM(${tADSPc~Z0!9#C46XJp31Q1aw(mq_!Hw|zX4WPVBmmi-Os*N*} zn@|gNME5RGzJE-p-wYsa_k-`xb?2F8#*;I@XXD;>~{Pd+`+7k(&yyT`;vAg2Kur78w1k0HkgYHbD@WPQ9vKsq|&zrnGHChnt-J6 z4=*PtnJ8gzl|1QzD5)PvTR=p4@`=mQgDE}$UY^WoG13mwo6KNKG$kM|cx&ot24l1E|bc|wtw zAB@}*{55M|yq9H1^UVHq%kZ_I+t(Tp!W6fwDu}zQO8E0m9`ev_V?jmLUpeWt;jy zP^Le1OYjf3y{ISSVJf};4ez#Pd+~iknRVz>y=4A5Mm4Y(WOznl}!}$2P;Goi0#kZpfn- z!y^mm)i0fN8n9P7xI3mZ>Td+bJG!H&JrVXuD~*W|z+&K&J~E(JdOmjjr0?6O?pp z1Qo39#7ZYs&m?(HabqVHkH?vAuDR%O4(AcJY|_H$iTo2qdKC*{js1ynGQzA_ol8#0 zc6|=IG`MA#V(TsEmVWul`CH~$atP<+TP|hxs%mhgJh(wz>++Jw6Xi(7MMY-$N2?&` z44@_JGowzfK6vCP z0ap)KmJkfzz5M!5AE@ZWi)(<`c?f4CTXULTK@mUbeF>cTc&;L&Pq4-_MBX%b-xbo@ zl$4beN}aIwtMW~gRV2Ye-2gC zRe^jn@zt-J5M9Dq<{xUl;v*V0@r@vH{Z<5)X>0q`+u{g4kgnXnG(66POUgva9{1~d z4)$5rKefj*m|C(sQm5J$YaCDRmlD|eI*DnnYJH#@6r!)+Gku$8cFczL&YOmRd zmujlc`WUM0V$YpY@C|3*Znus=^bgm4h-qFQ!xW)opVxWF-+AciC@d`*Pag*Dn3fxm z3#W2yolY|s?(IdgP0kb~d5rrirymmuyhpvFWE%3nccxF$`0Lt%S#^}+iPECSSU13T z{M4>cJBD-|>#4d+uX~S~NaKKEax9@la)T`BRi??r6$y1La3JoL=c&RO;c#qTF%D&# z|^NI zTZ=#Rm-IMOILOFA)Xl?6CaqNu1(kX|ApBY4!VOAf%UiGb zJhLak$BN4OXNTJq@C!Gu;>tPz_`EG_FR;Bd-%fqf1og&FK5juGP8g*6#t)yslvLRb zPc@}s6yqDae2k!+!etcci^rIFqrB`N@6P1VZ+8#2Ip7P8G!bu@^@&ZGn1_8Z3D$zb ztHpJRiL~$?V^sfzGh{?vx?@!71$(a^QG*n0teby|rsL4C?#*W|t}Mt7#O^4WYC$+( zJp%*(pbH9_Z#No9|H!yCQZgRrZ7RZ-Ko3xXG4>z7e)}hO_>UYfot~BCQIB|U3En;` z?*oU?HQIO!`2Upk6;M?-LEl`uySuv^1d;9zrMtVEtI{D27o@wpySr0Tr7waYh=7Rj zU9Qjjevi+4Je~u;ot>T87-nZ@_iqvQn@MgRxJ)Z`?HYtXsd_$RbDq-wk%@+VP4oVD z{Czh3FQH3-sZ{BGOl!WWbiqBM*yS_aeJuL=Jm6>jpM3YUkKq%SFHdQ(EL+9i4i*0# z@K#TJ_f5H(S~qC38RIo(pCs`8SBjtysW~3B-yRoW#zT@kxSx+{R!4z|aYrWxG8|7} z10x;DCr0of0^Nw`I6NgoE^1y9#;?#^IfE^A09cK;P5UOXLLcNbBut; z1-L&DW!M@;A}2RD4=-PaOkRW;5!&d0NkuTMUAVpgFa5HMNkG7~h^7eZ?Q8;d{KN-Z zNxtUtZzai}XxbZ)%vmJf3cJA3C&TfWj*@W=24$LcGapXL?8)+(GLmpr98Ov7jac{M zlX4Z!fV72PeBpDXMwxYm5m-sf!*8iA1_QlE>OVJAcattCbI7Xx)VX519gd(|bAu;I zK@QF$$7vnv9ETV?%U0Efo0zt{#Pv%QFJ2+p-1|OQ>DzPO{3crF2xe|W#jx-A7@T^^ zpD`Ioa<#NR`N(k~^s)o7p2ZWyH$5J%2l?Tu(0AF>PTt#JYN|AdX0#1#kGK*-}Xd)%xWD z|N2W7-fVe7;K#toW43@!(S5J+LO)=ZS}loYAJ3o{UR&LIbzG>TpoBDhzUAa?@+hGSG? znWk;qmO+}LLTpz|7$=1?}$Ot$}Bi;ju&I2)N|&= zON05Rwd4NYOM!<#>iL>u#R6uoN%&q3GBqyfpR~65+9M z7GMMM;>v9KC51}xGnYJ1?9Pp*mL{{KSCjLct(LXh16<#CcNoEg8a3>d=}Fb>pA!PU7k*0xZYtJrp!TlU zKaX>Gjqlmcbjik&>?ar2x{dP@p_JHe(zzi#0ac4MKalT*%}s-E5uvU*7pv5zy9>{H z?w}2o`|(;SOO?}nJJsVWZbC$5OvTb8JC`t+?iAn~lYJ{$cH z0#?(`S@AAp*Zd8%ies`{z@Yt}2s%Tu_-Zs+;ps>Vk8M6`{Y(ssR1t2COr)h$z8x>? z=j<=H>Wx`K$5K7~q%QiGln}^u2#2O7ac>POq$0K6vBY3)vMD!&?v6<+iKnwpxz{%0 zzGSUp-pz@9$x?MecmUfi-GO|rz53a6a^yDLgGIJ^ilxw)CONGIAGlImT<+5%tl1%# z%K9PtwMS38zCM>At59@cTGj~QfbgQ$BkNXXojFANEHNjoYajW*MZ}~-UXK~0QLn?) zq{=D1jn#0!XA;h%>N0VwNQ}KtqjlmumE!WHb=kc!3ajFzi}mZqmm<3BW%z6ftj`Z# zLkPnz+b@eRi!ODffVKz6VK|dbDB+U>VM}S!D1d{Gu!Bi76e4CWhH70C#dalsfgOW` zmM}8>@322fz#izGnWmIvX)~kN9{V>FwiJjPD$zxW4)?0l^_KI57~nJ20y6uh53Bd7 zBwy!p&ryC<-WFVpm0bJI_YED((+s_E&x)bSytv<|(+Gy2l~olz5CRV_SpXeW9N;N% zEpgy7lm}4 zDMc9(dbOY_Ta6nDddGn0mH}i+1VCx}tviAMMMew-{<(cX1L`LMpn^Jx0fbG@jW+-1 zQogz1(2oqd!It-v(=tJ)FzOR@*f6ejsHl77s!qdB^fbfNa5~8OmU7x{hubDeg{1x z2jDk#M0)%Y@SDXG6>5`lY}~&AM4+~_kGh+eC#R*8xu>VI_NE%1Ccbf5&T+GKeu+lQ z7CihZM#QfXTs(&N*c~IZ(cP+Lk-Wk=_NCg`dqsCx520L)A9q6&#BNn(wvXmtylp<- z2-LgzX!})wukZ2x9>I)|&7Gc`P?~5IK?S*;i<*s^NR~HV4AmW}vo3xiGs2loag{HHTDw`f4z7t)1ty7c$y%q{41S>A_|C*gtJsQg z*SyTKkv35_Um~>u&ok9=d_)F1%{e<{Fw_W8R(B2L9ygbBWY5%StFAl#Bm_FdDh70f zbZ;ZS*OotQsMsSs^rBy=p<~FGe^K|Ezf)lPG;@raAxjoM|guc+WP$xtv{nPb5D$vvK# zA#?Gdr)-JzGmBL|9}xa%0efCimB4sZ@KADC9}$89N9w&})a?^`1XM7Uevh~)>6;TW z#Git4_B3%Lw)J~PYeI%h@fK_76!%|{y#U1{{4zniV`IO=miA; zHRYiKvxy-g{?F=wtW!`v1po=8OaZ`4`H_4HU0P_JY@kvI(8Qd2gZzKqqY_Tpsi0_5 z&2fUR)TZu&Gbpd7ni9G{OB`~c3A$8)+UCw~PS#d>=1$($(ylIE9Ap*EQ{ zaY%2rPZK-76iYDz%TeMBZ6!mI7Ns{1PPhhA?<5A4$Ixl=3*P0-*-8PKTM3Z3m1 zJ)u1%orl&kHH(DA61Ndm$I0X3)hK*|L=w*4EeC>#(^SU(KzAHVt*@2XK|-GLnywo` zpxAAAm@RIv74n+Fx>-~)Rtp`6y}b`hrl&)xu|a8Dq2>n?DcP9`63o!zm#4ou_M+aD z5WoF#sp*hY_`}0n*|R*#>Lu{{rRRx%gj?mW3ck3KA4($jnFves z=d&DJ9huc9dX116fgbM%Sk0sP82hZ*;E3K=omy-ReYqb}WGAO^UHk(gBOcnhG@|}W;$aKf5*St|kRds>9+10NeJ)AaT zVK842k%x60EaoTn_>6{02&x*5<4?ALHNuX02Xm^a!(UL?h>2dJabh=S$)XGELKZEA9yBsoUdEn4-4KG zKwoc14a1gs-fhC3`$;U7s_|Gcft*n1nyUv#W0(aB%mpe6?1%&^D*fjnSyBm|?`L(u zC?E2?ezUw>LO@eRk}&}6-N-y(ymqF6i7sTiu&ft$93;Zx-%0qDg*=Rx^ch7;Rl#av z@G^;jFg-cSD={e(C?ZS$@N9WI)6%O~ib!2eh7(1_mv+(ft%A=rKE=iQOK?eH^tg3^ zA*u{q8JHk?p_NurGyFmc_DJ2Cob*`x>hNbSizfPsBQTSH z`1LV$tLQ>F<&~BbGTg8X#5;^Yfb1gY1revWI*xI}w87iR+?x_4WgCs+-~X&-7smDa5FQuB%^(0lc&P-lY=W zivzcHi6M-k(GAkH?Ft?XcwZbNKhkyVqv&oFRMCU%cVaaj)t%=tl5fPSeA-^BCUu|d zx777GMC{Awip@Xxfbo*4Vxu<;-uT$%?!#64zd+iw-Dc?ERI}Q1eKKCoEYDmYAlD+F zK_0gI>!M`}#56(vl4GS%Cm=MTS7snTS*E74Mnb5kk+QJE)^yTL0d+8%&^ko`|7*Co zX#hw~{$2Qg{D>#IuD&irXtCNV8wgU21FX?U@zYr$csQT7`j`a*VKbuezOYhwCB;a? z-bhUS0yiB@|5}p%jEgS;@{}G5A6{$chw#?bPPXOXSZ8Ax2EZPy-at)@0mz_bWmV7F z+0oFE;LX+6%|{g*#)QP5r}Brrf#=VTB#u4?&I0Ft`5lAt)ZsEFNg1kT6Qc6Nn1C0l zZ~!q5+TpypDCF-)&vCxqcbEB5^b&=T&DI&aJoL$NsE!KQ!0xheEI)alRR%F!+J`{MCnl(T0qT z0J(PI&OS%NK2U#7z@5Cn$$LzRl0XCAz8bU&zK@PlN4S?ARJ^;bqkWF|O$epw>f)2^ zy>$N(?jd*&7;_7H4OGskOX$PCpu#a#y5;KK0)nhfT|`4_{C5jOb#lS{+mxCwkpzFUZi!EZh696EqOdiRu3^KCnGglZ@vZqMQK_svz=r*A z82-=QtL5(_-cKkI332c@dpFx{M({TykmL)nIDeH~>C-~-DQBr4a64&p11@IGug*J# z$sud=O3&*UYYGq+nHiCz_%@gM^E0J{f8m}mIcQ_U5x}QY2IS#ZYYV{#;d|pD`BbW> zmW^esgpxlmOu zO33_U^LHC@*Vasic3QW72eHz z6Ucu)+Pl7S?>4ld)Z=VI-IDa3Zcyj9fBXT%tPp=OFS;^EXDo+K!J8HKD|*#hZ-No8 zZOREXi?zxAls-a>4=wmqSKdld2;@U(i6reC^r>vh2{B8tx{U`nzAn+cJkVP>xzUhU zupl&J%}h9R#)3&3XjNiLk8T-16~E<_7RN!(#T5RLc#@AsiiF4wy&_=@(a0|^BQCbx zq8CMxN5@LWftPb32+S6bcvYaTGHPwKpu~qR3+FK2o*jEwx=68tZsJNeq7Xf8)0D}Z zHFUU$@!8oc($aA`>RGECN{8a>vKP$co@@hVesm=Y?5Ec_z_(JziI}gHCP$wsWx2^P zU<>SHMlL@ThFV)2SZpr_cnHdPv0F0v@Wi=rz?4&Bn~0=VAvZvHqAqB$N}(;yHpGc8%5D{<+@nr%+b$h{V}+wl{wwhg!QB(T?-?0 z9eOt2PBhX74Zx+o=fpaO1jZr*AYQ}a8XH-n+uy@HiR%`vVciauRYb3Prq#^LwB8VW zwbKlBAlrsfoYii1VCodz!nxE2fYbEh3~BdFFonr3en3uf&oOC!_!ArZoO*X3`icOB=W z`8_yr(G-;FTHzzUxrt!{O3j+v_)9+bD!I!W)Gfn84)zgKN~#~MZ5|(gn5R87NX4^; zY%~roK41bb5%7nnWWR2L(UlqqP@R|JR0e5(P8H3|Bn6t6!OHI7*u^5YmTz3IoX7?Z z1`OVsSvKY+n*6TKr`y@8(tUS7rI^t5=44DpiMXLOgDNNU8@0s;F^=JK(j{TdSnxn& zU9M(xHKG8iuE9?sz8(IWf{oXF6_XMoXfwE0)~udDr})ujLD48TBxmgcPAcS=oOC3F)kD~?{75k7`K-i-Mw_<%YK3xjoE_9FuN8blS3fEA zsVeTxTx}-vKVbgmR3J4~=!;DrC0aU9F1{$a>SDLQH@-8@} z`+|Yl(w#{+=re10eA4eoczE`fZ6-T(h%SALUI!o`X;$}ql{EJhiV#r;54ss!_z@W) z$_<3XtwrcsixVqK75NlJshd49 zg^ecqkzc&dkh&Bzb~Yl6HVZxtZoI?GPnml|}d7!z^Fnrt`T&bQI$6OO;( z56xwL_9pc@zkA*KTuydtYcp6lMQm0n-g5W0J#3G1=0Z_CLnYqVG6rQ z9{3p-S6B*Go<6%mT)1ML!N;-_WfncblMz}9#>Er1fE|+*<_qAiT0a1fPB04VQXVjr&#w?_Xt&0pz#mzx% z)*yZeVlg`)=PF z@vu?|Kx=@Fb)!r-6ZjI{(LF5uZkSrRV%#V`(w+1=aX6%U80}Sf!b04TFkX*vmcAP% zS;F^q{O0PJ{KS@X8O zBHWRh@-T9;A7w~aZC~~PVsN%O4W*@bxu;oEwHkaJTuH}re|Mm5T<#|(4*7v?vJDKvse!1jwIyP=% zP_NpLg~v#vo!#Ac^8pgg9?M9k6%WL4R-he`U>|uRF*ji4_aC^i8mK984jh1`lx@#h zp4mqm+6@Tp7>Vby(0;E7Muw#v5EhG3yz&z4_xN8Wez}(w~4u zQ%A%^%chDiEThJhx9oh8G8kAdRczZecFZSUaR^XXk|^CZ{x&wJpqjnl@H?(^-r#U@ z*LQ?>PjT4I6>>utF?!>rJ)LRMyPzDwON{A3Lm4dBJ*RFsiH{{SK?zFlZ(3AYLj~+p zx-Wv)W{XzSyDx#MV5|0=_B4A(&O)Z(AGERG&oRGn&){?k{sgr6zK_{hl9edD=G4~Y zF}}icI2R;HTa=Y3x~A0D6fwT?bU0Uyaw)-R`8MvwYQh-|!?~v+7Jxu=g0!oe(~>zG zGg@scznd?YsQVcWHG^y55ozOHU35nuO~~^?ia2B+Viyh|p*z)?5G=btK-M13>>~La zfYkeaWol`a6$vZWBABU^HDytkJYrJa{)$gKt>TzfBw|vUKVVJATCQ_aL;3)RRNSFb zE2UP;uKYBALG6@xmgfbZV1V8w#nNI!!Ir{kp$8q2GAUbUeZ;K8j-Zw9DfsmF>mL-$ z+*UZZ$oLH=NzB$o8ly2919Fa$^g{s|o)Z{FB23)0)nlr(98B9w4a;YYdM8{4iJYQI z8!ogG#$I7G4(7)mDdpQ$KktVhAzMWx{SEy8iE6P!qgubW7ybms7ItKS)d)o}IP=5d{EXIVfbil1CkAUS zlni=A1G^=ibnBNg>E!y1&7huRG_O*=%;!>^8<{Znnf6?wL$aTWf@8cy`kW#yycTBH zY?sQKf*zBuHccgdqkl%cwgeA&(0v?5QmN*4kBsh8sa68NGsj>#tX2kt+!8Wx7|>(< zu%-Eciz-eE3XQj=VKfn+Vs@m1=*?x`GMXC>s-aWu;o)G(29Zh=r89_G-0`7^E@cvn znn#VtaEr)L^t@2g-(I=#npw^1PQMnPnowV8sn+Kej?&-$uvDs^z9ZU!bV!Nh5)M~K z6w8K2PU^YZn`u0EpoIU4MrXi7kUd?O9sG*`viEBxpUT^r=c)e^;Q#elReGuuf#bkt zrec7jQb3(BGF^9yNBcl(^h)q5PBjV5-c*RP?s%jhYhyNgJoYwQ+R6PBcWm#0sE)yO zRtPI`X|Nf$6FK55WX2etDnWeDLq|^mbo50l+;AJVAp!l8lBEmqrP@J!%SPNAZ8E-e zpwCpUIj4U0_w<7+T83-!50vI#$J;TLy zTbL|g`xB{;>AMH6s5!%Ch>{!PzICR2kaB`6zs;o_4#50AkrZge&2K}+J%J&N}%Envx3p)-t zsv}dRp9UHVte|xYDI?)GghZ*gG#`T^K3aOYFeNOs1c$Lr8b-F05-BjF;6{Rh&j(vf zLy-O26&DL`grYi_afinR?ijD~-(~cuY#Gz!-bIgSTDZlmWzjiCuWbxJ^9$qI=YC_X zvUp-fYHERKYEEd1_r;L?^E38ck@O2#wp$$EZ)|6~zQtfQy?2jU$^2363>GTGUHxoc z(Zr8<;`qr>X~Hn{+ek#SWUFw(EkL;cy71;gype+&-}4?pC84af?qAvfHJ6QdwOq72AHF_sZFL! z{78YkUhl*b5v$>>oTkh<&mo(bWfzCvKr<4dT*2Yp)D;nKm2&37{DU|6Rr2;J9O%dZ_NuP6+9^G!BLj%4)r4d|``?ZXC--vUuMhU@e`r z6qA{Z7jKPY`z*pOkJH@ikE~cu*lTCZ%oMp&4iqNLy;d=dqzc z+9@i=&FdxGy3(xTnAvS#9%E^x>MzP8@LbVd%*SRZqz5~CT~;W}caR&yHn~6md&+?2 z=RiKI<37cl!=0a7l820nNK;^7Ka z-MI@Hcy*QIS(WI<^cTQ-Qu`lPcr2HUiO;`k9dVI>QiMXBF8EU~KBItIKE!J8*0AKv z)E;@_3l`d^yJ+{9^k1Yrqphg-+N`D zWqivzS98$18kL*A+T2)5D1iQ|FtVV`;4L$1E}LpN$I+tE2Z7o0FqpUKEix%#=qjC5xQ*ir3`uTO>F{KjJ9XXu z=-W)JEOQ*n zMA&cM?UQow@l*ByExjtRh-}EWwX&;a+u^!DaOx?)WS)Ut*Ip;{3?gK4pX1glajr7% zWEKAq$oq0|MM@RVSYVN~tpS8?>umzrG(J~7yCl3OK|*qUwiwPJSOfD%gDuL z>6uk$O3}Ie8>_}zUH+Niq4=-vrVpLN%_J#HpL9?XKfdT(0;1Z2Hf2-7Uqb8nK~`j!8k?H`q|rZHNz32 z{&LJMx+W1TUg>x*bVVoDCsjP~i;VP!nmzJ&FU9gB`9^4acW8ud;@|_{+=B3CTWk~h z#e*?FkC-G83(%GO9`-RKa;rp~pUcE|@imwU9{yzX`J}hS;oz_%{^ML_w zN^|&xiM>FFWuoT5l^<7UDbnv=OTL+=?v?6#O#>L>!T|<_$0t*c{^I;G&EN@NL?5k^ zU6!;k{wAPR!JL!5uIrX&qM@?%qtX(yV!(4$22l%E-S=ulCwG7u#;VR{-A*H}PPZ3S zG+OXiQF>qO;=)?p&+KRpv}m&Y&08<@{K#A-B-uX9-E;(qf8cV0s1@o=k-C>1*mUUj z=7A#IEyYkl9eWTGs@-4YD7bcw8V2_(Uz**vvu4CT0!n*eN}JH9OL)1@br3uw`?nal z+29W;-)JJo84#!}|G3{beX^fmrBBK&5c??%Np$%8U>1Cm>1(=u z!!C>At>>@dkPM!)+FVFXY+=NEce=vI>lxN3N>O9v>PHALbaY+7ZlG6JklXvOl4)b*HOKFE|7b9dlK=jJ%<<0LdzcBXf+=( z)rLzn{UXY|_`t|hk0lG(mwKbtv4lQK;6JG)I<#m{)@-!OG>DP>v zDNrwr)O!;{F7Y*HS`Vi2nDG{50b|Z%;*4&`OV{L^H}}lPIa@fuSDblqyhO}dbiKK zLMjcrrz0-S8w-2MY!P$qKuVS&nMvD*A`%6rf|bGF(&UD>>*J<=*ERD%a2Jt8%OZlF zWK;ais*Y;H%zVL5h&Y=m(*^Ban^Y{lyjvYca~DCUiU)tO&^7c~P(lfiRvP5+o)+Oh zv-l}dh7VE0&R^Qq8Ki**prU%?b{;Nhr0fj9V6o%2mokJcL3K)T?o6~Ave7o^rUNCQ z0jPo5#UJ)1O?%I?&x1gpd_`<;KxGooVd}~9IvOb6C^<<}G06*yOisk2nt0GfS?cH7Hw@Fw zb)QtgJvBUtEHBt1HWHH-etkdI+$LR=)26SWY;L&?uTLike8a{{$3VwHM>kY#C(pPC z3|JMMR#B5nFW{}%Y@j_IO0DSVWAPkM^N@hj=rplImTI?uuOwV0XN9NvA~tzhuX8? zXTcqQlS0JmvI1;nhG@DLuMEA8a^|)Cw;d0i>qHJ)%4I~=cS+M;*vTNhO?vZro?ALt z5vOAp2@)^jCq1>a!|jffj;O4cm~YTfSuNO=4jQhvSvbgdCdu62=}uAt6Rrr>082(y z*lL)%4F;yGb}fSnceQi9nQHlNCl8bwy`EbR3*?r%>PMCj$6nAD9sOvZ(V&y@-&FW1 zB^M8$D=Rs_$}uBYV;zBz??omj#TL%5qpF;>Mufsu(Owje^)tdFA8lJik_W{K?wyHQ z_LqKJYTw2Bu}J=y54wk|skF@TcR;D<@QOTyi?6mDuY#V7FD8w(81+53M@ucU|Hf;v zRDb#fUrBC5KtKM2tM>Rpx9Zog4-#wXMAIdv(~e@!0R&1??#u!@@ibC+-1cBzhI~SD z7FeA`$7&ZAUF6oqA88{_a-;1^_4ifz#3au~TVz|iT!&l3dOJk#7nrp4U1keK z?!%<~uN?a9(jM6QXU=?P&ZkH^Zo8jlc8Ax`+-IaP&)bp03;OmbSxH>#Ne$XbC<`m) z9n!_VuvZ3V�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 delta 27441 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 N4|*>kfS&Mh{|8WsmyZAd diff --git a/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java b/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java index 2aceca49..bfa61d39 100644 --- a/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java +++ b/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java @@ -48,17 +48,15 @@ public class ConnectedAP { List gseNodes = ParserUtils.getChildNodesWithTag(node, "GSE"); - for (Node gseNode : gseNodes) { + for (Node gseNode : gseNodes) gses.add(new GSE(gseNode)); - } - + smvs = new LinkedList(); List smvNodes = ParserUtils.getChildNodesWithTag(node, "SMV"); - for (Node smvNode : smvNodes) { - smvs.add(new SMV(smvNode)); - } + for (Node smvNode : smvNodes) + smvs.add(new SMV(smvNode)); } public String getIedName() { diff --git a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java index 5d34675f..6033732f 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java @@ -116,7 +116,10 @@ public class LogicalNode implements DataModelNode { /* Parse Sampled Values (SV) control block definitions */ smvControlBlocks = new LinkedList(); - + + List svControlNodes = ParserUtils.getChildNodesWithTag(lnNode, "SampledValueControl"); + for (Node svControlNode : svControlNodes) + smvControlBlocks.add(new SampledValueControl(svControlNode)); /* Parse log control block definitions */ logControlBlocks = new LinkedList(); diff --git a/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java b/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java index 77993e77..f2f03b66 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java @@ -14,7 +14,7 @@ public class SampledValueControl { private String smvID; private int smpRate; private int nofASDU; - private boolean multicast; + private boolean multicast = false; private SmvOpts smvOpts; @@ -31,7 +31,10 @@ public class SampledValueControl { this.smvID = ParserUtils.parseAttribute(smvControlNode, "smvID"); - this.multicast = ParserUtils.parseBooleanAttribute(smvControlNode, "multicast"); + Boolean multicast = ParserUtils.parseBooleanAttribute(smvControlNode, "multicast"); + + if (multicast != null) + this.multicast = multicast; String smpRateString = ParserUtils.parseAttribute(smvControlNode, "smpRate"); diff --git a/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java b/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java index 1dcd59ad..02646af9 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java @@ -8,11 +8,12 @@ import com.libiec61850.scl.SclParserException; public class SmvOpts { - private boolean refreshTime = false; - private boolean sampleRate = false; - private boolean dataSet = false; - private boolean security = false; - private boolean sampleSynchronized = false; + private boolean refreshTime = false; /* 1 */ + private boolean sampleSynchronized = false; /* 2 */ + private boolean sampleRate = false; /* 4 */ + private boolean dataSet = false; /* 8 */ + private boolean security = false; /* 16 */ + public SmvOpts(Node smvOptsNode) throws SclParserException { @@ -38,4 +39,16 @@ public class SmvOpts { } + + public int getIntValue() { + int intValue = 0; + + if (refreshTime) intValue += 1; + if (sampleSynchronized) intValue += 2; + if (sampleRate) intValue += 4; + if (dataSet) intValue += 8; + if (security) intValue += 16; + + return intValue; + } } diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index a7e3ff42..cad7d5ec 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -51,6 +51,7 @@ import com.libiec61850.scl.model.IED; import com.libiec61850.scl.model.LogicalDevice; import com.libiec61850.scl.model.LogicalNode; import com.libiec61850.scl.model.ReportControlBlock; +import com.libiec61850.scl.model.SampledValueControl; import com.libiec61850.scl.model.Server; import com.libiec61850.scl.model.SettingControl; import com.libiec61850.scl.model.TriggerOptions; @@ -71,6 +72,10 @@ public class StaticModelGenerator { private List gseVariableNames; private int currentGseVariableNumber = 0; + private StringBuffer smvControlBlocks; + private List smvVariableNames; + private int currentSvCBVariableNumber = 0; + private StringBuffer settingGroupControlBlocks; private List sgcbVariableNames; private int currentSGCBVariableNumber = 0; @@ -101,6 +106,9 @@ public class StaticModelGenerator { this.gseControlBlocks = new StringBuffer(); this.gseVariableNames = new LinkedList(); + this.smvControlBlocks = new StringBuffer(); + this.smvVariableNames = new LinkedList(); + this.settingGroupControlBlocks = new StringBuffer(); this.sgcbVariableNames = new LinkedList(); @@ -267,6 +275,8 @@ public class StaticModelGenerator { createGooseVariableList(logicalDevices); + createSmvVariableList(logicalDevices); + createSettingControlsVariableList(logicalDevices); for (int i = 0; i < logicalDevices.size(); i++) { @@ -308,6 +318,11 @@ public class StaticModelGenerator { cOut.println(reportControlBlocks); + for (String smv : smvVariableNames) + cOut.println("extern SVControlBlock " + smv + ";"); + + cOut.println(smvControlBlocks); + for (String gcb : gseVariableNames) cOut.println("extern GSEControlBlock " + gcb + ";"); @@ -338,6 +353,11 @@ public class StaticModelGenerator { else cOut.println(" NULL,"); + if (smvVariableNames.size() > 0) + cOut.println(" &" + smvVariableNames.get(0) + ","); + else + cOut.println(" NULL,"); + if (sgcbVariableNames.size() > 0) cOut.println(" &" + sgcbVariableNames.get(0) + ","); else @@ -366,6 +386,28 @@ public class StaticModelGenerator { } } + + private void createSmvVariableList(List logicalDevices) { + for (LogicalDevice ld : logicalDevices) { + List lnodes = ld.getLogicalNodes(); + + String ldName = ld.getInst(); + + + for (LogicalNode ln : lnodes) { + List svCBs = ln.getSampledValueControlBlocks(); + + int smvCount = 0; + + for (SampledValueControl smv : svCBs) { + String smvVariableName = modelPrefix + "_" + ldName + "_" + ln.getName() + "_smv" + smvCount; + smvVariableNames.add(smvVariableName); + smvCount++; + } + } + } + } + private void createReportVariableList(List logicalDevices) { for (LogicalDevice ld : logicalDevices) { @@ -445,6 +487,8 @@ public class StaticModelGenerator { printGSEControlBlocks(ldName, lnName, logicalNode); + printSVControlBlocks(ldName, lnName, logicalNode); + printSettingControlBlock(lnName, logicalNode); } } @@ -742,11 +786,100 @@ public class StaticModelGenerator { hOut.println("#endif /* " + hDefineName + " */\n"); } + private void printSVControlBlocks(String ldName, String lnPrefix, LogicalNode logicalNode) { + List svControlBlocks = logicalNode.getSampledValueControlBlocks(); + + /* strip "iedModel_" from ldName */ + String[] ldNameComponents = ldName.split("_"); + String logicalDeviceName = ldNameComponents[1]; + + int smvControlNumber = 0; + + for (SampledValueControl svCB : svControlBlocks) { + + System.out.println("SVCB: " + svCB.getName()); + + PhyComAddress svAddress = connectedAP.lookupSMVAddress(logicalDeviceName, svCB.getName()); + + String svString = ""; + + String phyComAddrName = ""; + + if (svAddress != null) { + phyComAddrName = lnPrefix + "_smv" + smvControlNumber + "_address"; + + svString += "\nstatic PhyComAddress " + phyComAddrName + " = {\n"; + svString += " " + svAddress.getVlanPriority() + ",\n"; + svString += " " + svAddress.getVlanId() + ",\n"; + svString += " " + svAddress.getAppId() + ",\n"; + svString += " {"; + + for (int i = 0; i < 6; i++) { + svString += "0x" + Integer.toHexString(svAddress.getMacAddress()[i]); + if (i == 5) + svString += "}\n"; + else + svString += ", "; + } + + svString += "};\n\n"; + } + + String smvVariableName = lnPrefix + "_smv" + smvControlNumber; + + svString += "SVControlBlock " + smvVariableName + " = {"; + svString += "&" + lnPrefix + ", "; + + svString += "\"" + svCB.getName() + "\", "; + + if (svCB.getSmvID() == null) + svString += "NULL, "; + else + svString += "\"" + svCB.getSmvID() + "\", "; + + if (svCB.getDatSet() != null) + svString += "\"" + svCB.getDatSet() + "\", "; + else + svString += "NULL, "; + + svString += svCB.getSmvOpts().getIntValue() + ", "; + + svString += "0, " + svCB.getSmpRate() + ", "; + + svString += svCB.getConfRev() + ", "; + + if (svAddress != null) + svString += "&" + phyComAddrName + ", "; + else + svString += "NULL, "; + + if (svCB.isMulticast()) + svString += "false, "; + else + svString += "true, "; + + svString += svCB.getNofASDI() + ", "; + + currentSvCBVariableNumber++; + + if (currentSvCBVariableNumber < smvVariableNames.size()) + svString += "&" + smvVariableNames.get(currentSvCBVariableNumber); + else + svString += "NULL"; + + svString += "};\n"; + + this.smvControlBlocks.append(svString); + + smvControlNumber++; + } + } + private void printGSEControlBlocks(String ldName, String lnPrefix, LogicalNode logicalNode) { List gseControlBlocks = logicalNode.getGSEControlBlocks(); + /* strip "iedModel_" from ldName */ String[] ldNameComponents = ldName.split("_"); - String logicalDeviceName = ldNameComponents[1]; int gseControlNumber = 0; From ae3ddfd89ca8908a97420e7cae6c2277ee8b3515 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 11 Nov 2015 10:37:39 +0100 Subject: [PATCH 04/33] - added GooseSubscriber_getConfRev function --- src/goose/goose_subscriber.c | 6 ++++++ src/goose/goose_subscriber.h | 11 +++++++++++ src/vs/libiec61850-wo-goose.def | 1 + src/vs/libiec61850.def | 1 + 4 files changed, 19 insertions(+) diff --git a/src/goose/goose_subscriber.c b/src/goose/goose_subscriber.c index f1d1e8ea..2bc01782 100644 --- a/src/goose/goose_subscriber.c +++ b/src/goose/goose_subscriber.c @@ -109,6 +109,12 @@ GooseSubscriber_isTest(GooseSubscriber self) return self->simulation; } +uint32_t +GooseSubscriber_getConfRev(GooseSubscriber self) +{ + return self->confRev; +} + bool GooseSubscriber_needsCommission(GooseSubscriber self) { diff --git a/src/goose/goose_subscriber.h b/src/goose/goose_subscriber.h index db35050c..d575355e 100644 --- a/src/goose/goose_subscriber.h +++ b/src/goose/goose_subscriber.h @@ -125,6 +125,17 @@ GooseSubscriber_getSqNum(GooseSubscriber self); bool GooseSubscriber_isTest(GooseSubscriber self); +/** + * \brief returns the confRev value of the last received GOOSE message + * + * \param self GooseSubscriber instance to operate on. + * + * \return the confRev value of the last received GOOSE message. If the message does not contain such + * a value the result is always 0 + */ +uint32_t +GooseSubscriber_getConfRev(GooseSubscriber self); + bool GooseSubscriber_needsCommission(GooseSubscriber self); diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index f1cdcb39..9041e69f 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -498,3 +498,4 @@ EXPORTS SVControlBlock_create SVControlBlock_addPhyComAddress GSEControlBlock_addPhyComAddress + GooseSubscriber_getConfRev \ No newline at end of file diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index aca168eb..6012f5a5 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -522,3 +522,4 @@ EXPORTS SVControlBlock_create SVControlBlock_addPhyComAddress GSEControlBlock_addPhyComAddress + GooseSubscriber_getConfRev \ No newline at end of file From a4730069ff8ed8a7a2edea2b982d98291fb1bc33 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 11 Nov 2015 15:51:27 +0100 Subject: [PATCH 05/33] - sampled values - WIP --- .../iec61850_sv_client_example/CMakeLists.txt | 17 +++ examples/iec61850_sv_client_example/Makefile | 17 +++ .../sv_client_example.c | 74 ++++++++++ src/iec61850/common/iec61850_common.c | 4 + src/iec61850/inc/iec61850_client.h | 47 ++++++- src/iec61850/inc/iec61850_common.h | 5 + src/iec61850/inc_private/mms_sv.h | 4 + src/iec61850/server/mms_mapping/mms_mapping.c | 12 +- src/iec61850/server/mms_mapping/mms_sv.c | 126 +++++++++++++++++- 9 files changed, 294 insertions(+), 12 deletions(-) create mode 100644 examples/iec61850_sv_client_example/CMakeLists.txt create mode 100644 examples/iec61850_sv_client_example/Makefile create mode 100644 examples/iec61850_sv_client_example/sv_client_example.c diff --git a/examples/iec61850_sv_client_example/CMakeLists.txt b/examples/iec61850_sv_client_example/CMakeLists.txt new file mode 100644 index 00000000..1b9b1334 --- /dev/null +++ b/examples/iec61850_sv_client_example/CMakeLists.txt @@ -0,0 +1,17 @@ + +set(iec61850_sv_client_example_SRCS + sv_client_example.c +) + +IF(WIN32) +set_source_files_properties(${iec61850_sv_client_example_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(iec61850_sv_client_example + ${iec61850_sv_client_example_SRCS} +) + +target_link_libraries(iec61850_sv_client_example + iec61850 +) diff --git a/examples/iec61850_sv_client_example/Makefile b/examples/iec61850_sv_client_example/Makefile new file mode 100644 index 00000000..39f73461 --- /dev/null +++ b/examples/iec61850_sv_client_example/Makefile @@ -0,0 +1,17 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = sv_client_example +PROJECT_SOURCES = sv_client_example.c + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) diff --git a/examples/iec61850_sv_client_example/sv_client_example.c b/examples/iec61850_sv_client_example/sv_client_example.c new file mode 100644 index 00000000..7da1e81c --- /dev/null +++ b/examples/iec61850_sv_client_example/sv_client_example.c @@ -0,0 +1,74 @@ +/* + * sv_client_example.c + * + * This example is intended to show how SV control blocks are accessed + */ + +#include "iec61850_client.h" + +#include +#include + +#include "hal_thread.h" + + +int main(int argc, char** argv) { + + char* hostname; + int tcpPort = 102; + + if (argc > 1) + hostname = argv[1]; + else + hostname = "localhost"; + + if (argc > 2) + tcpPort = atoi(argv[2]); + + IedClientError error; + + IedConnection con = IedConnection_create(); + + IedConnection_connect(con, &error, hostname, tcpPort); + + if (error == IED_ERROR_OK) { + + char* svcbRef = "simpleIOGenericIO/LLN0.Volt"; + + ClientSVControlBlock svcb = ClientSVControlBlock_create(con, svcbRef); + + if (svcb != NULL) { + if (ClientSVControlBlock_isMulticast(svcb)) + printf("SVCB is multicast\n"); + else + printf("SVCB is unicast\n"); + + if (ClientSVControlBlock_setSvEna(svcb, true)) + printf("SVCB enabled\n"); + else + printf("Failed to enable SVCB\n"); + + printf("SvEna state: %i\n", ClientSVControlBlock_getSvEna(svcb)); + + char* msvID = ClientSVControlBlock_getMsvID(svcb); + + if (msvID != NULL) { + printf("MsvID: %s\n", msvID); + free(msvID); + } + + } + else { + printf("SVCB %s does not exist on server!\n", svcbRef); + } + + IedConnection_close(con); + } + else { + printf("Failed to connect to %s:%i\n", hostname, tcpPort); + } + + IedConnection_destroy(con); +} + + diff --git a/src/iec61850/common/iec61850_common.c b/src/iec61850/common/iec61850_common.c index 53f8194b..4a35256c 100644 --- a/src/iec61850/common/iec61850_common.c +++ b/src/iec61850/common/iec61850_common.c @@ -125,6 +125,10 @@ FunctionalConstraint_toString(FunctionalConstraint fc) { return "EX"; case IEC61850_FC_CO: return "CO"; + case IEC61850_FC_US: + return "US"; + case IEC61850_FC_MS: + return "MS"; default: return NULL; } diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index f0b86f81..4b9e397c 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -1,7 +1,7 @@ /* * iec61850_client.h * - * Copyright 2013, 2014 Michael Zillgith + * Copyright 2013, 2014, 2015 Michael Zillgith * * This file is part of libIEC61850. * @@ -306,6 +306,51 @@ IedConnection_getMmsConnection(IedConnection self); /** @} */ +/** + * @defgroup IEC61850_CLIENT_SV Client side SV control block handling functions + * + * @{ + */ + +/** an opaque handle to the instance data of a ClientSVControlBlock object */ +typedef struct sClientSVControlBlock* ClientSVControlBlock; + +/** + * \brief Create a new ClientSVControlBlock instance + * + * This function simplifies client side access to server MSV/USV control blocks + * NOTE: Do not use the functions after the IedConnection object is invalidated! + * + * \param connection the IedConnection object with a valid connection to the server. + * \param reference the object reference of the control block + * + * \return the new instance + */ +ClientSVControlBlock +ClientSVControlBlock_create(IedConnection connection, const char* reference); + +/** + * \brief Free all resources related to the ClientSVControlBlock instance. + * + * \param self the ClientSVControlBlock instance to operate on + */ +void +ClientSVControlBlock_destroy(ClientSVControlBlock self); + +bool +ClientSVControlBlock_isMulticast(ClientSVControlBlock self); + +bool +ClientSVControlBlock_setSvEna(ClientSVControlBlock self, bool svEna); + +bool +ClientSVControlBlock_getSvEna(ClientSVControlBlock self); + +char* +ClientSVControlBlock_getMsvID(ClientSVControlBlock self); + +/** @} */ + /** * @defgroup IEC61850_CLIENT_GOOSE Client side GOOSE control block handling functions * diff --git a/src/iec61850/inc/iec61850_common.h b/src/iec61850/inc/iec61850_common.h index c3d3bc65..0ff91892 100644 --- a/src/iec61850/inc/iec61850_common.h +++ b/src/iec61850/inc/iec61850_common.h @@ -217,6 +217,11 @@ typedef enum eFunctionalConstraint { IEC61850_FC_EX = 11, /** Control */ IEC61850_FC_CO = 12, + /** Unicast SV */ + IEC61850_FC_US = 13, + /** Multicast SV */ + IEC61850_FC_MS = 14, + IEC61850_FC_ALL = 99, IEC61850_FC_NONE = -1 } FunctionalConstraint; diff --git a/src/iec61850/inc_private/mms_sv.h b/src/iec61850/inc_private/mms_sv.h index 6f59a374..f868d75f 100644 --- a/src/iec61850/inc_private/mms_sv.h +++ b/src/iec61850/inc_private/mms_sv.h @@ -40,4 +40,8 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, MmsValue* LIBIEC61850_SV_readAccessSampledValueControlBlock(MmsMapping* self, MmsDomain* domain, char* variableIdOrig); +MmsDataAccessError +LIBIEC61850_SV_writeAccessSVControlBlock(MmsMapping* self, MmsDomain* domain, char* variableIdOrig, + MmsValue* value, MmsServerConnection connection); + #endif /* LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ */ diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 7e873698..5acf1e79 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1691,17 +1691,19 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, #endif /* (CONFIG_IEC61850_CONTROL_SERVICE == 1) */ #if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) + /* Goose control block - GO */ - if (isGooseControlBlock(separator)) { + if (isGooseControlBlock(separator)) return writeAccessGooseControlBlock(self, domain, variableId, value); - } + #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ #if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + /* Sampled Value control block - MS/US */ - if (isSampledValueControlBlock(separator)) { - //TODO handle write access to SVCB - } + if (isSampledValueControlBlock(separator)) + return LIBIEC61850_SV_writeAccessSVControlBlock(self, domain, variableId, value, connection); + #endif /* (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) */ diff --git a/src/iec61850/server/mms_mapping/mms_sv.c b/src/iec61850/server/mms_mapping/mms_sv.c index c4f1c1ce..29ddefd3 100644 --- a/src/iec61850/server/mms_mapping/mms_sv.c +++ b/src/iec61850/server/mms_mapping/mms_sv.c @@ -36,7 +36,9 @@ struct sMmsSampledValueControlBlock { char* name; + bool svEna; + MmsServerConnection reservedByClient; char* dstAddress; @@ -46,7 +48,8 @@ struct sMmsSampledValueControlBlock { MmsVariableSpecification* mmsType; MmsValue* mmsValue; - //MmsMapping* mmsMapping; + MmsValue* svEnaValue; + MmsValue* resvValue; }; MmsSampledValueControlBlock @@ -88,6 +91,109 @@ lookupSVCB(MmsMapping* self, MmsDomain* domain, char* lnName, char* objectName) return NULL; } +static void +MmsSampledValueControlBlock_enable(MmsSampledValueControlBlock self) +{ + //TODO call application callback handler + self->svEna = true; + MmsValue_setBoolean(self->svEnaValue, true); +} + +static void +MmsSampledValueControlBlock_disable(MmsSampledValueControlBlock self) +{ + //TODO call application callback handler + self->svEna = false; + MmsValue_setBoolean(self->svEnaValue, false); +} + +static bool +MmsSampledValueControlBlock_isEnabled(MmsSampledValueControlBlock self) +{ + return self->svEna; +} + +MmsDataAccessError +LIBIEC61850_SV_writeAccessSVControlBlock(MmsMapping* self, MmsDomain* domain, char* variableIdOrig, + MmsValue* value, MmsServerConnection connection) +{ + char variableId[130]; + + strncpy(variableId, variableIdOrig, 129); + + char* separator = strchr(variableId, '$'); + + *separator = 0; + + char* lnName = variableId; + + if (lnName == NULL) + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + + char* objectName = MmsMapping_getNextNameElement(separator + 1); + + if (objectName == NULL) + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + + char* varName = MmsMapping_getNextNameElement(objectName); + + if (varName != NULL) + *(varName - 1) = 0; + else + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + + MmsSampledValueControlBlock mmsSVCB = lookupSVCB(self, domain, lnName, objectName); + + if (mmsSVCB == NULL) + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + + if (mmsSVCB->reservedByClient != NULL) { + if (mmsSVCB->reservedByClient != connection) + return DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; + } + + if (strcmp(varName, "Resv") == 0) { + if (MmsValue_getType(value) != MMS_BOOLEAN) + return DATA_ACCESS_ERROR_TYPE_INCONSISTENT; + + if (MmsValue_getBoolean(value)) { + mmsSVCB->reservedByClient = connection; + MmsValue_setBoolean(mmsSVCB->resvValue, true); + } + else { + mmsSVCB->reservedByClient = NULL; + MmsValue_setBoolean(mmsSVCB->resvValue, false); + } + + return DATA_ACCESS_ERROR_SUCCESS; + } + else if (strcmp(varName, "SvEna") == 0) { + if (MmsValue_getType(value) != MMS_BOOLEAN) + return DATA_ACCESS_ERROR_TYPE_INCONSISTENT; + + if (MmsValue_getBoolean(value)) + MmsSampledValueControlBlock_enable(mmsSVCB); + else + MmsSampledValueControlBlock_disable(mmsSVCB); + + return DATA_ACCESS_ERROR_SUCCESS; + } + else { + if (MmsSampledValueControlBlock_isEnabled(mmsSVCB)) + return DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; + else { + bool allowAccess = false; + + // In 61850-9-2 mapping only Resv and SvEna are writable! + + if (allowAccess) + return DATA_ACCESS_ERROR_SUCCESS; + else + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + + } + } +} MmsValue* LIBIEC61850_SV_readAccessSampledValueControlBlock(MmsMapping* self, MmsDomain* domain, char* variableIdOrig) @@ -284,12 +390,18 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, namedVariable->typeSpec.structure.elements[currentSVCB] = svTypeSpec; - int currentIndex; + int currentIndex = 0; + + /* SvEna */ + MmsValue* svEna = MmsValue_getElement(svValues, currentIndex++); + + MmsValue* resv = NULL; + + if (unicast) { + /* Resv */ + resv = MmsValue_getElement(svValues, currentIndex++); + } - if (unicast) - currentIndex = 2; - else - currentIndex = 1; /* SvID */ MmsValue* svID = MmsValue_getElement(svValues, currentIndex++); @@ -353,6 +465,8 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, MmsSampledValueControlBlock mmsSvCb = MmsSampledValueControlBlock_create(); mmsSvCb->mmsValue = svValues; + mmsSvCb->svEnaValue = svEna; + mmsSvCb->resvValue = resv; mmsSvCb->mmsType = svTypeSpec; mmsSvCb->domain = domain; mmsSvCb->logicalNode = logicalNode; From c3dace4150c17f1e1dfaf29a8ca3f730418f37f2 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 12 Nov 2015 18:56:14 +0100 Subject: [PATCH 06/33] - fixed problem in MmsValue_printToBuffer - extended ClientControlBlock --- .../sv_client_example.c | 29 ++++++ src/iec61850/inc/iec61850_client.h | 90 +++++++++++++++++++ src/iec61850/server/mms_mapping/mms_sv.c | 14 ++- src/mms/inc/mms_value.h | 12 +++ src/mms/iso_mms/common/mms_value.c | 72 +++++++++++++-- 5 files changed, 208 insertions(+), 9 deletions(-) diff --git a/examples/iec61850_sv_client_example/sv_client_example.c b/examples/iec61850_sv_client_example/sv_client_example.c index 7da1e81c..1a09384b 100644 --- a/examples/iec61850_sv_client_example/sv_client_example.c +++ b/examples/iec61850_sv_client_example/sv_client_example.c @@ -57,6 +57,35 @@ int main(int argc, char** argv) { free(msvID); } + char* datSetName = ClientSVControlBlock_getDatSet(svcb); + + if (datSetName != NULL) { + printf("DatSet: %s\n", datSetName); + free(datSetName); + } + + printf("ConfRev: %i\n", ClientSVControlBlock_getConfRev(svcb)); + printf("SmpRate: %i\n", ClientSVControlBlock_getSmpRate(svcb)); + printf("SmpMod: %i\n", ClientSVControlBlock_getSmpMod(svcb)); + + int optFlds = ClientSVControlBlock_getOptFlds(svcb); + + printf("OptFlds: "); + if (optFlds & IEC61850_SV_OPT_REFRESH_TIME) + printf("refresh-time "); + if (optFlds & IEC61850_SV_OPT_SAMPLE_SYNC) + printf("sample-synch "); + if (optFlds & IEC61850_SV_OPT_SAMPLE_RATE) + printf("sample-rate "); + if (optFlds & IEC61850_SV_OPT_DATA_SET) + printf("date-set "); + if (optFlds & IEC61850_SV_OPT_SECURITY) + printf("security "); + printf("\n"); + + printf("noASDU: %i\n", ClientSVControlBlock_getNoASDU(svcb)); + + } else { printf("SVCB %s does not exist on server!\n", svcbRef); diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 4b9e397c..027c928d 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -312,9 +312,31 @@ IedConnection_getMmsConnection(IedConnection self); * @{ */ +/** SV ASDU contains attribute RefrTm */ +#define IEC61850_SV_OPT_REFRESH_TIME 1 + +/** SV ASDU contains attribute SmpSynch */ +#define IEC61850_SV_OPT_SAMPLE_SYNC 2 + +/** SV ASDU contains attribute SmpRate */ +#define IEC61850_SV_OPT_SAMPLE_RATE 4 + +/** SV ASDU contains attribute DatSet */ +#define IEC61850_SV_OPT_DATA_SET 8 + +/** SV ASDU contains attribute Security */ +#define IEC61850_SV_OPT_SECURITY 16 + /** an opaque handle to the instance data of a ClientSVControlBlock object */ typedef struct sClientSVControlBlock* ClientSVControlBlock; +typedef struct { + uint8_t addr[6]; + uint8_t priority; + uint16_t vid; + uint16_t appId; +} DstAddress; + /** * \brief Create a new ClientSVControlBlock instance * @@ -340,15 +362,83 @@ ClientSVControlBlock_destroy(ClientSVControlBlock self); bool ClientSVControlBlock_isMulticast(ClientSVControlBlock self); +/** + * \brief Return the error code of the last write or write acccess to the SVCB + * + * \param self the ClientSVControlBlock instance to operate on + * + * \return the error code of the last read or write access + */ +IedClientError +ClientSVControlBlock_getLastError(ClientSVControlBlock self); + + bool ClientSVControlBlock_setSvEna(ClientSVControlBlock self, bool svEna); bool ClientSVControlBlock_getSvEna(ClientSVControlBlock self); +bool +ClientSVControlBlock_setResv(ClientSVControlBlock self, bool svEna); + char* ClientSVControlBlock_getMsvID(ClientSVControlBlock self); +/** + * \brief Get the (MMS) reference to the data set + * + * NOTE: the returned string is dynamically allocated with the + * GLOBAL_MALLOC macro. The application is responsible to release + * the memory when the string is no longer needed. + * + * \param self the ClientSVControlBlock instance to operate on + * + * \return the data set reference as a NULL terminated string + */ +char* +ClientSVControlBlock_getDatSet(ClientSVControlBlock self); + +uint32_t +ClientSVControlBlock_getConfRev(ClientSVControlBlock self); + +uint16_t +ClientSVControlBlock_getSmpRate(ClientSVControlBlock self); + + +/** + * \brief returns the destination address of the SV publisher + * + * \param self the ClientSVControlBlock instance to operate on + */ +DstAddress +ClientSVControlBlock_getDstAddress(ClientSVControlBlock self); + +/** + * \brief returns the OptFlds bit string as integer + * + * \param self the ClientSVControlBlock instance to operate on + */ +int +ClientSVControlBlock_getOptFlds(ClientSVControlBlock self); + +/** + * \brief returns number of sample mode of the SV publisher + * + * \param self the ClientSVControlBlock instance to operate on + */ +uint8_t +ClientSVControlBlock_getSmpMod(ClientSVControlBlock self); + +/** + * \brief returns number of ASDUs included in the SV message + * + * \param self the ClientSVControlBlock instance to operate on + */ +int +ClientSVControlBlock_getNoASDU(ClientSVControlBlock self); + + /** @} */ /** diff --git a/src/iec61850/server/mms_mapping/mms_sv.c b/src/iec61850/server/mms_mapping/mms_sv.c index 29ddefd3..49ca4817 100644 --- a/src/iec61850/server/mms_mapping/mms_sv.c +++ b/src/iec61850/server/mms_mapping/mms_sv.c @@ -358,7 +358,11 @@ createSVControlBlockMmsStructure(char* gcbName, bool isUnicast) return gcb; } - +static void +createDataSetReference(char* buffer, char* domainName, char* lnName, char* dataSetName) +{ + StringUtils_createStringInBuffer(buffer, 5, domainName, "/", lnName, "$", dataSetName); +} MmsVariableSpecification* LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, @@ -380,6 +384,8 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, int currentSVCB = 0; + char dataRefBuffer[130]; + while (currentSVCB < svCount) { SVControlBlock* svControlBlock = getSVCBForLogicalNodeWithIndex( self, logicalNode, currentSVCB, unicast); @@ -409,7 +415,11 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, /* DatSet */ MmsValue* dataSetRef = MmsValue_getElement(svValues, currentIndex++); - MmsValue_setVisibleString(dataSetRef, svControlBlock->dataSetName); + + createDataSetReference(dataRefBuffer, MmsDomain_getName(domain), + logicalNode->name, svControlBlock->dataSetName); + + MmsValue_setVisibleString(dataSetRef, dataRefBuffer); /* ConfRev */ MmsValue* confRev = MmsValue_getElement(svValues, currentIndex++); diff --git a/src/mms/inc/mms_value.h b/src/mms/inc/mms_value.h index 0a8aeb8a..235cbb62 100644 --- a/src/mms/inc/mms_value.h +++ b/src/mms/inc/mms_value.h @@ -935,6 +935,18 @@ MmsValue_getSubElement(MmsValue* self, MmsVariableSpecification* varSpec, char* char* MmsValue_getTypeString(MmsValue* self); +/** + * \brief create a string representation of the MmsValue object in the provided buffer + * + * NOTE: This function is for debugging purposes only. It may not be aimed to be used + * in embedded systems. It requires a full featured snprintf function. + * + * \param self the MmsValue instance + * \param buffer the buffer where to copy the string representation + * \param bufferSize the size of the provided buffer + * + * \return a pointer to the start of the buffer + */ char* MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize); diff --git a/src/mms/iso_mms/common/mms_value.c b/src/mms/iso_mms/common/mms_value.c index 8c9492a4..9ecc61c2 100644 --- a/src/mms/iso_mms/common/mms_value.c +++ b/src/mms/iso_mms/common/mms_value.c @@ -1,7 +1,7 @@ /* * MmsValue.c * - * Copyright 2013 Michael Zillgith + * Copyright 2013-2015 Michael Zillgith * * This file is part of libIEC61850. * @@ -1968,6 +1968,22 @@ MmsValue_getTypeString(MmsValue* self) } } + +static void +msTimeToGeneralizedTime(uint64_t msTime, uint8_t* buffer, size_t bufferSize) +{ + time_t unixTime = (msTime / 1000); + + struct tm tmTime; + + int msPart = (msTime % 1000); + gmtime_r(&unixTime, &tmTime); + + snprintf((char*) buffer, bufferSize, "%04d%02d%02d%02d%02d%02d.%03dZ", tmTime.tm_year + 1900, tmTime.tm_mon + 1, + tmTime.tm_mday, tmTime.tm_hour, tmTime.tm_min, tmTime.tm_sec, msPart); +} + + char* MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize) { @@ -1995,19 +2011,32 @@ MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize) } } - buffer[bufPos++] = '}'; - buffer[bufPos] = 0; + if (bufPos < (bufferSize - 1)) { + buffer[bufPos++] = '}'; + buffer[bufPos] = 0; + } + else + buffer[bufferSize - 1] = 0; + } break; + case MMS_BINARY_TIME: - Conversions_msTimeToGeneralizedTime(MmsValue_getBinaryTimeAsUtcMs(self), (uint8_t*) buffer); + msTimeToGeneralizedTime(MmsValue_getBinaryTimeAsUtcMs(self), (uint8_t*) buffer, bufferSize); break; + case MMS_BIT_STRING: { int bufPos = 0; int size = MmsValue_getBitStringSize(self); + /* Behave like strncpy and fill buffer with zeros */ + if (size > bufferSize) { + memset(buffer, 0, bufferSize); + break; + } + int i; for (i = 0; i < size; i++) { if (MmsValue_getBitStringBit(self, i)) @@ -2018,24 +2047,40 @@ MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize) buffer[bufPos] = 0; } break; + case MMS_BOOLEAN: if (MmsValue_getBoolean(self)) strncpy(buffer, "true", bufferSize); else strncpy(buffer, "false", bufferSize); + + /* Ensure buffer is always 0 terminated */ + if (bufferSize > 0) + buffer[bufferSize - 1] = 0; + break; + case MMS_DATA_ACCESS_ERROR: snprintf(buffer, bufferSize, "error %i", self->value.dataAccessError); break; + case MMS_FLOAT: snprintf(buffer, bufferSize, "%f", MmsValue_toFloat(self)); break; - case MMS_GENERALIZED_TIME: + + case MMS_GENERALIZED_TIME: /* type not supported */ strncpy(buffer, "generalized time", bufferSize); + + /* Ensure buffer is always 0 terminated */ + if (bufferSize > 0) + buffer[bufferSize - 1] = 0; + break; + case MMS_INTEGER: snprintf(buffer, bufferSize, "%i", MmsValue_toInt32(self)); break; + case MMS_OCTET_STRING: { int size = MmsValue_getOctetStringSize(self); @@ -2049,20 +2094,33 @@ MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize) break; } } - break; + case MMS_UNSIGNED: snprintf(buffer, bufferSize, "%u", MmsValue_toUint32(self)); break; + case MMS_UTC_TIME: - Conversions_msTimeToGeneralizedTime(MmsValue_getUtcTimeInMs(self), (uint8_t*) buffer); + msTimeToGeneralizedTime(MmsValue_getUtcTimeInMs(self), (uint8_t*) buffer, bufferSize); break; + case MMS_STRING: case MMS_VISIBLE_STRING: strncpy(buffer, MmsValue_toString(self), bufferSize); + + /* Ensure buffer is always 0 terminated */ + if (bufferSize > 0) + buffer[bufferSize - 1] = 0; + break; + default: strncpy(buffer, "unknown type", bufferSize); + + /* Ensure buffer is always 0 terminated */ + if (bufferSize > 0) + buffer[bufferSize - 1] = 0; + break; } From c0174f9f3815dea360433ddd7fe050d2583aff9c Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 13 Nov 2015 17:48:19 +0100 Subject: [PATCH 07/33] - added SV subscriber and example --- CMakeLists.txt | 44 +- Makefile | 11 +- config/stack_config.h | 2 +- examples/CMakeLists.txt | 3 +- examples/Makefile | 1 + .../sv_client_example.c | 16 + examples/server_example1/static_model.c | 171 +---- examples/server_example2/static_model.c | 347 +--------- examples/server_example3/static_model.c | 2 + examples/server_example4/static_model.c | 186 +----- examples/server_example5/static_model.c | 347 +--------- .../server_example_61400_25/static_model.c | 337 +--------- .../static_model.c | 51 +- .../vmd-filestore/model.cfg | 8 +- .../server_example_control/static_model.c | 313 +-------- examples/server_example_goose/static_model.c | 276 +++----- .../server_example_setting_groups/sg_demo.icd | 2 - .../static_model.c | 96 +-- .../server_example_threadless/static_model.c | 223 ++----- examples/sv_subscriber/CMakeLists.txt | 34 + examples/sv_subscriber/Makefile | 21 + .../sv_subscriber/sv_subscriber_example.c | 73 ++ make/stack_includes.mk | 1 + src/CMakeLists.txt | 41 +- src/iec61850/common/iec61850_common.c | 2 +- src/iec61850/inc/iec61850_client.h | 6 +- src/mms/iso_mms/common/mms_value.c | 28 +- src/sampled_values/sv_subscriber.c | 621 ++++++++++++++++++ src/sampled_values/sv_subscriber.h | 326 +++++++++ src/vs/libiec61850-wo-goose.def | 17 +- src/vs/libiec61850.def | 43 +- 31 files changed, 1475 insertions(+), 2174 deletions(-) create mode 100644 examples/sv_subscriber/CMakeLists.txt create mode 100644 examples/sv_subscriber/Makefile create mode 100644 examples/sv_subscriber/sv_subscriber_example.c create mode 100644 src/sampled_values/sv_subscriber.c create mode 100644 src/sampled_values/sv_subscriber.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a4902a2b..55ccc698 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,7 @@ include_directories( ${CMAKE_CURRENT_BINARY_DIR}/config src/common/inc src/goose + src/sampled_values src/hal/inc src/iec61850/inc src/iec61850/inc_private @@ -75,27 +76,28 @@ set(API_HEADERS src/common/inc/linked_list.h src/common/inc/byte_buffer.h src/common/inc/lib_memory.h - src/iec61850/inc/iec61850_client.h - src/iec61850/inc/iec61850_common.h - src/iec61850/inc/iec61850_server.h - src/iec61850/inc/iec61850_model.h - src/iec61850/inc/iec61850_cdc.h - src/iec61850/inc/iec61850_dynamic_model.h - src/iec61850/inc/iec61850_config_file_parser.h - src/mms/inc/mms_value.h - src/mms/inc/mms_common.h - src/mms/inc/mms_types.h - src/mms/inc/mms_device_model.h - src/mms/inc/mms_server.h - src/mms/inc/mms_named_variable_list.h - src/mms/inc/mms_type_spec.h - src/mms/inc/mms_client_connection.h - src/mms/inc/iso_connection_parameters.h - src/mms/inc/iso_server.h - src/mms/inc/ber_integer.h - src/mms/inc/asn1_ber_primitive_value.h - src/goose/goose_subscriber.h - src/goose/goose_receiver.h + src/iec61850/inc/iec61850_client.h + src/iec61850/inc/iec61850_common.h + src/iec61850/inc/iec61850_server.h + src/iec61850/inc/iec61850_model.h + src/iec61850/inc/iec61850_cdc.h + src/iec61850/inc/iec61850_dynamic_model.h + src/iec61850/inc/iec61850_config_file_parser.h + src/mms/inc/mms_value.h + src/mms/inc/mms_common.h + src/mms/inc/mms_types.h + src/mms/inc/mms_device_model.h + src/mms/inc/mms_server.h + src/mms/inc/mms_named_variable_list.h + src/mms/inc/mms_type_spec.h + src/mms/inc/mms_client_connection.h + src/mms/inc/iso_connection_parameters.h + src/mms/inc/iso_server.h + src/mms/inc/ber_integer.h + src/mms/inc/asn1_ber_primitive_value.h + src/goose/goose_subscriber.h + src/goose/goose_receiver.h + src/sampled_values/sv_subscriber.h ) IF(WIN32) diff --git a/Makefile b/Makefile index 816d55fc..aa8f5bad 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ LIB_SOURCE_DIRS += src/mms/iso_mms/asn1c LIB_SOURCE_DIRS += src/mms/iso_server ifndef EXCLUDE_ETHERNET_WINDOWS LIB_SOURCE_DIRS += src/goose +LIB_SOURCE_DIRS += src/sampled_values endif LIB_SOURCE_DIRS += src/iec61850/client LIB_SOURCE_DIRS += src/iec61850/common @@ -45,13 +46,14 @@ LIB_SOURCE_DIRS += src/hal/ethernet/bsd LIB_SOURCE_DIRS += src/hal/filesystem/linux LIB_SOURCE_DIRS += src/hal/time/unix endif -LIB_INCLUDE_DIRS += config +LIB_INCLUDE_DIRS += config LIB_INCLUDE_DIRS += src/common/inc LIB_INCLUDE_DIRS += src/mms/iso_mms/asn1c LIB_INCLUDE_DIRS += src/mms/inc -LIB_INCLUDE_DIRS += src/mms/inc_private -LIB_INCLUDE_DIRS += src/hal/inc -LIB_INCLUDE_DIRS += src/goose +LIB_INCLUDE_DIRS += src/mms/inc_private +LIB_INCLUDE_DIRS += src/hal/inc +LIB_INCLUDE_DIRS += src/goose +LIB_INCLUDE_DIRS += src/sampled_values LIB_INCLUDE_DIRS += src/iec61850/inc LIB_INCLUDE_DIRS += src/iec61850/inc_private ifeq ($(HAL_IMPL), WIN32) @@ -92,6 +94,7 @@ LIB_API_HEADER_FILES += src/mms/inc/ber_integer.h LIB_API_HEADER_FILES += src/mms/inc/asn1_ber_primitive_value.h LIB_API_HEADER_FILES += src/goose/goose_subscriber.h LIB_API_HEADER_FILES += src/goose/goose_receiver.h +LIB_API_HEADER_FILES += src/sampled_values/sv_subscriber.h get_sources_from_directory = $(wildcard $1/*.c) get_sources = $(foreach dir, $1, $(call get_sources_from_directory,$(dir))) diff --git a/config/stack_config.h b/config/stack_config.h index e6a12ed1..3117ad9d 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -18,7 +18,7 @@ #define DEBUG_ISO_SERVER 0 #define DEBUG_ISO_CLIENT 0 #define DEBUG_IED_SERVER 0 -#define DEBUG_IED_CLIENT 0 +#define DEBUG_IED_CLIENT 1 #define DEBUG_MMS_CLIENT 0 #define DEBUG_MMS_SERVER 0 #define DEBUG_GOOSE_SUBSCRIBER 0 diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5bc51cf5..8e0f41dd 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -18,8 +18,9 @@ add_subdirectory(iec61850_client_example4) add_subdirectory(iec61850_client_example5) add_subdirectory(iec61850_client_example_files) add_subdirectory(iec61850_client_example_reporting) -add_subdirectory(goose_subscriber) add_subdirectory(mms_client_example1) add_subdirectory(mms_client_example2) add_subdirectory(mms_client_example3) add_subdirectory(mms_client_example4) +add_subdirectory(goose_subscriber) +add_subdirectory(sv_subscriber) diff --git a/examples/Makefile b/examples/Makefile index 61f781e8..b5f20397 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -25,6 +25,7 @@ EXAMPLE_DIRS += server_example_threadless EXAMPLE_DIRS += server_example_setting_groups EXAMPLE_DIRS += goose_subscriber EXAMPLE_DIRS += goose_publisher +EXAMPLE_DIRS += sv_subscriber EXAMPLE_DIRS += mms_utility MODEL_DIRS += server_example1 diff --git a/examples/iec61850_sv_client_example/sv_client_example.c b/examples/iec61850_sv_client_example/sv_client_example.c index 1a09384b..1ffe8aee 100644 --- a/examples/iec61850_sv_client_example/sv_client_example.c +++ b/examples/iec61850_sv_client_example/sv_client_example.c @@ -11,6 +11,19 @@ #include "hal_thread.h" +static void +printDstAddr(DstAddress dstAddress) +{ + printf(" addr: "); + + int i; + for (i = 0; i < 6; i++) + printf("%02x", dstAddress.addr[i]); + + printf("\n prio: %u\n", dstAddress.priority); + printf(" vid: %u\n", dstAddress.vid); + printf(" appID: %u\n", dstAddress.appId); +} int main(int argc, char** argv) { @@ -85,6 +98,9 @@ int main(int argc, char** argv) { printf("noASDU: %i\n", ClientSVControlBlock_getNoASDU(svcb)); + DstAddress dstAddress = ClientSVControlBlock_getDstAddress(svcb); + + printDstAddr(dstAddress); } else { diff --git a/examples/server_example1/static_model.c b/examples/server_example1/static_model.c index c6b25442..3f4b234b 100644 --- a/examples/server_example1/static_model.c +++ b/examples/server_example1/static_model.c @@ -3,171 +3,38 @@ * * automatically generated from sampleModel_with_dataset.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_Device1; -extern LogicalNode iedModel_Device1_LLN0; -extern DataObject iedModel_Device1_LLN0_Mod; -extern DataAttribute iedModel_Device1_LLN0_Mod_q; -extern DataAttribute iedModel_Device1_LLN0_Mod_t; -extern DataAttribute iedModel_Device1_LLN0_Mod_ctlModel; -extern DataObject iedModel_Device1_LLN0_Beh; -extern DataAttribute iedModel_Device1_LLN0_Beh_stVal; -extern DataAttribute iedModel_Device1_LLN0_Beh_q; -extern DataAttribute iedModel_Device1_LLN0_Beh_t; -extern DataObject iedModel_Device1_LLN0_Health; -extern DataAttribute iedModel_Device1_LLN0_Health_stVal; -extern DataAttribute iedModel_Device1_LLN0_Health_q; -extern DataAttribute iedModel_Device1_LLN0_Health_t; -extern DataObject iedModel_Device1_LLN0_NamPlt; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_d; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Device1_LPHD1; -extern DataObject iedModel_Device1_LPHD1_PhyNam; -extern DataAttribute iedModel_Device1_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Device1_LPHD1_PhyHealth; -extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_t; -extern DataObject iedModel_Device1_LPHD1_Proxy; -extern DataAttribute iedModel_Device1_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Device1_LPHD1_Proxy_q; -extern DataAttribute iedModel_Device1_LPHD1_Proxy_t; -extern LogicalNode iedModel_Device1_DGEN1; -extern DataObject iedModel_Device1_DGEN1_Mod; -extern DataAttribute iedModel_Device1_DGEN1_Mod_q; -extern DataAttribute iedModel_Device1_DGEN1_Mod_t; -extern DataAttribute iedModel_Device1_DGEN1_Mod_ctlModel; -extern DataObject iedModel_Device1_DGEN1_Beh; -extern DataAttribute iedModel_Device1_DGEN1_Beh_stVal; -extern DataAttribute iedModel_Device1_DGEN1_Beh_q; -extern DataAttribute iedModel_Device1_DGEN1_Beh_t; -extern DataObject iedModel_Device1_DGEN1_Health; -extern DataAttribute iedModel_Device1_DGEN1_Health_stVal; -extern DataAttribute iedModel_Device1_DGEN1_Health_q; -extern DataAttribute iedModel_Device1_DGEN1_Health_t; -extern DataObject iedModel_Device1_DGEN1_NamPlt; -extern DataAttribute iedModel_Device1_DGEN1_NamPlt_vendor; -extern DataAttribute iedModel_Device1_DGEN1_NamPlt_swRev; -extern DataAttribute iedModel_Device1_DGEN1_NamPlt_d; -extern DataObject iedModel_Device1_DGEN1_OpTmh; -extern DataAttribute iedModel_Device1_DGEN1_OpTmh_stVal; -extern DataAttribute iedModel_Device1_DGEN1_OpTmh_q; -extern DataAttribute iedModel_Device1_DGEN1_OpTmh_t; -extern DataObject iedModel_Device1_DGEN1_GnOpSt; -extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_stVal; -extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_q; -extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_t; -extern DataObject iedModel_Device1_DGEN1_OpTmsRs; -extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_stVal; -extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_q; -extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_t; -extern DataObject iedModel_Device1_DGEN1_TotWh; -extern DataAttribute iedModel_Device1_DGEN1_TotWh_mag; -extern DataAttribute iedModel_Device1_DGEN1_TotWh_mag_f; -extern DataAttribute iedModel_Device1_DGEN1_TotWh_q; -extern DataAttribute iedModel_Device1_DGEN1_TotWh_t; -extern LogicalNode iedModel_Device1_DSCH1; -extern DataObject iedModel_Device1_DSCH1_Mod; -extern DataAttribute iedModel_Device1_DSCH1_Mod_q; -extern DataAttribute iedModel_Device1_DSCH1_Mod_t; -extern DataAttribute iedModel_Device1_DSCH1_Mod_ctlModel; -extern DataObject iedModel_Device1_DSCH1_Beh; -extern DataAttribute iedModel_Device1_DSCH1_Beh_stVal; -extern DataAttribute iedModel_Device1_DSCH1_Beh_q; -extern DataAttribute iedModel_Device1_DSCH1_Beh_t; -extern DataObject iedModel_Device1_DSCH1_Health; -extern DataAttribute iedModel_Device1_DSCH1_Health_stVal; -extern DataAttribute iedModel_Device1_DSCH1_Health_q; -extern DataAttribute iedModel_Device1_DSCH1_Health_t; -extern DataObject iedModel_Device1_DSCH1_NamPlt; -extern DataAttribute iedModel_Device1_DSCH1_NamPlt_vendor; -extern DataAttribute iedModel_Device1_DSCH1_NamPlt_swRev; -extern DataAttribute iedModel_Device1_DSCH1_NamPlt_d; -extern DataObject iedModel_Device1_DSCH1_SchdSt; -extern DataAttribute iedModel_Device1_DSCH1_SchdSt_stVal; -extern DataAttribute iedModel_Device1_DSCH1_SchdSt_q; -extern DataAttribute iedModel_Device1_DSCH1_SchdSt_t; -extern DataObject iedModel_Device1_DSCH1_SchdId; -extern DataObject iedModel_Device1_DSCH1_SchdCat; -extern DataObject iedModel_Device1_DSCH1_SchdTyp; -extern DataObject iedModel_Device1_DSCH1_SchdAbsTm; -extern DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_val; -extern DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_time; -extern LogicalNode iedModel_Device1_MMXU1; -extern DataObject iedModel_Device1_MMXU1_Mod; -extern DataAttribute iedModel_Device1_MMXU1_Mod_q; -extern DataAttribute iedModel_Device1_MMXU1_Mod_t; -extern DataAttribute iedModel_Device1_MMXU1_Mod_ctlModel; -extern DataObject iedModel_Device1_MMXU1_Beh; -extern DataAttribute iedModel_Device1_MMXU1_Beh_stVal; -extern DataAttribute iedModel_Device1_MMXU1_Beh_q; -extern DataAttribute iedModel_Device1_MMXU1_Beh_t; -extern DataObject iedModel_Device1_MMXU1_Health; -extern DataAttribute iedModel_Device1_MMXU1_Health_stVal; -extern DataAttribute iedModel_Device1_MMXU1_Health_q; -extern DataAttribute iedModel_Device1_MMXU1_Health_t; -extern DataObject iedModel_Device1_MMXU1_NamPlt; -extern DataAttribute iedModel_Device1_MMXU1_NamPlt_vendor; -extern DataAttribute iedModel_Device1_MMXU1_NamPlt_swRev; -extern DataAttribute iedModel_Device1_MMXU1_NamPlt_d; -extern LogicalNode iedModel_Device1_MMXU2; -extern DataObject iedModel_Device1_MMXU2_Mod; -extern DataAttribute iedModel_Device1_MMXU2_Mod_q; -extern DataAttribute iedModel_Device1_MMXU2_Mod_t; -extern DataAttribute iedModel_Device1_MMXU2_Mod_ctlModel; -extern DataObject iedModel_Device1_MMXU2_Beh; -extern DataAttribute iedModel_Device1_MMXU2_Beh_stVal; -extern DataAttribute iedModel_Device1_MMXU2_Beh_q; -extern DataAttribute iedModel_Device1_MMXU2_Beh_t; -extern DataObject iedModel_Device1_MMXU2_Health; -extern DataAttribute iedModel_Device1_MMXU2_Health_stVal; -extern DataAttribute iedModel_Device1_MMXU2_Health_q; -extern DataAttribute iedModel_Device1_MMXU2_Health_t; -extern DataObject iedModel_Device1_MMXU2_NamPlt; -extern DataAttribute iedModel_Device1_MMXU2_NamPlt_vendor; -extern DataAttribute iedModel_Device1_MMXU2_NamPlt_swRev; -extern DataAttribute iedModel_Device1_MMXU2_NamPlt_d; -extern DataObject iedModel_Device1_MMXU2_TotW; -extern DataAttribute iedModel_Device1_MMXU2_TotW_mag; -extern DataAttribute iedModel_Device1_MMXU2_TotW_mag_f; -extern DataAttribute iedModel_Device1_MMXU2_TotW_q; -extern DataAttribute iedModel_Device1_MMXU2_TotW_t; - -extern DataSet ds_Device1_LLN0_dataset1; - - -extern DataSetEntry ds_Device1_LLN0_dataset1_fcda0; -extern DataSetEntry ds_Device1_LLN0_dataset1_fcda1; -extern DataSetEntry ds_Device1_LLN0_dataset1_fcda2; - -DataSetEntry ds_Device1_LLN0_dataset1_fcda0 = { + +extern DataSet iedModelds_Device1_LLN0_dataset1; + + +extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda0; +extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda1; +extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda2; + +DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda0 = { "Device1", false, "LLN0$ST$Mod$q", -1, NULL, NULL, - &ds_Device1_LLN0_dataset1_fcda1 + &iedModelds_Device1_LLN0_dataset1_fcda1 }; -DataSetEntry ds_Device1_LLN0_dataset1_fcda1 = { +DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda1 = { "Device1", false, "MMXU1$ST$Mod$q", -1, NULL, NULL, - &ds_Device1_LLN0_dataset1_fcda2 + &iedModelds_Device1_LLN0_dataset1_fcda2 }; -DataSetEntry ds_Device1_LLN0_dataset1_fcda2 = { +DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda2 = { "Device1", false, "MMXU1$CF$Mod$ctlModel", @@ -177,11 +44,11 @@ DataSetEntry ds_Device1_LLN0_dataset1_fcda2 = { NULL }; -DataSet ds_Device1_LLN0_dataset1 = { +DataSet iedModelds_Device1_LLN0_dataset1 = { "Device1", "LLN0$dataset1", 3, - &ds_Device1_LLN0_dataset1_fcda0, + &iedModelds_Device1_LLN0_dataset1_fcda0, NULL }; @@ -1723,7 +1590,8 @@ DataAttribute iedModel_Device1_MMXU2_TotW_t = { extern ReportControlBlock iedModel_Device1_LLN0_report0; -ReportControlBlock iedModel_Device1_LLN0_report0 = {&iedModel_Device1_LLN0, "LLN0_Events_BuffRep01", "LLN0$RP$brcbEV1", true, "dataset1", 1, 9, 239, 50, 900000, NULL}; +ReportControlBlock iedModel_Device1_LLN0_report0 = {&iedModel_Device1_LLN0, "LLN0_Events_BuffRep01", "LLN0$RP$brcbEV1", true, "dataset1", 1, 25, 239, 50, 900000, NULL}; + @@ -1731,10 +1599,11 @@ ReportControlBlock iedModel_Device1_LLN0_report0 = {&iedModel_Device1_LLN0, "LLN IedModel iedModel = { "SampleIED", &iedModel_Device1, - &ds_Device1_LLN0_dataset1, + &iedModelds_Device1_LLN0_dataset1, &iedModel_Device1_LLN0_report0, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/server_example2/static_model.c b/examples/server_example2/static_model.c index ae61c9d5..2e935caf 100644 --- a/examples/server_example2/static_model.c +++ b/examples/server_example2/static_model.c @@ -3,357 +3,60 @@ * * automatically generated from complexModel.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_Inverter; -extern LogicalNode iedModel_Inverter_LLN0; -extern DataObject iedModel_Inverter_LLN0_Mod; -extern DataAttribute iedModel_Inverter_LLN0_Mod_q; -extern DataAttribute iedModel_Inverter_LLN0_Mod_t; -extern DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel; -extern DataObject iedModel_Inverter_LLN0_Beh; -extern DataAttribute iedModel_Inverter_LLN0_Beh_stVal; -extern DataAttribute iedModel_Inverter_LLN0_Beh_q; -extern DataAttribute iedModel_Inverter_LLN0_Beh_t; -extern DataObject iedModel_Inverter_LLN0_Health; -extern DataAttribute iedModel_Inverter_LLN0_Health_stVal; -extern DataAttribute iedModel_Inverter_LLN0_Health_q; -extern DataAttribute iedModel_Inverter_LLN0_Health_t; -extern DataObject iedModel_Inverter_LLN0_NamPlt; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_d; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Inverter_LPHD1; -extern DataObject iedModel_Inverter_LPHD1_PhyNam; -extern DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Inverter_LPHD1_PhyHealth; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t; -extern DataObject iedModel_Inverter_LPHD1_Proxy; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_q; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_t; -extern LogicalNode iedModel_Inverter_ZINV1; -extern DataObject iedModel_Inverter_ZINV1_Mod; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_q; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_t; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel; -extern DataObject iedModel_Inverter_ZINV1_Beh; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_stVal; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_q; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_t; -extern DataObject iedModel_Inverter_ZINV1_Health; -extern DataAttribute iedModel_Inverter_ZINV1_Health_stVal; -extern DataAttribute iedModel_Inverter_ZINV1_Health_q; -extern DataAttribute iedModel_Inverter_ZINV1_Health_t; -extern DataObject iedModel_Inverter_ZINV1_NamPlt; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_d; -extern DataObject iedModel_Inverter_ZINV1_WRtg; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_VarRtg; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_ACTyp; -extern DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal; -extern DataObject iedModel_Inverter_ZINV1_OutWSet; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_OutVarSet; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit; -extern LogicalNode iedModel_Inverter_MMXU1; -extern DataObject iedModel_Inverter_MMXU1_Mod; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_q; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_t; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel; -extern DataObject iedModel_Inverter_MMXU1_Beh; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_stVal; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_q; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_t; -extern DataObject iedModel_Inverter_MMXU1_Health; -extern DataAttribute iedModel_Inverter_MMXU1_Health_stVal; -extern DataAttribute iedModel_Inverter_MMXU1_Health_q; -extern DataAttribute iedModel_Inverter_MMXU1_Health_t; -extern DataObject iedModel_Inverter_MMXU1_NamPlt; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_d; -extern DataObject iedModel_Inverter_MMXU1_TotW; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_t; -extern DataObject iedModel_Inverter_MMXU1_TotVAr; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_t; -extern DataObject iedModel_Inverter_MMXU1_TotVA; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_t; -extern DataObject iedModel_Inverter_MMXU1_Hz; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_q; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_t; -extern DataObject iedModel_Inverter_MMXU1_PhV; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_neut; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t; -extern DataObject iedModel_Inverter_MMXU1_A; -extern DataObject iedModel_Inverter_MMXU1_A_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_A_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_A_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_t; -extern DataObject iedModel_Inverter_MMXU1_A_neut; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_t; -extern DataObject iedModel_Inverter_MMXU1_W; -extern DataObject iedModel_Inverter_MMXU1_W_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_W_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_W_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_t; -extern LogicalDevice iedModel_Battery; -extern LogicalNode iedModel_Battery_LLN0; -extern DataObject iedModel_Battery_LLN0_Mod; -extern DataAttribute iedModel_Battery_LLN0_Mod_q; -extern DataAttribute iedModel_Battery_LLN0_Mod_t; -extern DataAttribute iedModel_Battery_LLN0_Mod_ctlModel; -extern DataObject iedModel_Battery_LLN0_Beh; -extern DataAttribute iedModel_Battery_LLN0_Beh_stVal; -extern DataAttribute iedModel_Battery_LLN0_Beh_q; -extern DataAttribute iedModel_Battery_LLN0_Beh_t; -extern DataObject iedModel_Battery_LLN0_Health; -extern DataAttribute iedModel_Battery_LLN0_Health_stVal; -extern DataAttribute iedModel_Battery_LLN0_Health_q; -extern DataAttribute iedModel_Battery_LLN0_Health_t; -extern DataObject iedModel_Battery_LLN0_NamPlt; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_d; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Battery_LPHD1; -extern DataObject iedModel_Battery_LPHD1_PhyNam; -extern DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Battery_LPHD1_PhyHealth; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_t; -extern DataObject iedModel_Battery_LPHD1_Proxy; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_q; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_t; -extern LogicalNode iedModel_Battery_ZBAT1; -extern DataObject iedModel_Battery_ZBAT1_Mod; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_q; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_t; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel; -extern DataObject iedModel_Battery_ZBAT1_Beh; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_stVal; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_q; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_t; -extern DataObject iedModel_Battery_ZBAT1_Health; -extern DataAttribute iedModel_Battery_ZBAT1_Health_stVal; -extern DataAttribute iedModel_Battery_ZBAT1_Health_q; -extern DataAttribute iedModel_Battery_ZBAT1_Health_t; -extern DataObject iedModel_Battery_ZBAT1_NamPlt; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_d; -extern DataObject iedModel_Battery_ZBAT1_Vol; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_q; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_t; -extern DataObject iedModel_Battery_ZBAT1_Amp; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_q; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_t; -extern LogicalNode iedModel_Battery_ZBTC1; -extern DataObject iedModel_Battery_ZBTC1_Mod; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_q; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_t; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel; -extern DataObject iedModel_Battery_ZBTC1_Beh; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_stVal; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_q; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_t; -extern DataObject iedModel_Battery_ZBTC1_Health; -extern DataAttribute iedModel_Battery_ZBTC1_Health_stVal; -extern DataAttribute iedModel_Battery_ZBTC1_Health_q; -extern DataAttribute iedModel_Battery_ZBTC1_Health_t; -extern DataObject iedModel_Battery_ZBTC1_NamPlt; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_d; -extern DataObject iedModel_Battery_ZBTC1_BatChaSt; -extern DataObject iedModel_Battery_ZBTC1_BatChaPwr; -extern DataObject iedModel_Battery_ZBTC1_BatChaMod; -extern DataObject iedModel_Battery_ZBTC1_ChaV; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_q; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_t; -extern DataObject iedModel_Battery_ZBTC1_ChaA; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_q; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_t; -extern LogicalDevice iedModel_Physical_Measurements; -extern LogicalNode iedModel_Physical_Measurements_LLN0; -extern DataObject iedModel_Physical_Measurements_LLN0_Mod; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel; -extern DataObject iedModel_Physical_Measurements_LLN0_Beh; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t; -extern DataObject iedModel_Physical_Measurements_LLN0_Health; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_t; -extern DataObject iedModel_Physical_Measurements_LLN0_NamPlt; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Physical_Measurements_LPHD1; -extern DataObject iedModel_Physical_Measurements_LPHD1_PhyNam; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t; -extern DataObject iedModel_Physical_Measurements_LPHD1_Proxy; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t; - -extern DataSet ds_Inverter_LLN0_dataset1; - - -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda0; -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda1; -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda2; -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda3; -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda4; - -DataSetEntry ds_Inverter_LLN0_dataset1_fcda0 = { + +extern DataSet iedModelds_Inverter_LLN0_dataset1; + + +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4; + +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0 = { "Inverter", false, "LLN0$ST$Mod$q", -1, NULL, NULL, - &ds_Inverter_LLN0_dataset1_fcda1 + &iedModelds_Inverter_LLN0_dataset1_fcda1 }; -DataSetEntry ds_Inverter_LLN0_dataset1_fcda1 = { +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1 = { "Battery", false, "LLN0$ST$Mod$q", -1, NULL, NULL, - &ds_Inverter_LLN0_dataset1_fcda2 + &iedModelds_Inverter_LLN0_dataset1_fcda2 }; -DataSetEntry ds_Inverter_LLN0_dataset1_fcda2 = { +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2 = { "Inverter", false, "MMXU1$ST$Mod$q", -1, NULL, NULL, - &ds_Inverter_LLN0_dataset1_fcda3 + &iedModelds_Inverter_LLN0_dataset1_fcda3 }; -DataSetEntry ds_Inverter_LLN0_dataset1_fcda3 = { +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3 = { "Inverter", false, "MMXU1$CF$Mod$ctlModel", -1, NULL, NULL, - &ds_Inverter_LLN0_dataset1_fcda4 + &iedModelds_Inverter_LLN0_dataset1_fcda4 }; -DataSetEntry ds_Inverter_LLN0_dataset1_fcda4 = { +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4 = { "Inverter", false, "MMXU1$MX$TotW$mag", @@ -363,11 +66,11 @@ DataSetEntry ds_Inverter_LLN0_dataset1_fcda4 = { NULL }; -DataSet ds_Inverter_LLN0_dataset1 = { +DataSet iedModelds_Inverter_LLN0_dataset1 = { "Inverter", "LLN0$dataset1", 5, - &ds_Inverter_LLN0_dataset1_fcda0, + &iedModelds_Inverter_LLN0_dataset1_fcda0, NULL }; @@ -3877,7 +3580,8 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t = { extern ReportControlBlock iedModel_Inverter_LLN0_report0; -ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 3, 32, 0, 0, NULL}; +ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 19, 32, 0, 0, NULL}; + @@ -3885,10 +3589,11 @@ ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "r IedModel iedModel = { "ied1", &iedModel_Inverter, - &ds_Inverter_LLN0_dataset1, + &iedModelds_Inverter_LLN0_dataset1, &iedModel_Inverter_LLN0_report0, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/server_example3/static_model.c b/examples/server_example3/static_model.c index 8080ff9d..84faec82 100644 --- a/examples/server_example3/static_model.c +++ b/examples/server_example3/static_model.c @@ -1955,6 +1955,7 @@ ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, + IedModel iedModel = { "simpleIO", &iedModel_GenericIO, @@ -1962,6 +1963,7 @@ IedModel iedModel = { &iedModel_GenericIO_LLN0_report0, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/server_example4/static_model.c b/examples/server_example4/static_model.c index d5334bcf..c2c99bf9 100644 --- a/examples/server_example4/static_model.c +++ b/examples/server_example4/static_model.c @@ -3,191 +3,49 @@ * * automatically generated from simpleIO_direct_control.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_GenericIO; -extern LogicalNode iedModel_GenericIO_LLN0; -extern DataObject iedModel_GenericIO_LLN0_Mod; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_q; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_t; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel; -extern DataObject iedModel_GenericIO_LLN0_Beh; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_q; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_t; -extern DataObject iedModel_GenericIO_LLN0_Health; -extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Health_q; -extern DataAttribute iedModel_GenericIO_LLN0_Health_t; -extern DataObject iedModel_GenericIO_LLN0_NamPlt; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_GenericIO_LPHD1; -extern DataObject iedModel_GenericIO_LPHD1_PhyNam; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor; -extern DataObject iedModel_GenericIO_LPHD1_PhyHealth; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t; -extern DataObject iedModel_GenericIO_LPHD1_Proxy; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t; -extern LogicalNode iedModel_GenericIO_GGIO1; -extern DataObject iedModel_GenericIO_GGIO1_Mod; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_Beh; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t; -extern DataObject iedModel_GenericIO_GGIO1_Health; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_t; -extern DataObject iedModel_GenericIO_GGIO1_NamPlt; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d; -extern DataObject iedModel_GenericIO_GGIO1_AnIn1; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn2; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn3; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn4; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO1; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO3; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO4; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind1; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind2; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind3; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind4; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; - -extern DataSet ds_GenericIO_LLN0_Events; - - -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda3; - -DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = { + +extern DataSet iedModelds_GenericIO_LLN0_Events; + + +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0 = { "GenericIO", false, "GGIO1$ST$SPCSO1$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda1 + &iedModelds_GenericIO_LLN0_Events_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { "GenericIO", false, "GGIO1$ST$SPCSO2$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda2 + &iedModelds_GenericIO_LLN0_Events_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { "GenericIO", false, "GGIO1$ST$SPCSO3$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda3 + &iedModelds_GenericIO_LLN0_Events_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { "GenericIO", false, "GGIO1$ST$SPCSO4$stVal", @@ -197,11 +55,11 @@ DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { NULL }; -DataSet ds_GenericIO_LLN0_Events = { +DataSet iedModelds_GenericIO_LLN0_Events = { "GenericIO", "LLN0$Events", 4, - &ds_GenericIO_LLN0_Events_fcda0, + &iedModelds_GenericIO_LLN0_Events_fcda0, NULL }; @@ -1915,7 +1773,8 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { extern ReportControlBlock iedModel_GenericIO_LLN0_report0; -ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 8, 111, 50, 1000, NULL}; +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 111, 50, 1000, NULL}; + @@ -1923,10 +1782,11 @@ ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, IedModel iedModel = { "simpleIO", &iedModel_GenericIO, - &ds_GenericIO_LLN0_Events, + &iedModelds_GenericIO_LLN0_Events, &iedModel_GenericIO_LLN0_report0, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/server_example5/static_model.c b/examples/server_example5/static_model.c index ae61c9d5..2e935caf 100644 --- a/examples/server_example5/static_model.c +++ b/examples/server_example5/static_model.c @@ -3,357 +3,60 @@ * * automatically generated from complexModel.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_Inverter; -extern LogicalNode iedModel_Inverter_LLN0; -extern DataObject iedModel_Inverter_LLN0_Mod; -extern DataAttribute iedModel_Inverter_LLN0_Mod_q; -extern DataAttribute iedModel_Inverter_LLN0_Mod_t; -extern DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel; -extern DataObject iedModel_Inverter_LLN0_Beh; -extern DataAttribute iedModel_Inverter_LLN0_Beh_stVal; -extern DataAttribute iedModel_Inverter_LLN0_Beh_q; -extern DataAttribute iedModel_Inverter_LLN0_Beh_t; -extern DataObject iedModel_Inverter_LLN0_Health; -extern DataAttribute iedModel_Inverter_LLN0_Health_stVal; -extern DataAttribute iedModel_Inverter_LLN0_Health_q; -extern DataAttribute iedModel_Inverter_LLN0_Health_t; -extern DataObject iedModel_Inverter_LLN0_NamPlt; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_d; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Inverter_LPHD1; -extern DataObject iedModel_Inverter_LPHD1_PhyNam; -extern DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Inverter_LPHD1_PhyHealth; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t; -extern DataObject iedModel_Inverter_LPHD1_Proxy; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_q; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_t; -extern LogicalNode iedModel_Inverter_ZINV1; -extern DataObject iedModel_Inverter_ZINV1_Mod; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_q; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_t; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel; -extern DataObject iedModel_Inverter_ZINV1_Beh; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_stVal; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_q; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_t; -extern DataObject iedModel_Inverter_ZINV1_Health; -extern DataAttribute iedModel_Inverter_ZINV1_Health_stVal; -extern DataAttribute iedModel_Inverter_ZINV1_Health_q; -extern DataAttribute iedModel_Inverter_ZINV1_Health_t; -extern DataObject iedModel_Inverter_ZINV1_NamPlt; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_d; -extern DataObject iedModel_Inverter_ZINV1_WRtg; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_VarRtg; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_ACTyp; -extern DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal; -extern DataObject iedModel_Inverter_ZINV1_OutWSet; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_OutVarSet; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit; -extern LogicalNode iedModel_Inverter_MMXU1; -extern DataObject iedModel_Inverter_MMXU1_Mod; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_q; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_t; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel; -extern DataObject iedModel_Inverter_MMXU1_Beh; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_stVal; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_q; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_t; -extern DataObject iedModel_Inverter_MMXU1_Health; -extern DataAttribute iedModel_Inverter_MMXU1_Health_stVal; -extern DataAttribute iedModel_Inverter_MMXU1_Health_q; -extern DataAttribute iedModel_Inverter_MMXU1_Health_t; -extern DataObject iedModel_Inverter_MMXU1_NamPlt; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_d; -extern DataObject iedModel_Inverter_MMXU1_TotW; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_t; -extern DataObject iedModel_Inverter_MMXU1_TotVAr; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_t; -extern DataObject iedModel_Inverter_MMXU1_TotVA; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_t; -extern DataObject iedModel_Inverter_MMXU1_Hz; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_q; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_t; -extern DataObject iedModel_Inverter_MMXU1_PhV; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_neut; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t; -extern DataObject iedModel_Inverter_MMXU1_A; -extern DataObject iedModel_Inverter_MMXU1_A_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_A_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_A_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_t; -extern DataObject iedModel_Inverter_MMXU1_A_neut; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_t; -extern DataObject iedModel_Inverter_MMXU1_W; -extern DataObject iedModel_Inverter_MMXU1_W_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_W_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_W_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_t; -extern LogicalDevice iedModel_Battery; -extern LogicalNode iedModel_Battery_LLN0; -extern DataObject iedModel_Battery_LLN0_Mod; -extern DataAttribute iedModel_Battery_LLN0_Mod_q; -extern DataAttribute iedModel_Battery_LLN0_Mod_t; -extern DataAttribute iedModel_Battery_LLN0_Mod_ctlModel; -extern DataObject iedModel_Battery_LLN0_Beh; -extern DataAttribute iedModel_Battery_LLN0_Beh_stVal; -extern DataAttribute iedModel_Battery_LLN0_Beh_q; -extern DataAttribute iedModel_Battery_LLN0_Beh_t; -extern DataObject iedModel_Battery_LLN0_Health; -extern DataAttribute iedModel_Battery_LLN0_Health_stVal; -extern DataAttribute iedModel_Battery_LLN0_Health_q; -extern DataAttribute iedModel_Battery_LLN0_Health_t; -extern DataObject iedModel_Battery_LLN0_NamPlt; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_d; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Battery_LPHD1; -extern DataObject iedModel_Battery_LPHD1_PhyNam; -extern DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Battery_LPHD1_PhyHealth; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_t; -extern DataObject iedModel_Battery_LPHD1_Proxy; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_q; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_t; -extern LogicalNode iedModel_Battery_ZBAT1; -extern DataObject iedModel_Battery_ZBAT1_Mod; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_q; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_t; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel; -extern DataObject iedModel_Battery_ZBAT1_Beh; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_stVal; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_q; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_t; -extern DataObject iedModel_Battery_ZBAT1_Health; -extern DataAttribute iedModel_Battery_ZBAT1_Health_stVal; -extern DataAttribute iedModel_Battery_ZBAT1_Health_q; -extern DataAttribute iedModel_Battery_ZBAT1_Health_t; -extern DataObject iedModel_Battery_ZBAT1_NamPlt; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_d; -extern DataObject iedModel_Battery_ZBAT1_Vol; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_q; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_t; -extern DataObject iedModel_Battery_ZBAT1_Amp; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_q; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_t; -extern LogicalNode iedModel_Battery_ZBTC1; -extern DataObject iedModel_Battery_ZBTC1_Mod; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_q; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_t; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel; -extern DataObject iedModel_Battery_ZBTC1_Beh; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_stVal; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_q; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_t; -extern DataObject iedModel_Battery_ZBTC1_Health; -extern DataAttribute iedModel_Battery_ZBTC1_Health_stVal; -extern DataAttribute iedModel_Battery_ZBTC1_Health_q; -extern DataAttribute iedModel_Battery_ZBTC1_Health_t; -extern DataObject iedModel_Battery_ZBTC1_NamPlt; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_d; -extern DataObject iedModel_Battery_ZBTC1_BatChaSt; -extern DataObject iedModel_Battery_ZBTC1_BatChaPwr; -extern DataObject iedModel_Battery_ZBTC1_BatChaMod; -extern DataObject iedModel_Battery_ZBTC1_ChaV; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_q; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_t; -extern DataObject iedModel_Battery_ZBTC1_ChaA; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_q; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_t; -extern LogicalDevice iedModel_Physical_Measurements; -extern LogicalNode iedModel_Physical_Measurements_LLN0; -extern DataObject iedModel_Physical_Measurements_LLN0_Mod; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel; -extern DataObject iedModel_Physical_Measurements_LLN0_Beh; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t; -extern DataObject iedModel_Physical_Measurements_LLN0_Health; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_t; -extern DataObject iedModel_Physical_Measurements_LLN0_NamPlt; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Physical_Measurements_LPHD1; -extern DataObject iedModel_Physical_Measurements_LPHD1_PhyNam; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t; -extern DataObject iedModel_Physical_Measurements_LPHD1_Proxy; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t; - -extern DataSet ds_Inverter_LLN0_dataset1; - - -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda0; -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda1; -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda2; -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda3; -extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda4; - -DataSetEntry ds_Inverter_LLN0_dataset1_fcda0 = { + +extern DataSet iedModelds_Inverter_LLN0_dataset1; + + +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4; + +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0 = { "Inverter", false, "LLN0$ST$Mod$q", -1, NULL, NULL, - &ds_Inverter_LLN0_dataset1_fcda1 + &iedModelds_Inverter_LLN0_dataset1_fcda1 }; -DataSetEntry ds_Inverter_LLN0_dataset1_fcda1 = { +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1 = { "Battery", false, "LLN0$ST$Mod$q", -1, NULL, NULL, - &ds_Inverter_LLN0_dataset1_fcda2 + &iedModelds_Inverter_LLN0_dataset1_fcda2 }; -DataSetEntry ds_Inverter_LLN0_dataset1_fcda2 = { +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2 = { "Inverter", false, "MMXU1$ST$Mod$q", -1, NULL, NULL, - &ds_Inverter_LLN0_dataset1_fcda3 + &iedModelds_Inverter_LLN0_dataset1_fcda3 }; -DataSetEntry ds_Inverter_LLN0_dataset1_fcda3 = { +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3 = { "Inverter", false, "MMXU1$CF$Mod$ctlModel", -1, NULL, NULL, - &ds_Inverter_LLN0_dataset1_fcda4 + &iedModelds_Inverter_LLN0_dataset1_fcda4 }; -DataSetEntry ds_Inverter_LLN0_dataset1_fcda4 = { +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4 = { "Inverter", false, "MMXU1$MX$TotW$mag", @@ -363,11 +66,11 @@ DataSetEntry ds_Inverter_LLN0_dataset1_fcda4 = { NULL }; -DataSet ds_Inverter_LLN0_dataset1 = { +DataSet iedModelds_Inverter_LLN0_dataset1 = { "Inverter", "LLN0$dataset1", 5, - &ds_Inverter_LLN0_dataset1_fcda0, + &iedModelds_Inverter_LLN0_dataset1_fcda0, NULL }; @@ -3877,7 +3580,8 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t = { extern ReportControlBlock iedModel_Inverter_LLN0_report0; -ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 3, 32, 0, 0, NULL}; +ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 19, 32, 0, 0, NULL}; + @@ -3885,10 +3589,11 @@ ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "r IedModel iedModel = { "ied1", &iedModel_Inverter, - &ds_Inverter_LLN0_dataset1, + &iedModelds_Inverter_LLN0_dataset1, &iedModel_Inverter_LLN0_report0, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/server_example_61400_25/static_model.c b/examples/server_example_61400_25/static_model.c index 68f61f2f..b34a03f0 100644 --- a/examples/server_example_61400_25/static_model.c +++ b/examples/server_example_61400_25/static_model.c @@ -3,342 +3,9 @@ * * automatically generated from wtur.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_WTG; -extern LogicalNode iedModel_WTG_LLN0; -extern DataObject iedModel_WTG_LLN0_Mod; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlVal; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_operTm; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlNum; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_T; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_Test; -extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_Check; -extern DataAttribute iedModel_WTG_LLN0_Mod_stVal; -extern DataAttribute iedModel_WTG_LLN0_Mod_q; -extern DataAttribute iedModel_WTG_LLN0_Mod_t; -extern DataAttribute iedModel_WTG_LLN0_Mod_ctlModel; -extern DataObject iedModel_WTG_LLN0_Beh; -extern DataAttribute iedModel_WTG_LLN0_Beh_stVal; -extern DataAttribute iedModel_WTG_LLN0_Beh_q; -extern DataAttribute iedModel_WTG_LLN0_Beh_t; -extern DataObject iedModel_WTG_LLN0_Health; -extern DataAttribute iedModel_WTG_LLN0_Health_stVal; -extern DataAttribute iedModel_WTG_LLN0_Health_q; -extern DataAttribute iedModel_WTG_LLN0_Health_t; -extern DataObject iedModel_WTG_LLN0_NamPlt; -extern DataAttribute iedModel_WTG_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_WTG_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_WTG_LLN0_NamPlt_configRev; -extern LogicalNode iedModel_WTG_LPHD1; -extern DataObject iedModel_WTG_LPHD1_NamPlt; -extern DataAttribute iedModel_WTG_LPHD1_NamPlt_vendor; -extern DataAttribute iedModel_WTG_LPHD1_NamPlt_swRev; -extern DataAttribute iedModel_WTG_LPHD1_NamPlt_configRev; -extern DataObject iedModel_WTG_LPHD1_PhyNam; -extern DataAttribute iedModel_WTG_LPHD1_PhyNam_vendor; -extern DataAttribute iedModel_WTG_LPHD1_PhyNam_hwRev; -extern DataAttribute iedModel_WTG_LPHD1_PhyNam_swRev; -extern DataAttribute iedModel_WTG_LPHD1_PhyNam_serNum; -extern DataAttribute iedModel_WTG_LPHD1_PhyNam_model; -extern DataObject iedModel_WTG_LPHD1_PhyHealth; -extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_t; -extern DataObject iedModel_WTG_LPHD1_Proxy; -extern DataAttribute iedModel_WTG_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_WTG_LPHD1_Proxy_q; -extern DataAttribute iedModel_WTG_LPHD1_Proxy_t; -extern LogicalNode iedModel_WTG_WTUR1; -extern DataObject iedModel_WTG_WTUR1_NamPlt; -extern DataAttribute iedModel_WTG_WTUR1_NamPlt_vendor; -extern DataAttribute iedModel_WTG_WTUR1_NamPlt_swRev; -extern DataAttribute iedModel_WTG_WTUR1_NamPlt_configRev; -extern DataObject iedModel_WTG_WTUR1_TotWh; -extern DataObject iedModel_WTG_WTUR1_TotWh_manRs; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_q; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_t; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_ctlModel; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboTimeout; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboClass; -extern DataObject iedModel_WTG_WTUR1_TotWh_hisRs; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_q; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_t; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_ctlModel; -extern DataObject iedModel_WTG_WTUR1_TotWh_actCtVal; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_q; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_t; -extern DataObject iedModel_WTG_WTUR1_TotWh_oldCtVal; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_q; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_t; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_ctTot; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_dly; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_mly; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_yly; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_tot; -extern DataAttribute iedModel_WTG_WTUR1_TotWh_rsPer; -extern DataObject iedModel_WTG_WTUR1_TurSt; -extern DataObject iedModel_WTG_WTUR1_TurSt_actSt; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_t; -extern DataObject iedModel_WTG_WTUR1_TurSt_oldSt; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_t; -extern DataObject iedModel_WTG_WTUR1_TurSt_stTm; -extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_manRs; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_t; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_ctlModel; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboTimeout; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboClass; -extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_hisRs; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_t; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_ctlModel; -extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_actTmVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_t; -extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_t; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tmTot; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_dly; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_mly; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_yly; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tot; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_rsPer; -extern DataObject iedModel_WTG_WTUR1_TurSt_stCt; -extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_manRs; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_t; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_ctlModel; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboTimeout; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboClass; -extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_hisRs; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_t; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_ctlModel; -extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_actCtVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_t; -extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_q; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_t; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_ctTot; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_dly; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_mly; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_yly; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_tot; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_rsPer; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_preTmms; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_pstTmms; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_smpTmms; -extern DataAttribute iedModel_WTG_WTUR1_TurSt_datSetMx; -extern DataObject iedModel_WTG_WTUR1_W; -extern DataAttribute iedModel_WTG_WTUR1_W_instMag; -extern DataAttribute iedModel_WTG_WTUR1_W_instMag_i; -extern DataAttribute iedModel_WTG_WTUR1_W_instMag_f; -extern DataAttribute iedModel_WTG_WTUR1_W_mag; -extern DataAttribute iedModel_WTG_WTUR1_W_mag_i; -extern DataAttribute iedModel_WTG_WTUR1_W_mag_f; -extern DataAttribute iedModel_WTG_WTUR1_W_q; -extern DataAttribute iedModel_WTG_WTUR1_W_t; -extern DataObject iedModel_WTG_WTUR1_SetTurOp; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_actSt; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_t; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_ctlModel; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_oldSt; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_t; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_t; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_ctlModel; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboTimeout; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboClass; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_t; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_ctlModel; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_t; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_t; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tmTot; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_dly; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_mly; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_yly; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tot; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_rsPer; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_t; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_ctlModel; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboTimeout; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboClass; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_operTm; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orIdent; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlNum; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_T; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Test; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Check; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_t; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_ctlModel; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_t; -extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_stVal; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_q; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_t; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_ctTot; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_dly; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_mly; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_yly; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_tot; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_rsPer; -extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmAcs; @@ -4466,6 +4133,7 @@ DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmAcs = { + IedModel iedModel = { "WIND", &iedModel_WTG, @@ -4473,6 +4141,7 @@ IedModel iedModel = { NULL, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/server_example_complex_array/static_model.c b/examples/server_example_complex_array/static_model.c index 71cad7d6..3bc9396a 100644 --- a/examples/server_example_complex_array/static_model.c +++ b/examples/server_example_complex_array/static_model.c @@ -3,56 +3,9 @@ * * automatically generated from mhai_array.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_ComplexArray; -extern LogicalNode iedModel_ComplexArray_LLN0; -extern DataObject iedModel_ComplexArray_LLN0_Mod; -extern DataAttribute iedModel_ComplexArray_LLN0_Mod_q; -extern DataAttribute iedModel_ComplexArray_LLN0_Mod_t; -extern DataAttribute iedModel_ComplexArray_LLN0_Mod_ctlModel; -extern DataObject iedModel_ComplexArray_LLN0_Beh; -extern DataAttribute iedModel_ComplexArray_LLN0_Beh_stVal; -extern DataAttribute iedModel_ComplexArray_LLN0_Beh_q; -extern DataAttribute iedModel_ComplexArray_LLN0_Beh_t; -extern DataObject iedModel_ComplexArray_LLN0_Health; -extern DataAttribute iedModel_ComplexArray_LLN0_Health_stVal; -extern DataAttribute iedModel_ComplexArray_LLN0_Health_q; -extern DataAttribute iedModel_ComplexArray_LLN0_Health_t; -extern DataObject iedModel_ComplexArray_LLN0_NamPlt; -extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_d; -extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_ComplexArray_LPHD1; -extern DataObject iedModel_ComplexArray_LPHD1_PhyNam; -extern DataAttribute iedModel_ComplexArray_LPHD1_PhyNam_vendor; -extern DataObject iedModel_ComplexArray_LPHD1_PhyHealth; -extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_t; -extern DataObject iedModel_ComplexArray_LPHD1_Proxy; -extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_q; -extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_t; -extern LogicalNode iedModel_ComplexArray_MHAI1; -extern DataObject iedModel_ComplexArray_MHAI1_HA; -extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_q; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_t; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numHar; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm; -extern DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency; @@ -590,6 +543,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency = { + IedModel iedModel = { "test", &iedModel_ComplexArray, @@ -597,6 +551,7 @@ IedModel iedModel = { NULL, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/server_example_config_file/vmd-filestore/model.cfg b/examples/server_example_config_file/vmd-filestore/model.cfg index bcd616e1..58fdeaee 100644 --- a/examples/server_example_config_file/vmd-filestore/model.cfg +++ b/examples/server_example_config_file/vmd-filestore/model.cfg @@ -40,13 +40,13 @@ DE(GGIO1$MX$AnIn2); DE(GGIO1$MX$AnIn3); DE(GGIO1$MX$AnIn4); } -RC(EventsRCB01 Events 0 Events 1 8 111 50 1000); -RC(AnalogValuesRCB01 AnalogValues 0 AnalogValues 1 8 111 50 1000); +RC(EventsRCB01 Events 0 Events 1 24 111 50 1000); +RC(AnalogValuesRCB01 AnalogValues 0 AnalogValues 1 24 111 50 1000); GC(gcbEvents events Events 2 0 -1 -1 ){ -PA(4 111 1000 010ccd010001); +PA(4 273 4096 010ccd010001); } GC(gcbAnalogValues analog AnalogValues 2 0 -1 -1 ){ -PA(4 111 1000 010ccd010001); +PA(4 273 4096 010ccd010001); } } LN(LPHD1){ diff --git a/examples/server_example_control/static_model.c b/examples/server_example_control/static_model.c index 8bd02ad2..b538b20e 100644 --- a/examples/server_example_control/static_model.c +++ b/examples/server_example_control/static_model.c @@ -3,318 +3,9 @@ * * automatically generated from simpleIO_control_tests.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_GenericIO; -extern LogicalNode iedModel_GenericIO_LLN0; -extern DataObject iedModel_GenericIO_LLN0_Mod; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_q; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_t; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel; -extern DataObject iedModel_GenericIO_LLN0_Beh; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_q; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_t; -extern DataObject iedModel_GenericIO_LLN0_Health; -extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Health_q; -extern DataAttribute iedModel_GenericIO_LLN0_Health_t; -extern DataObject iedModel_GenericIO_LLN0_NamPlt; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_GenericIO_LPHD1; -extern DataObject iedModel_GenericIO_LPHD1_PhyNam; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor; -extern DataObject iedModel_GenericIO_LPHD1_PhyHealth; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t; -extern DataObject iedModel_GenericIO_LPHD1_Proxy; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t; -extern LogicalNode iedModel_GenericIO_GGIO1; -extern DataObject iedModel_GenericIO_GGIO1_Mod; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_Beh; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t; -extern DataObject iedModel_GenericIO_GGIO1_Health; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_t; -extern DataObject iedModel_GenericIO_GGIO1_NamPlt; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d; -extern DataObject iedModel_GenericIO_GGIO1_AnIn1; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn2; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn3; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn4; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO1; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_sboClass; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO3; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO4; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO5; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_operTm; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_Test; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO6; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_SBO; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_operTm; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_operTm; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO7; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_operTm; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_operTm; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO8; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_operTm; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_operTm; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_operTm; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO9; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_t; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_Ind1; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind2; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind3; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind4; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; @@ -4182,6 +3873,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { + IedModel iedModel = { "simpleIO", &iedModel_GenericIO, @@ -4189,6 +3881,7 @@ IedModel iedModel = { NULL, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/server_example_goose/static_model.c b/examples/server_example_goose/static_model.c index 64549d37..69df5e7f 100644 --- a/examples/server_example_goose/static_model.c +++ b/examples/server_example_goose/static_model.c @@ -3,192 +3,51 @@ * * automatically generated from simpleIO_direct_control_goose.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_GenericIO; -extern LogicalNode iedModel_GenericIO_LLN0; -extern DataObject iedModel_GenericIO_LLN0_Mod; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_q; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_t; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel; -extern DataObject iedModel_GenericIO_LLN0_Beh; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_q; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_t; -extern DataObject iedModel_GenericIO_LLN0_Health; -extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Health_q; -extern DataAttribute iedModel_GenericIO_LLN0_Health_t; -extern DataObject iedModel_GenericIO_LLN0_NamPlt; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_GenericIO_LPHD1; -extern DataObject iedModel_GenericIO_LPHD1_PhyNam; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor; -extern DataObject iedModel_GenericIO_LPHD1_PhyHealth; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t; -extern DataObject iedModel_GenericIO_LPHD1_Proxy; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t; -extern LogicalNode iedModel_GenericIO_GGIO1; -extern DataObject iedModel_GenericIO_GGIO1_Mod; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_Beh; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t; -extern DataObject iedModel_GenericIO_GGIO1_Health; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_t; -extern DataObject iedModel_GenericIO_GGIO1_NamPlt; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d; -extern DataObject iedModel_GenericIO_GGIO1_AnIn1; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn2; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn3; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn4; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO1; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO3; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO4; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind1; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind2; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind3; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind4; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; - -extern DataSet ds_GenericIO_LLN0_Events; -extern DataSet ds_GenericIO_LLN0_AnalogValues; - - -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda3; - -DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = { + +extern DataSet iedModelds_GenericIO_LLN0_Events; +extern DataSet iedModelds_GenericIO_LLN0_Events2; +extern DataSet iedModelds_GenericIO_LLN0_AnalogValues; + + +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0 = { "GenericIO", false, "GGIO1$ST$SPCSO1$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda1 + &iedModelds_GenericIO_LLN0_Events_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { "GenericIO", false, "GGIO1$ST$SPCSO2$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda2 + &iedModelds_GenericIO_LLN0_Events_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { "GenericIO", false, "GGIO1$ST$SPCSO3$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda3 + &iedModelds_GenericIO_LLN0_Events_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { "GenericIO", false, "GGIO1$ST$SPCSO4$stVal", @@ -198,50 +57,103 @@ DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { NULL }; -DataSet ds_GenericIO_LLN0_Events = { +DataSet iedModelds_GenericIO_LLN0_Events = { "GenericIO", "LLN0$Events", 4, - &ds_GenericIO_LLN0_Events_fcda0, - &ds_GenericIO_LLN0_AnalogValues + &iedModelds_GenericIO_LLN0_Events_fcda0, + &iedModelds_GenericIO_LLN0_Events2 +}; + +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda0 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO1", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda1 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO2", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda2 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO3", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda3 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO4", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_GenericIO_LLN0_Events2 = { + "GenericIO", + "LLN0$Events2", + 4, + &iedModelds_GenericIO_LLN0_Events2_fcda0, + &iedModelds_GenericIO_LLN0_AnalogValues }; -extern DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda3; +extern DataSetEntry iedModelds_GenericIO_LLN0_AnalogValues_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_AnalogValues_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_AnalogValues_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_AnalogValues_fcda3; -DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda0 = { +DataSetEntry iedModelds_GenericIO_LLN0_AnalogValues_fcda0 = { "GenericIO", false, "GGIO1$MX$AnIn1", -1, NULL, NULL, - &ds_GenericIO_LLN0_AnalogValues_fcda1 + &iedModelds_GenericIO_LLN0_AnalogValues_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_AnalogValues_fcda1 = { "GenericIO", false, "GGIO1$MX$AnIn2", -1, NULL, NULL, - &ds_GenericIO_LLN0_AnalogValues_fcda2 + &iedModelds_GenericIO_LLN0_AnalogValues_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_AnalogValues_fcda2 = { "GenericIO", false, "GGIO1$MX$AnIn3", -1, NULL, NULL, - &ds_GenericIO_LLN0_AnalogValues_fcda3 + &iedModelds_GenericIO_LLN0_AnalogValues_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_AnalogValues_fcda3 = { "GenericIO", false, "GGIO1$MX$AnIn4", @@ -251,11 +163,11 @@ DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda3 = { NULL }; -DataSet ds_GenericIO_LLN0_AnalogValues = { +DataSet iedModelds_GenericIO_LLN0_AnalogValues = { "GenericIO", "LLN0$AnalogValues", 4, - &ds_GenericIO_LLN0_AnalogValues_fcda0, + &iedModelds_GenericIO_LLN0_AnalogValues_fcda0, NULL }; @@ -1970,8 +1882,9 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { extern ReportControlBlock iedModel_GenericIO_LLN0_report0; extern ReportControlBlock iedModel_GenericIO_LLN0_report1; -ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; -ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "AnalogValuesRCB01", "AnalogValues", false, "AnalogValues", 1, 8, 111, 50, 1000, NULL}; +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; +ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "AnalogValuesRCB01", "AnalogValues", false, "AnalogValues", 1, 24, 111, 50, 1000, NULL}; + extern GSEControlBlock iedModel_GenericIO_LLN0_gse0; extern GSEControlBlock iedModel_GenericIO_LLN0_gse1; @@ -1979,7 +1892,7 @@ extern GSEControlBlock iedModel_GenericIO_LLN0_gse1; static PhyComAddress iedModel_GenericIO_LLN0_gse0_address = { 4, 1, - 1000, + 4096, {0x1, 0xc, 0xcd, 0x1, 0x0, 0x1} }; @@ -1988,7 +1901,7 @@ GSEControlBlock iedModel_GenericIO_LLN0_gse0 = {&iedModel_GenericIO_LLN0, "gcbEv static PhyComAddress iedModel_GenericIO_LLN0_gse1_address = { 4, 1, - 1000, + 4096, {0x1, 0xc, 0xcd, 0x1, 0x0, 0x1} }; @@ -1999,10 +1912,11 @@ GSEControlBlock iedModel_GenericIO_LLN0_gse1 = {&iedModel_GenericIO_LLN0, "gcbAn IedModel iedModel = { "simpleIO", &iedModel_GenericIO, - &ds_GenericIO_LLN0_Events, + &iedModelds_GenericIO_LLN0_Events, &iedModel_GenericIO_LLN0_report0, &iedModel_GenericIO_LLN0_gse0, NULL, + NULL, initializeValues }; diff --git a/examples/server_example_setting_groups/sg_demo.icd b/examples/server_example_setting_groups/sg_demo.icd index ef3bef81..3086c38e 100644 --- a/examples/server_example_setting_groups/sg_demo.icd +++ b/examples/server_example_setting_groups/sg_demo.icd @@ -122,7 +122,6 @@ - @@ -151,7 +150,6 @@ - diff --git a/examples/server_example_setting_groups/static_model.c b/examples/server_example_setting_groups/static_model.c index d02d95fe..2c10dc43 100644 --- a/examples/server_example_setting_groups/static_model.c +++ b/examples/server_example_setting_groups/static_model.c @@ -3,101 +3,9 @@ * * automatically generated from sg_demo.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_PROT; -extern LogicalNode iedModel_PROT_LLN0; -extern DataObject iedModel_PROT_LLN0_Mod; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlVal; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_operTm; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orCat; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orIdent; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlNum; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_T; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_Test; -extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_Check; -extern DataAttribute iedModel_PROT_LLN0_Mod_stVal; -extern DataAttribute iedModel_PROT_LLN0_Mod_q; -extern DataAttribute iedModel_PROT_LLN0_Mod_t; -extern DataAttribute iedModel_PROT_LLN0_Mod_ctlModel; -extern DataObject iedModel_PROT_LLN0_Beh; -extern DataAttribute iedModel_PROT_LLN0_Beh_stVal; -extern DataAttribute iedModel_PROT_LLN0_Beh_q; -extern DataAttribute iedModel_PROT_LLN0_Beh_t; -extern DataObject iedModel_PROT_LLN0_Health; -extern DataAttribute iedModel_PROT_LLN0_Health_stVal; -extern DataAttribute iedModel_PROT_LLN0_Health_q; -extern DataAttribute iedModel_PROT_LLN0_Health_t; -extern DataObject iedModel_PROT_LLN0_NamPlt; -extern DataAttribute iedModel_PROT_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_PROT_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_PROT_LLN0_NamPlt_d; -extern DataAttribute iedModel_PROT_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_PROT_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_PROT_LPHD1; -extern DataObject iedModel_PROT_LPHD1_PhyNam; -extern DataAttribute iedModel_PROT_LPHD1_PhyNam_vendor; -extern DataAttribute iedModel_PROT_LPHD1_PhyNam_hwRev; -extern DataAttribute iedModel_PROT_LPHD1_PhyNam_swRev; -extern DataAttribute iedModel_PROT_LPHD1_PhyNam_serNum; -extern DataAttribute iedModel_PROT_LPHD1_PhyNam_model; -extern DataAttribute iedModel_PROT_LPHD1_PhyNam_location; -extern DataObject iedModel_PROT_LPHD1_PhyHealth; -extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_t; -extern DataObject iedModel_PROT_LPHD1_Proxy; -extern DataAttribute iedModel_PROT_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_PROT_LPHD1_Proxy_q; -extern DataAttribute iedModel_PROT_LPHD1_Proxy_t; -extern LogicalNode iedModel_PROT_PTOC1; -extern DataObject iedModel_PROT_PTOC1_Beh; -extern DataAttribute iedModel_PROT_PTOC1_Beh_stVal; -extern DataAttribute iedModel_PROT_PTOC1_Beh_q; -extern DataAttribute iedModel_PROT_PTOC1_Beh_t; -extern DataObject iedModel_PROT_PTOC1_Mod; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlVal; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_operTm; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orCat; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orIdent; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlNum; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_T; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Test; -extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Check; -extern DataAttribute iedModel_PROT_PTOC1_Mod_stVal; -extern DataAttribute iedModel_PROT_PTOC1_Mod_q; -extern DataAttribute iedModel_PROT_PTOC1_Mod_t; -extern DataAttribute iedModel_PROT_PTOC1_Mod_ctlModel; -extern DataObject iedModel_PROT_PTOC1_Str; -extern DataAttribute iedModel_PROT_PTOC1_Str_general; -extern DataAttribute iedModel_PROT_PTOC1_Str_dirGeneral; -extern DataAttribute iedModel_PROT_PTOC1_Str_q; -extern DataAttribute iedModel_PROT_PTOC1_Str_t; -extern DataObject iedModel_PROT_PTOC1_Op; -extern DataAttribute iedModel_PROT_PTOC1_Op_general; -extern DataAttribute iedModel_PROT_PTOC1_Op_q; -extern DataAttribute iedModel_PROT_PTOC1_Op_t; -extern DataObject iedModel_PROT_PTOC1_StrVal; -extern DataAttribute iedModel_PROT_PTOC1_StrVal_setMag; -extern DataAttribute iedModel_PROT_PTOC1_StrVal_setMag_f; -extern DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag; -extern DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag_f; -extern DataObject iedModel_PROT_PTOC1_OpDlTmms; -extern DataAttribute iedModel_PROT_PTOC1_OpDlTmms_setVal; -extern DataAttribute iedModel_SE_PROT_PTOC1_OpDlTmms_setVal; -extern DataObject iedModel_PROT_PTOC1_RsDlTmms; -extern DataAttribute iedModel_PROT_PTOC1_RsDlTmms_setVal; -extern DataAttribute iedModel_SE_PROT_PTOC1_RsDlTmms_setVal; -extern DataObject iedModel_PROT_PTOC1_RstTms; -extern DataAttribute iedModel_PROT_PTOC1_RstTms_setVal; -extern DataAttribute iedModel_SE_PROT_PTOC1_RstTms_setVal; @@ -1194,6 +1102,7 @@ DataAttribute iedModel_SE_PROT_PTOC1_RstTms_setVal = { + extern SettingGroupControlBlock iedModel_PROT_LLN0_sgcb; SettingGroupControlBlock iedModel_PROT_LLN0_sgcb = {&iedModel_PROT_LLN0, 1, 5, 0, false, 0, 0, NULL}; @@ -1205,6 +1114,7 @@ IedModel iedModel = { NULL, NULL, NULL, + NULL, &iedModel_PROT_LLN0_sgcb, initializeValues }; diff --git a/examples/server_example_threadless/static_model.c b/examples/server_example_threadless/static_model.c index b1bd317e..1fdf97c7 100644 --- a/examples/server_example_threadless/static_model.c +++ b/examples/server_example_threadless/static_model.c @@ -3,193 +3,50 @@ * * automatically generated from simpleIO_direct_control.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_GenericIO; -extern LogicalNode iedModel_GenericIO_LLN0; -extern DataObject iedModel_GenericIO_LLN0_Mod; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_q; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_t; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel; -extern DataObject iedModel_GenericIO_LLN0_Beh; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_q; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_t; -extern DataObject iedModel_GenericIO_LLN0_Health; -extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Health_q; -extern DataAttribute iedModel_GenericIO_LLN0_Health_t; -extern DataObject iedModel_GenericIO_LLN0_NamPlt; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_GenericIO_LPHD1; -extern DataObject iedModel_GenericIO_LPHD1_PhyNam; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor; -extern DataObject iedModel_GenericIO_LPHD1_PhyHealth; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t; -extern DataObject iedModel_GenericIO_LPHD1_Proxy; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t; -extern LogicalNode iedModel_GenericIO_GGIO1; -extern DataObject iedModel_GenericIO_GGIO1_Mod; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_Beh; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t; -extern DataObject iedModel_GenericIO_GGIO1_Health; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_t; -extern DataObject iedModel_GenericIO_GGIO1_NamPlt; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d; -extern DataObject iedModel_GenericIO_GGIO1_AnIn1; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn2; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn3; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn4; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO1; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO3; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO4; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind1; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind2; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind3; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind4; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; - -extern DataSet ds_GenericIO_LLN0_Events; -extern DataSet ds_GenericIO_LLN0_Events2; - - -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda3; - -DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = { + +extern DataSet iedModelds_GenericIO_LLN0_Events; +extern DataSet iedModelds_GenericIO_LLN0_Events2; + + +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0 = { "GenericIO", false, "GGIO1$ST$SPCSO1$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda1 + &iedModelds_GenericIO_LLN0_Events_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { "GenericIO", false, "GGIO1$ST$SPCSO2$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda2 + &iedModelds_GenericIO_LLN0_Events_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { "GenericIO", false, "GGIO1$ST$SPCSO3$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda3 + &iedModelds_GenericIO_LLN0_Events_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { "GenericIO", false, "GGIO1$ST$SPCSO4$stVal", @@ -199,50 +56,50 @@ DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { NULL }; -DataSet ds_GenericIO_LLN0_Events = { +DataSet iedModelds_GenericIO_LLN0_Events = { "GenericIO", "LLN0$Events", 4, - &ds_GenericIO_LLN0_Events_fcda0, - &ds_GenericIO_LLN0_Events2 + &iedModelds_GenericIO_LLN0_Events_fcda0, + &iedModelds_GenericIO_LLN0_Events2 }; -extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda3; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3; -DataSetEntry ds_GenericIO_LLN0_Events2_fcda0 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda0 = { "GenericIO", false, "GGIO1$ST$SPCSO1", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events2_fcda1 + &iedModelds_GenericIO_LLN0_Events2_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_Events2_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1 = { "GenericIO", false, "GGIO1$ST$SPCSO2", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events2_fcda2 + &iedModelds_GenericIO_LLN0_Events2_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_Events2_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2 = { "GenericIO", false, "GGIO1$ST$SPCSO3", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events2_fcda3 + &iedModelds_GenericIO_LLN0_Events2_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_Events2_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3 = { "GenericIO", false, "GGIO1$ST$SPCSO4", @@ -252,11 +109,11 @@ DataSetEntry ds_GenericIO_LLN0_Events2_fcda3 = { NULL }; -DataSet ds_GenericIO_LLN0_Events2 = { +DataSet iedModelds_GenericIO_LLN0_Events2 = { "GenericIO", "LLN0$Events2", 4, - &ds_GenericIO_LLN0_Events2_fcda0, + &iedModelds_GenericIO_LLN0_Events2_fcda0, NULL }; @@ -1986,10 +1843,11 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report1; extern ReportControlBlock iedModel_GenericIO_LLN0_report2; extern ReportControlBlock iedModel_GenericIO_LLN0_report3; -ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; -ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2}; -ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3}; -ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 8, 111, 50, 1000, NULL}; +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; +ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2}; +ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3}; +ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 111, 50, 1000, NULL}; + @@ -1997,10 +1855,11 @@ ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, IedModel iedModel = { "simpleIO", &iedModel_GenericIO, - &ds_GenericIO_LLN0_Events, + &iedModelds_GenericIO_LLN0_Events, &iedModel_GenericIO_LLN0_report0, NULL, NULL, + NULL, initializeValues }; diff --git a/examples/sv_subscriber/CMakeLists.txt b/examples/sv_subscriber/CMakeLists.txt new file mode 100644 index 00000000..ff8cd512 --- /dev/null +++ b/examples/sv_subscriber/CMakeLists.txt @@ -0,0 +1,34 @@ + +set(sv_subscriber_example_SRCS + sv_subscriber_example.c +) + +IF(WIN32) + +IF(WITH_WPCAP) + +set_source_files_properties(${sv_subscriber_example_SRCS} + PROPERTIES LANGUAGE CXX) +add_executable(sv_subscriber_example + ${sv_subscriber_example_SRCS} +) + +target_link_libraries(svsubscriber_example + iec61850 +) + +ENDIF(WITH_WPCAP) + +ELSE(WIN32) + +add_executable(sv_subscriber_example + ${sv_subscriber_example_SRCS} +) + +target_link_libraries(sv_subscriber_example + iec61850 +) + +ENDIF(WIN32) + + diff --git a/examples/sv_subscriber/Makefile b/examples/sv_subscriber/Makefile new file mode 100644 index 00000000..f84c02df --- /dev/null +++ b/examples/sv_subscriber/Makefile @@ -0,0 +1,21 @@ +LIBIEC_HOME=../../../libiec61850 + +PROJECT_BINARY_NAME = sv_subscriber +PROJECT_SOURCES += sv_subscriber_example.c + +INCLUDES += -I. + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) + + diff --git a/examples/sv_subscriber/sv_subscriber_example.c b/examples/sv_subscriber/sv_subscriber_example.c new file mode 100644 index 00000000..131bc5e8 --- /dev/null +++ b/examples/sv_subscriber/sv_subscriber_example.c @@ -0,0 +1,73 @@ +/* + * subscriber_test.c + * + * Example program for Sampled Values (SV) subscriber + * + */ + +#include "hal_thread.h" +#include +#include +#include "sv_subscriber.h" + + +static bool running = true; + +void sigint_handler(int signalId) +{ + running = 0; +} + + +/* Callback handler for received SV messages */ +static void +svUpdateListener (SVSubscriber subscriber, void* parameter, SVClientASDU asdu) +{ + printf("svUpdateListener called\n"); + + const char* svID = SVClientASDU_getSvId(asdu); + + if (svID != NULL) + printf(" svID=(%s)\n", svID); + + printf(" smpCnt: %i\n", SVClientASDU_getSmpCnt(asdu)); + printf(" confRev: %u\n", SVClientASDU_getConfRev(asdu)); + + if (SVClientASDU_getDataSize(asdu) >= 8) { + printf(" DATA[0]: %f\n", SVClientASDU_getFLOAT32(asdu, 0)); + printf(" DATA[1]: %f\n", SVClientASDU_getFLOAT32(asdu, 4)); + } +} + +int +main(int argc, char** argv) +{ + SVReceiver receiver = SVReceiver_create(); + + if (argc > 1) { + printf("Set interface id: %s\n", argv[1]); + SVReceiver_setInterfaceId(receiver, argv[1]); + } + else { + printf("Using interface eth0\n"); + SVReceiver_setInterfaceId(receiver, "eth0"); + } + + SVSubscriber subscriber = SVSubscriber_create(NULL, 0x4000); + + SVSubscriber_setListener(subscriber, svUpdateListener, NULL); + + SVReceiver_addSubscriber(receiver, subscriber); + + SVReceiver_start(receiver); + + signal(SIGINT, sigint_handler); + + while (running) { + Thread_sleep(1); + } + + SVReceiver_stop(receiver); + + SVReceiver_destroy(receiver); +} diff --git a/make/stack_includes.mk b/make/stack_includes.mk index 28e1291c..3ddcc443 100644 --- a/make/stack_includes.mk +++ b/make/stack_includes.mk @@ -7,3 +7,4 @@ INCLUDES += -I$(LIBIEC_HOME)/src/iec61850/inc INCLUDES += -I$(LIBIEC_HOME)/src/iec61850/inc_private INCLUDES += -I$(LIBIEC_HOME)/src/hal/inc INCLUDES += -I$(LIBIEC_HOME)/src/goose +INCLUDES += -I$(LIBIEC_HOME)/src/sampled_values diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 46dbfae8..8d835346 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -58,6 +58,7 @@ set (lib_common_SRCS ./iec61850/client/client_control.c ./iec61850/client/client_report_control.c ./iec61850/client/client_goose_control.c +./iec61850/client/client_sv_control.c ./iec61850/client/client_report.c ./iec61850/client/ied_connection.c ./iec61850/common/iec61850_common.c @@ -71,7 +72,7 @@ set (lib_common_SRCS ./iec61850/server/mms_mapping/mms_mapping.c ./iec61850/server/mms_mapping/reporting.c ./iec61850/server/mms_mapping/mms_goose.c - +./iec61850/server/mms_mapping/mms_sv.c ) set (lib_asn1c_SRCS @@ -173,6 +174,10 @@ set (lib_goose_SRCS ./goose/goose_publisher.c ) +set (lib_sv_SRCS +./sampled_values/sv_subscriber.c +) + set (lib_linux_SRCS ./hal/socket/linux/socket_linux.c ./hal/ethernet/linux/ethernet_linux.c @@ -213,6 +218,8 @@ set_source_files_properties(${lib_common_SRCS} ${lib_windows_SRCS} IF(WITH_WPCAP) set_source_files_properties(${lib_goose_SRCS} PROPERTIES LANGUAGE CXX) +set_source_files_properties(${lib_sv_SRCS} + PROPERTIES LANGUAGE CXX) ELSE() add_definitions(-DEXCLUDE_ETHERNET_WINDOWS) ENDIF() @@ -225,16 +232,17 @@ include_directories( IF(WITH_WPCAP) set (library_SRCS - ${lib_common_SRCS} - ${lib_asn1c_SRCS} - ${lib_goose_SRCS} + ${lib_common_SRCS} + ${lib_asn1c_SRCS} + ${lib_goose_SRCS} + ${lib_sv_SRCS} ${lib_windows_SRCS} ) ELSE() set (library_SRCS - ${lib_common_SRCS} - ${lib_asn1c_SRCS} + ${lib_common_SRCS} + ${lib_asn1c_SRCS} ${lib_windows_SRCS} ) @@ -243,23 +251,26 @@ ENDIF(WITH_WPCAP) ELSEIF(UNIX) IF(APPLE) set (library_SRCS - ${lib_common_SRCS} - ${lib_asn1c_SRCS} - ${lib_goose_SRCS} + ${lib_common_SRCS} + ${lib_asn1c_SRCS} + ${lib_goose_SRCS} + ${lib_sv_SRCS} ${lib_bsd_SRCS} ) ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") set (library_SRCS - ${lib_common_SRCS} - ${lib_asn1c_SRCS} - ${lib_goose_SRCS} + ${lib_common_SRCS} + ${lib_asn1c_SRCS} + ${lib_goose_SRCS} + ${lib_sv_SRCS} ${lib_bsd_SRCS} ) ELSE() set (library_SRCS - ${lib_common_SRCS} - ${lib_asn1c_SRCS} - ${lib_goose_SRCS} + ${lib_common_SRCS} + ${lib_asn1c_SRCS} + ${lib_goose_SRCS} + ${lib_sv_SRCS} ${lib_linux_SRCS} ) ENDIF(APPLE) diff --git a/src/iec61850/common/iec61850_common.c b/src/iec61850/common/iec61850_common.c index 4a35256c..7dae4129 100644 --- a/src/iec61850/common/iec61850_common.c +++ b/src/iec61850/common/iec61850_common.c @@ -292,7 +292,7 @@ Timestamp_setTimeInSeconds(Timestamp* self, uint32_t secondsSinceEpoch) void Timestamp_setTimeInMilliseconds(Timestamp* self, uint64_t millisSinceEpoch) { - uint32_t timeval32 = (millisSinceEpoch / 1000LL); + uint32_t timeval32 = (uint32_t) (millisSinceEpoch / 1000LL); uint8_t* timeArray = (uint8_t*) &timeval32; uint8_t* valueArray = self->val; diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 027c928d..69dce0f4 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -327,6 +327,7 @@ IedConnection_getMmsConnection(IedConnection self); /** SV ASDU contains attribute Security */ #define IEC61850_SV_OPT_SECURITY 16 + /** an opaque handle to the instance data of a ClientSVControlBlock object */ typedef struct sClientSVControlBlock* ClientSVControlBlock; @@ -370,7 +371,7 @@ ClientSVControlBlock_isMulticast(ClientSVControlBlock self); * \return the error code of the last read or write access */ IedClientError -ClientSVControlBlock_getLastError(ClientSVControlBlock self); +ClientSVControlBlock_getLastComError(ClientSVControlBlock self); bool @@ -382,6 +383,9 @@ ClientSVControlBlock_getSvEna(ClientSVControlBlock self); bool ClientSVControlBlock_setResv(ClientSVControlBlock self, bool svEna); +bool +ClientSVControlBlock_getResv(ClientSVControlBlock self); + char* ClientSVControlBlock_getMsvID(ClientSVControlBlock self); diff --git a/src/mms/iso_mms/common/mms_value.c b/src/mms/iso_mms/common/mms_value.c index 9ecc61c2..ebfa924f 100644 --- a/src/mms/iso_mms/common/mms_value.c +++ b/src/mms/iso_mms/common/mms_value.c @@ -1968,22 +1968,6 @@ MmsValue_getTypeString(MmsValue* self) } } - -static void -msTimeToGeneralizedTime(uint64_t msTime, uint8_t* buffer, size_t bufferSize) -{ - time_t unixTime = (msTime / 1000); - - struct tm tmTime; - - int msPart = (msTime % 1000); - gmtime_r(&unixTime, &tmTime); - - snprintf((char*) buffer, bufferSize, "%04d%02d%02d%02d%02d%02d.%03dZ", tmTime.tm_year + 1900, tmTime.tm_mon + 1, - tmTime.tm_mday, tmTime.tm_hour, tmTime.tm_min, tmTime.tm_sec, msPart); -} - - char* MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize) { @@ -2022,7 +2006,11 @@ MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize) break; case MMS_BINARY_TIME: - msTimeToGeneralizedTime(MmsValue_getBinaryTimeAsUtcMs(self), (uint8_t*) buffer, bufferSize); + { + uint8_t tempBuf[20]; + Conversions_msTimeToGeneralizedTime(MmsValue_getBinaryTimeAsUtcMs(self), tempBuf); + snprintf(buffer, bufferSize, "%s", tempBuf); + } break; case MMS_BIT_STRING: @@ -2101,7 +2089,11 @@ MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize) break; case MMS_UTC_TIME: - msTimeToGeneralizedTime(MmsValue_getUtcTimeInMs(self), (uint8_t*) buffer, bufferSize); + { + uint8_t tempBuf[20]; + Conversions_msTimeToGeneralizedTime(MmsValue_getUtcTimeInMs(self), tempBuf); + snprintf(buffer, bufferSize, "%s", tempBuf); + } break; case MMS_STRING: diff --git a/src/sampled_values/sv_subscriber.c b/src/sampled_values/sv_subscriber.c new file mode 100644 index 00000000..4dde938f --- /dev/null +++ b/src/sampled_values/sv_subscriber.c @@ -0,0 +1,621 @@ +/* + * sv_receiver.c + * + * Copyright 2015 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#include "stack_config.h" + +#include "libiec61850_platform_includes.h" + +#include "hal_ethernet.h" +#include "hal_thread.h" +#include "ber_decode.h" +#include "ber_encoder.h" + +#include "sv_subscriber.h" + +#ifndef DEBUG_SV_SUBSCRIBER +#define DEBUG_SV_SUBSCRIBER 1 +#endif + +#define ETH_BUFFER_LENGTH 1518 + +#define ETH_P_SV 0x88ba + +struct sSVReceiver { + bool running; + bool stopped; + + bool checkDestAddr; /* option: check destination address (additionally to AppID) to identify application */ + + char* interfaceId; + + uint8_t* buffer; + EthernetSocket ethSocket; + LinkedList subscriberList; +}; + +struct sSVSubscriber { + uint8_t ethAddr[6]; + uint16_t appId; + + SVUpdateListener listener; + void* listenerParameter; +}; + +struct sSVClientASDU { + + char* svId; + + uint8_t* smpCnt; + uint8_t* confRev; + uint8_t* smpSynch; + + + int dataBufferLength; + uint8_t* dataBuffer; +}; + + + + +SVReceiver +SVReceiver_create(void) +{ + SVReceiver self = (SVReceiver) GLOBAL_MALLOC(sizeof(struct sSVReceiver)); + + if (self != NULL) { + self->subscriberList = LinkedList_create(); + self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH); + + self->checkDestAddr = false; + } + + return self; +} + +void +SVReceiver_setInterfaceId(SVReceiver self, const char* interfaceId) +{ + if (self->interfaceId != NULL) + GLOBAL_FREEMEM(self->interfaceId); + + self->interfaceId = copyString(interfaceId); +} + +void +SVReceiver_disableDestAddrCheck(SVReceiver self) +{ + self->checkDestAddr = false; +} + +void +SVReceiver_addSubscriber(SVReceiver self, SVSubscriber subscriber) +{ + LinkedList_add(self->subscriberList, (void*) subscriber); +} + +void +SVReceiver_removeSubscriber(SVReceiver self, SVSubscriber subscriber) +{ + LinkedList_remove(self->subscriberList, (void*) subscriber); +} + +static void +svReceiverLoop(void* threadParameter) +{ + SVReceiver self = (SVReceiver) threadParameter; + + self->running = true; + self->stopped = false; + + SVReceiver_startThreadless(self); + + while (self->running) { + + if (SVReceiver_tick(self) == false) + Thread_sleep(1); + } + + SVReceiver_stopThreadless(self); + + self->stopped = true; +} + + +void +SVReceiver_start(SVReceiver self) +{ + Thread thread = Thread_create((ThreadExecutionFunction) svReceiverLoop, (void*) self, true); + + if (thread != NULL) { + if (DEBUG_SV_SUBSCRIBER) + printf("SV_SUBSCRIBER: SV receiver started for interface %s\n", self->interfaceId); + + Thread_start(thread); + } + else { + if (DEBUG_SV_SUBSCRIBER) + printf("SV_SUBSCRIBER: Starting SV receiver failed for interface %s\n", self->interfaceId); + } +} + +void +SVReceiver_stop(SVReceiver self) +{ + self->running = false; + + while (self->stopped == false) + Thread_sleep(1); +} + +void +SVReceiver_destroy(SVReceiver self) +{ + LinkedList_destroyDeep(self->subscriberList, + (LinkedListValueDeleteFunction) SVSubscriber_destroy); + + GLOBAL_FREEMEM(self->buffer); + GLOBAL_FREEMEM(self); +} + +void +SVReceiver_startThreadless(SVReceiver self) +{ + if (self->interfaceId == NULL) + self->ethSocket = Ethernet_createSocket(CONFIG_ETHERNET_INTERFACE_ID, NULL); + else + self->ethSocket = Ethernet_createSocket(self->interfaceId, NULL); + + Ethernet_setProtocolFilter(self->ethSocket, ETH_P_SV); + + self->running = true; +} + +void +SVReceiver_stopThreadless(SVReceiver self) +{ + Ethernet_destroySocket(self->ethSocket); + + self->running = false; +} + + +static void +parseASDU(SVReceiver self, SVSubscriber subscriber, uint8_t* buffer, int length) +{ + int bufPos = 0; + + struct sSVClientASDU asdu; + memset(&asdu, 0, sizeof(struct sSVClientASDU)); + + int svIdLength = 0; + + + while (bufPos < length) { + int elementLength; + + uint8_t tag = buffer[bufPos++]; + + bufPos = BerDecoder_decodeLength(buffer, &elementLength, bufPos, length); + + switch (tag) { + + case 0x80: + asdu.svId = (char*) (buffer + bufPos); + svIdLength = elementLength; + break; + + case 0x82: + asdu.smpCnt = buffer + bufPos; + break; + + case 0x83: + asdu.confRev = buffer + bufPos; + break; + + case 0x85: + asdu.smpSynch = buffer + bufPos; + break; + + case 0x87: + asdu.dataBuffer = buffer + bufPos; + asdu.dataBufferLength = elementLength; + break; + + default: /* ignore unknown tag */ + break; + } + + bufPos += elementLength; + } + + if (asdu.svId != NULL) + asdu.svId[svIdLength] = 0; + + /* Call callback handler */ + if (subscriber->listener != NULL) + subscriber->listener(subscriber, subscriber->listenerParameter, &asdu); +} + +static void +parseSequenceOfASDU(SVReceiver self, SVSubscriber subscriber, uint8_t* buffer, int length) +{ + int bufPos = 0; + + while (bufPos < length) { + int elementLength; + + uint8_t tag = buffer[bufPos++]; + + bufPos = BerDecoder_decodeLength(buffer, &elementLength, bufPos, length); + + switch (tag) { + case 0x30: + parseASDU(self, subscriber, buffer + bufPos, elementLength); + break; + + default: /* ignore unknown tag */ + break; + } + + bufPos += elementLength; + } +} + +static void +parseSVPayload(SVReceiver self, SVSubscriber subscriber, uint8_t* buffer, int apduLength) +{ + int bufPos = 0; + + if (buffer[bufPos++] == 0x60) { + int elementLength; + + bufPos = BerDecoder_decodeLength(buffer, &elementLength, bufPos, apduLength); + + int svEnd = bufPos + elementLength; + + while (bufPos < svEnd) { + uint8_t tag = buffer[bufPos++]; + + bufPos = BerDecoder_decodeLength(buffer, &elementLength, bufPos, svEnd); + + if (bufPos + elementLength > apduLength) { + if (DEBUG_SV_SUBSCRIBER) + printf("SV_SUBSCRIBER: Malformed message: sub element is too large!\n"); + + goto exit_error; + } + + if (bufPos == -1) + goto exit_error; + + switch(tag) { + case 0x80: /* noASDU (INTEGER) */ + /* ignore */ + break; + + case 0xa2: /* asdu (SEQUENCE) */ + parseSequenceOfASDU(self, subscriber, buffer + bufPos, elementLength); + break; + + default: /* ignore unknown tag */ + break; + } + + + bufPos += elementLength; + } + + return; + } + +exit_error: + if (DEBUG_SV_SUBSCRIBER) + printf("SV_SUBSCRIBER: Invalid SV message!\n"); + + return; +} + +static void +parseSVMessage(SVReceiver self, int numbytes) +{ + int bufPos; + bool subscriberFound = false; + uint8_t* buffer = self->buffer; + + if (numbytes < 22) return; + + /* Ethernet source address */ + uint8_t* srcAddr = buffer; + + /* skip ethernet addresses */ + bufPos = 12; + int headerLength = 14; + + /* check for VLAN tag */ + if ((buffer[bufPos] == 0x81) && (buffer[bufPos + 1] == 0x00)) { + bufPos += 4; /* skip VLAN tag */ + headerLength += 4; + } + + /* check for SV Ethertype */ + if (buffer[bufPos++] != 0x88) + return; + if (buffer[bufPos++] != 0xba) + return; + + uint16_t appId; + + appId = buffer[bufPos++] * 0x100; + appId += buffer[bufPos++]; + + uint16_t length; + + length = buffer[bufPos++] * 0x100; + length += buffer[bufPos++]; + + /* skip reserved fields */ + bufPos += 4; + + int apduLength = length - 8; + + if (numbytes < length + headerLength) { + if (DEBUG_SV_SUBSCRIBER) + printf("SV_SUBSCRIBER: Invalid PDU size\n"); + return; + } + + if (DEBUG_SV_SUBSCRIBER) { + printf("SV_SUBSCRIBER: SV message: ----------------\n"); + printf("SV_SUBSCRIBER: APPID: %u\n", appId); + printf("SV_SUBSCRIBER: LENGTH: %u\n", length); + printf("SV_SUBSCRIBER: APDU length: %i\n", apduLength); + } + + + /* check if there is a matching subscriber */ + LinkedList element = LinkedList_getNext(self->subscriberList); + + SVSubscriber subscriber; + + while (element != NULL) { + subscriber = (SVSubscriber) LinkedList_getData(element); + + if (subscriber->appId == appId) { + + if (self->checkDestAddr) { + if (memcmp(srcAddr, subscriber->ethAddr, 6) == 0) { + subscriberFound = true; + break; + } + else + if (DEBUG_SV_SUBSCRIBER) + printf("SV_SUBSCRIBER: Checking ethernet src address failed!\n"); + } + else { + subscriberFound = true; + break; + } + + + } + + element = LinkedList_getNext(element); + } + + + if (subscriberFound) + parseSVPayload(self, subscriber, buffer + bufPos, apduLength); + else { + if (DEBUG_SV_SUBSCRIBER) + printf("SV_SUBSCRIBER: SV message ignored due to unknown APPID value\n"); + } +} + +bool +SVReceiver_tick(SVReceiver self) +{ + int packetSize = Ethernet_receivePacket(self->ethSocket, self->buffer, ETH_BUFFER_LENGTH); + + if (packetSize > 0) { + parseSVMessage(self, packetSize); + return true; + } + else + return false; +} + +SVSubscriber +SVSubscriber_create(const uint8_t* ethAddr, uint16_t appID) +{ + SVSubscriber self = (SVSubscriber) GLOBAL_CALLOC(1, sizeof(struct sSVSubscriber)); + + if (self != NULL) { + self->appId = appID; + + if (ethAddr != NULL) + memcpy(self->ethAddr, ethAddr, 6); + } + + return self; +} + +void +SVSubscriber_destroy(SVSubscriber self) +{ + if (self != NULL) + GLOBAL_FREEMEM(self); +} + + +void +SVSubscriber_setListener(SVSubscriber self, SVUpdateListener listener, void* parameter) +{ + self->listener = listener; + self->listenerParameter = parameter; +} + +uint16_t +SVClientASDU_getSmpCnt(SVClientASDU self) +{ + uint16_t retVal; + uint8_t* valBytes = (uint8_t*) &retVal; + +#if (ORDER_LITTLE_ENDIAN == 1) + valBytes[0] = self->smpCnt[1]; + valBytes[1] = self->smpCnt[0]; +#else + valBytes[0] = self->smpCnt[0]; + valBytes[1] = self->smpCnt[1]; +#endif + + return retVal; +} + +const char* +SVClientASDU_getSvId(SVClientASDU self) +{ + return self->svId; +} + +uint32_t +SVClientASDU_getConfRev(SVClientASDU self) +{ + uint32_t retVal = *((uint32_t*) (self->confRev)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 4); +#endif + + return retVal; +} + +int8_t +SVClientASDU_getINT8(SVClientASDU self, int index) +{ + int8_t retVal = *((int8_t*) (self->dataBuffer + index)); + + return retVal; +} + +int16_t +SVClientASDU_getINT16(SVClientASDU self, int index) +{ + int16_t retVal = *((int16_t*) (self->dataBuffer + index)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 2); +#endif + + return retVal; +} + +int32_t +SVClientASDU_getINT32(SVClientASDU self, int index) +{ + int32_t retVal = *((int32_t*) (self->dataBuffer + index)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 4); +#endif + + return retVal; +} + +uint8_t +SVClientASDU_getINT8U(SVClientASDU self, int index) +{ + uint8_t retVal = *((uint8_t*) (self->dataBuffer + index)); + + return retVal; +} + +uint16_t +SVClientASDU_getINT16U(SVClientASDU self, int index) +{ + uint16_t retVal = *((uint16_t*) (self->dataBuffer + index)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 2); +#endif + + return retVal; +} + +uint32_t +SVClientASDU_getINT32U(SVClientASDU self, int index) +{ + uint32_t retVal = *((uint32_t*) (self->dataBuffer + index)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 4); +#endif + + return retVal; +} + + +float +SVClientASDU_getFLOAT32(SVClientASDU self, int index) +{ + float retVal = *((float*) (self->dataBuffer + index)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 4); +#endif + + return retVal; +} + +double +SVClientASDU_getFLOAT64(SVClientASDU self, int index) +{ + double retVal = *((double*) (self->dataBuffer + index)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 8); +#endif + + return retVal; +} + + +int +SVClientASDU_getDataSize(SVClientASDU self) +{ + return self->dataBufferLength; +} + diff --git a/src/sampled_values/sv_subscriber.h b/src/sampled_values/sv_subscriber.h new file mode 100644 index 00000000..b619e294 --- /dev/null +++ b/src/sampled_values/sv_subscriber.h @@ -0,0 +1,326 @@ +/* + * sv_subscriber_api.h + * + * Copyright 2015 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#ifndef SAMPLED_VALUES_SV_SUBSCRIBER_H_ +#define SAMPLED_VALUES_SV_SUBSCRIBER_H_ + +#include "libiec61850_common_api.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief opaque handle to a SV ASDU (Application service data unit) instance. + * + * Sampled Values (SV) ASDUs (application service data units) are the basic units for + * sampled value data. Each ASDU represents a single sample consisting of multiple measurement + * values with a single dedicated timestamp. + * + * NOTE: SVClientASDU are statically allocated and are only valid inside of the SVUpdateListener + * function when called by the library. If you need the data contained in the ASDU elsewhere + * you have to copy and store the data by yourself! + */ +typedef struct sSVClientASDU* SVClientASDU; + +/** + * \brief opaque handle to a SV subscriber instance + * + * A subscriber is an instance associated with a single stream of measurement data. It is identified + * by the Ethernet destination address, the appID value (both are on SV message level) and the svID value + * that is part of each ASDU (SVClientASDU object). + */ +typedef struct sSVSubscriber* SVSubscriber; + +/** + * \brief Callback function for received SV messages + * + * Will be called for each ASDU contained in a SV message! + * + * \param subscriber the subscriber that was associated with the received SV message + * \param parameter a user provided parameter that is simply passed to the callback + * \param asdu SV ASDU data structure. This structure is only valid inside of the callback function + */ +typedef void (*SVUpdateListener)(SVSubscriber subscriber, void* parameter, SVClientASDU asdu); + +/** + * \brief opaque handle to a SV receiver instance + */ +typedef struct sSVReceiver* SVReceiver; + +/** + * \brief Create a new SV receiver instance. + * + * A receiver is responsible for processing all SV message for a single Ethernet interface. + * In order to process messages from multiple Ethernet interfaces you have to create multiple + * instances. + * + * \return the newly created receiver instance + */ +SVReceiver +SVReceiver_create(void); + +/** + * \brief Disable check for destination address of the received SV messages + * + * Per default both the appID and the destination address are checked to identify + * relevant SV messages. Destination address check can be disabled for performance + * reason when the appIDs are unique in the local system. + * + * \param self the receiver instance reference + */ +void +SVReceiver_disableDestAddrCheck(SVReceiver self); + +/** + * \brief Set the Ethernet interface ID for the receiver instance + * + * Use this function if you want to use a different interface than + * the default interface set by CONFIG_ETHERNET_INTERFACE_ID (stack_config.h) + * NOTE: This function has to be called before calling SVReceiver_start. + * + * \param self the receiver instance reference + * \param interfaceId the Ethernet interface id (platform specific e.g. eth0 for linux). + */ +void +SVReceiver_setInterfaceId(SVReceiver self, const char* interfaceId); + +/** + * \brief Add a subscriber instance to the receiver + * + * The given subscriber will be connected to the receiver instance. + * + * \param self the receiver instance reference + * \param subscriber the subscriber instance to connect + */ +void +SVReceiver_addSubscriber(SVReceiver self, SVSubscriber subscriber); + +/** + * \brief Disconnect subscriber and receiver + * + * \param self the receiver instance reference + * \param subscriber the subscriber instance to disconnect + */ +void +SVReceiver_removeSubscriber(SVReceiver self, SVSubscriber subscriber); + +/** + * \brief Receiver starts listening for SV messages. + * + * NOTE: This call will start a new background thread. + * + * \param self the receiver instance reference + */ +void +SVReceiver_start(SVReceiver self); + +/** + * \brief Receiver stops listening for SV messages + * + * \param self the receiver instance reference + */ +void +SVReceiver_stop(SVReceiver self); + +/** + * \brief Destroy receiver instance (cleanup resources) + * + * \param self the receiver instance reference + */ +void +SVReceiver_destroy(SVReceiver self); + +/*************************************** + * Functions for non-threaded operation + ***************************************/ + +void +SVReceiver_startThreadless(SVReceiver self); + +void +SVReceiver_stopThreadless(SVReceiver self); + +bool +SVReceiver_tick(SVReceiver self); + +/* + * Subscriber + */ + +SVSubscriber +SVSubscriber_create(const uint8_t* ethAddr, uint16_t appID); + +/** + * \brief Set a callback handler to process received SV messages + * + * If the received SV message contains multiple ASDUs (application service data units) the callback + * function will be called for each ASDU separately. If a callback function has already been installed + * for this SVSubscriber object the old callback will be replaced. + * + * \param self The subscriber object + * \param listener the callback function to install + * \param a user provided parameter that is provided to the callback function + * + */ +void +SVSubscriber_setListener(SVSubscriber self, SVUpdateListener listener, void* parameter); + +void +SVSubscriber_destroy(SVSubscriber self); + +/************************************************************************* + * SVClientASDU object methods + **************************************************************************/ + +/** + * \brief return the SmpCnt value included in the SV ASDU + * + * The SmpCnt (sample counter) is increased for each ASDU to + * identify the sample. + * + * \param self ASDU object instance + */ +uint16_t +SVClientASDU_getSmpCnt(SVClientASDU self); + +/** + * \brief return the SvID value included in the SV ASDU + * + * \param self ASDU object instance + */ +const char* +SVClientASDU_getSvId(SVClientASDU self); + +/** + * \brief return the ConfRev value included in the SV ASDU + * + * \param self ASDU object instance + */ +uint32_t +SVClientASDU_getConfRev(SVClientASDU self); + +/** + * \brief Get an INT8 data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +int8_t +SVClientASDU_getINT8(SVClientASDU self, int index); + +/** + * \brief Get an INT16 data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +int16_t +SVClientASDU_getINT16(SVClientASDU self, int index); + +/** + * \brief Get an INT32 data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +int32_t +SVClientASDU_getINT32(SVClientASDU self, int index); + +/** + * \brief Get an INT8U data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +uint8_t +SVClientASDU_getINT8U(SVClientASDU self, int index); + +/** + * \brief Get an INT16U data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +uint16_t +SVClientASDU_getINT16U(SVClientASDU self, int index); + +/** + * \brief Get an INT32U data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +uint32_t +SVClientASDU_getINT32U(SVClientASDU self, int index); + +/** + * \brief Get an FLOAT32 data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +float +SVClientASDU_getFLOAT32(SVClientASDU self, int index); + +/** + * \brief Get an FLOAT64 data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +double +SVClientASDU_getFLOAT64(SVClientASDU self, int index); + +/** + * \brief Returns the size of the data part of the ASDU + * + * \param self ASDU object instance + * + * \return size of the ASDU data part in bytes. + */ +int +SVClientASDU_getDataSize(SVClientASDU self); + +#ifdef __cplusplus +} +#endif + + +#endif /* SAMPLED_VALUES_SV_SUBSCRIBER_ */ diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 9041e69f..c886c741 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -498,4 +498,19 @@ EXPORTS SVControlBlock_create SVControlBlock_addPhyComAddress GSEControlBlock_addPhyComAddress - GooseSubscriber_getConfRev \ No newline at end of file + ClientSVControlBlock_create + ClientSVControlBlock_destroy + ClientSVControlBlock_isMulticast + ClientSVControlBlock_getLastComError + ClientSVControlBlock_setSvEna + ClientSVControlBlock_getSvEna + ClientSVControlBlock_setResv + ClientSVControlBlock_getResv + ClientSVControlBlock_getMsvID + ClientSVControlBlock_getDatSet + ClientSVControlBlock_getConfRev + ClientSVControlBlock_getSmpRate + ClientSVControlBlock_getDstAddress + ClientSVControlBlock_getOptFlds + ClientSVControlBlock_getSmpMod + ClientSVControlBlock_getNoASDU \ No newline at end of file diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 6012f5a5..abde790d 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -522,4 +522,45 @@ EXPORTS SVControlBlock_create SVControlBlock_addPhyComAddress GSEControlBlock_addPhyComAddress - GooseSubscriber_getConfRev \ No newline at end of file + GooseSubscriber_getConfRev + SVReceiver_create + SVReceiver_setInterfaceId + SVReceiver_addSubscriber + SVReceiver_removeSubscriber + SVReceiver_start + SVReceiver_stop + SVReceiver_destroy + SVReceiver_startThreadless + SVReceiver_stopThreadless + SVReceiver_tick + SVSubscriber_create + SVSubscriber_setListener + SVSubscriber_destroy + SVClientASDU_getSmpCnt + SVClientASDU_getSvId + SVClientASDU_getConfRev + SVClientASDU_getINT8 + SVClientASDU_getINT16 + SVClientASDU_getINT32 + SVClientASDU_getINT8U + SVClientASDU_getINT16U + SVClientASDU_getINT32U + SVClientASDU_getFLOAT32 + SVClientASDU_getFLOAT64 + SVClientASDU_getDataSize + ClientSVControlBlock_create + ClientSVControlBlock_destroy + ClientSVControlBlock_isMulticast + ClientSVControlBlock_getLastComError + ClientSVControlBlock_setSvEna + ClientSVControlBlock_getSvEna + ClientSVControlBlock_setResv + ClientSVControlBlock_getResv + ClientSVControlBlock_getMsvID + ClientSVControlBlock_getDatSet + ClientSVControlBlock_getConfRev + ClientSVControlBlock_getSmpRate + ClientSVControlBlock_getDstAddress + ClientSVControlBlock_getOptFlds + ClientSVControlBlock_getSmpMod + ClientSVControlBlock_getNoASDU \ No newline at end of file From 06a3f7618973a9367c1e7af6b2a88f8c24c78894 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 16 Nov 2015 09:48:46 +0100 Subject: [PATCH 08/33] - updated documentation for SV subscriber --- .../sv_subscriber/sv_subscriber_example.c | 21 ++++++++++++++++--- src/doxygen.config | 3 ++- src/sampled_values/sv_subscriber.h | 8 +++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/examples/sv_subscriber/sv_subscriber_example.c b/examples/sv_subscriber/sv_subscriber_example.c index 131bc5e8..46784c92 100644 --- a/examples/sv_subscriber/sv_subscriber_example.c +++ b/examples/sv_subscriber/sv_subscriber_example.c @@ -1,5 +1,5 @@ /* - * subscriber_test.c + * sv_subscriber_example.c * * Example program for Sampled Values (SV) subscriber * @@ -33,6 +33,16 @@ svUpdateListener (SVSubscriber subscriber, void* parameter, SVClientASDU asdu) printf(" smpCnt: %i\n", SVClientASDU_getSmpCnt(asdu)); printf(" confRev: %u\n", SVClientASDU_getConfRev(asdu)); + /* + * Access to the data requires a priori knowledge of the data set. + * For this example we assume a data set consisting of FLOAT32 values. + * A FLOAT32 value is encoded as 4 bytes. You can find the first FLOAT32 + * value at byte position 0, the second value at byte position 4, the third + * value at byte position 8, and so on. + * + * To prevent damages due configuration, please check the length of the + * data block of the SV message before accessing the data. + */ if (SVClientASDU_getDataSize(asdu) >= 8) { printf(" DATA[0]: %f\n", SVClientASDU_getFLOAT32(asdu, 0)); printf(" DATA[1]: %f\n", SVClientASDU_getFLOAT32(asdu, 4)); @@ -53,21 +63,26 @@ main(int argc, char** argv) SVReceiver_setInterfaceId(receiver, "eth0"); } + /* Create a subscriber listening to SV messages with APPID 4000h */ SVSubscriber subscriber = SVSubscriber_create(NULL, 0x4000); + /* Install a callback handler for the subscriber */ SVSubscriber_setListener(subscriber, svUpdateListener, NULL); + /* Connect the subscriber to the receiver */ SVReceiver_addSubscriber(receiver, subscriber); + /* Start listening to SV messages - starts a new receiver background thread */ SVReceiver_start(receiver); signal(SIGINT, sigint_handler); - while (running) { + while (running) Thread_sleep(1); - } + /* Stop listening to SV messages */ SVReceiver_stop(receiver); + /* Cleanup and free resources */ SVReceiver_destroy(receiver); } diff --git a/src/doxygen.config b/src/doxygen.config index f6275955..c9c1c332 100644 --- a/src/doxygen.config +++ b/src/doxygen.config @@ -18,7 +18,7 @@ DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "libIEC61850" -PROJECT_NUMBER = 0.8.7 +PROJECT_NUMBER = 0.9.0 PROJECT_BRIEF = "Open-source IEC 61850 MMS/GOOSE server and client library" @@ -219,6 +219,7 @@ INPUT += "iec61850/inc/iec61850_config_file_parser.h" INPUT += "iec61850/inc/iec61850_cdc.h" INPUT += "goose/goose_subscriber.h" INPUT += "goose/goose_receiver.h" +INPUT += "sampled_values/sv_subscriber.h" INPUT += "mms/inc/mms_device_model.h" INPUT += "mms/inc/mms_types.h" INPUT += "mms/inc/mms_common.h" diff --git a/src/sampled_values/sv_subscriber.h b/src/sampled_values/sv_subscriber.h index b619e294..f15ca21a 100644 --- a/src/sampled_values/sv_subscriber.h +++ b/src/sampled_values/sv_subscriber.h @@ -30,6 +30,12 @@ extern "C" { #endif +/** + * \defgroup sv_subscriber_api_group IEC 61850 sampled values (SV) subscriber API + */ +/**@{*/ + + /** * \brief opaque handle to a SV ASDU (Application service data unit) instance. * @@ -318,6 +324,8 @@ SVClientASDU_getFLOAT64(SVClientASDU self, int index); int SVClientASDU_getDataSize(SVClientASDU self); +/**@}*/ + #ifdef __cplusplus } #endif From dda1bad0071b5609342f721edfd8030144283821 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 16 Nov 2015 10:51:45 +0100 Subject: [PATCH 09/33] - extended documentation for SV subscriber --- src/iec61850/client/client_sv_control.c | 358 ++++++++++++++++++++++++ src/sampled_values/sv_subscriber.h | 41 +++ 2 files changed, 399 insertions(+) create mode 100644 src/iec61850/client/client_sv_control.c diff --git a/src/iec61850/client/client_sv_control.c b/src/iec61850/client/client_sv_control.c new file mode 100644 index 00000000..6a2cfb6d --- /dev/null +++ b/src/iec61850/client/client_sv_control.c @@ -0,0 +1,358 @@ +/* + * client_sv_control.c + * + * Copyright 2015 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#include "iec61850_client.h" + +#include "stack_config.h" + +#include "ied_connection_private.h" + +#include "libiec61850_platform_includes.h" + +struct sClientSVControlBlock { + IedConnection connection; + bool isMulticast; + char* reference; + IedClientError lastError; +}; + +ClientSVControlBlock +ClientSVControlBlock_create(IedConnection connection, const char* reference) +{ + bool isMulticast = false; + + /* Check if CB exists and if it is a unicast or mulitcast CB */ + IedClientError error; + MmsValue* value = IedConnection_readObject(connection, &error, reference, IEC61850_FC_MS); + + if (value != NULL) { + isMulticast = true; + MmsValue_delete(value); + } + else { + value = IedConnection_readObject(connection, &error, reference, IEC61850_FC_US); + + if (value == NULL) + return NULL; + + MmsValue_delete(value); + } + + ClientSVControlBlock self = (ClientSVControlBlock) GLOBAL_CALLOC(1, sizeof(struct sClientSVControlBlock)); + + if (self) { + self->connection = connection; + self->reference = copyString(reference); + self->isMulticast = isMulticast; + } + + return self; +} + +void +ClientSVControlBlock_destroy(ClientSVControlBlock self) +{ + if (self) { + GLOBAL_FREEMEM(self->reference); + GLOBAL_FREEMEM(self); + } +} + + +IedClientError +ClientSVControlBlock_getLastComError(ClientSVControlBlock self) +{ + return self->lastError; +} + +bool +ClientSVControlBlock_isMulticast(ClientSVControlBlock self) +{ + return self->isMulticast; +} + +static bool +setBooleanVariable(ClientSVControlBlock self, const char* varName, bool value) +{ + char refBuf[130]; + + strcpy(refBuf, self->reference); + strcat(refBuf, "."); + strcat(refBuf, varName); + + self->lastError = IED_ERROR_OK; + + if (self->isMulticast) + IedConnection_writeBooleanValue(self->connection, &(self->lastError), refBuf, IEC61850_FC_MS, value); + else + IedConnection_writeBooleanValue(self->connection, &(self->lastError), refBuf, IEC61850_FC_US, value); + + + if (self->lastError == IED_ERROR_OK) + return true; + else + return false; +} + +bool +ClientSVControlBlock_setSvEna(ClientSVControlBlock self, bool svEna) +{ + return setBooleanVariable(self, "SvEna", svEna); +} + +bool +ClientSVControlBlock_setResv(ClientSVControlBlock self, bool svEna) +{ + if (self->isMulticast == false) + return setBooleanVariable(self, "SvEna", svEna); + else + return false; +} + +static bool +readBooleanVariable(ClientSVControlBlock self, const char* varName) +{ + char refBuf[130]; + + strcpy(refBuf, self->reference); + strcat(refBuf, "."); + strcat(refBuf, varName); + + self->lastError = IED_ERROR_OK; + + bool retVal; + + if (self->isMulticast) + retVal = IedConnection_readBooleanValue(self->connection, &(self->lastError), refBuf, IEC61850_FC_MS); + else + retVal = IedConnection_readBooleanValue(self->connection, &(self->lastError), refBuf, IEC61850_FC_US); + + return retVal; +} + +bool +ClientSVControlBlock_getSvEna(ClientSVControlBlock self) +{ + return readBooleanVariable(self, "SvEna"); +} + +bool +ClientSVControlBlock_getResv(ClientSVControlBlock self) +{ + return readBooleanVariable(self, "Resv"); +} + +static char* +readStringVariable(ClientSVControlBlock self, const char* varName) +{ + char refBuf[130]; + + strcpy(refBuf, self->reference); + strcat(refBuf, "."); + strcat(refBuf, varName); + + self->lastError = IED_ERROR_OK; + + char* retVal; + + if (self->isMulticast) + retVal = IedConnection_readStringValue(self->connection, &(self->lastError), refBuf, IEC61850_FC_MS); + else + retVal = IedConnection_readStringValue(self->connection, &(self->lastError), refBuf, IEC61850_FC_US); + + return retVal; +} + +char* +ClientSVControlBlock_getMsvID(ClientSVControlBlock self) +{ + return readStringVariable(self, "MsvID"); +} + +char* +ClientSVControlBlock_getDatSet(ClientSVControlBlock self) +{ + return readStringVariable(self, "DatSet"); +} + +static uint32_t +readUIntVariable(ClientSVControlBlock self, const char* varName) +{ + char refBuf[130]; + + strcpy(refBuf, self->reference); + strcat(refBuf, "."); + strcat(refBuf, varName); + + self->lastError = IED_ERROR_OK; + + uint32_t retVal; + + if (self->isMulticast) + retVal = IedConnection_readUnsigned32Value(self->connection, &(self->lastError), refBuf, IEC61850_FC_MS); + else + retVal = IedConnection_readUnsigned32Value(self->connection, &(self->lastError), refBuf, IEC61850_FC_US); + + return retVal; +} + +uint32_t +ClientSVControlBlock_getConfRev(ClientSVControlBlock self) +{ + return readUIntVariable(self, "ConfRev"); +} + +uint16_t +ClientSVControlBlock_getSmpRate(ClientSVControlBlock self) +{ + return readUIntVariable(self, "SmpRate"); +} + +int +ClientSVControlBlock_getOptFlds(ClientSVControlBlock self) +{ + char refBuf[130]; + + strcpy(refBuf, self->reference); + strcat(refBuf, "."); + strcat(refBuf, "OptFlds"); + + self->lastError = IED_ERROR_OK; + + MmsValue* optFlds; + + if (self->isMulticast) + optFlds = IedConnection_readObject(self->connection, &(self->lastError), refBuf, IEC61850_FC_MS); + else + optFlds = IedConnection_readObject(self->connection, &(self->lastError), refBuf, IEC61850_FC_US); + + if (optFlds == NULL) + return 0; + + int retVal = 0; + + if (MmsValue_getType(optFlds) == MMS_BIT_STRING) + retVal = MmsValue_getBitStringAsInteger(optFlds); + + MmsValue_delete(optFlds); + + return retVal; +} + +uint8_t +ClientSVControlBlock_getSmpMod(ClientSVControlBlock self) +{ + return readUIntVariable(self, "SmpMod"); +} + +int +ClientSVControlBlock_getNoASDU(ClientSVControlBlock self) +{ + return readUIntVariable(self, "noASDU"); +} + +DstAddress +ClientSVControlBlock_getDstAddress(ClientSVControlBlock self) +{ + char refBuf[130]; + + strcpy(refBuf, self->reference); + strcat(refBuf, "."); + strcat(refBuf, "DstAddress"); + + self->lastError = IED_ERROR_OK; + + MmsValue* dstAddrValue; + + if (self->isMulticast) + dstAddrValue = IedConnection_readObject(self->connection, &(self->lastError), refBuf, IEC61850_FC_MS); + else + dstAddrValue = IedConnection_readObject(self->connection, &(self->lastError), refBuf, IEC61850_FC_US); + + DstAddress retVal; + memset(&retVal, 0, sizeof(retVal)); + + if (dstAddrValue == NULL) goto exit_error; + + if (MmsValue_getType(dstAddrValue) != MMS_STRUCTURE) { + if (DEBUG_IED_CLIENT) printf("IED_CLIENT: SVCB - addr has wrong type\n"); + goto exit_cleanup; + } + + if (MmsValue_getArraySize(dstAddrValue) != 4) { + if (DEBUG_IED_CLIENT) printf("IED_CLIENT: SVCB - addr has wrong type\n"); + goto exit_cleanup; + } + + MmsValue* addr = MmsValue_getElement(dstAddrValue, 0); + + if (MmsValue_getType(addr) != MMS_OCTET_STRING) { + if (DEBUG_IED_CLIENT) printf("IED_CLIENT: SVCB - addr has wrong type\n"); + goto exit_cleanup; + } + + if (MmsValue_getOctetStringSize(addr) != 6) { + if (DEBUG_IED_CLIENT) printf("IED_CLIENT: SVCB - addr has wrong size\n"); + goto exit_cleanup; + } + + uint8_t* addrBuf = MmsValue_getOctetStringBuffer(addr); + + memcpy(&(retVal.addr), addrBuf, 6); + + MmsValue* prio = MmsValue_getElement(dstAddrValue, 1); + + if (MmsValue_getType(prio) != MMS_UNSIGNED) { + if (DEBUG_IED_CLIENT) printf("IED_CLIENT: SVCB - prio has wrong type\n"); + goto exit_cleanup; + } + + retVal.priority = MmsValue_toUint32(prio); + + MmsValue* vid = MmsValue_getElement(dstAddrValue, 2); + + if (MmsValue_getType(vid) != MMS_UNSIGNED) { + if (DEBUG_IED_CLIENT) printf("IED_CLIENT: SVCB - vid has wrong type\n"); + goto exit_cleanup; + } + + retVal.vid = MmsValue_toUint32(vid); + + MmsValue* appID = MmsValue_getElement(dstAddrValue, 3); + + if (MmsValue_getType(appID) != MMS_UNSIGNED) { + if (DEBUG_IED_CLIENT) printf("IED_CLIENT: SVCB - appID has wrong type\n"); + goto exit_cleanup; + } + + retVal.appId = MmsValue_toUint32(appID); + + +exit_cleanup: + MmsValue_delete(dstAddrValue); + +exit_error: + return retVal; +} + + diff --git a/src/sampled_values/sv_subscriber.h b/src/sampled_values/sv_subscriber.h index f15ca21a..a72075e1 100644 --- a/src/sampled_values/sv_subscriber.h +++ b/src/sampled_values/sv_subscriber.h @@ -32,6 +32,47 @@ extern "C" { /** * \defgroup sv_subscriber_api_group IEC 61850 sampled values (SV) subscriber API + * + * The sampled values (SV) subscriber API consists of three different objects. + * The \ref SVReceiver object is responsible for handling all SV Ethernet messages + * for a specific Ethernet interface. If you want to receive SV messages on multiple + * Ethernet interfaces you have to use several \ref SVReceiver instances. + * An \ref SVSubscriber object is associated to a SV data stream that is identified by its appID + * and destination Ethernet address. The \reg SVSubscriber object is used to install a callback + * handler that is invoked for each ASDU (application service data unit) received for the + * associated stream. An \ref SVClientASDU is an object that represents a single ASDU. Each ASDU contains + * some meta information that can be obtained by specific access functions like e.g. + * \ref SVClientASDU_getSmpCnt to access the "SmpCnt" (sample count) attribute of the ASDU. The actual + * measurement data contained in the ASDU does not consist of structured ASN.1 data but stored as raw binary + * data. Without a priori knowledge of the dataset associated with the ASDU data stream it is not + * possible to interpret the received data correctly. Therefore you have to provide the data access functions + * with an index value to indicate the data type and the start of the data in the data block of the ASDU. + * E.g. reading a data set consisting of two FLOAT32 values you can use two subsequent calls of + * \ref SVClientASDU_getFLOAT32 one with index = 0 and the second one with index = 4. + * + * | IEC 61850 type | required bytes | + * | -------------- | -------------- | + * | BOOLEAN | 1 byte | + * | INT8 | 1 byte | + * | INT16 | 2 byte | + * | INT32 | 4 byte | + * | INT64 | 8 byte | + * | INT8U | 1 byte | + * | INT16U | 2 byte | + * | INT24U | 3 byte | + * | INT32U | 4 byte | + * | FLOAT32 | 4 byte | + * | FLOAT64 | 8 byte | + * | ENUMERATED | 4 byte | + * | CODED ENUM | 4 byte | + * | OCTET STRING | 20 byte | + * | VISIBLE STRING | 35 byte | + * | TimeStamp | 8 byte | + * | EntryTime | 6 byte | + * | BITSTRING | 4 byte | + * + * The SV subscriber API can be used independent of the IEC 61850 client API. In order to access the SVCB via MMS you + * have to use the IEC 61850 client API. Please see \ref ClientSVControlBlock object in section \ref IEC61850_CLIENT_SV . */ /**@{*/ From 3fe6edfbc7a09c1b600a403a031b2e5edb9752b0 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 16 Nov 2015 11:00:58 +0100 Subject: [PATCH 10/33] - added README file in third_party/winpcap --- third_party/winpcap/README | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 third_party/winpcap/README diff --git a/third_party/winpcap/README b/third_party/winpcap/README new file mode 100644 index 00000000..9050673d --- /dev/null +++ b/third_party/winpcap/README @@ -0,0 +1,2 @@ +For GOOSE support add winpcap source and headers here. Rerun cmake to configure the build system for GOOSE support. + From 348273a1c84663bfde2a94db451c387cf2af0200 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 16 Nov 2015 11:31:14 +0100 Subject: [PATCH 11/33] - fixed bug: GOOSE minTime, maxTime are ignored by GOOSE publisher when set by GSEControlBlock_create. Instead default values from stack_config.h are always used --- .../server_example_dynamic.c | 2 ++ src/iec61850/server/mms_mapping/mms_goose.c | 26 +++++++------------ src/sampled_values/sv_subscriber.h | 3 ++- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/examples/server_example_dynamic/server_example_dynamic.c b/examples/server_example_dynamic/server_example_dynamic.c index 49dccbc1..1d01c40a 100644 --- a/examples/server_example_dynamic/server_example_dynamic.c +++ b/examples/server_example_dynamic/server_example_dynamic.c @@ -57,6 +57,8 @@ int main(int argc, char** argv) { ReportControlBlock_create("events01", lln0, "events01", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0); ReportControlBlock_create("events02", lln0, "events02", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0); + GSEControlBlock_create("gse01", lln0, "events01", "events", 1, false, 200, 3000); + /********************* * run server ********************/ diff --git a/src/iec61850/server/mms_mapping/mms_goose.c b/src/iec61850/server/mms_mapping/mms_goose.c index 4df30eba..dafc5188 100644 --- a/src/iec61850/server/mms_mapping/mms_goose.c +++ b/src/iec61850/server/mms_mapping/mms_goose.c @@ -305,24 +305,20 @@ MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t current GoosePublisher_publish(self->publisher, self->dataSetValues); if (self->retransmissionsLeft > 0) { - self->nextPublishTime = currentTime + CONFIG_GOOSE_EVENT_RETRANSMISSION_INTERVAL; + self->nextPublishTime = currentTime + self->minTime; if (self->retransmissionsLeft > 1) - GoosePublisher_setTimeAllowedToLive(self->publisher, - CONFIG_GOOSE_EVENT_RETRANSMISSION_INTERVAL * 3); + GoosePublisher_setTimeAllowedToLive(self->publisher, self->minTime * 3); else - GoosePublisher_setTimeAllowedToLive(self->publisher, - CONFIG_GOOSE_STABLE_STATE_TRANSMISSION_INTERVAL * 3); + GoosePublisher_setTimeAllowedToLive(self->publisher, self->maxTime * 3); self->retransmissionsLeft--; } else { - GoosePublisher_setTimeAllowedToLive(self->publisher, - CONFIG_GOOSE_STABLE_STATE_TRANSMISSION_INTERVAL * 3); + GoosePublisher_setTimeAllowedToLive(self->publisher, self->maxTime * 3); - self->nextPublishTime = currentTime + - CONFIG_GOOSE_STABLE_STATE_TRANSMISSION_INTERVAL; + self->nextPublishTime = currentTime + self->maxTime; } #if (CONFIG_MMS_THREADLESS_STACK != 1) @@ -343,18 +339,14 @@ MmsGooseControlBlock_observedObjectChanged(MmsGooseControlBlock self) self->retransmissionsLeft = CONFIG_GOOSE_EVENT_RETRANSMISSION_COUNT; if (self->retransmissionsLeft > 0) { - self->nextPublishTime = currentTime + - CONFIG_GOOSE_EVENT_RETRANSMISSION_INTERVAL; + self->nextPublishTime = currentTime + self->minTime; - GoosePublisher_setTimeAllowedToLive(self->publisher, - CONFIG_GOOSE_EVENT_RETRANSMISSION_INTERVAL * 3); + GoosePublisher_setTimeAllowedToLive(self->publisher, self->minTime * 3); } else { - self->nextPublishTime = currentTime + - CONFIG_GOOSE_STABLE_STATE_TRANSMISSION_INTERVAL; + self->nextPublishTime = currentTime + self->maxTime; - GoosePublisher_setTimeAllowedToLive(self->publisher, - CONFIG_GOOSE_STABLE_STATE_TRANSMISSION_INTERVAL * 3); + GoosePublisher_setTimeAllowedToLive(self->publisher, self->maxTime * 3); } GoosePublisher_publish(self->publisher, self->dataSetValues); diff --git a/src/sampled_values/sv_subscriber.h b/src/sampled_values/sv_subscriber.h index a72075e1..282eb3f4 100644 --- a/src/sampled_values/sv_subscriber.h +++ b/src/sampled_values/sv_subscriber.h @@ -72,7 +72,8 @@ extern "C" { * | BITSTRING | 4 byte | * * The SV subscriber API can be used independent of the IEC 61850 client API. In order to access the SVCB via MMS you - * have to use the IEC 61850 client API. Please see \ref ClientSVControlBlock object in section \ref IEC61850_CLIENT_SV . + * have to use the IEC 61850 client API. Please see \ref ClientSVControlBlock object in section \ref IEC61850_CLIENT_SV. + * */ /**@{*/ From 603f343d5d5d5329ba9e0876be13481c92b4116e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 16 Nov 2015 12:25:33 +0100 Subject: [PATCH 12/33] - removed type DstAddress and replaced by type PhyComAddress --- .../iec61850_sv_client_example/sv_client_example.c | 10 +++++----- src/iec61850/client/client_sv_control.c | 10 +++++----- src/iec61850/inc/iec61850_client.h | 9 +-------- src/iec61850/inc/iec61850_common.h | 8 ++++++++ src/iec61850/inc/iec61850_model.h | 7 ------- src/sampled_values/sv_subscriber.h | 2 +- 6 files changed, 20 insertions(+), 26 deletions(-) diff --git a/examples/iec61850_sv_client_example/sv_client_example.c b/examples/iec61850_sv_client_example/sv_client_example.c index 1ffe8aee..90922ec0 100644 --- a/examples/iec61850_sv_client_example/sv_client_example.c +++ b/examples/iec61850_sv_client_example/sv_client_example.c @@ -12,16 +12,16 @@ #include "hal_thread.h" static void -printDstAddr(DstAddress dstAddress) +printDstAddr(PhyComAddress dstAddress) { printf(" addr: "); int i; for (i = 0; i < 6; i++) - printf("%02x", dstAddress.addr[i]); + printf("%02x", dstAddress.dstAddress[i]); - printf("\n prio: %u\n", dstAddress.priority); - printf(" vid: %u\n", dstAddress.vid); + printf("\n prio: %u\n", dstAddress.vlanPriority); + printf(" vid: %u\n", dstAddress.vlanId); printf(" appID: %u\n", dstAddress.appId); } @@ -98,7 +98,7 @@ int main(int argc, char** argv) { printf("noASDU: %i\n", ClientSVControlBlock_getNoASDU(svcb)); - DstAddress dstAddress = ClientSVControlBlock_getDstAddress(svcb); + PhyComAddress dstAddress = ClientSVControlBlock_getDstAddress(svcb); printDstAddr(dstAddress); diff --git a/src/iec61850/client/client_sv_control.c b/src/iec61850/client/client_sv_control.c index 6a2cfb6d..966ea638 100644 --- a/src/iec61850/client/client_sv_control.c +++ b/src/iec61850/client/client_sv_control.c @@ -271,7 +271,7 @@ ClientSVControlBlock_getNoASDU(ClientSVControlBlock self) return readUIntVariable(self, "noASDU"); } -DstAddress +PhyComAddress ClientSVControlBlock_getDstAddress(ClientSVControlBlock self) { char refBuf[130]; @@ -289,7 +289,7 @@ ClientSVControlBlock_getDstAddress(ClientSVControlBlock self) else dstAddrValue = IedConnection_readObject(self->connection, &(self->lastError), refBuf, IEC61850_FC_US); - DstAddress retVal; + PhyComAddress retVal; memset(&retVal, 0, sizeof(retVal)); if (dstAddrValue == NULL) goto exit_error; @@ -318,7 +318,7 @@ ClientSVControlBlock_getDstAddress(ClientSVControlBlock self) uint8_t* addrBuf = MmsValue_getOctetStringBuffer(addr); - memcpy(&(retVal.addr), addrBuf, 6); + memcpy(&(retVal.dstAddress), addrBuf, 6); MmsValue* prio = MmsValue_getElement(dstAddrValue, 1); @@ -327,7 +327,7 @@ ClientSVControlBlock_getDstAddress(ClientSVControlBlock self) goto exit_cleanup; } - retVal.priority = MmsValue_toUint32(prio); + retVal.vlanPriority = MmsValue_toUint32(prio); MmsValue* vid = MmsValue_getElement(dstAddrValue, 2); @@ -336,7 +336,7 @@ ClientSVControlBlock_getDstAddress(ClientSVControlBlock self) goto exit_cleanup; } - retVal.vid = MmsValue_toUint32(vid); + retVal.vlanId = MmsValue_toUint32(vid); MmsValue* appID = MmsValue_getElement(dstAddrValue, 3); diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 69dce0f4..2f7b1b8e 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -331,13 +331,6 @@ IedConnection_getMmsConnection(IedConnection self); /** an opaque handle to the instance data of a ClientSVControlBlock object */ typedef struct sClientSVControlBlock* ClientSVControlBlock; -typedef struct { - uint8_t addr[6]; - uint8_t priority; - uint16_t vid; - uint16_t appId; -} DstAddress; - /** * \brief Create a new ClientSVControlBlock instance * @@ -415,7 +408,7 @@ ClientSVControlBlock_getSmpRate(ClientSVControlBlock self); * * \param self the ClientSVControlBlock instance to operate on */ -DstAddress +PhyComAddress ClientSVControlBlock_getDstAddress(ClientSVControlBlock self); /** diff --git a/src/iec61850/inc/iec61850_common.h b/src/iec61850/inc/iec61850_common.h index 0ff91892..0c9dc271 100644 --- a/src/iec61850/inc/iec61850_common.h +++ b/src/iec61850/inc/iec61850_common.h @@ -36,6 +36,14 @@ extern "C" { */ /**@{*/ +/** PhyComAddress type contains Ethernet address and VLAN attributes */ +typedef struct { + uint8_t vlanPriority; + uint16_t vlanId; + uint16_t appId; + uint8_t dstAddress[6]; +} PhyComAddress; + /** * @defgroup TRIGGER_OPTIONS Trigger options (bit values combinable) * diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index 376593b0..cd6828bf 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -270,13 +270,6 @@ struct sSettingGroupControlBlock { SettingGroupControlBlock* sibling; /* next control block in list or NULL if this is the last entry */ }; -typedef struct { - uint8_t vlanPriority; - uint16_t vlanId; - uint16_t appId; - uint8_t dstAddress[6]; -} PhyComAddress; - struct sGSEControlBlock { LogicalNode* parent; char* name; diff --git a/src/sampled_values/sv_subscriber.h b/src/sampled_values/sv_subscriber.h index 282eb3f4..c463e5bd 100644 --- a/src/sampled_values/sv_subscriber.h +++ b/src/sampled_values/sv_subscriber.h @@ -39,7 +39,7 @@ extern "C" { * Ethernet interfaces you have to use several \ref SVReceiver instances. * An \ref SVSubscriber object is associated to a SV data stream that is identified by its appID * and destination Ethernet address. The \reg SVSubscriber object is used to install a callback - * handler that is invoked for each ASDU (application service data unit) received for the + * handler \ref SVUpdateListener that is invoked for each ASDU (application service data unit) received for the * associated stream. An \ref SVClientASDU is an object that represents a single ASDU. Each ASDU contains * some meta information that can be obtained by specific access functions like e.g. * \ref SVClientASDU_getSmpCnt to access the "SmpCnt" (sample count) attribute of the ASDU. The actual From bae3de6bc3232a212869d40639ee1bd8cae2fa5b Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 17 Nov 2015 12:07:53 +0100 Subject: [PATCH 13/33] - added test sv publisher --- .../sv_subscriber/test_publisher/Makefile | 22 + .../test_publisher/sv_publisher.c | 571 ++++++++++++++++++ src/iec61850/server/mms_mapping/reporting.c | 7 +- 3 files changed, 596 insertions(+), 4 deletions(-) create mode 100644 examples/sv_subscriber/test_publisher/Makefile create mode 100644 examples/sv_subscriber/test_publisher/sv_publisher.c diff --git a/examples/sv_subscriber/test_publisher/Makefile b/examples/sv_subscriber/test_publisher/Makefile new file mode 100644 index 00000000..56c20628 --- /dev/null +++ b/examples/sv_subscriber/test_publisher/Makefile @@ -0,0 +1,22 @@ +LIBIEC_HOME=../../../ + +PROJECT_BINARY_NAME = sv_test_publisher +PROJECT_SOURCES = sv_publisher.c +# PROJECT_SOURCES += remote_control.c + +INCLUDES += -I. + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) + + diff --git a/examples/sv_subscriber/test_publisher/sv_publisher.c b/examples/sv_subscriber/test_publisher/sv_publisher.c new file mode 100644 index 00000000..0fea09b2 --- /dev/null +++ b/examples/sv_subscriber/test_publisher/sv_publisher.c @@ -0,0 +1,571 @@ +/* + * sv_publisher.c + * + * Copyright 2013 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#include "stack_config.h" +#include "libiec61850_platform_includes.h" + +#include "hal_ethernet.h" + +#define DEBUG_SV_PUBLISHER 1 + +#define CONFIG_SV_DEFAULT_DST_ADDRESS CONFIG_GOOSE_DEFAULT_DST_ADDRESS + +#define CONFIG_SV_DEFAULT_PRIORITY 4 +#define CONFIG_SV_DEFAULT_VLAN_ID 0 +#define CONFIG_SV_DEFAULT_APPID 0x4000 + +#define SV_MAX_MESSAGE_SIZE 1518 + +#define IEC61850_SV_SMPSYNC_NOT_SYNCHRONIZED 0 +#define IEC61850_SV_SMPSYNC_SYNCED_UNSPEC_LOCAL_CLOCK 1 +#define IEC61850_SV_SMPSYNC_SYNCED_GLOBAL_CLOCK 2 + +#define IEC61850_SV_SMPMOD_PER_NOMINAL_PERIOD 0 +#define IEC61850_SV_SMPMOD_SAMPLES_PER_SECOND 1 +#define IEC61850_SV_SMPMOD_SECONDS_PER_SAMPLE 2 + +typedef struct sCommParameters { + uint8_t vlanPriority; + uint16_t vlanId; + uint16_t appId; + uint8_t dstAddress[6]; +} CommParameters; + +typedef struct sSV_ASDU* SV_ASDU; + +struct sSV_ASDU { + char* svID; + char* datset; + int dataSize; + + bool hasRefrTm; + bool hasSmpRate; + bool hasSmpMod; + + uint8_t* _dataBuffer; + + uint8_t smpSynch; + uint16_t smpCnt; + uint32_t confRev; + + uint8_t* smpCntBuf; + + SV_ASDU _next; +}; + +typedef struct sSampledValuesPublisher* SampledValuesPublisher; + +struct sSampledValuesPublisher { + uint8_t* buffer; + uint16_t appId; + EthernetSocket ethernetSocket; + + int lengthField; /* can probably be removed since packets have fixed size! */ + int payloadStart; + + int payloadLength; /* length of payload buffer */ + + int asduCount; /* number of ASDUs in the APDU */ + SV_ASDU asduLIst; + + +}; + + +static void +preparePacketBuffer(SampledValuesPublisher self, CommParameters* parameters, char* interfaceID) +{ + uint8_t srcAddr[6]; + + if (interfaceID != NULL) + Ethernet_getInterfaceMACAddress(interfaceID, srcAddr); + else + Ethernet_getInterfaceMACAddress(CONFIG_ETHERNET_INTERFACE_ID, srcAddr); + + uint8_t defaultDstAddr[] = CONFIG_SV_DEFAULT_DST_ADDRESS; + + uint8_t* dstAddr; + uint8_t priority; + uint16_t vlanId; + uint16_t appId; + + if (parameters == NULL) { + dstAddr = defaultDstAddr; + priority = CONFIG_SV_DEFAULT_PRIORITY; + vlanId = CONFIG_SV_DEFAULT_VLAN_ID; + appId = CONFIG_SV_DEFAULT_APPID; + } + else { + dstAddr = parameters->dstAddress; + priority = parameters->vlanPriority; + vlanId = parameters->vlanId; + appId = parameters->appId; + } + + if (interfaceID != NULL) + self->ethernetSocket = Ethernet_createSocket(interfaceID, dstAddr); + else + self->ethernetSocket = Ethernet_createSocket(CONFIG_ETHERNET_INTERFACE_ID, dstAddr); + + self->buffer = (uint8_t*) GLOBAL_MALLOC(SV_MAX_MESSAGE_SIZE); + + memcpy(self->buffer, dstAddr, 6); + memcpy(self->buffer + 6, srcAddr, 6); + + int bufPos = 12; + + /* Priority tag - IEEE 802.1Q */ + self->buffer[bufPos++] = 0x81; + self->buffer[bufPos++] = 0x00; + + uint8_t tci1 = priority << 5; + tci1 += vlanId / 256; + + uint8_t tci2 = vlanId % 256; + + self->buffer[bufPos++] = tci1; /* Priority + VLAN-ID */ + self->buffer[bufPos++] = tci2; /* VLAN-ID */ + + /* EtherType Sampled Values */ + self->buffer[bufPos++] = 0x88; + self->buffer[bufPos++] = 0xBa; + + /* APPID */ + self->buffer[bufPos++] = appId / 256; + self->buffer[bufPos++] = appId % 256; + + self->lengthField = bufPos; + + /* Length */ + self->buffer[bufPos++] = 0x00; + self->buffer[bufPos++] = 0x08; + + /* Reserved1 */ + self->buffer[bufPos++] = 0x00; + self->buffer[bufPos++] = 0x00; + + /* Reserved2 */ + self->buffer[bufPos++] = 0x00; + self->buffer[bufPos++] = 0x00; + + self->payloadStart = bufPos; +} + + +static int +encodeUInt16FixedSize(uint16_t value, uint8_t* buffer, int bufPos) +{ + uint8_t* valueArray = (uint8_t*) &value; + +#if (ORDER_LITTLE_ENDIAN == 1) + buffer[bufPos++] = valueArray[1]; + buffer[bufPos++] = valueArray[0]; +#else + buffer[bufPos++] = valueArray[0]; + buffer[bufPos++] = valueArray[1]; +#endif + + return bufPos; +} + +static int +encodeUInt32FixedSize(uint32_t value, uint8_t* buffer, int bufPos) +{ + uint8_t* valueArray = (uint8_t*) &value; + +#if (ORDER_LITTLE_ENDIAN == 1) + buffer[bufPos++] = valueArray[3]; + buffer[bufPos++] = valueArray[2]; + buffer[bufPos++] = valueArray[1]; + buffer[bufPos++] = valueArray[0]; +#else + buffer[bufPos++] = valueArray[0]; + buffer[bufPos++] = valueArray[1]; + buffer[bufPos++] = valueArray[2]; + buffer[bufPos++] = valueArray[3]; +#endif + + return bufPos; +} + + +SampledValuesPublisher +SampledValuesPublisher_create() +{ + SampledValuesPublisher self = GLOBAL_CALLOC(1, sizeof(struct sSampledValuesPublisher)); + + self->asduLIst = NULL; + + preparePacketBuffer(self, NULL, "eth0"); + + return self; +} + +SV_ASDU +SampledValuesPublisher_addASDU(SampledValuesPublisher self, char* svID, char* datset, uint32_t confRev) +{ + SV_ASDU newAsdu = GLOBAL_CALLOC(1, sizeof(struct sSV_ASDU)); + + newAsdu->svID = svID; + newAsdu->datset = datset; + newAsdu->confRev = confRev; + + newAsdu->_next = NULL; + + /* append new ASDU to list */ + if (self->asduLIst == NULL) + self->asduLIst = newAsdu; + else { + SV_ASDU lastAsdu = self->asduLIst; + + while (lastAsdu->_next != NULL) + lastAsdu = lastAsdu->_next; + + lastAsdu->_next = newAsdu; + } + + return newAsdu; +} + +static int +SV_ASDU_getEncodedSize(SV_ASDU self) +{ + int encodedSize = 0; + + /* svID */ + encodedSize += ( 2 + strlen(self->svID) ); + + /* datset */ + if (self->datset != NULL) + encodedSize += ( 2 + strlen(self->datset) ); + + /* smpCnt */ + encodedSize += 4; + + /* confRef */ + encodedSize += 6; + + /* refrTm */ + if (self->hasRefrTm) + encodedSize += 10; /* ??? */ + + /* smpSynch */ + encodedSize += 3; + + /* smpRate */ + if (self->hasSmpRate) + encodedSize += 4; + + /* sample */ + encodedSize += 2; + encodedSize += self->dataSize; + + /* smpMod */ + if (self->hasSmpMod) + encodedSize += 4; + + return encodedSize; +} + +static int +SV_ASDU_encodeToBuffer(SV_ASDU self, uint8_t* buffer, int bufPos) +{ + int encodedSize = SV_ASDU_getEncodedSize(self); + + /* tag and length field */ + bufPos = BerEncoder_encodeTL(0x30, encodedSize, buffer, bufPos); + + /* svID */ + bufPos = BerEncoder_encodeStringWithTag(0x80, self->svID, buffer, bufPos); + + /* DatSet */ + if (self->datset != NULL) + bufPos = BerEncoder_encodeStringWithTag(0x81, self->datset, buffer, bufPos); + + uint8_t octetString[4]; + + /* SmpCnt */ + bufPos = BerEncoder_encodeTL(0x82, 2, buffer, bufPos); + self->smpCntBuf = buffer + bufPos; + bufPos = encodeUInt16FixedSize(self->smpCnt, buffer, bufPos); + + /* ConfRev */ + bufPos = BerEncoder_encodeTL(0x83, 4, buffer, bufPos); + bufPos = encodeUInt32FixedSize(self->confRev, buffer, bufPos); + + /* RefrTm */ + //TODO implement me + + /* SmpSynch */ + bufPos = BerEncoder_encodeTL(0x85, 1, buffer, bufPos); + buffer[bufPos++] = self->smpSynch; + + /* SmpRate */ + //TODO implement me + + /* Sample */ + bufPos = BerEncoder_encodeTL(0x87, self->dataSize, buffer, bufPos); + + self->_dataBuffer = buffer + bufPos; + + bufPos += self->dataSize; /* data has to inserted by user before sending message */ + + /* SmpMod */ + //TODO implement me + + return bufPos; +} + +void +SampledValuesPublisher_setupComplete(SampledValuesPublisher self) +{ + int numberOfAsdu = 0; + + /* determine number of ASDUs and length of all ASDUs */ + SV_ASDU nextAsdu = self->asduLIst; + int totalASDULength = 0; + + while (nextAsdu != NULL) { + numberOfAsdu++; + int asduLength = SV_ASDU_getEncodedSize(nextAsdu); + + /* tag and length field */ + asduLength += BerEncoder_determineLengthSize(asduLength); + asduLength++; + + totalASDULength += asduLength; + + nextAsdu = nextAsdu->_next; + } + + /* encode frame to buffer */ + int sequenceSize = 1 + BerEncoder_determineLengthSize(totalASDULength) + totalASDULength; + + int innerSize = 2 + BerEncoder_UInt32determineEncodedSize(numberOfAsdu) + sequenceSize; + + uint8_t* buffer = self->buffer + self->payloadStart; + + int bufPos = BerEncoder_encodeTL(0x60, innerSize, buffer, 0); + + /* noASDU */ + bufPos = BerEncoder_encodeUInt32WithTL(0x80, numberOfAsdu, buffer, bufPos); + + /* seqASDU */ + bufPos = BerEncoder_encodeTL(0xa2, totalASDULength, buffer, bufPos); + + nextAsdu = self->asduLIst; + + while (nextAsdu != NULL) { + bufPos = SV_ASDU_encodeToBuffer(nextAsdu, buffer, bufPos); + + nextAsdu = nextAsdu->_next; + } + + /* Update length field */ + int payloadLength = bufPos; + + size_t msgLength = payloadLength + 8; + + int lengthIndex = self->lengthField; + + self->buffer[lengthIndex] = msgLength / 256; + self->buffer[lengthIndex + 1] = msgLength & 0xff; + + self->payloadLength = payloadLength; + +} + + +void +SampledValuesPublisher_publish(SampledValuesPublisher self) +{ + if (DEBUG_SV_PUBLISHER) + printf("SV_PUBLISHER: send SV message\n"); + + Ethernet_sendPacket(self->ethernetSocket, self->buffer, self->payloadStart + self->payloadLength); + +} + + +void +SampledValuesPublisher_destroy(SampledValuesPublisher self) +{ + GLOBAL_FREEMEM(self->buffer); +} + + +void +SV_ASDU_resetBuffer(SV_ASDU self) +{ + self->dataSize = 0; +} + + +int +SV_ASDU_addINT8(SV_ASDU self) +{ + int index = self->dataSize; + + self->dataSize += 1; + + return index; +} + +void +SV_ASDU_setINT8(SV_ASDU self, int index, int8_t value) +{ + self->_dataBuffer[index] = value; +} + +int +SV_ASDU_addINT32(SV_ASDU self) +{ + int index = self->dataSize; + + self->dataSize += 4; + + return index; +} + +int +SV_ASDU_addFLOAT(SV_ASDU self) +{ + int index = self->dataSize; + + self->dataSize += 4; + + return index; +} + +void +SV_ASDU_setFLOAT(SV_ASDU self, int index, float value) +{ + uint8_t* buf = (uint8_t*) &value; + + +#if (ORDER_LITTLE_ENDIAN == 1) + BerEncoder_revertByteOrder(buf, 4); +#endif + + int i; + + uint8_t* buffer = self->_dataBuffer + index; + + for (i = 0; i < 4; i++) { + buffer[i] = buf[i]; + } +} + + +void +SV_ASDU_setSmpCnt(SV_ASDU self, uint16_t value) +{ + //TODO write value to correct field in buffer +} + +void +SV_ASDU_increaseSmpCnt(SV_ASDU self) +{ + self->smpCnt++; + + encodeUInt16FixedSize(self->smpCnt, self->smpCntBuf, 0); +} + +#if 0 +void +SV_ASDU_setRefrTm(SV_ASDU self, Timestamp refrTm) +{ +} +#endif + + +int +main(int argc, char** argv) +{ + SampledValuesPublisher svPublisher = SampledValuesPublisher_create(); + + SV_ASDU asdu1 = SampledValuesPublisher_addASDU(svPublisher, "svpub1", NULL, 1); + + int float1 = SV_ASDU_addFLOAT(asdu1); + int float2 = SV_ASDU_addFLOAT(asdu1); + + SV_ASDU asdu2 = SampledValuesPublisher_addASDU(svPublisher, "svpub2", NULL, 1); + + int float3 = SV_ASDU_addFLOAT(asdu2); + int float4 = SV_ASDU_addFLOAT(asdu2); + + SampledValuesPublisher_setupComplete(svPublisher); + + float fVal1 = 1234.5678f; + float fVal2 = 0.12345f; + + int i; + + for (i = 0; i < 10; i++) { + SV_ASDU_setFLOAT(asdu1, float1, fVal1); + SV_ASDU_setFLOAT(asdu1, float2, fVal2); + + SV_ASDU_increaseSmpCnt(asdu1); + SV_ASDU_increaseSmpCnt(asdu2); + + fVal1 += 1.1f; + fVal2 += 0.1f; + + SampledValuesPublisher_publish(svPublisher); + } + + SampledValuesPublisher_destroy(svPublisher); +} + +int +main1(int argc, char** argv) +{ + SampledValuesPublisher svPublisher = SampledValuesPublisher_create(); + + SV_ASDU asdu = SampledValuesPublisher_addASDU(svPublisher, "svpub1", NULL, 1); + + int float1 = SV_ASDU_addFLOAT(asdu); + int float2 = SV_ASDU_addFLOAT(asdu); + + SampledValuesPublisher_setupComplete(svPublisher); + + + float fVal1 = 1234.5678f; + float fVal2 = 0.12345f; + + int i; + + for (i = 0; i < 10; i++) { + SV_ASDU_setFLOAT(asdu, float1, fVal1); + SV_ASDU_setFLOAT(asdu, float2, fVal2); + SV_ASDU_increaseSmpCnt(asdu); + + fVal1 += 1.1f; + fVal2 += 0.1f; + + SampledValuesPublisher_publish(svPublisher); + } + + SampledValuesPublisher_destroy(svPublisher); +} + diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 61ee939f..0e410741 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -634,7 +634,7 @@ refreshTriggerOptions(ReportControl* rc) static void purgeBuf(ReportControl* rc) { - if (DEBUG_IED_SERVER) printf("reporting.c: run purgeBuf\n"); + if (DEBUG_IED_SERVER) printf("IED_SERVER: reporting.c: run purgeBuf\n"); ReportBuffer* reportBuffer = rc->reportBuffer; @@ -1202,7 +1202,7 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme } if (DEBUG_IED_SERVER) - printf("Activate report for client %s\n", + printf("IED_SERVER: Activate report for client %s\n", MmsServerConnection_getClientAddress(connection)); if (updateReportDataset(self, rc, NULL, connection)) { @@ -1245,7 +1245,7 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme } if (DEBUG_IED_SERVER) - printf("Deactivate report for client %s\n", + printf("IED_SERVER: Deactivate report for client %s\n", MmsServerConnection_getClientAddress(connection)); if (rc->buffered == false) { @@ -1321,7 +1321,6 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme increaseConfRev(rc); } else { - printf("BBBBBB\n"); retVal = DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; goto exit_function; } From daf876e4dfb4b162f9996586ecb6463bdbb42f25 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 17 Nov 2015 14:56:44 +0100 Subject: [PATCH 14/33] - fixed bug in sv_subscriber: missing initialization of allocated memory --- config/stack_config.h | 2 + examples/goose_subscriber/CMakeLists.txt | 4 - examples/sv_subscriber/CMakeLists.txt | 6 +- examples/sv_subscriber/Makefile | 2 +- .../sv_subscriber/sv_subscriber_example.c | 2 +- src/hal/ethernet/win32/ethernet_win32.c | 152 +++++++++--------- src/sampled_values/sv_subscriber.c | 4 +- 7 files changed, 88 insertions(+), 84 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index 3117ad9d..aba11f10 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -23,6 +23,8 @@ #define DEBUG_MMS_SERVER 0 #define DEBUG_GOOSE_SUBSCRIBER 0 #define DEBUG_GOOSE_PUBLISHER 0 +#define DEBUG_SV_SUBSCRIBER 0 +#define DEBUG_HAL_ETHERNET 0 /* Maximum MMS PDU SIZE - default is 65000 */ #define CONFIG_MMS_MAXIMUM_PDU_SIZE 65000 diff --git a/examples/goose_subscriber/CMakeLists.txt b/examples/goose_subscriber/CMakeLists.txt index 91724d24..a5874fa4 100644 --- a/examples/goose_subscriber/CMakeLists.txt +++ b/examples/goose_subscriber/CMakeLists.txt @@ -5,8 +5,6 @@ set(goose_subscriber_example_SRCS IF(WIN32) -IF(WITH_WPCAP) - set_source_files_properties(${goose_subscriber_example_SRCS} PROPERTIES LANGUAGE CXX) add_executable(goose_subscriber_example @@ -17,8 +15,6 @@ target_link_libraries(goose_subscriber_example iec61850 ) -ENDIF(WITH_WPCAP) - ELSE(WIN32) add_executable(goose_subscriber_example diff --git a/examples/sv_subscriber/CMakeLists.txt b/examples/sv_subscriber/CMakeLists.txt index ff8cd512..65071fbe 100644 --- a/examples/sv_subscriber/CMakeLists.txt +++ b/examples/sv_subscriber/CMakeLists.txt @@ -5,20 +5,16 @@ set(sv_subscriber_example_SRCS IF(WIN32) -IF(WITH_WPCAP) - set_source_files_properties(${sv_subscriber_example_SRCS} PROPERTIES LANGUAGE CXX) add_executable(sv_subscriber_example ${sv_subscriber_example_SRCS} ) -target_link_libraries(svsubscriber_example +target_link_libraries(sv_subscriber_example iec61850 ) -ENDIF(WITH_WPCAP) - ELSE(WIN32) add_executable(sv_subscriber_example diff --git a/examples/sv_subscriber/Makefile b/examples/sv_subscriber/Makefile index f84c02df..cefcd7ac 100644 --- a/examples/sv_subscriber/Makefile +++ b/examples/sv_subscriber/Makefile @@ -1,4 +1,4 @@ -LIBIEC_HOME=../../../libiec61850 +LIBIEC_HOME=../.. PROJECT_BINARY_NAME = sv_subscriber PROJECT_SOURCES += sv_subscriber_example.c diff --git a/examples/sv_subscriber/sv_subscriber_example.c b/examples/sv_subscriber/sv_subscriber_example.c index 46784c92..d8046478 100644 --- a/examples/sv_subscriber/sv_subscriber_example.c +++ b/examples/sv_subscriber/sv_subscriber_example.c @@ -55,8 +55,8 @@ main(int argc, char** argv) SVReceiver receiver = SVReceiver_create(); if (argc > 1) { - printf("Set interface id: %s\n", argv[1]); SVReceiver_setInterfaceId(receiver, argv[1]); + printf("Set interface id: %s\n", argv[1]); } else { printf("Using interface eth0\n"); diff --git a/src/hal/ethernet/win32/ethernet_win32.c b/src/hal/ethernet/win32/ethernet_win32.c index 432c36cf..2770df81 100644 --- a/src/hal/ethernet/win32/ethernet_win32.c +++ b/src/hal/ethernet/win32/ethernet_win32.c @@ -29,6 +29,10 @@ #include "libiec61850_platform_includes.h" +#ifndef DEBUG_HAL_ETHERNET +#define DEBUG_HAL_ETHERNET 1 +#endif + #if (CONFIG_INCLUDE_ETHERNET_WINDOWS == 1) @@ -92,26 +96,25 @@ static bool dllLoaded = false; static void loadDLLs(void) { - HINSTANCE hDll = LoadLibrary("iphlpapi.dll"); - - if (hDll == NULL) { - printf("Error loading iphlpapi.dll!\n"); - return; - } + HINSTANCE hDll = LoadLibrary("iphlpapi.dll"); + if (hDll == NULL) { + if (DEBUG_HAL_ETHERNET) + printf("Error loading iphlpapi.dll!\n"); + return; + } - GetAdaptersAddresses = (pgetadaptersaddresses) GetProcAddress(hDll, - "GetAdaptersAddresses"); + GetAdaptersAddresses = (pgetadaptersaddresses) GetProcAddress(hDll, + "GetAdaptersAddresses"); - if (GetAdaptersAddresses == NULL) - printf("Error loading GetAdaptersAddresses from iphlpapi.dll (%d)\n", (int) GetLastError()); + if (GetAdaptersAddresses == NULL) + printf("Error loading GetAdaptersAddresses from iphlpapi.dll (%d)\n", (int) GetLastError()); } #endif /* __MINGW64_VERSION_MAJOR */ #endif /* __GNUC__ */ - static char* getInterfaceName(int interfaceIndex) { @@ -137,6 +140,7 @@ getInterfaceName(int interfaceIndex) if (i == interfaceIndex) { interfaceName = (char*) malloc(strlen(device->name) + 1); strcpy(interfaceName, device->name); + if (DEBUG_HAL_ETHERNET) printf("Use interface (%s)\n", interfaceName); ifaceFound = true; break; @@ -147,6 +151,7 @@ getInterfaceName(int interfaceIndex) if (!ifaceFound) { + if (DEBUG_HAL_ETHERNET) printf("No ethernet interfaces found! Make sure WinPcap is installed.\n"); return NULL; } @@ -159,52 +164,55 @@ getInterfaceName(int interfaceIndex) static void getAdapterMacAddress(char* pcapAdapterName, uint8_t* macAddress) { - PIP_ADAPTER_ADDRESSES pAddresses = NULL; - ULONG outBufLen = 0; + PIP_ADAPTER_ADDRESSES pAddresses = NULL; + ULONG outBufLen = 0; - pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(65000); + pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(65000); - if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW) { - free(pAddresses); - pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen); - } + if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW) { + free(pAddresses); + pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen); + } - if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == NO_ERROR) { - PIP_ADAPTER_ADDRESSES pAddress = pAddresses; + if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == NO_ERROR) { + PIP_ADAPTER_ADDRESSES pAddress = pAddresses; - while (pAddress != NULL) { + while (pAddress != NULL) { - DWORD addressLength = pAddress->PhysicalAddressLength; + DWORD addressLength = pAddress->PhysicalAddressLength; - if (addressLength == 6) { + if (addressLength == 6) { - int i; + int i; - printf("Adapter %s: ", pAddress->AdapterName); + if (DEBUG_HAL_ETHERNET) { + printf("Adapter %s: ", pAddress->AdapterName); - for (i = 0; i < (int) addressLength; i++) { - printf("%02x ", pAddress->PhysicalAddress[i]); - } + for (i = 0; i < (int) addressLength; i++) { + printf("%02x ", pAddress->PhysicalAddress[i]); + } + } - if (strstr(pcapAdapterName, pAddress->AdapterName) != 0) { - printf(" requested found!"); + if (strstr(pcapAdapterName, pAddress->AdapterName) != 0) { + if (DEBUG_HAL_ETHERNET) + printf(" requested found!"); - for (i = 0; i < (int) addressLength; i++) { - macAddress[i] = pAddress->PhysicalAddress[i]; - } - } + for (i = 0; i < (int) addressLength; i++) { + macAddress[i] = pAddress->PhysicalAddress[i]; + } + } - printf("\n"); - } + printf("\n"); + } - pAddress = pAddress->Next; - } + pAddress = pAddress->Next; + } - free(pAddresses); - } - else { - printf("Error getting device addresses!\n"); - } + free(pAddresses); + } + else { + printf("Error getting device addresses!\n"); + } } @@ -215,8 +223,8 @@ Ethernet_getInterfaceMACAddress(const char* interfaceId, uint8_t* addr) #ifdef __GNUC__ #ifndef __MINGW64_VERSION_MAJOR if (!dllLoaded) { - loadDLLs(); - dllLoaded = true; + loadDLLs(); + dllLoaded = true; } #endif #endif @@ -226,13 +234,13 @@ Ethernet_getInterfaceMACAddress(const char* interfaceId, uint8_t* addr) long interfaceIndex = strtol(interfaceId, &endPtr, 10); if (endPtr != NULL) { - printf("Ethernet_getInterfaceMACAddress: invalid interface number %s\n", interfaceId); - return; + printf("Ethernet_getInterfaceMACAddress: invalid interface number %s\n", interfaceId); + return; } char* interfaceName = getInterfaceName((int) interfaceIndex); - getAdapterMacAddress(interfaceName, addr); + getAdapterMacAddress(interfaceName, addr); } @@ -276,44 +284,44 @@ Ethernet_sendPacket(EthernetSocket ethSocket, uint8_t* buffer, int packetSize) void Ethernet_setProtocolFilter(EthernetSocket ethSocket, uint16_t etherType) { - char filterString[100]; + char filterString[100]; - sprintf(filterString, "(ether proto 0x%04x) or (vlan and ether proto 0x%04x)", etherType, etherType); + sprintf(filterString, "(ether proto 0x%04x) or (vlan and ether proto 0x%04x)", etherType, etherType); - if (pcap_compile(ethSocket->rawSocket, &(ethSocket->etherTypeFilter), filterString, 1, 0) < 0) { - printf("Compiling packet filter failed!\n"); - return; - } + if (pcap_compile(ethSocket->rawSocket, &(ethSocket->etherTypeFilter), filterString, 1, 0) < 0) { + printf("Compiling packet filter failed!\n"); + return; + } - if (pcap_setfilter(ethSocket->rawSocket, &(ethSocket->etherTypeFilter)) < 0) { - printf("Setting packet filter failed!\n"); - } + if (pcap_setfilter(ethSocket->rawSocket, &(ethSocket->etherTypeFilter)) < 0) { + printf("Setting packet filter failed!\n"); + } } int Ethernet_receivePacket(EthernetSocket self, uint8_t* buffer, int bufferSize) { - struct pcap_pkthdr* header; - uint8_t* packetData; + struct pcap_pkthdr* header; + uint8_t* packetData; - int pcapCode = pcap_next_ex(self->rawSocket, &header, (const unsigned char**) &packetData); + int pcapCode = pcap_next_ex(self->rawSocket, &header, (const unsigned char**) &packetData); - if (pcapCode > 0) { - int packetSize = header->caplen; + if (pcapCode > 0) { + int packetSize = header->caplen; - if (packetSize > bufferSize) - packetSize = bufferSize; + if (packetSize > bufferSize) + packetSize = bufferSize; - memcpy(buffer, packetData, packetSize); + memcpy(buffer, packetData, packetSize); - return packetSize; - } - else { - if (pcapCode < 0) - printf("winpcap error\n"); + return packetSize; + } + else { + if (pcapCode < 0) + printf("winpcap error\n"); - return 0; - } + return 0; + } } bool diff --git a/src/sampled_values/sv_subscriber.c b/src/sampled_values/sv_subscriber.c index 4dde938f..369ae679 100644 --- a/src/sampled_values/sv_subscriber.c +++ b/src/sampled_values/sv_subscriber.c @@ -80,7 +80,7 @@ struct sSVClientASDU { SVReceiver SVReceiver_create(void) { - SVReceiver self = (SVReceiver) GLOBAL_MALLOC(sizeof(struct sSVReceiver)); + SVReceiver self = (SVReceiver) GLOBAL_CALLOC(1, sizeof(struct sSVReceiver)); if (self != NULL) { self->subscriberList = LinkedList_create(); @@ -180,6 +180,8 @@ SVReceiver_destroy(SVReceiver self) void SVReceiver_startThreadless(SVReceiver self) { + printf("SVReceiver_startThreadless\n"); + if (self->interfaceId == NULL) self->ethSocket = Ethernet_createSocket(CONFIG_ETHERNET_INTERFACE_ID, NULL); else From 33433f1d0985f0a115c5816f8279b9ea7cf63ee8 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 17 Nov 2015 15:07:58 +0100 Subject: [PATCH 15/33] - removed debug output --- src/sampled_values/sv_subscriber.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/sampled_values/sv_subscriber.c b/src/sampled_values/sv_subscriber.c index 369ae679..990565c9 100644 --- a/src/sampled_values/sv_subscriber.c +++ b/src/sampled_values/sv_subscriber.c @@ -180,8 +180,6 @@ SVReceiver_destroy(SVReceiver self) void SVReceiver_startThreadless(SVReceiver self) { - printf("SVReceiver_startThreadless\n"); - if (self->interfaceId == NULL) self->ethSocket = Ethernet_createSocket(CONFIG_ETHERNET_INTERFACE_ID, NULL); else From f5c5fa7fb4c8ae269d294a234548a5998ed6c3ae Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 20 Nov 2015 15:23:48 +0100 Subject: [PATCH 16/33] - fixed problems in buffered reporting --- dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs | 3 +- src/iec61850/inc_private/reporting.h | 9 +- src/iec61850/server/mms_mapping/reporting.c | 115 ++++++++++++++---- 3 files changed, 103 insertions(+), 24 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs index 3c581979..475aadc1 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs @@ -1224,7 +1224,8 @@ namespace IEC61850 DATA_REFERENCE = 16, BUFFER_OVERFLOW = 32, ENTRY_ID = 64, - CONF_REV = 128 + CONF_REV = 128, + ALL = 255 } public enum Validity diff --git a/src/iec61850/inc_private/reporting.h b/src/iec61850/inc_private/reporting.h index 739bdf22..4c8443ff 100644 --- a/src/iec61850/inc_private/reporting.h +++ b/src/iec61850/inc_private/reporting.h @@ -63,7 +63,7 @@ typedef struct { MmsValue** valueReferences; /* array to store value references for fast access */ - bool gi; + bool gi; /* flag to indicate that a GI report is triggered */ uint16_t sqNum; uint32_t intgPd; @@ -84,9 +84,14 @@ typedef struct { bool triggered; /* { covered by mutex } */ uint64_t reportTime; /* { covered by mutex } */ - /* the following members are only required for buffered RCBs */ + /* + * the following members are only required for buffered RCBs * + * TODO move to ReportBuffer structure! + */ + bool isBuffering; /* true if buffered RCB is buffering (datSet is set to a valid value) */ bool isResync; /* true if buffered RCB is in resync state */ + ReportBuffer* reportBuffer; MmsValue* timeOfEntry; } ReportControl; diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 0e410741..e10865df 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1143,6 +1143,24 @@ updateOwner(ReportControl* rc, MmsServerConnection connection) #endif /* CONFIG_REPORTING_SUPPORTS_OWNER == 1*/ } + +static bool +checkForZeroEntryID(MmsValue* value) +{ + uint8_t* buffer = MmsValue_getOctetStringBuffer(value); + + int i = 0; + + while (i < 8) { + if (buffer[i] != 0) + return false; + + i++; + } + + return true; +} + static bool checkReportBufferForEntryID(ReportControl* rc, MmsValue* value) { @@ -1154,14 +1172,8 @@ checkReportBufferForEntryID(ReportControl* rc, MmsValue* value) if (memcmp(entry->entryId, value->value.octetString.buf, 8) == 0) { ReportBufferEntry* nextEntryForResync = entry->next; - if (nextEntryForResync != NULL) { - rc->reportBuffer->nextToTransmit = nextEntryForResync; - rc->isResync = true; - } - else { - rc->isResync = false; - rc->reportBuffer->nextToTransmit = NULL; - } + rc->reportBuffer->nextToTransmit = nextEntryForResync; + rc->isResync = true; retVal = true; break; @@ -1213,8 +1225,15 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme MmsValue_update(rptEna, value); + if (rc->buffered) { + + if (rc->isResync == false) + rc->reportBuffer->nextToTransmit = rc->reportBuffer->oldestReport; + + rc->isResync = false; + } + rc->enabled = true; - rc->isResync = false; rc->gi = false; refreshBufferTime(rc); @@ -1359,19 +1378,28 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme goto exit_function; } - else if (strcmp(elementName, "EntryId") == 0) { + else if (strcmp(elementName, "EntryID") == 0) { + if (MmsValue_getOctetStringSize(value) != 8) { retVal = DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; goto exit_function; } - if (!checkReportBufferForEntryID(rc, value)) { - retVal = DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; - goto exit_function; + if (checkForZeroEntryID(value) == false) { + + if (!checkReportBufferForEntryID(rc, value)) { + rc->reportBuffer->isOverflow = true; + retVal = DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; + goto exit_function; + } + } + else { + rc->reportBuffer->nextToTransmit = rc->reportBuffer->oldestReport; + rc->isResync = false; + rc->reportBuffer->isOverflow = true; } MmsValue* entryID = ReportControl_getRCBValue(rc, elementName); - MmsValue_update(entryID, value); goto exit_function; @@ -1517,6 +1545,42 @@ printReportId(ReportBufferEntry* report) } #endif + +static void +removeAllGIReportsFromReportBuffer(ReportBuffer* reportBuffer) +{ + ReportBufferEntry* currentReport = reportBuffer->oldestReport; + ReportBufferEntry* lastReport = NULL; + + while (currentReport != NULL) { + if (currentReport->flags & 2) { + + if (currentReport == reportBuffer->oldestReport) { + reportBuffer->oldestReport = currentReport->next; + } + else { + lastReport->next = currentReport->next; + + } + +#if (DEBUG_IED_SERVER == 1) + printf("IED_SERVER: REMOVE old GI report with ID "); + printReportId(currentReport); + printf("\n"); +#endif + + if (reportBuffer->nextToTransmit == currentReport) + reportBuffer->nextToTransmit = currentReport->next; + + currentReport = currentReport->next; + } + else { + lastReport = currentReport; + currentReport = currentReport->next; + } + } +} + static void enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_t timeOfEntry) { @@ -1581,6 +1645,8 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_ return; } + if (isGI) removeAllGIReportsFromReportBuffer(buffer); + uint8_t* entryBufPos = NULL; uint8_t* entryStartPos; @@ -1604,7 +1670,7 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_ if (DEBUG_IED_SERVER) printf ("IED_SERVER: Last buffer offset: %i\n", (int) ((uint8_t*) buffer->lastEnqueuedReport - buffer->memoryBlock)); - if (buffer->lastEnqueuedReport == buffer->oldestReport) { // --> buffer->reportsCount = 1? + if (buffer->lastEnqueuedReport == buffer->oldestReport) { /* --> buffer->reportsCount == 1 */ assert(buffer->reportsCount == 1); entryBufPos = (uint8_t*) ((uint8_t*) buffer->lastEnqueuedReport + buffer->lastEnqueuedReport->entryLength); @@ -1638,11 +1704,14 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_ if ((entryBufPos + bufferEntrySize) > (buffer->memoryBlock + buffer->memoryBlockSize)) { /* buffer overflow */ entryBufPos = buffer->memoryBlock; + /* remove old reports until enough space for new entry is available */ while ((entryBufPos + bufferEntrySize) > (uint8_t*) buffer->oldestReport) { assert(buffer->oldestReport != NULL); - if (buffer->nextToTransmit == buffer->oldestReport) + if (buffer->nextToTransmit == buffer->oldestReport) { buffer->nextToTransmit = buffer->oldestReport->next; + buffer->isOverflow = true; + } #if (DEBUG_IED_SERVER == 1) printf("IED_SERVER: REMOVE report with ID "); @@ -1650,8 +1719,6 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_ printf("\n"); #endif - buffer->isOverflow = true; - buffer->oldestReport = buffer->oldestReport->next; buffer->reportsCount--; @@ -1676,8 +1743,10 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_ while ((uint8_t*) buffer->oldestReport > buffer->memoryBlock) { assert(buffer->oldestReport != NULL); - if (buffer->nextToTransmit == buffer->oldestReport) + if (buffer->nextToTransmit == buffer->oldestReport) { buffer->nextToTransmit = buffer->oldestReport->next; + buffer->isOverflow = true; + } #if (DEBUG_IED_SERVER == 1) printf("IED_SERVER: REMOVE report with ID "); @@ -1696,8 +1765,10 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_ assert(buffer->oldestReport != NULL); - if (buffer->nextToTransmit == buffer->oldestReport) + if (buffer->nextToTransmit == buffer->oldestReport) { buffer->nextToTransmit = buffer->oldestReport->next; + buffer->isOverflow = true; + } #if (DEBUG_IED_SERVER == 1) printf("IED_SERVER: REMOVE report with ID "); @@ -1717,8 +1788,10 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_ assert(buffer->oldestReport != NULL); - if (buffer->nextToTransmit == buffer->oldestReport) + if (buffer->nextToTransmit == buffer->oldestReport) { buffer->nextToTransmit = buffer->oldestReport->next; + buffer->isOverflow = true; + } #if (DEBUG_IED_SERVER == 1) printf("IED_SERVER: REMOVE report with ID "); From 4c0466c8587a397e7cb181c0e7e74ccbcb6333c1 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 24 Nov 2015 15:23:26 +0100 Subject: [PATCH 17/33] - fixed bug in report timestamp in buffered reporting: was using UTC_TIME instead of BINARY_TIME --- config/stack_config.h | 2 +- dotnet/IEC61850forCSharp/ReportControlBlock.cs | 4 ++-- src/iec61850/client/client_report.c | 4 ++++ src/iec61850/server/mms_mapping/reporting.c | 8 ++++++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index aba11f10..b842089c 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -18,7 +18,7 @@ #define DEBUG_ISO_SERVER 0 #define DEBUG_ISO_CLIENT 0 #define DEBUG_IED_SERVER 0 -#define DEBUG_IED_CLIENT 1 +#define DEBUG_IED_CLIENT 0 #define DEBUG_MMS_CLIENT 0 #define DEBUG_MMS_SERVER 0 #define DEBUG_GOOSE_SUBSCRIBER 0 diff --git a/dotnet/IEC61850forCSharp/ReportControlBlock.cs b/dotnet/IEC61850forCSharp/ReportControlBlock.cs index 889e8d61..f4b4a699 100644 --- a/dotnet/IEC61850forCSharp/ReportControlBlock.cs +++ b/dotnet/IEC61850forCSharp/ReportControlBlock.cs @@ -372,6 +372,8 @@ namespace IEC61850 IedConnection_setRCBValues (connection, out error, self, parametersMask, singleRequest); + resetSendFlags(); + if (error != 0) throw new IedConnectionException ("setRCBValues service failed", error); @@ -382,8 +384,6 @@ namespace IEC61850 InstallReportHandler(this.reportHandler, this.reportHandlerParameter); } } - - resetSendFlags(); } /// diff --git a/src/iec61850/client/client_report.c b/src/iec61850/client/client_report.c index f930c4cd..20cc3c1b 100644 --- a/src/iec61850/client/client_report.c +++ b/src/iec61850/client/client_report.c @@ -397,11 +397,15 @@ private_IedConnection_handleReport(IedConnection self, MmsValue* value) /* has report-timestamp */ if (MmsValue_getBitStringBit(optFlds, 2) == true) { + MmsValue* timeStampValue = MmsValue_getElement(value, inclusionIndex); if (MmsValue_getType(timeStampValue) == MMS_BINARY_TIME) { matchingReport->hasTimestamp = true; matchingReport->timestamp = MmsValue_getBinaryTimeAsUtcMs(timeStampValue); + + if (DEBUG_IED_CLIENT) + printf("DEBUG_IED_CLIENT: report has timestamp %llu\n", matchingReport->timestamp); } inclusionIndex++; diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index e10865df..37ad50b0 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1178,6 +1178,8 @@ checkReportBufferForEntryID(ReportControl* rc, MmsValue* value) retVal = true; break; } + + entry = entry->next; } return retVal; @@ -2002,8 +2004,10 @@ sendNextReportEntry(ReportControl* self) if (timeOfEntry == NULL) goto return_out_of_memory; timeOfEntry->deleteValue = 0; - timeOfEntry->type = MMS_UTC_TIME; - MmsValue_setUtcTimeMs(timeOfEntry, report->timeOfEntry); + timeOfEntry->type = MMS_BINARY_TIME; + timeOfEntry->value.binaryTime.size = 6; + + MmsValue_setBinaryTime(timeOfEntry, report->timeOfEntry); if (MemAllocLinkedList_add(reportElements, timeOfEntry) == NULL) goto return_out_of_memory; From 907eb0bbae9434fa2b4fb6254675efec34fe69ce Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 26 Nov 2015 12:22:35 +0100 Subject: [PATCH 18/33] - removed ResvTms form BRCB (depending on configuration option CONFIG_IEC61850_BRCB_WITH_RESVTMS) --- config/stack_config.h | 3 ++ src/iec61850/server/mms_mapping/reporting.c | 39 +++++++++++++++------ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index b842089c..7727f459 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -133,6 +133,9 @@ /* include support for IEC 61850 reporting services */ #define CONFIG_IEC61850_REPORT_SERVICE 1 +/* support buffered report control blocks with ResvTms field */ +#define CONFIG_IEC61850_BRCB_WITH_RESVTMS 0 + /* The default buffer size of buffered RCBs in bytes */ #define CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE 65536 diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 37ad50b0..0a8da537 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -43,6 +43,10 @@ #if (CONFIG_IEC61850_REPORT_SERVICE == 1) +#ifndef CONFIG_IEC61850_BRCB_WITH_RESVTMS +#define CONFIG_IEC61850_BRCB_WITH_RESVTMS 0 +#endif + static ReportBuffer* ReportBuffer_create(void) { @@ -836,15 +840,23 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock, rcb->name = copyString(reportControlBlock->name); rcb->type = MMS_STRUCTURE; + int brcbElementCount; + +#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) + brcbElementCount = 15; +#else + brcbElementCount = 14; +#endif + + MmsValue* mmsValue = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue)); mmsValue->deleteValue = false; mmsValue->type = MMS_STRUCTURE; - mmsValue->value.structure.size = 15; - mmsValue->value.structure.components = (MmsValue**) GLOBAL_CALLOC(15, sizeof(MmsValue*)); - - rcb->typeSpec.structure.elementCount = 15; + mmsValue->value.structure.size = brcbElementCount; + mmsValue->value.structure.components = (MmsValue**) GLOBAL_CALLOC(brcbElementCount, sizeof(MmsValue*)); - rcb->typeSpec.structure.elements = (MmsVariableSpecification**) GLOBAL_CALLOC(15, + rcb->typeSpec.structure.elementCount = brcbElementCount; + rcb->typeSpec.structure.elements = (MmsVariableSpecification**) GLOBAL_CALLOC(brcbElementCount, sizeof(MmsVariableSpecification*)); MmsVariableSpecification* namedVariable = @@ -957,19 +969,24 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock, reportControl->timeOfEntry = mmsValue->value.structure.components[12]; + int currentIndex = 13; + +#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("ResvTms"); - namedVariable->type = MMS_UNSIGNED; - namedVariable->typeSpec.unsignedInteger = 32; - rcb->typeSpec.structure.elements[13] = namedVariable; - mmsValue->value.structure.components[13] = MmsValue_newUnsigned(32); + namedVariable->type = MMS_INTEGER; + namedVariable->typeSpec.integer = 16; + rcb->typeSpec.structure.elements[currentIndex] = namedVariable; + mmsValue->value.structure.components[currentIndex] = MmsValue_newInteger(16); + currentIndex++; +#endif /* (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) */ namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("Owner"); namedVariable->type = MMS_OCTET_STRING; namedVariable->typeSpec.octetString = -64; - rcb->typeSpec.structure.elements[14] = namedVariable; - mmsValue->value.structure.components[14] = MmsValue_newOctetString(0, 4); /* size 4 is enough to store client IPv4 address */ + rcb->typeSpec.structure.elements[currentIndex] = namedVariable; + mmsValue->value.structure.components[currentIndex] = MmsValue_newOctetString(0, 4); /* size 4 is enough to store client IPv4 address */ reportControl->rcbValues = mmsValue; From 108332774fc3bf850ba70340bc14a1f5c987dab4 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 26 Nov 2015 18:58:46 +0100 Subject: [PATCH 19/33] - added FCs "BR" and "RP" - fixed conformance problem in buffered reporting timeofEntry write access handling --- dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs | 10 +++++++ dotnet/IEC61850forCSharp/MmsValue.cs | 26 +++++++++++++++++++ src/iec61850/client/client_report_control.c | 2 +- src/iec61850/common/iec61850_common.c | 20 ++++++++++++++ src/iec61850/inc/iec61850_common.h | 5 ++++ src/iec61850/server/mms_mapping/reporting.c | 12 ++++++--- 6 files changed, 70 insertions(+), 5 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs index 475aadc1..e8adb97f 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs @@ -1323,6 +1323,16 @@ namespace IEC61850 EX = 11, /** Control */ CO = 12, + /** Unicast SV */ + US = 13, + /** Multicast SV */ + MS = 14, + /** Unbuffered report */ + RP = 15, + /** Buffered report */ + BR = 16, + + /** All FCs - wildcard value */ ALL = 99, NONE = -1 } diff --git a/dotnet/IEC61850forCSharp/MmsValue.cs b/dotnet/IEC61850forCSharp/MmsValue.cs index 3f69b7b0..d4e84436 100644 --- a/dotnet/IEC61850forCSharp/MmsValue.cs +++ b/dotnet/IEC61850forCSharp/MmsValue.cs @@ -140,6 +140,12 @@ namespace IEC61850 [return: MarshalAs(UnmanagedType.I1)] static extern bool MmsValue_equals(IntPtr self, IntPtr otherValue); + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern IntPtr MmsValue_newBinaryTime (bool timeOfDay); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void MmsValue_setBinaryTime (IntPtr self, UInt64 timestamp); + internal MmsValue (IntPtr value) { @@ -229,6 +235,26 @@ namespace IEC61850 return new MmsValue(newValue, true); } + /// + /// Create a new MmsValue instance of type MMS_BINARY_TIME + /// + /// the new MmsValue instance. + /// If set to true large 6 byte format. + public static MmsValue NewBinaryTime(bool largeFormat) + { + IntPtr newValue = MmsValue_newBinaryTime (largeFormat); + + return new MmsValue (newValue, true); + } + + /// + /// Sets the binary time. + /// + /// Timestamp. + public void SetBinaryTime(UInt64 timestamp) { + MmsValue_setBinaryTime (this.valueReference, timestamp); + } + internal IntPtr valueReference; private bool responsableForDeletion; diff --git a/src/iec61850/client/client_report_control.c b/src/iec61850/client/client_report_control.c index 3d01defe..b0b4a187 100644 --- a/src/iec61850/client/client_report_control.c +++ b/src/iec61850/client/client_report_control.c @@ -637,7 +637,7 @@ IedConnection_setRCBValues(IedConnection self, IedClientError* error, ClientRepo MmsValue* dataAccessError = (MmsValue*) accessResult->data; if (MmsValue_getDataAccessError(dataAccessError) != DATA_ACCESS_ERROR_SUCCESS) { - *error = IED_ERROR_UNKNOWN; + *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(dataAccessError)); break; } diff --git a/src/iec61850/common/iec61850_common.c b/src/iec61850/common/iec61850_common.c index 7dae4129..f8e0f016 100644 --- a/src/iec61850/common/iec61850_common.c +++ b/src/iec61850/common/iec61850_common.c @@ -129,6 +129,10 @@ FunctionalConstraint_toString(FunctionalConstraint fc) { return "US"; case IEC61850_FC_MS: return "MS"; + case IEC61850_FC_RP: + return "RP"; + case IEC61850_FC_BR: + return "BR"; default: return NULL; } @@ -157,6 +161,8 @@ FunctionalConstraint_fromString(const char* fcString) if (fcString[0] == 'M') { if (fcString[1] == 'X') return IEC61850_FC_MX; + if (fcString[1] == 'S') + return IEC61850_FC_MS; return IEC61850_FC_NONE; } @@ -183,6 +189,8 @@ FunctionalConstraint_fromString(const char* fcString) if (fcString[0] == 'B') { if (fcString[1] == 'L') return IEC61850_FC_BL; + if (fcString[1] == 'R') + return IEC61850_FC_BR; return IEC61850_FC_NONE; } @@ -192,6 +200,18 @@ FunctionalConstraint_fromString(const char* fcString) return IEC61850_FC_NONE; } + if (fcString[0] == 'U') { + if (fcString[1] == 'S') + return IEC61850_FC_US; + return IEC61850_FC_NONE; + } + + if (fcString[0] == 'R') { + if (fcString[1] == 'P') + return IEC61850_FC_RP; + return IEC61850_FC_NONE; + } + return IEC61850_FC_NONE; } diff --git a/src/iec61850/inc/iec61850_common.h b/src/iec61850/inc/iec61850_common.h index 0c9dc271..938c9d17 100644 --- a/src/iec61850/inc/iec61850_common.h +++ b/src/iec61850/inc/iec61850_common.h @@ -229,7 +229,12 @@ typedef enum eFunctionalConstraint { IEC61850_FC_US = 13, /** Multicast SV */ IEC61850_FC_MS = 14, + /** Unbuffered report */ + IEC61850_FC_RP = 15, + /** Buffered report */ + IEC61850_FC_BR = 16, + /** All FCs - wildcard value */ IEC61850_FC_ALL = 99, IEC61850_FC_NONE = -1 } FunctionalConstraint; diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 0a8da537..17811fc4 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1438,10 +1438,6 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme goto exit_function; } - else if ((strcmp(elementName, "ConfRev") == 0) || (strcmp(elementName, "SqNum") == 0)) { - retVal = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; - goto exit_function; - } else if (strcmp(elementName, "RptID") == 0) { MmsValue* rptId = ReportControl_getRCBValue(rc, elementName); @@ -1452,6 +1448,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme goto exit_function; } + else if (strcmp(elementName, "ConfRev") == 0) { + retVal = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + goto exit_function; + } else if (strcmp(elementName, "SqNum") == 0) { retVal = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; goto exit_function; @@ -1460,6 +1460,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme retVal = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; goto exit_function; } + else if (strcmp(elementName, "TimeofEntry") == 0) { + retVal = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + goto exit_function; + } MmsValue* rcbValue = ReportControl_getRCBValue(rc, elementName); From b9c520240a1d57a18bde44f57fdbf431a9ccc7a5 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 27 Nov 2015 14:54:21 +0100 Subject: [PATCH 20/33] - added support for VMD scope named variable lists --- src/mms/inc/mms_device_model.h | 2 +- src/mms/inc_private/mms_server_internal.h | 3 + src/mms/iso_mms/server/mms_domain.c | 16 +--- .../iso_mms/server/mms_get_namelist_service.c | 4 +- .../server/mms_named_variable_list_service.c | 81 +++++++++++++++++++ src/mms/iso_mms/server/mms_read_service.c | 40 +++++++-- src/mms/iso_mms/server/mms_server_common.c | 22 +++++ .../iso_mms/server/mms_server_connection.c | 18 +---- 8 files changed, 144 insertions(+), 42 deletions(-) diff --git a/src/mms/inc/mms_device_model.h b/src/mms/inc/mms_device_model.h index 0787fa41..6ab11651 100644 --- a/src/mms/inc/mms_device_model.h +++ b/src/mms/inc/mms_device_model.h @@ -116,7 +116,7 @@ void MmsDomain_deleteNamedVariableList(MmsDomain* self, char* variableListName); MmsNamedVariableList -MmsDomain_getNamedVariableList(MmsDomain* self, char* variableListName); +MmsDomain_getNamedVariableList(MmsDomain* self, const char* variableListName); LinkedList MmsDomain_getNamedVariableLists(MmsDomain* self); diff --git a/src/mms/inc_private/mms_server_internal.h b/src/mms/inc_private/mms_server_internal.h index 2e7f5712..69913375 100644 --- a/src/mms/inc_private/mms_server_internal.h +++ b/src/mms/inc_private/mms_server_internal.h @@ -272,6 +272,9 @@ mmsServer_getLowIndex(AlternateAccess_t* alternateAccess); int mmsServer_getNumberOfElements(AlternateAccess_t* alternateAccess); +MmsNamedVariableList +mmsServer_getNamedVariableListWithName(LinkedList namedVariableLists, const char* variableListName); + void mmsServer_deleteVariableList(LinkedList namedVariableLists, char* variableListName); diff --git a/src/mms/iso_mms/server/mms_domain.c b/src/mms/iso_mms/server/mms_domain.c index c70567d0..5e22fe29 100644 --- a/src/mms/iso_mms/server/mms_domain.c +++ b/src/mms/iso_mms/server/mms_domain.c @@ -77,26 +77,14 @@ MmsDomain_addNamedVariableList(MmsDomain* self, MmsNamedVariableList variableLis } MmsNamedVariableList -MmsDomain_getNamedVariableList(MmsDomain* self, char* variableListName) +MmsDomain_getNamedVariableList(MmsDomain* self, const char* variableListName) { MmsNamedVariableList variableList = NULL; if (self == NULL) goto exit_function; - LinkedList element = LinkedList_getNext(self->namedVariableLists); - - while (element != NULL) { - MmsNamedVariableList varList = (MmsNamedVariableList) element->data; - - if (strcmp(MmsNamedVariableList_getName(varList), variableListName) == 0) { - variableList = varList; - break; - } - - element = LinkedList_getNext(element); - } - + variableList = mmsServer_getNamedVariableListWithName(self->namedVariableLists, variableListName); exit_function: return variableList; diff --git a/src/mms/iso_mms/server/mms_get_namelist_service.c b/src/mms/iso_mms/server/mms_get_namelist_service.c index 7719e1ca..a36dbedb 100644 --- a/src/mms/iso_mms/server/mms_get_namelist_service.c +++ b/src/mms/iso_mms/server/mms_get_namelist_service.c @@ -266,7 +266,7 @@ getNamedVariableListsDomainSpecific(MmsServerConnection connection, char* domain } static LinkedList -getnamedVariableListsVMDSpecific(MmsServerConnection connection) +getNamedVariableListsVMDSpecific(MmsServerConnection connection) { MmsDevice* device = MmsServer_getDevice(connection->server); @@ -555,7 +555,7 @@ mmsServer_handleGetNameListRequest( #if (MMS_DATA_SET_SERVICE == 1) else if (objectClass == OBJECT_CLASS_NAMED_VARIABLE_LIST) { - LinkedList nameList = getnamedVariableListsVMDSpecific(connection); + LinkedList nameList = getNamedVariableListsVMDSpecific(connection); #if (CONFIG_MMS_SORT_NAME_LIST == 1) StringUtils_sortList(nameList); diff --git a/src/mms/iso_mms/server/mms_named_variable_list_service.c b/src/mms/iso_mms/server/mms_named_variable_list_service.c index 954da06a..71ce3a5e 100644 --- a/src/mms/iso_mms/server/mms_named_variable_list_service.c +++ b/src/mms/iso_mms/server/mms_named_variable_list_service.c @@ -179,6 +179,24 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection, } } } + else if (request->listOfVariableListName->list.array[i]->present == ObjectName_PR_vmdspecific) { + char listName[65]; + + mmsMsg_copyAsn1IdentifierToStringBuffer(request->listOfVariableListName->list.array[i]->choice.vmdspecific, + listName, 65); + + MmsNamedVariableList variableList = mmsServer_getNamedVariableListWithName(device->namedVariableLists, listName); + + if (variableList != NULL) { + numberMatched++; + + if (mmsServer_callVariableListChangedHandler(false, MMS_VMD_SPECIFIC, NULL, listName, connection) + == MMS_ERROR_NONE) { + numberDeleted++; + mmsServer_deleteVariableList(device->namedVariableLists, listName); + } + } + } } createDeleteNamedVariableListResponse(invokeId, response, numberMatched, numberDeleted); @@ -451,6 +469,7 @@ mmsServer_handleDefineNamedVariableListRequest( char variableListName[65]; if (request->variableListName.choice.aaspecific.size > 64) { + //TODO send reject PDU instead? mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); goto exit_free_struct; } @@ -487,6 +506,48 @@ mmsServer_handleDefineNamedVariableListRequest( else mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_CAPABILITY_UNAVAILABLE); } + else if (request->variableListName.present == ObjectName_PR_vmdspecific) { + LinkedList vmdScopeNVLs = MmsDevice_getNamedVariableLists(connection->server->device); + + if (LinkedList_size(vmdScopeNVLs) < CONFIG_MMS_MAX_NUMBER_OF_VMD_SPECIFIC_DATA_SETS) { + + char variableListName[65]; + + if (request->variableListName.choice.vmdspecific.size > 64) { + //TODO send reject PDU instead? + mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + goto exit_free_struct; + } + + StringUtils_createStringFromBufferInBuffer(variableListName, + request->variableListName.choice.vmdspecific.buf, + request->variableListName.choice.vmdspecific.size); + + if (mmsServer_getNamedVariableListWithName(MmsDevice_getNamedVariableLists(connection->server->device), variableListName) != NULL) { + mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_OBJECT_EXISTS); + } + else { + MmsError mmsError; + + MmsNamedVariableList namedVariableList = createNamedVariableList(NULL, device, + request, variableListName, &mmsError); + + if (namedVariableList != NULL) { + if (mmsServer_callVariableListChangedHandler(true, MMS_VMD_SPECIFIC, NULL, variableListName, connection) + == MMS_ERROR_NONE) { + LinkedList_add(vmdScopeNVLs, (void*) namedVariableList); + + createDefineNamedVariableListResponse(invokeId, response); + } + else { + MmsNamedVariableList_destroy(namedVariableList); + mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED); + } + + } + } + } + } else mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_TYPE_UNSUPPORTED); @@ -635,6 +696,26 @@ mmsServer_handleGetNamedVariableListAttributesRequest( mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); } #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ + else if (request->present == ObjectName_PR_vmdspecific) { + char listName[65]; + + if (request->choice.vmdspecific.size > 64) { + mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OTHER); + goto exit_function; + } + + StringUtils_createStringFromBufferInBuffer(listName, request->choice.vmdspecific.buf, + request->choice.vmdspecific.size); + + MmsDevice* mmsDevice = MmsServer_getDevice(connection->server); + + MmsNamedVariableList varList = mmsServer_getNamedVariableListWithName(mmsDevice->namedVariableLists, listName); + + if (varList != NULL) + createGetNamedVariableListAttributesResponse(invokeId, response, varList); + else + mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + } else { mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } diff --git a/src/mms/iso_mms/server/mms_read_service.c b/src/mms/iso_mms/server/mms_read_service.c index 6ad75e49..1f48c642 100644 --- a/src/mms/iso_mms/server/mms_read_service.c +++ b/src/mms/iso_mms/server/mms_read_service.c @@ -663,6 +663,29 @@ handleReadNamedVariableListRequest( } } } + else if (read->variableAccessSpecification.choice.variableListName.present == ObjectName_PR_vmdspecific) + { + char listName[65]; + + mmsMsg_copyAsn1IdentifierToStringBuffer(read->variableAccessSpecification.choice.variableListName.choice.vmdspecific, + listName, 65); + + MmsNamedVariableList namedList = mmsServer_getNamedVariableListWithName(connection->server->device->namedVariableLists, listName); + + if (namedList == NULL) + mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + else { + + VarAccessSpec accessSpec; + + accessSpec.isNamedVariableList = true; + accessSpec.specific = 0; + accessSpec.domainId = NULL; + accessSpec.itemId = listName; + + createNamedVariableListResponse(connection, namedList, invokeId, response, read, &accessSpec); + } + } #if (MMS_DYNAMIC_DATA_SETS == 1) else if (read->variableAccessSpecification.choice.variableListName.present == ObjectName_PR_aaspecific) @@ -674,17 +697,18 @@ handleReadNamedVariableListRequest( MmsNamedVariableList namedList = MmsServerConnection_getNamedVariableList(connection, listName); - VarAccessSpec accessSpec; - - accessSpec.isNamedVariableList = true; - accessSpec.specific = 2; - accessSpec.domainId = NULL; - accessSpec.itemId = listName; - if (namedList == NULL) mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); - else + else { + VarAccessSpec accessSpec; + + accessSpec.isNamedVariableList = true; + accessSpec.specific = 2; + accessSpec.domainId = NULL; + accessSpec.itemId = listName; + createNamedVariableListResponse(connection, namedList, invokeId, response, read, &accessSpec); + } } #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ else diff --git a/src/mms/iso_mms/server/mms_server_common.c b/src/mms/iso_mms/server/mms_server_common.c index f5a16e42..46d87bed 100644 --- a/src/mms/iso_mms/server/mms_server_common.c +++ b/src/mms/iso_mms/server/mms_server_common.c @@ -201,6 +201,28 @@ mmsServer_getNumberOfElements(AlternateAccess_t* alternateAccess) return 0; } +MmsNamedVariableList +mmsServer_getNamedVariableListWithName(LinkedList namedVariableLists, const char* variableListName) +{ + MmsNamedVariableList variableList = NULL; + + LinkedList element = LinkedList_getNext(namedVariableLists); + + while (element != NULL) { + MmsNamedVariableList varList = (MmsNamedVariableList) element->data; + + if (strcmp(MmsNamedVariableList_getName(varList), variableListName) == 0) { + variableList = varList; + break; + } + + element = LinkedList_getNext(element); + } + + return variableList; +} + + void mmsServer_deleteVariableList(LinkedList namedVariableLists, char* variableListName) { diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 60bc6543..c0cf1c20 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -355,23 +355,7 @@ MmsServerConnection_deleteNamedVariableList(MmsServerConnection self, char* list MmsNamedVariableList MmsServerConnection_getNamedVariableList(MmsServerConnection self, const char* variableListName) { - //TODO remove code duplication - similar to MmsDomain_getNamedVariableList ! - MmsNamedVariableList variableList = NULL; - - LinkedList element = LinkedList_getNext(self->namedVariableLists); - - while (element != NULL) { - MmsNamedVariableList varList = (MmsNamedVariableList) element->data; - - if (strcmp(MmsNamedVariableList_getName(varList), variableListName) == 0) { - variableList = varList; - break; - } - - element = LinkedList_getNext(element); - } - - return variableList; + return mmsServer_getNamedVariableListWithName(self->namedVariableLists, variableListName); } #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ From 91d122fd519566971b6bd18210d232a00e3f8541 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 27 Nov 2015 17:31:29 +0100 Subject: [PATCH 21/33] - RCBs support for VMD scope datasets - Client support for VMD scope datasets --- src/iec61850/client/ied_connection.c | 138 ++++++++++++------ src/iec61850/inc/iec61850_client.h | 4 +- src/iec61850/server/mms_mapping/reporting.c | 7 + src/mms/inc/mms_client_connection.h | 14 +- src/mms/inc/mms_device_model.h | 3 + .../client/mms_client_named_variable_list.c | 53 +++++-- src/mms/iso_mms/client/mms_client_read.c | 19 ++- src/mms/iso_mms/server/mms_device.c | 7 + 8 files changed, 176 insertions(+), 69 deletions(-) diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index 7c305683..3d5bee5c 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -1901,23 +1901,34 @@ IedConnection_createDataSet(IedConnection self, IedClientError* error, const cha bool isAssociationSpecific = false; if (dataSetReference[0] != '@') { - domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { - *error = IED_ERROR_OBJECT_REFERENCE_INVALID; - goto exit_function; + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + domainId = NULL; + + if (dataSetReference[0] == '/') + itemId = dataSetReference + 1; + else + itemId = dataSetReference; } + else { + domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); + + if (domainId == NULL) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } - int domainIdLength = strlen(domainId); + int domainIdLength = strlen(domainId); - if ((strlen(dataSetReference) - domainIdLength - 1) > 32) { - *error = IED_ERROR_OBJECT_REFERENCE_INVALID; - goto exit_function; - } + if ((strlen(dataSetReference) - domainIdLength - 1) > 32) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } - char* itemIdRef = copyStringToBuffer(dataSetReference + domainIdLength + 1, itemIdBuffer); - StringUtils_replace(itemIdRef, '.', '$'); - itemId = itemIdRef; + char* itemIdRef = copyStringToBuffer(dataSetReference + domainIdLength + 1, itemIdBuffer); + StringUtils_replace(itemIdRef, '.', '$'); + itemId = itemIdRef; + } } else { itemId = dataSetReference + 1; @@ -1965,28 +1976,40 @@ exit_function: void IedConnection_deleteDataSet(IedConnection self, IedClientError* error, const char* dataSetReference) { - char domainId[65]; + char domainIdBuf[65]; + char* domainId = domainIdBuf; char itemId[DATA_SET_MAX_NAME_LENGTH + 1]; bool isAssociationSpecific = false; int dataSetReferenceLength = strlen(dataSetReference); if (dataSetReference[0] != '@') { - if (MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainId) == NULL) { - *error = IED_ERROR_OBJECT_REFERENCE_INVALID; - goto exit_function; + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + domainId = NULL; + + if (dataSetReference[0] == '/') + strcpy(itemId, dataSetReference + 1); + else + strcpy(itemId, dataSetReference); } + else { + + if (MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainId) == NULL) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } - const char* itemIdString = dataSetReference + strlen(domainId) + 1; + const char* itemIdString = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdString) > DATA_SET_MAX_NAME_LENGTH) { - *error = IED_ERROR_OBJECT_REFERENCE_INVALID; - goto exit_function; - } + if (strlen(itemIdString) > DATA_SET_MAX_NAME_LENGTH) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } - copyStringToBuffer(itemIdString, itemId); + copyStringToBuffer(itemIdString, itemId); - StringUtils_replace(itemId, '.', '$'); + StringUtils_replace(itemId, '.', '$'); + } } else { if (dataSetReferenceLength > 33) { @@ -2028,23 +2051,33 @@ IedConnection_getDataSetDirectory(IedConnection self, IedClientError* error, con bool isAssociationSpecific = false; if (dataSetReference[0] != '@') { - domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + domainId = NULL; - if (domainId == NULL) { - *error = IED_ERROR_OBJECT_REFERENCE_INVALID; - goto exit_function; + if (dataSetReference[0] == '/') + itemId = dataSetReference + 1; + else + itemId = dataSetReference; } + else { + domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - const char* itemIdRef = dataSetReference + strlen(domainId) + 1; + if (domainId == NULL) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } - if (strlen(itemIdRef) > DATA_SET_MAX_NAME_LENGTH) { - *error = IED_ERROR_OBJECT_REFERENCE_INVALID; - goto exit_function; - } + const char* itemIdRef = dataSetReference + strlen(domainId) + 1; + + if (strlen(itemIdRef) > DATA_SET_MAX_NAME_LENGTH) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } - char* itemIdRefInBuffer = copyStringToBuffer(itemIdRef, itemIdBuffer); - StringUtils_replace(itemIdRefInBuffer, '.', '$'); - itemId = itemIdRefInBuffer; + char* itemIdRefInBuffer = copyStringToBuffer(itemIdRef, itemIdBuffer); + StringUtils_replace(itemIdRefInBuffer, '.', '$'); + itemId = itemIdRefInBuffer; + } } else { itemId = dataSetReference + 1; @@ -2103,24 +2136,35 @@ IedConnection_readDataSetValues(IedConnection self, IedClientError* error, const bool isAssociationSpecific = false; if (dataSetReference[0] != '@') { - domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { - *error = IED_ERROR_OBJECT_REFERENCE_INVALID; - goto exit_function; + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + domainId = NULL; + + if (dataSetReference[0] == '/') + itemId = dataSetReference + 1; + else + itemId = dataSetReference; } + else { + domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - const char* itemIdRefOrig = dataSetReference + strlen(domainId) + 1; + if (domainId == NULL) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } - if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) { - *error = IED_ERROR_OBJECT_REFERENCE_INVALID; - goto exit_function; - } + const char* itemIdRefOrig = dataSetReference + strlen(domainId) + 1; - char* itemIdRef = copyStringToBuffer(itemIdRefOrig, itemIdBuffer); + if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } - StringUtils_replace(itemIdRef, '.', '$'); - itemId = itemIdRef; + char* itemIdRef = copyStringToBuffer(itemIdRefOrig, itemIdBuffer); + + StringUtils_replace(itemIdRef, '.', '$'); + itemId = itemIdRef; + } } else { itemId = dataSetReference + 1; diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 2f7b1b8e..c9ed2541 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -1310,7 +1310,9 @@ IedConnection_readDataSetValues(IedConnection self, IedClientError* error, const * \brief create a new data set at the connected server device * * This function creates a new data set at the server. The parameter dataSetReference is the name of the new data set - * to create. It is either in the form LDName/LNodeName.dataSetName or @dataSetName for an association specific data set. + * to create. It is either in the form LDName/LNodeName.dataSetName for permanent domain or VMD scope data sets or + * @dataSetName for an association specific data set. If the LDName part of the reference is missing the resulting + * data set will be of VMD scope. * * The dataSetElements parameter contains a linked list containing the object references of FCDs or FCDAs. The format of * this object references is LDName/LNodeName.item(arrayIndex)component[FC]. diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 17811fc4..5d40e3ba 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -513,6 +513,13 @@ updateReportDataset(MmsMapping* mapping, ReportControl* rc, MmsValue* newDatSet, dataSet = MmsMapping_createDataSetByNamedVariableList(mapping, mmsVariableList); } } + /* check for VMD specific data set */ + else if (dataSetName[0] == '/') { + MmsNamedVariableList mmsVariableList = MmsDevice_getNamedVariableListWithName(mapping->mmsDevice, dataSetName + 1); + + if (mmsVariableList != NULL) + dataSet = MmsMapping_createDataSetByNamedVariableList(mapping, mmsVariableList); + } } if (dataSet == NULL) diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index 621bbb51..e745678e 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -384,6 +384,9 @@ MmsConnection_getVariableAccessAttributes(MmsConnection self, MmsError* mmsError /** * \brief Read the values of a domain specific named variable list * + * The resulting named variable list will either be of domain scope (when the domainId argument + * is present) or VMD scope when the domainId argument is NULL. + * * \param self MmsConnection instance to operate on * \param mmsError user provided variable to store error code * \param domainId the domain name of the requested variables. @@ -416,7 +419,10 @@ MmsConnection_readNamedVariableListValuesAssociationSpecific(MmsConnection self, const char* listName, bool specWithResult); /** - * \brief Define a new named variable list at the server. + * \brief Define a new VMD or domain scoped named variable list at the server. + * + * The resulting named variable list will either be of domain scope (when the domainId argument + * is present) or VMD scope when the domainId argument is NULL. * * \param self MmsConnection instance to operate on * \param mmsError user provided variable to store error code @@ -446,6 +452,9 @@ MmsConnection_defineNamedVariableListAssociationSpecific(MmsConnection self, Mms /** * \brief Read the entry list of a named variable list at the server. * + * The resulting named variable list will either be of domain scope (when the domainId argument + * is present) or VMD scope when the domainId argument is NULL. + * * \param self MmsConnection instance to operate on * \param mmsError user provided variable to store error code * \param domainId the domain name of the domain of the variable list @@ -477,6 +486,9 @@ MmsConnection_readNamedVariableListDirectoryAssociationSpecific(MmsConnection se /** * \brief Delete a named variable list at the server. * + * The resulting named variable list will either be of domain scope (when the domainId argument + * is present) or VMD scope when the domainId argument is NULL. + * * \param self MmsConnection instance to operate on * \param mmsError user provided variable to store error code * \param domainId the domain name of the domain of the variable list diff --git a/src/mms/inc/mms_device_model.h b/src/mms/inc/mms_device_model.h index 6ab11651..218bdeff 100644 --- a/src/mms/inc/mms_device_model.h +++ b/src/mms/inc/mms_device_model.h @@ -182,6 +182,9 @@ MmsDevice_getNamedVariable(MmsDevice* self, char* variableName); LinkedList MmsDevice_getNamedVariableLists(MmsDevice* self); +MmsNamedVariableList +MmsDevice_getNamedVariableListWithName(MmsDevice* self, const char* variableListName); + /**@}*/ #ifdef __cplusplus diff --git a/src/mms/iso_mms/client/mms_client_named_variable_list.c b/src/mms/iso_mms/client/mms_client_named_variable_list.c index 43b67273..49bf84d0 100644 --- a/src/mms/iso_mms/client/mms_client_named_variable_list.c +++ b/src/mms/iso_mms/client/mms_client_named_variable_list.c @@ -54,11 +54,18 @@ mmsClient_createDeleteNamedVariableListRequest(long invokeId, ByteBuffer* writeB request->listOfVariableListName->list.array = (ObjectName_t**) GLOBAL_CALLOC(1, sizeof(ObjectName_t*)); request->listOfVariableListName->list.array[0] = (ObjectName_t*) GLOBAL_CALLOC(1, sizeof(ObjectName_t)); - request->listOfVariableListName->list.array[0]->present = ObjectName_PR_domainspecific; - request->listOfVariableListName->list.array[0]->choice.domainspecific.domainId.size = strlen(domainId); - request->listOfVariableListName->list.array[0]->choice.domainspecific.domainId.buf = (uint8_t*) copyString(domainId); - request->listOfVariableListName->list.array[0]->choice.domainspecific.itemId.size = strlen(listNameId); - request->listOfVariableListName->list.array[0]->choice.domainspecific.itemId.buf = (uint8_t*) copyString(listNameId); + if (domainId != NULL) { + request->listOfVariableListName->list.array[0]->present = ObjectName_PR_domainspecific; + request->listOfVariableListName->list.array[0]->choice.domainspecific.domainId.size = strlen(domainId); + request->listOfVariableListName->list.array[0]->choice.domainspecific.domainId.buf = (uint8_t*) copyString(domainId); + request->listOfVariableListName->list.array[0]->choice.domainspecific.itemId.size = strlen(listNameId); + request->listOfVariableListName->list.array[0]->choice.domainspecific.itemId.buf = (uint8_t*) copyString(listNameId); + } + else { + request->listOfVariableListName->list.array[0]->present = ObjectName_PR_vmdspecific; + request->listOfVariableListName->list.array[0]->choice.vmdspecific.size = strlen(listNameId); + request->listOfVariableListName->list.array[0]->choice.vmdspecific.buf = (uint8_t*) copyString(listNameId); + } request->scopeOfDelete = (INTEGER_t*) GLOBAL_CALLOC(1, sizeof(INTEGER_t)); asn_long2INTEGER(request->scopeOfDelete, DeleteNamedVariableListRequest__scopeOfDelete_specific); @@ -156,13 +163,21 @@ mmsClient_createGetNamedVariableListAttributesRequest(uint32_t invokeId, ByteBuf GetNamedVariableListAttributesRequest_t* request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.getNamedVariableListAttributes); - request->present = ObjectName_PR_domainspecific; + if (domainId != NULL) { + request->present = ObjectName_PR_domainspecific; + + request->choice.domainspecific.domainId.size = strlen(domainId); + request->choice.domainspecific.domainId.buf = (uint8_t*) copyString(domainId); - request->choice.domainspecific.domainId.size = strlen(domainId); - request->choice.domainspecific.domainId.buf = (uint8_t*) copyString(domainId); + request->choice.domainspecific.itemId.size = strlen(listNameId); + request->choice.domainspecific.itemId.buf = (uint8_t*) copyString(listNameId); + } + else { + request->present = ObjectName_PR_vmdspecific; - request->choice.domainspecific.itemId.size = strlen(listNameId); - request->choice.domainspecific.itemId.buf = (uint8_t*) copyString(listNameId); + request->choice.vmdspecific.size = strlen(listNameId); + request->choice.vmdspecific.buf = (uint8_t*) copyString(listNameId); + } der_encode(&asn_DEF_MmsPdu, mmsPdu, (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); @@ -277,13 +292,21 @@ mmsClient_createDefineNamedVariableListRequest( request->variableListName.choice.aaspecific.buf = (uint8_t*) copyString(listNameId); } else { - request->variableListName.present = ObjectName_PR_domainspecific; + if (domainId != NULL) { /* domain scope */ + request->variableListName.present = ObjectName_PR_domainspecific; + + request->variableListName.choice.domainspecific.domainId.size = strlen(domainId); + request->variableListName.choice.domainspecific.domainId.buf = (uint8_t*) copyString(domainId); - request->variableListName.choice.domainspecific.domainId.size = strlen(domainId); - request->variableListName.choice.domainspecific.domainId.buf = (uint8_t*) copyString(domainId); + request->variableListName.choice.domainspecific.itemId.size = strlen(listNameId); + request->variableListName.choice.domainspecific.itemId.buf = (uint8_t*) copyString(listNameId); + } + else { /* VMD scope */ + request->variableListName.present = ObjectName_PR_vmdspecific; - request->variableListName.choice.domainspecific.itemId.size = strlen(listNameId); - request->variableListName.choice.domainspecific.itemId.buf = (uint8_t*) copyString(listNameId); + request->variableListName.choice.vmdspecific.size = strlen(listNameId); + request->variableListName.choice.vmdspecific.buf = (uint8_t*) copyString(listNameId); + } } int listSize = LinkedList_size(listOfVariables); diff --git a/src/mms/iso_mms/client/mms_client_read.c b/src/mms/iso_mms/client/mms_client_read.c index b3b3b149..df94412e 100644 --- a/src/mms/iso_mms/client/mms_client_read.c +++ b/src/mms/iso_mms/client/mms_client_read.c @@ -307,13 +307,22 @@ mmsClient_createReadNamedVariableListRequest(uint32_t invokeId, const char* doma ObjectName_t* objectName = &(readRequest->variableAccessSpecification.choice.variableListName); - objectName->present = ObjectName_PR_domainspecific; - objectName->choice.domainspecific.domainId.buf = (uint8_t*) copyString(domainId); - objectName->choice.domainspecific.domainId.size = strlen(domainId); + if (domainId != NULL) { + objectName->present = ObjectName_PR_domainspecific; + + objectName->choice.domainspecific.domainId.buf = (uint8_t*) copyString(domainId); + objectName->choice.domainspecific.domainId.size = strlen(domainId); + + objectName->choice.domainspecific.itemId.buf = (uint8_t*) copyString(itemId); + objectName->choice.domainspecific.itemId.size = strlen(itemId); + } + else { + objectName->present = ObjectName_PR_vmdspecific; - objectName->choice.domainspecific.itemId.buf = (uint8_t*) copyString(itemId); - objectName->choice.domainspecific.itemId.size = strlen(itemId); + objectName->choice.vmdspecific.buf = (uint8_t*) copyString(itemId); + objectName->choice.vmdspecific.size = strlen(itemId); + } asn_enc_rval_t rval; diff --git a/src/mms/iso_mms/server/mms_device.c b/src/mms/iso_mms/server/mms_device.c index e0968bf5..36db62c6 100644 --- a/src/mms/iso_mms/server/mms_device.c +++ b/src/mms/iso_mms/server/mms_device.c @@ -127,3 +127,10 @@ MmsDevice_getNamedVariableLists(MmsDevice* self) { return self->namedVariableLists; } + +MmsNamedVariableList +MmsDevice_getNamedVariableListWithName(MmsDevice* self, const char* variableListName) +{ + return mmsServer_getNamedVariableListWithName(self->namedVariableLists, variableListName); +} + From a6830fb0a8f597e0d304db69710c3108bb38dc12 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 30 Nov 2015 09:45:30 +0100 Subject: [PATCH 22/33] - changed debug output for buffered reporting --- config/stack_config.h | 2 +- src/iec61850/server/mms_mapping/reporting.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index 7727f459..b5ece377 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -36,7 +36,7 @@ * 0 ==> server runs in multi-threaded mode (one thread for each connection and * one server background thread ) */ -#define CONFIG_MMS_SINGLE_THREADED 0 +#define CONFIG_MMS_SINGLE_THREADED 1 /* * Optimize stack for threadless operation - don't use semaphores diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 5d40e3ba..ab3d67e5 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1531,6 +1531,7 @@ printEnqueuedReports(ReportControl* reportControl) { ReportBuffer* rb = reportControl->reportBuffer; +#if 0 printf("IED_SERVER: --- Enqueued reports ---\n"); if (rb->oldestReport == NULL) { @@ -1561,7 +1562,8 @@ printEnqueuedReports(ReportControl* reportControl) entry = entry->next; } } - printf("IED_SERVER: reports: %i\n", rb->reportsCount); +#endif + printf("IED_SERVER: BRCB %s reports: %i\n", reportControl->name, rb->reportsCount); printf("IED_SERVER: -------------------------\n"); } From 0fb088320af1760c059fdb550ec17d0ac50c1b52 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 3 Dec 2015 15:15:40 +0100 Subject: [PATCH 23/33] - fixed problem in reporting.csproj file - fixed bug in C# Validity enum --- dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs | 4 ++-- dotnet/reporting/reporting.csproj | 14 +------------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs index e8adb97f..ab051de2 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs @@ -1231,8 +1231,8 @@ namespace IEC61850 public enum Validity { GOOD = 0, - INVALID = 1, - RESERVED = 2, + RESERVED = 1, + INVALID = 2, QUESTIONABLE = 3 } diff --git a/dotnet/reporting/reporting.csproj b/dotnet/reporting/reporting.csproj index 319ba365..d4050d4c 100644 --- a/dotnet/reporting/reporting.csproj +++ b/dotnet/reporting/reporting.csproj @@ -49,13 +49,7 @@ - - True - True - Settings.settings - - @@ -64,12 +58,6 @@ IEC61850forCSharp - - - SettingsSingleFileGenerator - Settings.Designer.cs - - False @@ -92,4 +80,4 @@ true - \ No newline at end of file + From 837f0ac60e8248b4c60b1f0d1d1a794a863f7576 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sun, 6 Dec 2015 19:34:02 +0100 Subject: [PATCH 24/33] - fixed problem when client API tries to read a complete FC data structure (due to missing ".") --- src/iec61850/server/mms_mapping/mms_mapping.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 5acf1e79..a358bc2f 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -2704,6 +2704,12 @@ MmsMapping_createMmsVariableNameFromObjectReference(const char* objectReference, } } + if (!fcAdded) { + mmsVariableName[destIndex++] = '$'; + mmsVariableName[destIndex++] = fcString[0]; + mmsVariableName[destIndex++] = fcString[1]; + } + mmsVariableName[destIndex] = 0; return mmsVariableName; From 366fa7a1bb8af7aef4dc8f5c519cdc23506bb1dd Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 14 Dec 2015 19:02:02 +0100 Subject: [PATCH 25/33] - fixed bug for TC sDsN12: non-persitent dataset not allowed for BRCB --- src/iec61850/server/mms_mapping/reporting.c | 24 +++++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index ab3d67e5..4b5061b4 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -503,16 +503,24 @@ updateReportDataset(MmsMapping* mapping, ReportControl* rc, MmsValue* newDatSet, if (dataSet == NULL) { + /* check if association specific data set is requested */ + + if (dataSetName[0] == '@') { - if (connection != NULL) { - MmsNamedVariableList mmsVariableList - = MmsServerConnection_getNamedVariableList(connection, dataSetName + 1); - if (mmsVariableList != NULL) - dataSet = MmsMapping_createDataSetByNamedVariableList(mapping, mmsVariableList); + if (rc->buffered == false) { /* for buffered report non-permanent datasets are not allowed */ + if (connection != NULL) { + MmsNamedVariableList mmsVariableList + = MmsServerConnection_getNamedVariableList(connection, dataSetName + 1); + + if (mmsVariableList != NULL) + dataSet = MmsMapping_createDataSetByNamedVariableList(mapping, mmsVariableList); + } } + } + /* check for VMD specific data set */ else if (dataSetName[0] == '/') { MmsNamedVariableList mmsVariableList = MmsDevice_getNamedVariableListWithName(mapping->mmsDevice, dataSetName + 1); @@ -1315,8 +1323,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme if (strcmp(elementName, "GI") == 0) { if ((rc->enabled) && (rc->clientConnection == connection)) { - if (MmsValue_getBoolean(value)) - rc->gi = true; + if (MmsValue_getBoolean(value)) { + if (rc->triggerOps & TRG_OPT_GI) + rc->gi = true; + } retVal = DATA_ACCESS_ERROR_SUCCESS; goto exit_function; From ed8a73873d858b6888a8dc6244ebf7a83a4847c7 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 14 Dec 2015 19:06:26 +0100 Subject: [PATCH 26/33] - fixed bug for TC sBr25: Purge buffer when RptID is changes --- src/iec61850/server/mms_mapping/reporting.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 4b5061b4..7303b489 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1458,6 +1458,9 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme else if (strcmp(elementName, "RptID") == 0) { MmsValue* rptId = ReportControl_getRCBValue(rc, elementName); + if (rc->buffered) + purgeBuf(rc); + if (strlen(MmsValue_toString(value)) == 0) updateWithDefaultRptId(rc, rptId); else From 0a82e09b92938392180f332875a48d3c565d43f9 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 14 Dec 2015 19:14:50 +0100 Subject: [PATCH 27/33] - fixed bug for TC sBr21: set BufOvfl when entryID is not set --- src/iec61850/server/mms_mapping/reporting.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 7303b489..c72a3b2b 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1301,7 +1301,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme printf("IED_SERVER: Deactivate report for client %s\n", MmsServerConnection_getClientAddress(connection)); - if (rc->buffered == false) { + if (rc->buffered) { + rc->reportBuffer->isOverflow = true; + } + else { GLOBAL_FREEMEM(rc->inclusionFlags); rc->inclusionFlags = NULL; @@ -1428,11 +1431,13 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme retVal = DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; goto exit_function; } + + rc->reportBuffer->isOverflow = false; } else { rc->reportBuffer->nextToTransmit = rc->reportBuffer->oldestReport; - rc->isResync = false; rc->reportBuffer->isOverflow = true; + rc->isResync = false; } MmsValue* entryID = ReportControl_getRCBValue(rc, elementName); From 26d188ab4d09b43151e9e45ec39a777983a6c363 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 14 Dec 2015 19:42:57 +0100 Subject: [PATCH 28/33] - fixed bug with access to "Owner" attribute of BRCBs when resvTms not available --- src/iec61850/server/mms_mapping/reporting.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index c72a3b2b..ee606180 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -220,10 +220,15 @@ ReportControl_getRCBValue(ReportControl* rc, char* elementName) return MmsValue_getElement(rc->rcbValues, 11); else if (strcmp(elementName, "TimeofEntry") == 0) return MmsValue_getElement(rc->rcbValues, 12); +#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) else if (strcmp(elementName, "ResvTms") == 0) return MmsValue_getElement(rc->rcbValues, 13); else if (strcmp(elementName, "Owner") == 0) return MmsValue_getElement(rc->rcbValues, 14); +#else + else if (strcmp(elementName, "Owner") == 0) + return MmsValue_getElement(rc->rcbValues, 13); +#endif } else { if (strcmp(elementName, "RptID") == 0) return MmsValue_getElement(rc->rcbValues, 0); @@ -1001,7 +1006,7 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock, namedVariable->type = MMS_OCTET_STRING; namedVariable->typeSpec.octetString = -64; rcb->typeSpec.structure.elements[currentIndex] = namedVariable; - mmsValue->value.structure.components[currentIndex] = MmsValue_newOctetString(0, 4); /* size 4 is enough to store client IPv4 address */ + mmsValue->value.structure.components[currentIndex] = MmsValue_newOctetString(0, 128); /* size 4 is enough to store client IPv4 address */ reportControl->rcbValues = mmsValue; From daa0a1e95867b554b43b942baf1591b8749d5f49 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 14 Dec 2015 20:05:17 +0100 Subject: [PATCH 29/33] - GoCB DatSet and GoID are now readonly by stack_config.h --- config/stack_config.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index b5ece377..405a5a1a 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -102,9 +102,14 @@ /* The number of GOOSE retransmissions after an event */ #define CONFIG_GOOSE_EVENT_RETRANSMISSION_COUNT 2 -/* Define if GOOSE control block elements are writable (1) or read-only (0) */ -#define CONFIG_GOOSE_GOID_WRITABLE 1 -#define CONFIG_GOOSE_DATSET_WRITABLE 1 +/* Define if GOOSE control block elements are writable (1) or read-only (0) + * + * WARNING: To be compliant with the IEC 61850-8-1 standard all GoCB elements + * but GoEna have to be read-only! + * + * */ +#define CONFIG_GOOSE_GOID_WRITABLE 0 +#define CONFIG_GOOSE_DATSET_WRITABLE 0 #define CONFIG_GOOSE_CONFREV_WRITABLE 0 #define CONFIG_GOOSE_NDSCOM_WRITABLE 0 #define CONFIG_GOOSE_DSTADDRESS_WRITABLE 0 From 9e626d58b8576f3dc746e661346d64ee261b1610 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 25 Dec 2015 18:33:24 +0100 Subject: [PATCH 30/33] - added java based modelviewer tool --- .../server_example_dynamic.c | 5 +- src/iec61850/server/mms_mapping/reporting.c | 7 +- src/mms/iso_mms/server/mms_file_service.c | 12 +- tools/model_generator/build-modelviewer.sh | 12 + tools/model_generator/manifest-modelviewer.mf | 2 + .../src/com/libiec61850/scl/SclParser.java | 36 ++- .../com/libiec61850/scl/model/DataObject.java | 9 +- .../com/libiec61850/scl/types/SclType.java | 2 +- .../scl/types/TypeDeclarations.java | 6 + .../tools/DynamicModelGenerator.java | 2 +- .../com/libiec61850/tools/ModelViewer.java | 254 ++++++++++++++++++ .../tools/StaticModelGenerator.java | 2 +- 12 files changed, 324 insertions(+), 25 deletions(-) create mode 100755 tools/model_generator/build-modelviewer.sh create mode 100644 tools/model_generator/manifest-modelviewer.mf create mode 100644 tools/model_generator/src/com/libiec61850/tools/ModelViewer.java diff --git a/examples/server_example_dynamic/server_example_dynamic.c b/examples/server_example_dynamic/server_example_dynamic.c index 1d01c40a..2bab1f05 100644 --- a/examples/server_example_dynamic/server_example_dynamic.c +++ b/examples/server_example_dynamic/server_example_dynamic.c @@ -83,9 +83,8 @@ int main(int argc, char** argv) { while (running) { IedServer_lockDataModel(iedServer); - MmsValue_setFloat(temperatureValue->mmsValue, val); - MmsValue_setUtcTimeMs(temperatureTimestamp->mmsValue, Hal_getTimeInMs()); - IedServer_updateAttributeValue(iedServer, temperatureValue, temperatureValue->mmsValue); + IedServer_updateUTCTimeAttributeValue(iedServer, temperatureTimestamp, Hal_getTimeInMs()) + IedServer_updateFloatAttributeValue(iedServer, temperatureValue, val); IedServer_unlockDataModel(iedServer); diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index ee606180..2ce1a3ff 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -57,7 +57,7 @@ ReportBuffer_create(void) self->memoryBlockSize = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->memoryBlock = (uint8_t*) GLOBAL_MALLOC(self->memoryBlockSize); self->reportsCount = 0; - self->isOverflow = false; + self->isOverflow = true; return self; } @@ -1266,8 +1266,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme if (rc->buffered) { - if (rc->isResync == false) + if (rc->isResync == false) { rc->reportBuffer->nextToTransmit = rc->reportBuffer->oldestReport; + rc->reportBuffer->isOverflow = true; + } rc->isResync = false; } @@ -1308,6 +1310,7 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme if (rc->buffered) { rc->reportBuffer->isOverflow = true; + rc->isResync = false; } else { GLOBAL_FREEMEM(rc->inclusionFlags); diff --git a/src/mms/iso_mms/server/mms_file_service.c b/src/mms/iso_mms/server/mms_file_service.c index 74c60d56..75ee5054 100644 --- a/src/mms/iso_mms/server/mms_file_service.c +++ b/src/mms/iso_mms/server/mms_file_service.c @@ -517,9 +517,9 @@ addFileEntriesToResponse(uint8_t* buffer, int bufPos, int maxBufSize, char* dire } static void -createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, char* directoryName, char* continueAfterFileName) +createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, int maxPduSize, char* directoryName, char* continueAfterFileName) { - int maxSize = response->maxSize - 3; /* reserve space for moreFollows */ + int maxSize = maxPduSize - 3; /* reserve space for moreFollows */ uint8_t* buffer = response->buffer; bool moreFollows = false; @@ -533,6 +533,8 @@ createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, char* direc continueAfterFileName = NULL; } + printf("createFileDirectoryResponse: maxSize:%i\n", maxSize); + tempCurPos = addFileEntriesToResponse(buffer, tempCurPos, maxSize, directoryName, continueAfterFileName, &moreFollows); if (tempCurPos < 0) { @@ -584,6 +586,8 @@ createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, char* direc bufPos = BerEncoder_encodeBoolean(0x81, moreFollows, buffer, bufPos); response->size = bufPos; + + printf("createFileDirectoryResponse: maxSize:%i response->isze:%i\n", maxSize, response->size); } void @@ -708,7 +712,9 @@ mmsServer_handleFileDirectoryRequest( } - createFileDirectoryResponse(invokeId, response, filename, continueAfter); + int maxPduSize = connection->maxPduSize; + + createFileDirectoryResponse(invokeId, response, maxPduSize, filename, continueAfter); } #endif /* MMS_FILE_SERVICE == 1 */ diff --git a/tools/model_generator/build-modelviewer.sh b/tools/model_generator/build-modelviewer.sh new file mode 100755 index 00000000..42d27fb2 --- /dev/null +++ b/tools/model_generator/build-modelviewer.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +mkdir build + +find src/ -name "*.java" > listFile.tmp + +javac -target 1.6 -source 1.6 -d build @listFile.tmp + +jar cfm modelviewer.jar manifest-modelviewer.mf -C build/ com/ + +rm listFile.tmp +rm -r build diff --git a/tools/model_generator/manifest-modelviewer.mf b/tools/model_generator/manifest-modelviewer.mf new file mode 100644 index 00000000..dd837e70 --- /dev/null +++ b/tools/model_generator/manifest-modelviewer.mf @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Main-Class: com.libiec61850.tools.ModelViewer diff --git a/tools/model_generator/src/com/libiec61850/scl/SclParser.java b/tools/model_generator/src/com/libiec61850/scl/SclParser.java index 8ed6b2c3..4ed22e51 100644 --- a/tools/model_generator/src/com/libiec61850/scl/SclParser.java +++ b/tools/model_generator/src/com/libiec61850/scl/SclParser.java @@ -62,28 +62,47 @@ public class SclParser { private List ieds; private Communication communication; private TypeDeclarations typeDeclarations; - private Node scl; + + public static boolean withOutput = true; + + public TypeDeclarations getTypeDeclarations() { + return typeDeclarations; + } - public SclParser(InputStream stream) throws SclParserException { + private Node scl; + + public SclParser(InputStream stream, boolean withOutput) throws SclParserException { + this.withOutput = withOutput; + Document doc = parseXmlDocument(stream); scl = getRootNode(doc); - System.out.println("parse data type templates ..."); + if (withOutput) + System.out.println("parse data type templates ..."); + typeDeclarations = parseTypeDeclarations(); - System.out.println("parse IED section ..."); + if (withOutput) + System.out.println("parse IED section ..."); parseIedSections(); - System.out.println("parse communication section ..."); + if (withOutput) + System.out.println("parse communication section ..."); + communication = parseCommunicationSection(); if (communication == null) - System.out.println("WARNING: No communication section found!"); + if (withOutput) + System.out.println("WARNING: No communication section found!"); + } + + public SclParser(InputStream stream) throws SclParserException { + this(stream, true); } - public IED getIedByteName(String iedName) { + public IED getIedByName(String iedName) { for (IED ied : ieds) { if (ied.getName().equals(iedName)) return ied; @@ -280,7 +299,8 @@ public class SclParser { if (connectedAP.getApName().equals(accessPointName)) { - System.out.println("Found connectedAP " + accessPointName + " for IED " + ied.getName()); + if (withOutput) + System.out.println("Found connectedAP " + accessPointName + " for IED " + ied.getName()); return connectedAP; } diff --git a/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java b/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java index 7a861767..818bfadd 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java @@ -82,12 +82,9 @@ public class DataObject implements DataModelNode { for (DataAttributeDefinition daDefinition : daDefinitions) { - if (daDefinition.getFc() == FunctionalConstraint.SE) { - - System.out.println("Add SG DA for corresponding SE DA: "); - this.dataAttributes.add(new DataAttribute(daDefinition, typeDeclarations, FunctionalConstraint.SG, this)); - } - + if (daDefinition.getFc() == FunctionalConstraint.SE) + this.dataAttributes.add(new DataAttribute(daDefinition, typeDeclarations, FunctionalConstraint.SG, this)); + this.dataAttributes.add(new DataAttribute(daDefinition, typeDeclarations, null, this)); diff --git a/tools/model_generator/src/com/libiec61850/scl/types/SclType.java b/tools/model_generator/src/com/libiec61850/scl/types/SclType.java index 04c9e45d..f6edac4a 100644 --- a/tools/model_generator/src/com/libiec61850/scl/types/SclType.java +++ b/tools/model_generator/src/com/libiec61850/scl/types/SclType.java @@ -26,7 +26,7 @@ import org.w3c.dom.Node; import com.libiec61850.scl.ParserUtils; import com.libiec61850.scl.SclParserException; -public class SclType { +public abstract class SclType { private String id = null; private String description; diff --git a/tools/model_generator/src/com/libiec61850/scl/types/TypeDeclarations.java b/tools/model_generator/src/com/libiec61850/scl/types/TypeDeclarations.java index 4d9999ae..2931ce15 100644 --- a/tools/model_generator/src/com/libiec61850/scl/types/TypeDeclarations.java +++ b/tools/model_generator/src/com/libiec61850/scl/types/TypeDeclarations.java @@ -68,5 +68,11 @@ public class TypeDeclarations { return null; } + + public List getTypeDeclarations() { + return typeDeclarations; + } + + } diff --git a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java index 1297c623..a7fd6606 100644 --- a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java @@ -62,7 +62,7 @@ public class DynamicModelGenerator { if (iedName == null) ied = sclParser.getFirstIed(); else - ied = sclParser.getIedByteName(iedName); + ied = sclParser.getIedByName(iedName); if (ied == null) throw new SclParserException("No data model present in SCL file! Exit."); diff --git a/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java b/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java new file mode 100644 index 00000000..d364959f --- /dev/null +++ b/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java @@ -0,0 +1,254 @@ +package com.libiec61850.tools; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.List; + +import com.libiec61850.scl.SclParser; +import com.libiec61850.scl.SclParserException; +import com.libiec61850.scl.model.AccessPoint; +import com.libiec61850.scl.model.DataAttribute; +import com.libiec61850.scl.model.DataObject; +import com.libiec61850.scl.model.IED; +import com.libiec61850.scl.model.LogicalDevice; +import com.libiec61850.scl.model.LogicalNode; +import com.libiec61850.scl.model.Server; +import com.libiec61850.scl.types.DataAttributeType; +import com.libiec61850.scl.types.DataObjectType; +import com.libiec61850.scl.types.EnumerationType; +import com.libiec61850.scl.types.LogicalNodeType; +import com.libiec61850.scl.types.SclType; +import com.libiec61850.scl.types.TypeDeclarations; + +public class ModelViewer { + + private static void showTypes(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName) + throws SclParserException { + + SclParser sclParser = new SclParser(stream, false); + + TypeDeclarations typeDecl = sclParser.getTypeDeclarations(); + + for (SclType type : typeDecl.getTypeDeclarations()) { + output.print(type.getId()); + + if (type.getClass() == LogicalNodeType.class) + output.print(" : LogicalNode"); + else if (type.getClass() == DataObjectType.class) + output.print(" : DataObject"); + else if (type.getClass() == DataAttributeType.class) + output.print(" : DataAttribute"); + else if (type.getClass() == EnumerationType.class) + output.print(" : Enumeration"); + + output.println(); + } + } + + private static void printSubAttributes(DataAttribute attribute, PrintStream output, String indent, String add) { + + if (attribute.getSubDataAttributes() != null) { + + for (DataAttribute attr : attribute.getSubDataAttributes()) { + output.println(indent + add + attr.getName()); + + printSubAttributes(attr, output, indent + add, add); + } + } + } + + private static void printModelStructure(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName) + throws SclParserException { + + SclParser sclParser = new SclParser(stream, false); + + IED ied = null; + + if (iedName == null) + ied = sclParser.getFirstIed(); + else + ied = sclParser.getIedByName(iedName); + + AccessPoint ap = ied.getFirstAccessPoint(); + + Server server = ap.getServer(); + + List devices = server.getLogicalDevices(); + + for (LogicalDevice device : devices) { + output.println(device.getInst()); + + List lNodes = device.getLogicalNodes(); + + for (LogicalNode lNode : lNodes) { + output.println(" " + lNode.getName()); + + for (DataObject dObject : lNode.getDataObjects()) { + output.println(" " + dObject.getName()); + + for (DataAttribute dAttribute : dObject.getDataAttributes()) { + output.println(" " + dAttribute.getName() + " [" + dAttribute.getFc().toString() + "]"); + + printSubAttributes(dAttribute, output, " ", " "); + } + + } + } + } + + } + + + private static void printSubAttributeList(DataAttribute attribute, PrintStream output, String prefix) { + + if (attribute.getSubDataAttributes() != null) { + + for (DataAttribute attr : attribute.getSubDataAttributes()) { + + String nextPrefix = prefix + "." + attr.getName(); + + output.println(nextPrefix + " [" + attr.getFc() + "]"); + + printSubAttributeList(attr, output, nextPrefix); + } + } + } + + + private static void printAttributeList(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName) + throws SclParserException { + + SclParser sclParser = new SclParser(stream, false); + + IED ied = null; + + if (iedName == null) + ied = sclParser.getFirstIed(); + else + ied = sclParser.getIedByName(iedName); + + AccessPoint ap = ied.getFirstAccessPoint(); + + Server server = ap.getServer(); + + List devices = server.getLogicalDevices(); + + + + for (LogicalDevice device : devices) { + + String devPrefix = ied.getName() + device.getInst() + "/"; + + List lNodes = device.getLogicalNodes(); + + for (LogicalNode lNode : lNodes) { + String lNodePrefix = devPrefix + lNode.getName(); + + for (DataObject dObject : lNode.getDataObjects()) { + + String dOPrefix = lNodePrefix + "." + dObject.getName(); + + for (DataAttribute dAttribute : dObject.getDataAttributes()) { + + String daPrefix = dOPrefix + "." + dAttribute.getName(); + + output.println(daPrefix + " [" + dAttribute.getFc().toString() + "]"); + + printSubAttributeList(dAttribute, output, daPrefix); + } + + } + } + } + + } + + public static void main(String[] args) throws FileNotFoundException { + + if (args.length < 1) { + System.out.println("SCL model viewer"); + System.out.println("Usage: scltool [-ied ] [-ap ] [-t] [-s] [-a] []"); + System.out.println(" -ied select IED"); + System.out.println(" -ap select AP"); + System.out.println(" -t print type list"); + System.out.println(" -s print IED device model structure"); + System.out.println(" -a print list of data attributes (object references)"); + System.exit(1); + } + + String icdFile = args[0]; + + PrintStream outputStream = System.out; + + String accessPointName = null; + String iedName = null; + + boolean printTypeList = false; + boolean printModelStructure = false; + boolean printDataAttribtues = false; + + if (args.length > 1) { + for (int i = 1; i < args.length; i++) { + if (args[i].equals("-ap")) { + accessPointName = args[i+1]; + + System.out.println("Select access point " + accessPointName); + + i++; + } + else if (args[i].equals("-ied")) { + iedName = args[i+1]; + + System.out.println("Select IED " + iedName); + + i++; + + } + else if (args[i].equals("-t")) { + printTypeList = true; + + i++; + + } + else if (args[i].equals("-s")) { + printModelStructure = true; + + i++; + + } + else if (args[i].equals("-a")) { + printDataAttribtues = true; + + i++; + + } + else { + outputStream = new PrintStream(new FileOutputStream(new File(args[i]))); + } + } + + } + + InputStream stream = new FileInputStream(icdFile); + + try { + if (printTypeList) + showTypes(stream, icdFile, outputStream, iedName, accessPointName); + + if (printModelStructure) + printModelStructure(stream, icdFile, outputStream, iedName, accessPointName); + + if (printDataAttribtues) + printAttributeList(stream, icdFile, outputStream, iedName, accessPointName); + + + } catch (SclParserException e) { + System.err.println("ERROR: " + e.getMessage()); + } + } + +} diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index cad7d5ec..a0b1ea6d 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -129,7 +129,7 @@ public class StaticModelGenerator { if (iedName == null) ied = sclParser.getFirstIed(); else - ied = sclParser.getIedByteName(iedName); + ied = sclParser.getIedByName(iedName); if (ied == null) System.out.println("IED model not found in SCL file! Exit."); From 902ca28056e8f08d62a3857a2e933d38736f8d9c Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 26 Dec 2015 11:20:27 +0100 Subject: [PATCH 31/33] - fixed problem: GI without activated GI trigger option --- src/hal/socket/linux/socket_linux.c | 2 +- src/iec61850/server/mms_mapping/reporting.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hal/socket/linux/socket_linux.c b/src/hal/socket/linux/socket_linux.c index fc01f75d..b00423dd 100644 --- a/src/hal/socket/linux/socket_linux.c +++ b/src/hal/socket/linux/socket_linux.c @@ -316,7 +316,7 @@ Socket_connect(Socket self, const char* address, int port) activateTcpNoDelay(self); -#if CONFIG_ACTIVATE_TCP_KEEPALIVE == 1 +#if (CONFIG_ACTIVATE_TCP_KEEPALIVE == 1) activateKeepAlive(self->fd); #endif diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index ab3d67e5..bb875100 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1315,8 +1315,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme if (strcmp(elementName, "GI") == 0) { if ((rc->enabled) && (rc->clientConnection == connection)) { - if (MmsValue_getBoolean(value)) - rc->gi = true; + if (MmsValue_getBoolean(value)) { + if (rc->triggerOps & TRG_OPT_GI) + rc->gi = true; + } retVal = DATA_ACCESS_ERROR_SUCCESS; goto exit_function; From 50115191ccaeb55b247117d134c00c2e7be99a39 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 26 Dec 2015 12:15:53 +0100 Subject: [PATCH 32/33] - SCL parser/modeviewer: show unused types --- tools/model_generator/modelviewer.jar | Bin 0 -> 83139 bytes .../libiec61850/scl/model/DataAttribute.java | 4 +++ .../com/libiec61850/scl/model/DataObject.java | 3 +++ .../libiec61850/scl/model/LogicalNode.java | 3 +++ .../com/libiec61850/scl/types/SclType.java | 9 +++++++ .../com/libiec61850/tools/ModelViewer.java | 25 ++++++++++++++++-- 6 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tools/model_generator/modelviewer.jar diff --git a/tools/model_generator/modelviewer.jar b/tools/model_generator/modelviewer.jar new file mode 100644 index 0000000000000000000000000000000000000000..27a0c016a24e1fc82d38cbb461db4fd3d33f33d4 GIT binary patch literal 83139 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 z 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≧̸(VR4o7A)kuR^(p*iX+ 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 Lgt7o@Q<(n;=|y2- literal 0 HcmV?d00001 diff --git a/tools/model_generator/src/com/libiec61850/scl/model/DataAttribute.java b/tools/model_generator/src/com/libiec61850/scl/model/DataAttribute.java index 44193d78..8362d86e 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/DataAttribute.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/DataAttribute.java @@ -87,6 +87,8 @@ public class DataAttribute implements DataModelNode { if (!(this.sclType instanceof EnumerationType)) throw new SclParserException("Wrong type definition for enumerated data attribute"); + + this.sclType.setUsed(true); } private void createConstructedAttribute(DataAttributeDefinition daDefinition, TypeDeclarations typeDeclarations) @@ -98,6 +100,8 @@ public class DataAttribute implements DataModelNode { if (!(this.sclType instanceof DataAttributeType)) throw new SclParserException("Wrong type definition for constructed data attribute"); + + this.sclType.setUsed(true); DataAttributeType dataAttributeType = (DataAttributeType) this.sclType; diff --git a/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java b/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java index 818bfadd..c7fae5e0 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java @@ -55,6 +55,9 @@ public class DataObject implements DataModelNode { if (sclType == null) throw new SclParserException("type declaration missing for data object."); + + /* mark type as used */ + sclType.setUsed(true); createDataAttributes(typeDeclarations, sclType); diff --git a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java index 6033732f..021dfc80 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java @@ -82,6 +82,9 @@ public class LogicalNode implements DataModelNode { dataObjects = new LinkedList(); LogicalNodeType type = (LogicalNodeType) sclType; + + /* mark type as used */ + type.setUsed(true); List doDefinitions = type.getDataObjectDefinitions(); diff --git a/tools/model_generator/src/com/libiec61850/scl/types/SclType.java b/tools/model_generator/src/com/libiec61850/scl/types/SclType.java index f6edac4a..fab834bb 100644 --- a/tools/model_generator/src/com/libiec61850/scl/types/SclType.java +++ b/tools/model_generator/src/com/libiec61850/scl/types/SclType.java @@ -30,6 +30,7 @@ public abstract class SclType { private String id = null; private String description; + private boolean isUsed = false; public SclType(Node xmlNode) throws SclParserException { this.id = ParserUtils.parseAttribute(xmlNode, "id"); @@ -51,4 +52,12 @@ public abstract class SclType { public String getDesc() { return description; } + + public void setUsed(boolean isUsed) { + this.isUsed = isUsed; + } + + public boolean isUsed() { + return this.isUsed; + } } diff --git a/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java b/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java index d364959f..b1059043 100644 --- a/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java +++ b/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java @@ -26,7 +26,7 @@ import com.libiec61850.scl.types.TypeDeclarations; public class ModelViewer { - private static void showTypes(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName) + private static void showTypes(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName, boolean unusedOnly) throws SclParserException { SclParser sclParser = new SclParser(stream, false); @@ -34,6 +34,12 @@ public class ModelViewer { TypeDeclarations typeDecl = sclParser.getTypeDeclarations(); for (SclType type : typeDecl.getTypeDeclarations()) { + + if (unusedOnly) { + if (type.isUsed() == true) + continue; + } + output.print(type.getId()); if (type.getClass() == LogicalNodeType.class) @@ -45,6 +51,10 @@ public class ModelViewer { else if (type.getClass() == EnumerationType.class) output.print(" : Enumeration"); + if (!unusedOnly) + if (type.isUsed() == false) + System.out.print(" UNUSED TYPE!"); + output.println(); } } @@ -175,6 +185,7 @@ public class ModelViewer { System.out.println(" -ied select IED"); System.out.println(" -ap select AP"); System.out.println(" -t print type list"); + System.out.println(" -u print list of unused types"); System.out.println(" -s print IED device model structure"); System.out.println(" -a print list of data attributes (object references)"); System.exit(1); @@ -188,6 +199,7 @@ public class ModelViewer { String iedName = null; boolean printTypeList = false; + boolean printUnusedTypes = false; boolean printModelStructure = false; boolean printDataAttribtues = false; @@ -225,6 +237,12 @@ public class ModelViewer { i++; + } + else if (args[i].equals("-u")) { + printUnusedTypes = true; + + i++; + } else { outputStream = new PrintStream(new FileOutputStream(new File(args[i]))); @@ -237,7 +255,10 @@ public class ModelViewer { try { if (printTypeList) - showTypes(stream, icdFile, outputStream, iedName, accessPointName); + showTypes(stream, icdFile, outputStream, iedName, accessPointName, false); + + if (printUnusedTypes) + showTypes(stream, icdFile, outputStream, iedName, accessPointName, true); if (printModelStructure) printModelStructure(stream, icdFile, outputStream, iedName, accessPointName); From ecf64277a80b5576b537b38bd91a2cffc464d8be Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 7 Jan 2016 16:48:40 +0100 Subject: [PATCH 33/33] - fixed bug in server side file directory service with nested directory structure - mms_utility: added read file directory feature --- examples/mms_utility/mms_utility.c | 32 ++++++++++++++++++++--- src/mms/iso_mms/server/mms_file_service.c | 15 +++++------ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/examples/mms_utility/mms_utility.c b/examples/mms_utility/mms_utility.c index 51976a6f..f941514c 100644 --- a/examples/mms_utility/mms_utility.c +++ b/examples/mms_utility/mms_utility.c @@ -8,7 +8,8 @@ static void print_help() { - printf("MMS utility (libiec61850 v0.5) options:\n"); + + printf("MMS utility (libiec61850 " LIBIEC61850_VERSION ") options:\n"); printf("-h specify hostname\n"); printf("-p specify port\n"); printf("-l specify maximum PDU size\n"); @@ -16,7 +17,18 @@ print_help() printf("-i show server identity\n"); printf("-t show domain directory\n"); printf("-r read domain variable\n"); - printf("-a specify domain for read or write command"); + printf("-a specify domain for read or write command\n"); + printf("-f show file list\n"); +} + +static void +mmsFileDirectoryHandler (void* parameter, char* filename, uint32_t size, uint64_t lastModified) +{ + char* lastName = (char*) parameter; + + strcpy (lastName, filename); + + printf("%s\n", filename); } int main(int argc, char** argv) { @@ -33,11 +45,12 @@ int main(int argc, char** argv) { int identifyDevice = 0; int readWriteHasDomain = 0; int readVariable = 0; + int showFileList = 0; int c; - while ((c = getopt(argc, argv, "idh:p:l:t:a:r:")) != -1) + while ((c = getopt(argc, argv, "ifdh:p:l:t:a:r:")) != -1) switch (c) { case 'h': hostname = copyString(optarg); @@ -66,6 +79,9 @@ int main(int argc, char** argv) { readVariable = 1; variableName = copyString(optarg); break; + case 'f': + showFileList = 1; + break; default: print_help(); @@ -150,6 +166,16 @@ int main(int argc, char** argv) { printf("Reading VMD scope variable not yet supported!\n"); } + if (showFileList) { + char lastName[300]; + lastName[0] = 0; + + char* continueAfter = NULL; + + while (MmsConnection_getFileDirectory(con, &error, "", continueAfter, mmsFileDirectoryHandler, lastName)) { + continueAfter = lastName; + } + } exit: MmsConnection_destroy(con); diff --git a/src/mms/iso_mms/server/mms_file_service.c b/src/mms/iso_mms/server/mms_file_service.c index 75ee5054..41d7e307 100644 --- a/src/mms/iso_mms/server/mms_file_service.c +++ b/src/mms/iso_mms/server/mms_file_service.c @@ -437,7 +437,7 @@ encodeFileSpecification(uint8_t tag, char* fileSpecification, uint8_t* buffer, i } static int -addFileEntriesToResponse(uint8_t* buffer, int bufPos, int maxBufSize, char* directoryName, char* continueAfterFileName, bool* moreFollows) +addFileEntriesToResponse(uint8_t* buffer, int bufPos, int maxBufSize, char* directoryName, char** continueAfterFileName, bool* moreFollows) { int directoryNameLength = strlen(directoryName); @@ -464,9 +464,10 @@ addFileEntriesToResponse(uint8_t* buffer, int bufPos, int maxBufSize, char* dire break; } else { - if (continueAfterFileName != NULL) { - if (strcmp(continueAfterFileName, directoryName) == 0) - continueAfterFileName = NULL; + if (*continueAfterFileName != NULL) { + if (strcmp(*continueAfterFileName, directoryName) == 0) { + *continueAfterFileName = NULL; + } } else { uint64_t msTime; @@ -533,9 +534,7 @@ createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, int maxPduS continueAfterFileName = NULL; } - printf("createFileDirectoryResponse: maxSize:%i\n", maxSize); - - tempCurPos = addFileEntriesToResponse(buffer, tempCurPos, maxSize, directoryName, continueAfterFileName, &moreFollows); + tempCurPos = addFileEntriesToResponse(buffer, tempCurPos, maxSize, directoryName, &continueAfterFileName, &moreFollows); if (tempCurPos < 0) { @@ -586,8 +585,6 @@ createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, int maxPduS bufPos = BerEncoder_encodeBoolean(0x81, moreFollows, buffer, bufPos); response->size = bufPos; - - printf("createFileDirectoryResponse: maxSize:%i response->isze:%i\n", maxSize, response->size); } void