- reworked server side array handling (-> incompatible data model structure changes!)

v1.6_develop_rgoose_sntp
Michael Zillgith 4 years ago
parent 8755019986
commit 659dd49338

@ -103,11 +103,11 @@
<LN lnClass="MHAI" lnType="MHAI1" inst="1" prefix=""> <LN lnClass="MHAI" lnType="MHAI1" inst="1" prefix="">
<DataSet name="TestMHAI"> <DataSet name="TestMHAI">
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(7)"/> <FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(7)" ix="7"/>
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(8)"/> <FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(8)" ix="8"/>
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(9).cVal"/> <FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(9).cVal" ix="9"/>
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(10).cVal.mag"/> <FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(10).cVal.mag" ix="10"/>
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(11).cVal.mag.f"/> <FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(11).cVal.mag.f" ix="11"/>
</DataSet> </DataSet>
<ReportControl name="MHAIRCB" confRev="1" datSet="TestMHAI" rptID="TestMHAI" buffered="false" intgPd="1000" bufTime="50"> <ReportControl name="MHAIRCB" confRev="1" datSet="TestMHAI" rptID="TestMHAI" buffered="false" intgPd="1000" bufTime="50">

@ -26,26 +26,30 @@ sigint_handler(int signalId)
} }
static void 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); if (mag && ang && q && t) {
IedServer_updateQuality(server, q, quality);
MmsValue* cValElement_ang_f = MmsValue_getElement(MmsValue_getElement(cValElement, 1), 0); IedServer_updateTimestampAttributeValue(server, t, &timestamp);
IedServer_updateFloatAttributeValue(server, mag, magnitude);
MmsValue_setFloat(cValElement_mag_f, magnitude); IedServer_updateFloatAttributeValue(server, ang, angle);
MmsValue_setFloat(cValElement_ang_f, angle); }
else {
MmsValue* q = MmsValue_getElement(cmv, 1); printf("one of mag, ang, q, t not found\n");
MmsValue_setBitStringFromInteger(q, (int) quality); }
}
MmsValue* t = MmsValue_getElement(cmv, 2); else {
MmsValue_setUtcTimeByBuffer(t, timestamp.val); printf("Element with index %i not found\n", idx);
}
} }
int int
@ -62,10 +66,7 @@ main(int argc, char **argv)
/* Get access to the MHAI1.HA data object handle - for static and dynamic model*/ /* Get access to the MHAI1.HA data object handle - for static and dynamic model*/
DataObject* mhai1_ha_phsAHar = (DataObject*) DataObject* mhai1_ha_phsAHar = (DataObject*)
IedModel_getModelNodeByObjectReference(&iedModel, "testComplexArray/MHAI1.HA.phsAHar"); IedModel_getModelNodeByShortObjectReference(&iedModel, "ComplexArray/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);
/* assuming the array has 16 elements */ /* assuming the array has 16 elements */
float mag = 200.f; float mag = 200.f;
@ -78,7 +79,7 @@ main(int argc, char **argv)
int i; int i;
for (i = 0; i < 16; 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; mag += 1.f;
angle += 0.01f; angle += 0.01f;
} }
@ -104,11 +105,13 @@ main(int argc, char **argv)
Timestamp_setTimeInMilliseconds(&timestamp, Hal_getTimeInMs()); Timestamp_setTimeInMilliseconds(&timestamp, Hal_getTimeInMs());
IedServer_lockDataModel(iedServer); IedServer_lockDataModel(iedServer);
for (i = 0; i < 16; 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 += 0.1f; mag += 0.1f;
angle += 0.05f; angle += 0.05f;
} }
IedServer_unlockDataModel(iedServer); IedServer_unlockDataModel(iedServer);
if (counter == 10) { if (counter == 10) {

File diff suppressed because it is too large Load Diff

@ -161,13 +161,134 @@ extern DataAttribute iedModel_ComplexArray_GGIO1_Ind4_t;
extern LogicalNode iedModel_ComplexArray_MHAI1; extern LogicalNode iedModel_ComplexArray_MHAI1;
extern DataObject iedModel_ComplexArray_MHAI1_HA; extern DataObject iedModel_ComplexArray_MHAI1_HA;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar; extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal; extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_0;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_q; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_t; 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_numHar;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc; extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm; 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 (&iedModel_ComplexArray_MHAI1)
#define IEDMODEL_ComplexArray_MHAI1_HA (&iedModel_ComplexArray_MHAI1_HA) #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 (&iedModel_ComplexArray_MHAI1_HA_phsAHar)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal) #define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag) #define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_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_0_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang) #define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_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_0_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_q) #define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_t) #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_numHar (&iedModel_ComplexArray_MHAI1_HA_numHar)
#define IEDMODEL_ComplexArray_MHAI1_HA_numCyc (&iedModel_ComplexArray_MHAI1_HA_numCyc) #define IEDMODEL_ComplexArray_MHAI1_HA_numCyc (&iedModel_ComplexArray_MHAI1_HA_numCyc)
#define IEDMODEL_ComplexArray_MHAI1_HA_evalTm (&iedModel_ComplexArray_MHAI1_HA_evalTm) #define IEDMODEL_ComplexArray_MHAI1_HA_evalTm (&iedModel_ComplexArray_MHAI1_HA_evalTm)

@ -116,9 +116,12 @@ LIB61850_API LogicalNode*
LogicalNode_create(const char* name, LogicalDevice* parent); 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. * 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 name the name of the data object (e.h. "Mod", "Health" ...)
* \param parent the parent model node * \param parent the parent model node

@ -214,7 +214,7 @@ struct sDataObject {
ModelNode* firstChild; ModelNode* firstChild;
int elementCount; /* value > 0 if this is an array */ 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 { struct sDataAttribute {
@ -225,7 +225,7 @@ struct sDataAttribute {
ModelNode* firstChild; ModelNode* firstChild;
int elementCount; /* value > 0 if this is an array */ 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; FunctionalConstraint fc;
DataAttributeType type; DataAttributeType type;
@ -234,7 +234,7 @@ struct sDataAttribute {
MmsValue* mmsValue; MmsValue* mmsValue;
uint32_t sAddr; uint32_t sAddr; /* TODO remove in version 2.0 */
}; };
typedef struct sDataSetEntry { typedef struct sDataSetEntry {
@ -367,11 +367,22 @@ ModelNode_getChildCount(ModelNode* self);
* \param self the model node instance * \param self the model node instance
* \param name the name of the child model node * \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* LIB61850_API ModelNode*
ModelNode_getChild(ModelNode* self, const char* name); 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 * \brief return a child model node with a given functional constraint
* *

@ -237,9 +237,17 @@ exit_function:
static void static void
installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttribute* dataAttribute, 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 */ char mmsVariableName[65]; /* maximum size is 64 according to 61850-8-1 */
@ -268,7 +276,12 @@ installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttr
return; 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; dataAttribute->mmsValue = cacheValue;
@ -280,7 +293,6 @@ installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttr
#if (DEBUG_IED_SERVER == 1) #if (DEBUG_IED_SERVER == 1)
if (cacheValue == NULL) { if (cacheValue == NULL) {
printf("IED_SERVER: exception: invalid initializer for %s\n", mmsVariableName); printf("IED_SERVER: exception: invalid initializer for %s\n", mmsVariableName);
exit(-1);
} }
#endif #endif
@ -288,10 +300,12 @@ installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttr
} }
int childPosition = strlen(objectReference); int childPosition = strlen(objectReference);
int childCompIdPos = strlen(componentId);
DataAttribute* subDataAttribute = (DataAttribute*) dataAttribute->firstChild; DataAttribute* subDataAttribute = (DataAttribute*) dataAttribute->firstChild;
while (subDataAttribute != NULL) { while (subDataAttribute != NULL) {
installDefaultValuesForDataAttribute(self, ld, subDataAttribute, objectReference, childPosition); installDefaultValuesForDataAttribute(self, ld, subDataAttribute, objectReference, childPosition, idx, componentId, childCompIdPos);
subDataAttribute = (DataAttribute*) subDataAttribute->sibling; subDataAttribute = (DataAttribute*) subDataAttribute->sibling;
} }
@ -299,27 +313,54 @@ installDefaultValuesForDataAttribute(IedServer self, LogicalDevice* ld, DataAttr
static void static void
installDefaultValuesForDataObject(IedServer self, LogicalDevice* ld, DataObject* dataObject, 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 (dataObject->elementCount > 0) {
if (DEBUG_IED_SERVER) 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; 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; ModelNode* childNode = dataObject->firstChild;
int childPosition = strlen(objectReference); int childPosition = strlen(objectReference);
int childCompIdPos = strlen(componentId);
while (childNode != NULL) { while (childNode) {
if (childNode->modelType == DataObjectModelType) { 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) { 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; childNode = childNode->sibling;
@ -332,6 +373,8 @@ installDefaultValuesInCache(IedServer self)
IedModel* model = self->model; IedModel* model = self->model;
char objectReference[130]; char objectReference[130];
char componentId[130];
componentId[0] = 0;
LogicalDevice* logicalDevice = model->firstChild; LogicalDevice* logicalDevice = model->firstChild;
@ -354,7 +397,7 @@ installDefaultValuesInCache(IedServer self)
int refPosition = strlen(objectReference); int refPosition = strlen(objectReference);
while (dataObject != NULL) { while (dataObject != NULL) {
installDefaultValuesForDataObject(self, logicalDevice, dataObject, objectReference, refPosition); installDefaultValuesForDataObject(self, logicalDevice, dataObject, objectReference, refPosition, -1, componentId, 0);
dataObject = (DataObject*) dataObject->sibling; dataObject = (DataObject*) dataObject->sibling;
} }

@ -1107,7 +1107,7 @@ ControlObject_initialize(ControlObject* self)
else else
{ {
if (DEBUG_IED_SERVER) 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; self->cdc = CST_NONE;
} }
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */

@ -330,6 +330,9 @@ createFCNamedVariableFromDataObject(DataObject* dataObject,
namedVariable->typeSpec.array.elementTypeSpec = (MmsVariableSpecification*) GLOBAL_CALLOC(1, namedVariable->typeSpec.array.elementTypeSpec = (MmsVariableSpecification*) GLOBAL_CALLOC(1,
sizeof(MmsVariableSpecification)); sizeof(MmsVariableSpecification));
namedVariable = namedVariable->typeSpec.array.elementTypeSpec; namedVariable = namedVariable->typeSpec.array.elementTypeSpec;
/* for arrays use the first child as type template */
dataObject = (DataObject*)dataObject->firstChild;
} }
namedVariable->type = MMS_STRUCTURE; namedVariable->type = MMS_STRUCTURE;

@ -554,11 +554,32 @@ DataObject_create(const char* name, ModelNode* parent, int arrayElements)
self->name = StringUtils_copyString(name); self->name = StringUtils_copyString(name);
self->modelType = DataObjectModelType; self->modelType = DataObjectModelType;
self->elementCount = arrayElements;
self->firstChild = NULL; self->firstChild = NULL;
self->parent = parent; self->parent = parent;
self->sibling = NULL; 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) if (parent->modelType == LogicalNodeModelType)
LogicalNode_addDataObject((LogicalNode*) parent, self); LogicalNode_addDataObject((LogicalNode*) parent, self);
else if (parent->modelType == DataObjectModelType) else if (parent->modelType == DataObjectModelType)

@ -635,9 +635,76 @@ ModelNode_getChildCount(ModelNode* modelNode) {
ModelNode* ModelNode*
ModelNode_getChild(ModelNode* self, const char* name) ModelNode_getChild(ModelNode* self, const char* name)
{ {
/* check for separator */ /* check for element separator */
const char* separator = strchr(name, '.'); 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; int nameElementLength = 0;
if (separator != NULL) if (separator != NULL)
@ -649,7 +716,7 @@ ModelNode_getChild(ModelNode* self, const char* name)
ModelNode* matchingNode = NULL; ModelNode* matchingNode = NULL;
while (nextNode != NULL) { while (nextNode) {
int nodeNameLen = strlen(nextNode->name); int nodeNameLen = strlen(nextNode->name);
if (nodeNameLen == nameElementLength) { if (nodeNameLen == nameElementLength) {
@ -669,6 +736,31 @@ ModelNode_getChild(ModelNode* self, const char* name)
return matchingNode; 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*
ModelNode_getChildWithFc(ModelNode* self, const char* name, FunctionalConstraint fc) ModelNode_getChildWithFc(ModelNode* self, const char* name, FunctionalConstraint fc)
{ {

@ -82,6 +82,9 @@ MmsServer_getValueFromCache(MmsServer self, MmsDomain* domain, const char* itemI
LIB61850_INTERNAL MmsValue* LIB61850_INTERNAL MmsValue*
MmsServer_getValueFromCacheEx(MmsServer self, MmsDomain* domain, const char* itemId, MmsVariableSpecification** typeSpec); 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 LIB61850_INTERNAL bool
MmsServer_isLocked(MmsServer self); MmsServer_isLocked(MmsServer self);

@ -1,7 +1,7 @@
/* /*
* mms_value_cache.h * mms_value_cache.h
* *
* Copyright 2013-2018 Michael Zillgith * Copyright 2013-2021 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -38,6 +38,9 @@ MmsValueCache_insertValue(MmsValueCache self, char* itemId, MmsValue* value);
LIB61850_INTERNAL MmsValue* LIB61850_INTERNAL MmsValue*
MmsValueCache_lookupValue(MmsValueCache self, const char* itemId, MmsVariableSpecification** outSpec); 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 LIB61850_INTERNAL void
MmsValueCache_destroy(MmsValueCache self); MmsValueCache_destroy(MmsValueCache self);

@ -185,6 +185,10 @@ MmsVariableSpecification_getStructureElements(MmsVariableSpecification* self)
MmsVariableSpecification* MmsVariableSpecification*
MmsVariableSpecification_getNamedVariableRecursive(MmsVariableSpecification* variable, const char* nameId) 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, '$'); const char* separator = strchr(nameId, '$');
int i; int i;

@ -465,6 +465,17 @@ MmsServer_getValueFromCacheEx(MmsServer self, MmsDomain* domain, const char* ite
return NULL ; 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 void
MmsServer_insertIntoCache(MmsServer self, MmsDomain* domain, char* itemId, MmsValue* value) MmsServer_insertIntoCache(MmsServer self, MmsDomain* domain, char* itemId, MmsValue* value)
{ {

@ -1,7 +1,7 @@
/* /*
* mms_value_cache.c * mms_value_cache.c
* *
* Copyright 2013 Michael Zillgith * Copyright 2013-2021 Michael Zillgith
* *
* This file is part of libIEC61850. * 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); Map_addEntry(self->map, StringUtils_copyString(itemId), cacheEntry);
} }
else 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* static char*
@ -126,34 +127,131 @@ MmsValueCache_lookupValue(MmsValueCache self, const char* itemId, MmsVariableSpe
* get value for first matching key substring! * get value for first matching key substring!
* Then iterate the value for the exact value. * Then iterate the value for the exact value.
*/ */
MmsValue* value = NULL; 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); char* parentItemId = getParentSubString(itemIdCopy);
if (parentItemId != NULL) { if (parentItemId != NULL) {
value = searchCacheForValue(self, itemId, parentItemId, outSpec); value = searchCacheForValue(self, itemId, parentItemId, outSpec);
} }
GLOBAL_FREEMEM(itemIdCopy);
} }
if (cacheEntry != NULL) { return value;
}
if (outSpec) { static MmsValue*
*outSpec = cacheEntry->typeSpec; searchCacheForValueEx(MmsValueCache self, const char* itemId, char* parentId, int idx, char* componentId, MmsVariableSpecification** outSpec)
} {
MmsValueCacheEntry* cacheEntry;
MmsValue* value = NULL;
return cacheEntry->value; cacheEntry = (MmsValueCacheEntry*) Map_getEntry(self->map, (void*) parentId);
}
else if (cacheEntry == NULL) {
return value; 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 static void

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

Loading…
Cancel
Save