From 2dba040c1aa1844f13cf375dace9a33c193efacd Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 7 Mar 2020 12:47:25 +0100 Subject: [PATCH] - CDC helper functions: added stSeld and attributes from ControlTestingCDC to control CDCs --- src/iec61850/server/model/cdc.c | 64 +++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/src/iec61850/server/model/cdc.c b/src/iec61850/server/model/cdc.c index 9b5038b2..a5293970 100644 --- a/src/iec61850/server/model/cdc.c +++ b/src/iec61850/server/model/cdc.c @@ -554,6 +554,19 @@ addOriginatorAndCtlNumOptions(ModelNode* parent, uint32_t controlOptions) DataAttribute_create("ctlNum", parent, IEC61850_INT8U, IEC61850_FC_ST, 0, 0, 0); } +static void +addCommonControlAttributes(DataObject* dobj, uint32_t controlOptions) +{ + if (controlOptions & CDC_CTL_OPTION_OP_RCVD) + DataAttribute_create("opRcvd", (ModelNode*) dobj, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); + + if (controlOptions & CDC_CTL_OPTION_OP_OK) + DataAttribute_create("opOk", (ModelNode*) dobj, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); + + if (controlOptions & CDC_CTL_OPTION_T_OP_OK) + DataAttribute_create("tOpOk", (ModelNode*) dobj, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); +} + /** * * CDC_OPTION_IS_TIME_ACTICATED @@ -574,6 +587,11 @@ CDC_SPC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addControls(newSPC, IEC61850_BOOLEAN, controlOptions); + if (controlOptions & CDC_CTL_OPTION_ST_SELD) + DataAttribute_create("stSeld", (ModelNode*) newSPC, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + + addCommonControlAttributes(newSPC, controlOptions); + if (options & CDC_OPTION_PICS_SUBST) CDC_addOptionPicsSubst(newSPC, IEC61850_BOOLEAN); @@ -605,6 +623,11 @@ CDC_DPC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addControls(newDPC, IEC61850_BOOLEAN, controlOptions); + if (controlOptions & CDC_CTL_OPTION_ST_SELD) + DataAttribute_create("stSeld", (ModelNode*) newDPC, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + + addCommonControlAttributes(newDPC, controlOptions); + if (options & CDC_OPTION_PICS_SUBST) CDC_addOptionPicsSubst(newDPC, IEC61850_CODEDENUM); @@ -661,16 +684,22 @@ addAnalogControls(DataObject* parent, uint32_t controlOptions, bool isIntegerNot } } +static void +addControlStatusAttributesForAnalogControl(DataObject* dobj, uint32_t controlOptions) +{ + if (controlOptions & CDC_CTL_OPTION_ORIGIN) + addOriginator("origin", (ModelNode*) dobj, IEC61850_FC_MX); + + if (controlOptions & CDC_CTL_OPTION_CTL_NUM) + DataAttribute_create("ctlNum", (ModelNode*) dobj, IEC61850_INT8U, IEC61850_FC_MX, 0, 0, 0); +} + DataObject* CDC_APC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, bool isIntegerNotFloat) { DataObject* newAPC = DataObject_create(dataObjectName, parent, 0); - if (controlOptions & CDC_CTL_OPTION_ORIGIN) - addOriginator("origin", (ModelNode*) newAPC, IEC61850_FC_MX); - - if (controlOptions & CDC_CTL_OPTION_CTL_NUM) - DataAttribute_create("ctlNum", (ModelNode*) newAPC, IEC61850_INT8U, IEC61850_FC_MX, 0, 0, 0); + addControlStatusAttributesForAnalogControl(newAPC, controlOptions); CAC_AnalogueValue_create("mxVal", (ModelNode*) newAPC, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, isIntegerNotFloat); @@ -679,14 +708,7 @@ CDC_APC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, if (controlOptions & CDC_CTL_OPTION_ST_SELD) DataAttribute_create("stSeld", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_MX, TRG_OPT_DATA_CHANGED, 0, 0); - if (controlOptions & CDC_CTL_OPTION_OP_RCVD) - DataAttribute_create("opRcvd", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); - - if (controlOptions & CDC_CTL_OPTION_OP_OK) - DataAttribute_create("opOk", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); - - if (controlOptions & CDC_CTL_OPTION_T_OP_OK) - DataAttribute_create("tOpOk", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_OR, TRG_OPT_DATA_CHANGED, 0, 0); + addCommonControlAttributes(newAPC, controlOptions); if (options & CDC_OPTION_PICS_SUBST) { DataAttribute_create("subEna", (ModelNode*) newAPC, IEC61850_BOOLEAN, IEC61850_FC_SV, 0, 0, 0); @@ -705,7 +727,6 @@ CDC_APC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, return newAPC; } - DataObject* CDC_INC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions) { @@ -717,6 +738,11 @@ CDC_INC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addControls(newINC, IEC61850_INT32, controlOptions); + if (controlOptions & CDC_CTL_OPTION_ST_SELD) + DataAttribute_create("stSeld", (ModelNode*) newINC, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + + addCommonControlAttributes(newINC, controlOptions); + if (options & CDC_OPTION_PICS_SUBST) CDC_addOptionPicsSubst(newINC, IEC61850_INT32); @@ -748,6 +774,11 @@ CDC_ENC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addControls(newENC, IEC61850_ENUMERATED, controlOptions); + if (controlOptions & CDC_CTL_OPTION_ST_SELD) + DataAttribute_create("stSeld", (ModelNode*) newENC, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + + addCommonControlAttributes(newENC, controlOptions); + if (options & CDC_OPTION_PICS_SUBST) CDC_addOptionPicsSubst(newENC, IEC61850_ENUMERATED); @@ -773,6 +804,11 @@ CDC_BSC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, addControls(newBSC, IEC61850_CODEDENUM, controlOptions); + if (controlOptions & CDC_CTL_OPTION_ST_SELD) + DataAttribute_create("stSeld", (ModelNode*) newBSC, IEC61850_BOOLEAN, IEC61850_FC_ST, TRG_OPT_DATA_CHANGED, 0, 0); + + addCommonControlAttributes(newBSC, controlOptions); + if (options & CDC_OPTION_PICS_SUBST) CDC_addOptionPicsSubstValWithTrans(newBSC, hasTransientIndicator);