From 659dd493389e48f1f2ed5f409ba484cc36baca2d Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 31 Jul 2021 14:46:44 +0200 Subject: [PATCH] - reworked server side array handling (-> incompatible data model structure changes!) --- .../mhai_array.cid | 10 +- .../server_example_ca.c | 47 +- .../static_model.c | 1875 ++++++++++++++++- .../static_model.h | 254 ++- src/iec61850/inc/iec61850_dynamic_model.h | 5 +- src/iec61850/inc/iec61850_model.h | 19 +- src/iec61850/server/impl/ied_server.c | 67 +- src/iec61850/server/mms_mapping/control.c | 2 +- src/iec61850/server/mms_mapping/mms_mapping.c | 3 + src/iec61850/server/model/dynamic_model.c | 23 +- src/iec61850/server/model/model.c | 96 +- src/mms/inc_private/mms_server_libinternal.h | 3 + src/mms/inc_private/mms_value_cache.h | 5 +- src/mms/iso_mms/common/mms_type_spec.c | 4 + src/mms/iso_mms/server/mms_server.c | 11 + src/mms/iso_mms/server/mms_value_cache.c | 132 +- tools/model_generator/genmodel.jar | Bin 96995 -> 97845 bytes .../tools/StaticModelGenerator.java | 153 +- 18 files changed, 2552 insertions(+), 157 deletions(-) diff --git a/examples/server_example_complex_array/mhai_array.cid b/examples/server_example_complex_array/mhai_array.cid index 0b588518..06762205 100644 --- a/examples/server_example_complex_array/mhai_array.cid +++ b/examples/server_example_complex_array/mhai_array.cid @@ -103,11 +103,11 @@ - - - - - + + + + + diff --git a/examples/server_example_complex_array/server_example_ca.c b/examples/server_example_complex_array/server_example_ca.c index c70eb7b6..509d4876 100644 --- a/examples/server_example_complex_array/server_example_ca.c +++ b/examples/server_example_complex_array/server_example_ca.c @@ -26,26 +26,30 @@ sigint_handler(int signalId) } static void -updateCMVArrayElement(MmsValue *cval, int index, float magnitude, float angle, Quality quality, Timestamp timestamp) +updateCMVArrayElement(IedServer server, DataObject* phsAHar, int idx, float magnitude, float angle, Quality quality, Timestamp timestamp) { - MmsValue* cmv = MmsValue_getElement(cval, index); + DataObject* phsAHarArrayElem = (DataObject*)ModelNode_getChildWithIdx((ModelNode*)phsAHar, idx); - MmsValue* cValElement = MmsValue_getElement(cmv, 0); + if (phsAHarArrayElem) { - assert(MmsValue_getArraySize(cValElement) == 2); + DataAttribute* mag = (DataAttribute*)ModelNode_getChild((ModelNode*)phsAHarArrayElem, "cVal.mag.f"); + DataAttribute* ang = (DataAttribute*)ModelNode_getChild((ModelNode*)phsAHarArrayElem, "cVal.ang.f"); + DataAttribute* q = (DataAttribute*)ModelNode_getChild((ModelNode*)phsAHarArrayElem, "q"); + DataAttribute* t = (DataAttribute*)ModelNode_getChild((ModelNode*)phsAHarArrayElem, "t"); - MmsValue* cValElement_mag_f = MmsValue_getElement(MmsValue_getElement(cValElement, 0), 0); - - MmsValue* cValElement_ang_f = MmsValue_getElement(MmsValue_getElement(cValElement, 1), 0); - - MmsValue_setFloat(cValElement_mag_f, magnitude); - MmsValue_setFloat(cValElement_ang_f, angle); - - MmsValue* q = MmsValue_getElement(cmv, 1); - MmsValue_setBitStringFromInteger(q, (int) quality); - - MmsValue* t = MmsValue_getElement(cmv, 2); - MmsValue_setUtcTimeByBuffer(t, timestamp.val); + if (mag && ang && q && t) { + IedServer_updateQuality(server, q, quality); + IedServer_updateTimestampAttributeValue(server, t, ×tamp); + IedServer_updateFloatAttributeValue(server, mag, magnitude); + IedServer_updateFloatAttributeValue(server, ang, angle); + } + else { + printf("one of mag, ang, q, t not found\n"); + } + } + else { + printf("Element with index %i not found\n", idx); + } } int @@ -62,10 +66,7 @@ main(int argc, char **argv) /* Get access to the MHAI1.HA data object handle - for static and dynamic model*/ DataObject* mhai1_ha_phsAHar = (DataObject*) - IedModel_getModelNodeByObjectReference(&iedModel, "testComplexArray/MHAI1.HA.phsAHar"); - - /* Get access to the corresponding MMS value data structure - the MX(FC) part of the data object */ - MmsValue* mhai1_ha_phsAHar_mx = IedServer_getFunctionalConstrainedData(iedServer, mhai1_ha_phsAHar, IEC61850_FC_MX); + IedModel_getModelNodeByShortObjectReference(&iedModel, "ComplexArray/MHAI1.HA.phsAHar"); /* assuming the array has 16 elements */ float mag = 200.f; @@ -78,7 +79,7 @@ main(int argc, char **argv) int i; for (i = 0; i < 16; i++) { - updateCMVArrayElement(mhai1_ha_phsAHar_mx, i, mag, angle, quality, timestamp); + updateCMVArrayElement(iedServer, mhai1_ha_phsAHar, i, mag, angle, quality, timestamp); mag += 1.f; angle += 0.01f; } @@ -104,11 +105,13 @@ main(int argc, char **argv) Timestamp_setTimeInMilliseconds(×tamp, Hal_getTimeInMs()); IedServer_lockDataModel(iedServer); + for (i = 0; i < 16; i++) { - updateCMVArrayElement(mhai1_ha_phsAHar_mx, i, mag, angle, quality, timestamp); + updateCMVArrayElement(iedServer, mhai1_ha_phsAHar, i, mag, angle, quality, timestamp); mag += 0.1f; angle += 0.05f; } + IedServer_unlockDataModel(iedServer); if (counter == 10) { diff --git a/examples/server_example_complex_array/static_model.c b/examples/server_example_complex_array/static_model.c index 3f5a6f14..c4daacdf 100644 --- a/examples/server_example_complex_array/static_model.c +++ b/examples/server_example_complex_array/static_model.c @@ -79,7 +79,8 @@ LogicalDevice iedModel_ComplexArray = { "ComplexArray", (ModelNode*) &iedModel, NULL, - (ModelNode*) &iedModel_ComplexArray_LLN0 + (ModelNode*) &iedModel_ComplexArray_LLN0, + NULL }; LogicalNode iedModel_ComplexArray_LLN0 = { @@ -96,7 +97,8 @@ DataObject iedModel_ComplexArray_LLN0_Mod = { (ModelNode*) &iedModel_ComplexArray_LLN0, (ModelNode*) &iedModel_ComplexArray_LLN0_Beh, (ModelNode*) &iedModel_ComplexArray_LLN0_Mod_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_LLN0_Mod_stVal = { @@ -106,6 +108,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Mod_stVal = { (ModelNode*) &iedModel_ComplexArray_LLN0_Mod_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, @@ -119,6 +122,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Mod_q = { (ModelNode*) &iedModel_ComplexArray_LLN0_Mod_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -132,6 +136,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Mod_t = { (ModelNode*) &iedModel_ComplexArray_LLN0_Mod_ctlModel, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -145,6 +150,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Mod_ctlModel = { NULL, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_ENUMERATED, 0, @@ -157,7 +163,8 @@ DataObject iedModel_ComplexArray_LLN0_Beh = { (ModelNode*) &iedModel_ComplexArray_LLN0, (ModelNode*) &iedModel_ComplexArray_LLN0_Health, (ModelNode*) &iedModel_ComplexArray_LLN0_Beh_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_LLN0_Beh_stVal = { @@ -167,6 +174,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Beh_stVal = { (ModelNode*) &iedModel_ComplexArray_LLN0_Beh_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, @@ -180,6 +188,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Beh_q = { (ModelNode*) &iedModel_ComplexArray_LLN0_Beh_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -193,6 +202,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Beh_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -205,7 +215,8 @@ DataObject iedModel_ComplexArray_LLN0_Health = { (ModelNode*) &iedModel_ComplexArray_LLN0, (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt, (ModelNode*) &iedModel_ComplexArray_LLN0_Health_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_LLN0_Health_stVal = { @@ -215,6 +226,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Health_stVal = { (ModelNode*) &iedModel_ComplexArray_LLN0_Health_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, @@ -228,6 +240,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Health_q = { (ModelNode*) &iedModel_ComplexArray_LLN0_Health_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -241,6 +254,7 @@ DataAttribute iedModel_ComplexArray_LLN0_Health_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -253,7 +267,8 @@ DataObject iedModel_ComplexArray_LLN0_NamPlt = { (ModelNode*) &iedModel_ComplexArray_LLN0, NULL, (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_vendor, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_LLN0_NamPlt_vendor = { @@ -263,6 +278,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_vendor = { (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_swRev, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_VISIBLE_STRING_255, 0, @@ -276,6 +292,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_swRev = { (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_d, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_VISIBLE_STRING_255, 0, @@ -289,6 +306,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_d = { (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_configRev, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_VISIBLE_STRING_255, 0, @@ -302,6 +320,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_configRev = { (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_ldNs, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_VISIBLE_STRING_255, 0, @@ -315,6 +334,7 @@ DataAttribute iedModel_ComplexArray_LLN0_NamPlt_ldNs = { NULL, NULL, 0, + -1, IEC61850_FC_EX, IEC61850_VISIBLE_STRING_255, 0, @@ -335,7 +355,8 @@ DataObject iedModel_ComplexArray_LPHD1_PhyNam = { (ModelNode*) &iedModel_ComplexArray_LPHD1, (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth, (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyNam_vendor, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_LPHD1_PhyNam_vendor = { @@ -345,6 +366,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_PhyNam_vendor = { NULL, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_VISIBLE_STRING_255, 0, @@ -357,7 +379,8 @@ DataObject iedModel_ComplexArray_LPHD1_PhyHealth = { (ModelNode*) &iedModel_ComplexArray_LPHD1, (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy, (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_stVal = { @@ -367,6 +390,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_stVal = { (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, @@ -380,6 +404,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_q = { (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -393,6 +418,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -405,7 +431,8 @@ DataObject iedModel_ComplexArray_LPHD1_Proxy = { (ModelNode*) &iedModel_ComplexArray_LPHD1, NULL, (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_LPHD1_Proxy_stVal = { @@ -415,6 +442,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_Proxy_stVal = { (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -428,6 +456,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_Proxy_q = { (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -441,6 +470,7 @@ DataAttribute iedModel_ComplexArray_LPHD1_Proxy_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -461,7 +491,8 @@ DataObject iedModel_ComplexArray_GGIO1_Mod = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_Beh, (ModelNode*) &iedModel_ComplexArray_GGIO1_Mod_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_Mod_stVal = { @@ -471,6 +502,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Mod_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Mod_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, @@ -484,6 +516,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Mod_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Mod_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -497,6 +530,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Mod_t = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Mod_ctlModel, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -510,6 +544,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Mod_ctlModel = { NULL, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_ENUMERATED, 0, @@ -522,7 +557,8 @@ DataObject iedModel_ComplexArray_GGIO1_Beh = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_Health, (ModelNode*) &iedModel_ComplexArray_GGIO1_Beh_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_Beh_stVal = { @@ -532,6 +568,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Beh_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Beh_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, @@ -545,6 +582,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Beh_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Beh_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -558,6 +596,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Beh_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -570,7 +609,8 @@ DataObject iedModel_ComplexArray_GGIO1_Health = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_NamPlt, (ModelNode*) &iedModel_ComplexArray_GGIO1_Health_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_Health_stVal = { @@ -580,6 +620,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Health_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Health_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_ENUMERATED, 0 + TRG_OPT_DATA_CHANGED, @@ -593,6 +634,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Health_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Health_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -606,6 +648,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Health_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -618,7 +661,8 @@ DataObject iedModel_ComplexArray_GGIO1_NamPlt = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn1, (ModelNode*) &iedModel_ComplexArray_GGIO1_NamPlt_vendor, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_vendor = { @@ -628,6 +672,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_vendor = { (ModelNode*) &iedModel_ComplexArray_GGIO1_NamPlt_swRev, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_VISIBLE_STRING_255, 0, @@ -641,6 +686,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_swRev = { (ModelNode*) &iedModel_ComplexArray_GGIO1_NamPlt_d, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_VISIBLE_STRING_255, 0, @@ -654,6 +700,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_d = { (ModelNode*) &iedModel_ComplexArray_GGIO1_NamPlt_dU, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_VISIBLE_STRING_255, 0, @@ -667,6 +714,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_dU = { NULL, NULL, 0, + -1, IEC61850_FC_DC, IEC61850_UNICODE_STRING_255, 0, @@ -679,7 +727,8 @@ DataObject iedModel_ComplexArray_GGIO1_AnIn1 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn2, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn1_mag, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_mag = { @@ -689,6 +738,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_mag = { (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn1_q, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn1_mag_f, 0, + -1, IEC61850_FC_MX, IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, @@ -702,6 +752,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_mag_f = { NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, @@ -715,6 +766,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn1_t, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -728,6 +780,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_t = { NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_TIMESTAMP, 0, @@ -740,7 +793,8 @@ DataObject iedModel_ComplexArray_GGIO1_AnIn2 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn3, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn2_mag, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_mag = { @@ -750,6 +804,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_mag = { (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn2_q, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn2_mag_f, 0, + -1, IEC61850_FC_MX, IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, @@ -763,6 +818,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_mag_f = { NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, @@ -776,6 +832,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn2_t, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -789,6 +846,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_t = { NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_TIMESTAMP, 0, @@ -801,7 +859,8 @@ DataObject iedModel_ComplexArray_GGIO1_AnIn3 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn4, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn3_mag, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_mag = { @@ -811,6 +870,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_mag = { (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn3_q, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn3_mag_f, 0, + -1, IEC61850_FC_MX, IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, @@ -824,6 +884,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_mag_f = { NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, @@ -837,6 +898,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn3_t, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -850,6 +912,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_t = { NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_TIMESTAMP, 0, @@ -862,7 +925,8 @@ DataObject iedModel_ComplexArray_GGIO1_AnIn4 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn4_mag, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_mag = { @@ -872,6 +936,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_mag = { (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn4_q, (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn4_mag_f, 0, + -1, IEC61850_FC_MX, IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED, @@ -885,6 +950,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_mag_f = { NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, @@ -898,6 +964,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_AnIn4_t, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -911,6 +978,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_t = { NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_TIMESTAMP, 0, @@ -923,7 +991,8 @@ DataObject iedModel_ComplexArray_GGIO1_SPCSO1 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_origin, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_origin = { @@ -933,6 +1002,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_origin = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_ctlNum, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_origin_orCat, 0, + -1, IEC61850_FC_ST, IEC61850_CONSTRUCTED, 0, @@ -946,6 +1016,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_origin_orCat = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_origin_orIdent, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_ENUMERATED, 0, @@ -959,6 +1030,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_origin_orIdent = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_OCTET_STRING_64, 0, @@ -972,6 +1044,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_ctlNum = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_stVal, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_INT8U, 0, @@ -985,6 +1058,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -998,6 +1072,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -1011,6 +1086,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_t = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_ctlModel, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -1024,6 +1100,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_ctlModel = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_ENUMERATED, 0, @@ -1037,6 +1114,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper = { NULL, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper_ctlVal, 0, + -1, IEC61850_FC_CO, IEC61850_CONSTRUCTED, 0, @@ -1050,6 +1128,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_ctlVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_BOOLEAN, 0, @@ -1063,6 +1142,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper_ctlNum, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin_orCat, 0, + -1, IEC61850_FC_CO, IEC61850_CONSTRUCTED, 0, @@ -1076,6 +1156,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin_orCat = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin_orIdent, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_ENUMERATED, 0, @@ -1089,6 +1170,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin_orIdent = { NULL, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_OCTET_STRING_64, 0, @@ -1102,6 +1184,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_ctlNum = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper_T, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_INT8U, 0, @@ -1115,6 +1198,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_T = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper_Test, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_TIMESTAMP, 0, @@ -1128,6 +1212,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_Test = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO1_Oper_Check, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_BOOLEAN, 0, @@ -1141,6 +1226,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_Check = { NULL, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_CHECK, 0, @@ -1153,7 +1239,8 @@ DataObject iedModel_ComplexArray_GGIO1_SPCSO2 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_stVal = { @@ -1163,6 +1250,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -1176,6 +1264,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -1189,6 +1278,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_ctlModel, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper_ctlVal, 0, + -1, IEC61850_FC_CO, IEC61850_CONSTRUCTED, 0, @@ -1202,6 +1292,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_ctlVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_BOOLEAN, 0, @@ -1215,6 +1306,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper_ctlNum, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin_orCat, 0, + -1, IEC61850_FC_CO, IEC61850_CONSTRUCTED, 0, @@ -1228,6 +1320,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin_orCat = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin_orIdent, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_ENUMERATED, 0, @@ -1241,6 +1334,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin_orIdent = { NULL, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_OCTET_STRING_64, 0, @@ -1254,6 +1348,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_ctlNum = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper_T, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_INT8U, 0, @@ -1267,6 +1362,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_T = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper_Test, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_TIMESTAMP, 0, @@ -1280,6 +1376,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_Test = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_Oper_Check, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_BOOLEAN, 0, @@ -1293,6 +1390,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_Check = { NULL, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_CHECK, 0, @@ -1306,6 +1404,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_ctlModel = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO2_t, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_ENUMERATED, 0, @@ -1319,6 +1418,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -1331,7 +1431,8 @@ DataObject iedModel_ComplexArray_GGIO1_SPCSO3 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_stVal = { @@ -1341,6 +1442,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -1354,6 +1456,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -1367,6 +1470,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_ctlModel, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper_ctlVal, 0, + -1, IEC61850_FC_CO, IEC61850_CONSTRUCTED, 0, @@ -1380,6 +1484,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_ctlVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_BOOLEAN, 0, @@ -1393,6 +1498,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper_ctlNum, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin_orCat, 0, + -1, IEC61850_FC_CO, IEC61850_CONSTRUCTED, 0, @@ -1406,6 +1512,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin_orCat = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin_orIdent, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_ENUMERATED, 0, @@ -1419,6 +1526,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin_orIdent = { NULL, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_OCTET_STRING_64, 0, @@ -1432,6 +1540,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_ctlNum = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper_T, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_INT8U, 0, @@ -1445,6 +1554,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_T = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper_Test, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_TIMESTAMP, 0, @@ -1458,6 +1568,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_Test = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_Oper_Check, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_BOOLEAN, 0, @@ -1471,6 +1582,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_Check = { NULL, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_CHECK, 0, @@ -1484,6 +1596,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_ctlModel = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO3_t, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_ENUMERATED, 0, @@ -1497,6 +1610,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -1509,7 +1623,8 @@ DataObject iedModel_ComplexArray_GGIO1_SPCSO4 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind1, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_stVal = { @@ -1519,6 +1634,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -1532,6 +1648,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -1545,6 +1662,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_ctlModel, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper_ctlVal, 0, + -1, IEC61850_FC_CO, IEC61850_CONSTRUCTED, 0, @@ -1558,6 +1676,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_ctlVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_BOOLEAN, 0, @@ -1571,6 +1690,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper_ctlNum, (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin_orCat, 0, + -1, IEC61850_FC_CO, IEC61850_CONSTRUCTED, 0, @@ -1584,6 +1704,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin_orCat = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin_orIdent, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_ENUMERATED, 0, @@ -1597,6 +1718,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin_orIdent = { NULL, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_OCTET_STRING_64, 0, @@ -1610,6 +1732,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_ctlNum = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper_T, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_INT8U, 0, @@ -1623,6 +1746,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_T = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper_Test, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_TIMESTAMP, 0, @@ -1636,6 +1760,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_Test = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_Oper_Check, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_BOOLEAN, 0, @@ -1649,6 +1774,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_Check = { NULL, NULL, 0, + -1, IEC61850_FC_CO, IEC61850_CHECK, 0, @@ -1662,6 +1788,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_ctlModel = { (ModelNode*) &iedModel_ComplexArray_GGIO1_SPCSO4_t, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_ENUMERATED, 0, @@ -1675,6 +1802,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -1687,7 +1815,8 @@ DataObject iedModel_ComplexArray_GGIO1_Ind1 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind2, (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind1_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_Ind1_stVal = { @@ -1697,6 +1826,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind1_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind1_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -1710,6 +1840,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind1_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind1_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -1723,6 +1854,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind1_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -1735,7 +1867,8 @@ DataObject iedModel_ComplexArray_GGIO1_Ind2 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind3, (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind2_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_Ind2_stVal = { @@ -1745,6 +1878,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind2_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind2_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -1758,6 +1892,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind2_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind2_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -1771,6 +1906,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind2_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -1783,7 +1919,8 @@ DataObject iedModel_ComplexArray_GGIO1_Ind3 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind4, (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind3_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_Ind3_stVal = { @@ -1793,6 +1930,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind3_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind3_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -1806,6 +1944,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind3_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind3_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -1819,6 +1958,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind3_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -1831,7 +1971,8 @@ DataObject iedModel_ComplexArray_GGIO1_Ind4 = { (ModelNode*) &iedModel_ComplexArray_GGIO1, NULL, (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind4_stVal, - 0 + 0, + -1 }; DataAttribute iedModel_ComplexArray_GGIO1_Ind4_stVal = { @@ -1841,6 +1982,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind4_stVal = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind4_q, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_BOOLEAN, 0 + TRG_OPT_DATA_CHANGED, @@ -1854,6 +1996,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind4_q = { (ModelNode*) &iedModel_ComplexArray_GGIO1_Ind4_t, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, @@ -1867,6 +2010,7 @@ DataAttribute iedModel_ComplexArray_GGIO1_Ind4_t = { NULL, NULL, 0, + -1, IEC61850_FC_ST, IEC61850_TIMESTAMP, 0, @@ -1887,7 +2031,8 @@ DataObject iedModel_ComplexArray_MHAI1_HA = { (ModelNode*) &iedModel_ComplexArray_MHAI1, NULL, (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, - 0 + 0, + -1 }; DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar = { @@ -1895,95 +2040,1733 @@ DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar = { "phsAHar", (ModelNode*) &iedModel_ComplexArray_MHAI1_HA, (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_numHar, - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal, - 16 + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0, + 16, + 0-1 +}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_0 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal, + 0, + 0 }; -DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal = { +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal = { DataAttributeModelType, "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_0, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_1 = { + DataObjectModelType, + "phsAHar", (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_q, - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal, + 0, + 1 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag, 0, + -1, IEC61850_FC_MX, IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; -DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag = { +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag = { DataAttributeModelType, "mag", - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal, - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang, - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag_f, 0, + -1, IEC61850_FC_MX, IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; -DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f = { +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag_f = { DataAttributeModelType, "f", - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag, NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; -DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang = { +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang = { DataAttributeModelType, "ang", - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal, NULL, - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang_f, 0, + -1, IEC61850_FC_MX, IEC61850_CONSTRUCTED, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; -DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f = { +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang_f = { DataAttributeModelType, "f", - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang, NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, NULL, 0}; -DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_q = { +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_q = { DataAttributeModelType, "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_1, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_2 = { + DataObjectModelType, + "phsAHar", (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, - (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_t, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal, + 0, + 2 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2_t, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_QUALITY, 0 + TRG_OPT_QUALITY_CHANGED, NULL, 0}; -DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_t = { +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_t = { DataAttributeModelType, "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_2, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_3 = { + DataObjectModelType, + "phsAHar", (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal, + 0, + 3 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_3, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_4 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal, + 0, + 4 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_4, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_5 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal, + 0, + 5 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_5, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_6 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal, + 0, + 6 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_6, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_7 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal, + 0, + 7 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_7, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_8 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal, + 0, + 8 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_8, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_9 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal, + 0, + 9 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_9, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_10 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal, + 0, + 10 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_10, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_11 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal, + 0, + 11 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_11, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_12 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal, + 0, + 12 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_12, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_13 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal, + 0, + 13 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_13, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_14 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal, + 0, + 14 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_14, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_15 = { + DataObjectModelType, + "phsAHar", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal, + 0, + 15 +}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_q, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang = { + DataAttributeModelType, + "ang", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal, + NULL, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang_f, + 0, + -1, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang, + NULL, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15, + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15_t, + NULL, + 0, + -1, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_15, NULL, NULL, 0, + -1, IEC61850_FC_MX, IEC61850_TIMESTAMP, 0, @@ -1997,6 +3780,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_numHar = { (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_numCyc, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_INT16U, 0 + TRG_OPT_DATA_CHANGED, @@ -2010,6 +3794,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc = { (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_evalTm, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_INT16U, 0 + TRG_OPT_DATA_CHANGED, @@ -2023,6 +3808,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm = { (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_frequency, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_INT16U, 0 + TRG_OPT_DATA_CHANGED, @@ -2036,6 +3822,7 @@ DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency = { NULL, NULL, 0, + -1, IEC61850_FC_CF, IEC61850_FLOAT32, 0 + TRG_OPT_DATA_CHANGED, diff --git a/examples/server_example_complex_array/static_model.h b/examples/server_example_complex_array/static_model.h index d6bb6179..77bb51c2 100644 --- a/examples/server_example_complex_array/static_model.h +++ b/examples/server_example_complex_array/static_model.h @@ -161,13 +161,134 @@ extern DataAttribute iedModel_ComplexArray_GGIO1_Ind4_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 DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_0; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_1; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_2; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_3; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_4; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_5; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_6; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_7; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_8; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_9; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_10; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_11; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_12; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_13; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_14; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_t; +extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_15; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang_f; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_q; +extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_t; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numHar; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm; @@ -325,13 +446,118 @@ extern DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency; #define IEDMODEL_ComplexArray_MHAI1 (&iedModel_ComplexArray_MHAI1) #define IEDMODEL_ComplexArray_MHAI1_HA (&iedModel_ComplexArray_MHAI1_HA) #define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar (&iedModel_ComplexArray_MHAI1_HA_phsAHar) -#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal) -#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag) -#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f) -#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang) -#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f) -#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_q) -#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_t) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang_f) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_q) +#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_t) #define IEDMODEL_ComplexArray_MHAI1_HA_numHar (&iedModel_ComplexArray_MHAI1_HA_numHar) #define IEDMODEL_ComplexArray_MHAI1_HA_numCyc (&iedModel_ComplexArray_MHAI1_HA_numCyc) #define IEDMODEL_ComplexArray_MHAI1_HA_evalTm (&iedModel_ComplexArray_MHAI1_HA_evalTm) diff --git a/src/iec61850/inc/iec61850_dynamic_model.h b/src/iec61850/inc/iec61850_dynamic_model.h index 20de3cbe..f0402dbd 100644 --- a/src/iec61850/inc/iec61850_dynamic_model.h +++ b/src/iec61850/inc/iec61850_dynamic_model.h @@ -116,9 +116,12 @@ LIB61850_API LogicalNode* LogicalNode_create(const char* name, LogicalDevice* parent); /** - * \brief create a new data object and add it to a parent model node + * \brief create a new data object or array data object and add it to a parent model node * * The parent model node has to be of type DataObject or LogicalNode. + * + * NOTE: When the data object is an array the array elements will also be created by this function. + * This will result in child DataObject instances for each array element. * * \param name the name of the data object (e.h. "Mod", "Health" ...) * \param parent the parent model node diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index 77cb5c5d..d686872f 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -214,7 +214,7 @@ struct sDataObject { ModelNode* firstChild; int elementCount; /* value > 0 if this is an array */ - //int arrayIndex; /* value > -1 when this is an array element */ + int arrayIndex; /* value > -1 when this is an array element */ }; struct sDataAttribute { @@ -225,7 +225,7 @@ struct sDataAttribute { ModelNode* firstChild; int elementCount; /* value > 0 if this is an array */ - // int arrayIndex; /* value > -1 when this is an array element */ + int arrayIndex; /* value > -1 when this is an array element */ FunctionalConstraint fc; DataAttributeType type; @@ -234,7 +234,7 @@ struct sDataAttribute { MmsValue* mmsValue; - uint32_t sAddr; + uint32_t sAddr; /* TODO remove in version 2.0 */ }; typedef struct sDataSetEntry { @@ -367,11 +367,22 @@ ModelNode_getChildCount(ModelNode* self); * \param self the model node instance * \param name the name of the child model node * - * \return the model node instance or NULL if model node does not exist. + * \return the model node instance or NULL if model node does not exist. */ LIB61850_API ModelNode* ModelNode_getChild(ModelNode* self, const char* name); +/** + * \brief return the child node of an array or other structure + * + * \param self the model node instance + * \param idx the index (e.g. array index) starting with 0 + * + * \return the model node instance or NULL if model node with given index does not exist. + */ +LIB61850_API ModelNode* +ModelNode_getChildWithIdx(ModelNode* self, int idx); + /** * \brief return a child model node with a given functional constraint * diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index 60df8ce3..bc9a14ae 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -237,9 +237,17 @@ exit_function: static void installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttribute* dataAttribute, - char* objectReference, int position) + char* objectReference, int position, int idx, char* componentId, int compIdPos) { - sprintf(objectReference + position, ".%s", dataAttribute->name); + if (idx == -1) { + sprintf(objectReference + position, ".%s", dataAttribute->name); + } + else { + if (compIdPos == 0) + sprintf(componentId, "%s", dataAttribute->name); + else + sprintf(componentId + compIdPos, "$%s", dataAttribute->name); + } char mmsVariableName[65]; /* maximum size is 64 according to 61850-8-1 */ @@ -268,7 +276,12 @@ installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttr return; } - MmsValue* cacheValue = MmsServer_getValueFromCache(self->mmsServer, domain, mmsVariableName); + MmsValue* cacheValue = NULL; + + if (idx == -1) + cacheValue = MmsServer_getValueFromCache(self->mmsServer, domain, mmsVariableName); + else + cacheValue = MmsServer_getValueFromCacheEx2(self->mmsServer, domain, mmsVariableName, idx, componentId); dataAttribute->mmsValue = cacheValue; @@ -280,7 +293,6 @@ installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttr #if (DEBUG_IED_SERVER == 1) if (cacheValue == NULL) { printf("IED_SERVER: exception: invalid initializer for %s\n", mmsVariableName); - exit(-1); } #endif @@ -288,10 +300,12 @@ installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttr } int childPosition = strlen(objectReference); + int childCompIdPos = strlen(componentId); + DataAttribute* subDataAttribute = (DataAttribute*) dataAttribute->firstChild; while (subDataAttribute != NULL) { - installDefaultValuesForDataAttribute(self, ld, subDataAttribute, objectReference, childPosition); + installDefaultValuesForDataAttribute(self, ld, subDataAttribute, objectReference, childPosition, idx, componentId, childCompIdPos); subDataAttribute = (DataAttribute*) subDataAttribute->sibling; } @@ -299,27 +313,54 @@ installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttr static void installDefaultValuesForDataObject(IedServer self, LogicalDevice* ld, DataObject* dataObject, - char* objectReference, int position) + char* objectReference, int position, int idx, char* componentId, int compIdPos) { if (dataObject->elementCount > 0) { if (DEBUG_IED_SERVER) - printf("IED_SERVER: DataObject is an array. Skip installing default values in cache\n"); + printf("IED_SERVER: DataObject %s is an array\n", dataObject->name); + + ModelNode* arrayElemNode = dataObject->firstChild; + + sprintf(objectReference + position, ".%s", dataObject->name); + int childPosition = strlen(objectReference); + + int arrayIdx = 0; + + while (arrayElemNode) { + installDefaultValuesForDataObject(self, ld, (DataObject*)arrayElemNode, objectReference, childPosition, arrayIdx, componentId, compIdPos); + + arrayIdx++; + arrayElemNode = arrayElemNode->sibling; + } return; } - sprintf(objectReference + position, ".%s", dataObject->name); + if (dataObject->arrayIndex == -1) { + if (idx == -1) + sprintf(objectReference + position, ".%s", dataObject->name); + else { + if (compIdPos == 0) + sprintf(componentId, "%s", dataObject->name); + else + sprintf(componentId + compIdPos, "$%s", dataObject->name); + } + } + + if (compIdPos == 0) + componentId[0] = 0; ModelNode* childNode = dataObject->firstChild; int childPosition = strlen(objectReference); + int childCompIdPos = strlen(componentId); - while (childNode != NULL) { + while (childNode) { if (childNode->modelType == DataObjectModelType) { - installDefaultValuesForDataObject(self, ld, (DataObject*) childNode, objectReference, childPosition); + installDefaultValuesForDataObject(self, ld, (DataObject*) childNode, objectReference, childPosition, idx, componentId, childCompIdPos); } else if (childNode->modelType == DataAttributeModelType) { - installDefaultValuesForDataAttribute(self, ld, (DataAttribute*) childNode, objectReference, childPosition); + installDefaultValuesForDataAttribute(self, ld, (DataAttribute*) childNode, objectReference, childPosition, idx, componentId, childCompIdPos); } childNode = childNode->sibling; @@ -332,6 +373,8 @@ installDefaultValuesInCache(IedServer self) IedModel* model = self->model; char objectReference[130]; + char componentId[130]; + componentId[0] = 0; LogicalDevice* logicalDevice = model->firstChild; @@ -354,7 +397,7 @@ installDefaultValuesInCache(IedServer self) int refPosition = strlen(objectReference); while (dataObject != NULL) { - installDefaultValuesForDataObject(self, logicalDevice, dataObject, objectReference, refPosition); + installDefaultValuesForDataObject(self, logicalDevice, dataObject, objectReference, refPosition, -1, componentId, 0); dataObject = (DataObject*) dataObject->sibling; } diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 17dbf725..ad406c66 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -1107,7 +1107,7 @@ ControlObject_initialize(ControlObject* self) else { if (DEBUG_IED_SERVER) - printf("IED_SERVER: ERROR - stValType or ctlValType could not be determined!\n"); + printf("IED_SERVER: ERROR - stValType (%i) or ctlValType (%i) could not be determined!\n", stValType, ctlValType); self->cdc = CST_NONE; } #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index feb73c00..b2c46f42 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -330,6 +330,9 @@ createFCNamedVariableFromDataObject(DataObject* dataObject, namedVariable->typeSpec.array.elementTypeSpec = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); namedVariable = namedVariable->typeSpec.array.elementTypeSpec; + + /* for arrays use the first child as type template */ + dataObject = (DataObject*)dataObject->firstChild; } namedVariable->type = MMS_STRUCTURE; diff --git a/src/iec61850/server/model/dynamic_model.c b/src/iec61850/server/model/dynamic_model.c index 0843d713..82667c18 100644 --- a/src/iec61850/server/model/dynamic_model.c +++ b/src/iec61850/server/model/dynamic_model.c @@ -554,11 +554,32 @@ DataObject_create(const char* name, ModelNode* parent, int arrayElements) self->name = StringUtils_copyString(name); self->modelType = DataObjectModelType; - self->elementCount = arrayElements; self->firstChild = NULL; self->parent = parent; self->sibling = NULL; + self->elementCount = arrayElements; + self->arrayIndex = -1; + + if (arrayElements > 0) { + int i; + + for (i = 0; i < arrayElements; i++) { + DataObject* arrayElement = (DataObject*) GLOBAL_MALLOC(sizeof(DataObject)); + + self->name = NULL; + self->modelType = DataObjectModelType; + self->firstChild = NULL; + self->parent = parent; + self->sibling = NULL; + + self->elementCount = 0; + self->arrayIndex = i; + + DataObject_addChild(self, (ModelNode*) arrayElement); + } + } + if (parent->modelType == LogicalNodeModelType) LogicalNode_addDataObject((LogicalNode*) parent, self); else if (parent->modelType == DataObjectModelType) diff --git a/src/iec61850/server/model/model.c b/src/iec61850/server/model/model.c index 6d8a3e58..73acb013 100644 --- a/src/iec61850/server/model/model.c +++ b/src/iec61850/server/model/model.c @@ -635,9 +635,76 @@ ModelNode_getChildCount(ModelNode* modelNode) { ModelNode* ModelNode_getChild(ModelNode* self, const char* name) { - /* check for separator */ + /* check for element separator */ const char* separator = strchr(name, '.'); + /* allow first character to be "." */ + if (separator == name) + name++; + + /* check for array separator */ + const char* arraySeparator = strchr(name, '('); + + if (arraySeparator) { + + const char* arraySeparator2 = strchr(arraySeparator, ')'); + + if (arraySeparator2) { + int idx = (int) strtol(arraySeparator + 1, NULL, 10); + + ModelNode* arrayNode = NULL; + + if (name == arraySeparator) { + arrayNode = ModelNode_getChildWithIdx(self, idx); + } + else { + char nameCopy[65]; + + const char* pos = name; + + int cpyIdx = 0; + + while (pos < arraySeparator) { + nameCopy[cpyIdx] = *pos; + cpyIdx++; + pos++; + } + + nameCopy[cpyIdx] = 0; + + ModelNode* childNode = ModelNode_getChild(self, nameCopy); + + if (childNode) { + arrayNode = ModelNode_getChildWithIdx(childNode, idx); + } + else + return NULL; + } + + if (arrayNode) { + + if (*(arraySeparator2 + 1) == 0) { + return arrayNode; + } + else { + if (*(arraySeparator2 + 1) == '.') + return ModelNode_getChild(arrayNode, arraySeparator2 + 2); + else + return ModelNode_getChild(arrayNode, arraySeparator2 + 1); + } + + } + else + return NULL; + + } + else { + /* invalid name */ + return NULL; + } + + } + int nameElementLength = 0; if (separator != NULL) @@ -649,7 +716,7 @@ ModelNode_getChild(ModelNode* self, const char* name) ModelNode* matchingNode = NULL; - while (nextNode != NULL) { + while (nextNode) { int nodeNameLen = strlen(nextNode->name); if (nodeNameLen == nameElementLength) { @@ -669,6 +736,31 @@ ModelNode_getChild(ModelNode* self, const char* name) return matchingNode; } +ModelNode* +ModelNode_getChildWithIdx(ModelNode* self, int idx) +{ + ModelNode* foundElement = NULL; + + if (self->modelType == DataObjectModelType || self->modelType == DataAttributeModelType) { + ModelNode* nextNode = self->firstChild; + + int currentIdx = 0; + + while (nextNode) { + if (currentIdx == idx) { + foundElement = nextNode; + break; + } + + currentIdx++; + + nextNode = nextNode->sibling; + } + } + + return foundElement; +} + ModelNode* ModelNode_getChildWithFc(ModelNode* self, const char* name, FunctionalConstraint fc) { diff --git a/src/mms/inc_private/mms_server_libinternal.h b/src/mms/inc_private/mms_server_libinternal.h index ef8f95f4..17a5f418 100644 --- a/src/mms/inc_private/mms_server_libinternal.h +++ b/src/mms/inc_private/mms_server_libinternal.h @@ -82,6 +82,9 @@ MmsServer_getValueFromCache(MmsServer self, MmsDomain* domain, const char* itemI LIB61850_INTERNAL MmsValue* MmsServer_getValueFromCacheEx(MmsServer self, MmsDomain* domain, const char* itemId, MmsVariableSpecification** typeSpec); +LIB61850_INTERNAL MmsValue* +MmsServer_getValueFromCacheEx2(MmsServer self, MmsDomain* domain, const char* itemId, int idx, const char* componentId); + LIB61850_INTERNAL bool MmsServer_isLocked(MmsServer self); diff --git a/src/mms/inc_private/mms_value_cache.h b/src/mms/inc_private/mms_value_cache.h index bdacbb27..ef7fd808 100644 --- a/src/mms/inc_private/mms_value_cache.h +++ b/src/mms/inc_private/mms_value_cache.h @@ -1,7 +1,7 @@ /* * mms_value_cache.h * - * Copyright 2013-2018 Michael Zillgith + * Copyright 2013-2021 Michael Zillgith * * This file is part of libIEC61850. * @@ -38,6 +38,9 @@ MmsValueCache_insertValue(MmsValueCache self, char* itemId, MmsValue* value); LIB61850_INTERNAL MmsValue* MmsValueCache_lookupValue(MmsValueCache self, const char* itemId, MmsVariableSpecification** outSpec); +LIB61850_INTERNAL MmsValue* +MmsValueCache_lookupValueEx(MmsValueCache self, const char* itemId, int idx, const char* componentId, MmsVariableSpecification** outSpec); + LIB61850_INTERNAL void MmsValueCache_destroy(MmsValueCache self); diff --git a/src/mms/iso_mms/common/mms_type_spec.c b/src/mms/iso_mms/common/mms_type_spec.c index 5dd93c3f..167f477e 100644 --- a/src/mms/iso_mms/common/mms_type_spec.c +++ b/src/mms/iso_mms/common/mms_type_spec.c @@ -185,6 +185,10 @@ MmsVariableSpecification_getStructureElements(MmsVariableSpecification* self) MmsVariableSpecification* MmsVariableSpecification_getNamedVariableRecursive(MmsVariableSpecification* variable, const char* nameId) { + if (variable->type == MMS_ARRAY) { + return MmsVariableSpecification_getNamedVariableRecursive(variable->typeSpec.array.elementTypeSpec, nameId); + } + const char* separator = strchr(nameId, '$'); int i; diff --git a/src/mms/iso_mms/server/mms_server.c b/src/mms/iso_mms/server/mms_server.c index c387cb8b..21fb4e76 100644 --- a/src/mms/iso_mms/server/mms_server.c +++ b/src/mms/iso_mms/server/mms_server.c @@ -465,6 +465,17 @@ MmsServer_getValueFromCacheEx(MmsServer self, MmsDomain* domain, const char* ite return NULL ; } +MmsValue* +MmsServer_getValueFromCacheEx2(MmsServer self, MmsDomain* domain, const char* itemId, int idx, const char* componentId) +{ + MmsValueCache cache = (MmsValueCache) Map_getEntry(self->valueCaches, domain); + + if (cache != NULL) + return MmsValueCache_lookupValueEx(cache, itemId, idx, componentId, NULL); + + return NULL ; +} + void MmsServer_insertIntoCache(MmsServer self, MmsDomain* domain, char* itemId, MmsValue* value) { diff --git a/src/mms/iso_mms/server/mms_value_cache.c b/src/mms/iso_mms/server/mms_value_cache.c index fcabff0f..f4ade311 100644 --- a/src/mms/iso_mms/server/mms_value_cache.c +++ b/src/mms/iso_mms/server/mms_value_cache.c @@ -1,7 +1,7 @@ /* * mms_value_cache.c * - * Copyright 2013 Michael Zillgith + * Copyright 2013-2021 Michael Zillgith * * This file is part of libIEC61850. * @@ -62,7 +62,8 @@ MmsValueCache_insertValue(MmsValueCache self, char* itemId, MmsValue* value) Map_addEntry(self->map, StringUtils_copyString(itemId), cacheEntry); } else - if (DEBUG) printf("Cannot insert value into cache %s : no typeSpec found!\n", itemId); + if (DEBUG) + printf("Cannot insert value into cache %s : no typeSpec found!\n", itemId); } static char* @@ -126,34 +127,131 @@ MmsValueCache_lookupValue(MmsValueCache self, const char* itemId, MmsVariableSpe * get value for first matching key substring! * Then iterate the value for the exact value. */ - MmsValue* value = NULL; - MmsValueCacheEntry* cacheEntry; + MmsValueCacheEntry* cacheEntry = (MmsValueCacheEntry*) Map_getEntry(self->map, (void*) itemId); - cacheEntry = (MmsValueCacheEntry*) Map_getEntry(self->map, (void*) itemId); + if (cacheEntry) { + + if (outSpec) { + *outSpec = cacheEntry->typeSpec; + } + + return cacheEntry->value; + } + else { + char itemIdCopy[65]; + StringUtils_copyStringToBuffer(itemId, itemIdCopy); - if (cacheEntry == NULL) { - char* itemIdCopy = StringUtils_copyString(itemId); char* parentItemId = getParentSubString(itemIdCopy); if (parentItemId != NULL) { value = searchCacheForValue(self, itemId, parentItemId, outSpec); } - - GLOBAL_FREEMEM(itemIdCopy); } - if (cacheEntry != NULL) { + return value; +} - if (outSpec) { - *outSpec = cacheEntry->typeSpec; - } +static MmsValue* +searchCacheForValueEx(MmsValueCache self, const char* itemId, char* parentId, int idx, char* componentId, MmsVariableSpecification** outSpec) +{ + MmsValueCacheEntry* cacheEntry; + MmsValue* value = NULL; - return cacheEntry->value; - } - else - return value; + cacheEntry = (MmsValueCacheEntry*) Map_getEntry(self->map, (void*) parentId); + + if (cacheEntry == NULL) { + char* parentItemId = getParentSubString(parentId); + + if (parentItemId) { + value = searchCacheForValueEx(self, itemId, parentItemId, idx, componentId, outSpec); + } + } + else { + + const char* childId = getChildSubString(itemId, parentId); + + if (childId) { + + MmsVariableSpecification* typeSpec = MmsDomain_getNamedVariable(self->domain, parentId); + + value = MmsVariableSpecification_getChildValue(typeSpec, cacheEntry->value, childId); + + if (value) { + if (idx != -1) { + if (MmsValue_getType(value) == MMS_ARRAY) { + MmsValue* elementValue = MmsValue_getElement(value, idx); + + + if (elementValue) { + if (componentId) { + MmsVariableSpecification* childSpec = MmsVariableSpecification_getNamedVariableRecursive(typeSpec, childId); + + if (childSpec) { + MmsVariableSpecification* elementSpec = childSpec->typeSpec.array.elementTypeSpec; + + if (elementSpec) { + MmsValue* componentValue = MmsVariableSpecification_getChildValue(elementSpec, elementValue, componentId); + + if (componentValue) { + value = componentValue; + } + } + } + } + else { + value = elementValue; + } + } + } + } + } + + if (outSpec) { + *outSpec = MmsVariableSpecification_getNamedVariableRecursive(typeSpec, childId); + } + } + } + + return value; +} + +MmsValue* +MmsValueCache_lookupValueEx(MmsValueCache self, const char* itemId, int idx, const char* componentId, MmsVariableSpecification** outSpec) +{ + MmsValue* value = NULL; + + MmsValueCacheEntry* cacheEntry = (MmsValueCacheEntry*) Map_getEntry(self->map, (void*) itemId); + + if (cacheEntry) { + if (outSpec) { + *outSpec = cacheEntry->typeSpec; + } + + return cacheEntry->value; + } + else { + char itemIdCopy[65]; + char componentIdCopyBuf[65]; + + StringUtils_copyStringToBuffer(itemId, itemIdCopy); + + char* componentIdCopy = NULL; + + if (componentId) { + componentIdCopy = StringUtils_copyStringToBuffer(componentId, componentIdCopyBuf); + + } + + char* parentItemId = getParentSubString(itemIdCopy); + + if (parentItemId != NULL) { + value = searchCacheForValueEx(self, itemId, parentItemId, idx, componentIdCopy, outSpec); + } + } + + return value; } static void diff --git a/tools/model_generator/genmodel.jar b/tools/model_generator/genmodel.jar index af9060187104bcf4194f09fb034ada3164dfd36a..ff915a65413230699d91c0b4a86f4122be473f25 100644 GIT binary patch delta 30481 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 delta 29819 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

H!yYdYz~t*#s0z0 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 dataObjects, String dataAttributeSibling, boolean isTransient) { + private void printDataObjectDefinitions(String lnName, List dataObjects, String dataAttributeSibling, boolean isTransient, int arrayIdx) { for (int i = 0; i < dataObjects.size(); i++) { + boolean isArray = false; + DataObject dataObject = dataObjects.get(i); - + + if (dataObject.getCount() > 0) { + isArray = true; + } + String doName = lnName + "_" + dataObject.getName(); variablesList.add(doName); @@ -629,27 +637,6 @@ public class StaticModelGenerator { cOut.println(" (ModelNode*) &" + dataAttributeSibling + ","); else cOut.println(" NULL,"); - - String firstSubDataObjectName = null; - String firstDataAttributeName = null; - - if ((dataObject.getSubDataObjects() != null) && (dataObject.getSubDataObjects().size() > 0)) - firstSubDataObjectName = doName + "_" + dataObject.getSubDataObjects().get(0).getName(); - - if ((dataObject.getDataAttributes() != null) && (dataObject.getDataAttributes().size() > 0)) - firstDataAttributeName = doName + "_" + dataObject.getDataAttributes().get(0).getName(); - - if (firstSubDataObjectName != null) { - cOut.println(" (ModelNode*) &" + firstSubDataObjectName + ","); - } else if (firstDataAttributeName != null) { - cOut.println(" (ModelNode*) &" + firstDataAttributeName + ","); - } else { - cOut.println(" NULL,"); - } - - cOut.println(" " + dataObject.getCount()); - - cOut.println("};\n"); boolean isDoTransient = false; @@ -659,17 +646,99 @@ public class StaticModelGenerator { if (dataObject.isTransient()) isDoTransient = true; } + + if (isArray) { + String childName = doName + "_0"; + + cOut.println(" (ModelNode*) &" + childName + ","); + + cOut.println(" " + dataObject.getCount() + ","); + + cOut.println(" 0" + arrayIdx); + + cOut.println("};\n"); + + /* Print array elements */ + + for (int idx = 0; idx < dataObject.getCount(); idx++) { + + String arrayElementdoName = doName + "_" + idx; + + cOut.println("DataObject " + arrayElementdoName + " = {"); + cOut.println(" DataObjectModelType,"); + cOut.println(" \"" + dataObject.getName() + "\","); + cOut.println(" (ModelNode*) &" + doName + ","); + + /* sibling */ + if (idx != dataObject.getCount() - 1) + cOut.println(" (ModelNode*) &" + doName + "_" + (idx + 1) + ","); + else + cOut.println(" NULL,"); + + String firstSubDataObjectName = null; + String firstDataAttributeName = null; + + if ((dataObject.getSubDataObjects() != null) && (dataObject.getSubDataObjects().size() > 0)) + firstSubDataObjectName = arrayElementdoName + "_" + dataObject.getSubDataObjects().get(0).getName(); + + if ((dataObject.getDataAttributes() != null) && (dataObject.getDataAttributes().size() > 0)) + firstDataAttributeName = arrayElementdoName + "_" + dataObject.getDataAttributes().get(0).getName(); + + if (firstSubDataObjectName != null) { + cOut.println(" (ModelNode*) &" + firstSubDataObjectName + ","); + } else if (firstDataAttributeName != null) { + cOut.println(" (ModelNode*) &" + firstDataAttributeName + ","); + } else { + cOut.println(" NULL,"); + } + + cOut.println(" 0,"); + + cOut.println(" " + idx); + + cOut.println("};\n"); + + if (dataObject.getSubDataObjects() != null) + printDataObjectDefinitions(arrayElementdoName, dataObject.getSubDataObjects(), firstDataAttributeName, isDoTransient, -1); + + if (dataObject.getDataAttributes() != null) + printDataAttributeDefinitions(arrayElementdoName, dataObject.getDataAttributes(), isDoTransient, -1); + } + } + else { + String firstSubDataObjectName = null; + String firstDataAttributeName = null; + + if ((dataObject.getSubDataObjects() != null) && (dataObject.getSubDataObjects().size() > 0)) + firstSubDataObjectName = doName + "_" + dataObject.getSubDataObjects().get(0).getName(); - if (dataObject.getSubDataObjects() != null) - printDataObjectDefinitions(doName, dataObject.getSubDataObjects(), firstDataAttributeName, isDoTransient); + if ((dataObject.getDataAttributes() != null) && (dataObject.getDataAttributes().size() > 0)) + firstDataAttributeName = doName + "_" + dataObject.getDataAttributes().get(0).getName(); - if (dataObject.getDataAttributes() != null) - printDataAttributeDefinitions(doName, dataObject.getDataAttributes(), isDoTransient); + if (firstSubDataObjectName != null) { + cOut.println(" (ModelNode*) &" + firstSubDataObjectName + ","); + } else if (firstDataAttributeName != null) { + cOut.println(" (ModelNode*) &" + firstDataAttributeName + ","); + } else { + cOut.println(" NULL,"); + } + + cOut.println(" 0,"); + + cOut.println(" " + arrayIdx); + + cOut.println("};\n"); + + if (dataObject.getSubDataObjects() != null) + printDataObjectDefinitions(doName, dataObject.getSubDataObjects(), firstDataAttributeName, isDoTransient, -1); + if (dataObject.getDataAttributes() != null) + printDataAttributeDefinitions(doName, dataObject.getDataAttributes(), isDoTransient, -1); + } } } - private void printDataAttributeDefinitions(String doName, List dataAttributes, boolean isTransient) { + private void printDataAttributeDefinitions(String doName, List dataAttributes, boolean isTransient, int arrayIdx) { for (int i = 0; i < dataAttributes.size(); i++) { DataAttribute dataAttribute = dataAttributes.get(i); @@ -708,6 +777,7 @@ public class StaticModelGenerator { cOut.println(" NULL,"); cOut.println(" " + dataAttribute.getCount() + ","); + cOut.println(" -1,"); cOut.println(" IEC61850_FC_" + dataAttribute.getFc().toString() + ","); cOut.println(" IEC61850_" + dataAttribute.getType() + ","); @@ -749,7 +819,8 @@ public class StaticModelGenerator { cOut.println("};\n"); if (dataAttribute.getSubDataAttributes() != null) - printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes(), isTransient); + printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes(), isTransient, -1); + //TODO handle array case DataModelValue value = dataAttribute.getValue(); @@ -899,12 +970,28 @@ public class StaticModelGenerator { String doName = prefix + "_" + dataObject.getName(); hOut.println("extern DataObject " + doName + ";"); + + if (dataObject.getCount() > 0) { + for (int idx = 0; idx < dataObject.getCount(); idx++) { + String arrayElemDoName = doName + "_" + idx; + + hOut.println("extern DataObject " + arrayElemDoName + ";"); + + if (dataObject.getSubDataObjects() != null) { + printDataObjectForwardDeclarations(arrayElemDoName, dataObject.getSubDataObjects()); + } + + printDataAttributeForwardDeclarations(arrayElemDoName, dataObject.getDataAttributes()); + } + } + else { + if (dataObject.getSubDataObjects() != null) { + printDataObjectForwardDeclarations(doName, dataObject.getSubDataObjects()); + } - if (dataObject.getSubDataObjects() != null) { - printDataObjectForwardDeclarations(doName, dataObject.getSubDataObjects()); + printDataAttributeForwardDeclarations(doName, dataObject.getDataAttributes()); } - printDataAttributeForwardDeclarations(doName, dataObject.getDataAttributes()); } }