- 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="">
<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(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(10).cVal.mag"/>
<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(7)" ix="7"/>
<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" ix="9"/>
<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" ix="11"/>
</DataSet>
<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
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, &timestamp);
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(&timestamp, 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) {

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 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)

@ -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

@ -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
*

@ -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;
}

@ -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) */

@ -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;

@ -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)

@ -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)
{

@ -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);

@ -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);

@ -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;

@ -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)
{

@ -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

@ -594,7 +594,7 @@ public class StaticModelGenerator {
cOut.println("};\n");
printDataObjectDefinitions(lnName, logicalNode.getDataObjects(), null, false);
printDataObjectDefinitions(lnName, logicalNode.getDataObjects(), null, false, -1);
printReportControlBlocks(lnName, logicalNode);
@ -609,11 +609,19 @@ public class StaticModelGenerator {
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++) {
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<DataAttribute> dataAttributes, boolean isTransient) {
private void printDataAttributeDefinitions(String doName, List<DataAttribute> 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());
}
}

Loading…
Cancel
Save