From 07fc8bf0092d03c8d0bd5437ea382ef5ef3adf31 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 17 Dec 2020 16:17:51 +0100 Subject: [PATCH] - IED server: fixed problem that BL FC is not writable (#287) --- .../server_example_substitution.c | 47 +++++++++- .../static_model.c | 92 +++++++++++++++++-- .../static_model.h | 14 ++- .../substitution_example.cid | 2 + src/iec61850/inc_private/ied_server_private.h | 1 + src/iec61850/server/mms_mapping/mms_mapping.c | 63 ++++--------- 6 files changed, 162 insertions(+), 57 deletions(-) diff --git a/examples/server_example_substitution/server_example_substitution.c b/examples/server_example_substitution/server_example_substitution.c index b4052254..2f41d892 100644 --- a/examples/server_example_substitution/server_example_substitution.c +++ b/examples/server_example_substitution/server_example_substitution.c @@ -2,7 +2,8 @@ * server_example_substitution.c * * - How to use the IEC 61850 substitution service - * - Two data objects can be substituted: + * - How to use the blocking service + * - Two data objects can be substituted and/or blocked: * -- GGIO1.AnIn1 * -- GGIO1.Ind1 */ @@ -24,6 +25,8 @@ static IedServer iedServer = NULL; static bool subsAnIn1 = false; static bool subsInd1 = false; +static bool blkEnaAnIn1 = false; +static bool blkEnaInd1 = false; static float an1 = 0.f; static uint64_t timestamp = 0; @@ -35,7 +38,6 @@ sigint_handler(int signalId) running = 0; } - static void connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter) { @@ -54,13 +56,13 @@ updateProcessValues() Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp); Timestamp_setLeapSecondKnown(&iecTimestamp, true); - if (subsAnIn1 == false) { + if ((subsAnIn1 == false) && (blkEnaAnIn1 == false)) { IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_t, &iecTimestamp); IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_q, QUALITY_VALIDITY_GOOD); IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_mag_f, an1); } - if (subsInd1 == false) { + if ((subsInd1 == false) && (blkEnaInd1 == false)) { IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_t, &iecTimestamp); IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_Ind1_q, QUALITY_VALIDITY_GOOD); IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_stVal, ind1); @@ -116,6 +118,23 @@ writeAccessHandler (DataAttribute* dataAttribute, MmsValue* value, ClientConnect } } + else if (dataAttribute == IEDMODEL_LD1_GGIO1_AnIn1_blkEna) { + printf("Received GGIO1.AnIn1.blkEna: %i\n", MmsValue_getBoolean(value)); + + blkEnaAnIn1 = MmsValue_getBoolean(value); + + /* Update quality flags */ + + Quality quality = + Quality_fromMmsValue(IedServer_getAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_q)); + + if (blkEnaAnIn1) + Quality_setFlag(&quality, QUALITY_OPERATOR_BLOCKED); + else + Quality_unsetFlag(&quality, QUALITY_OPERATOR_BLOCKED); + + IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_q, quality); + } else if (dataAttribute == IEDMODEL_LD1_GGIO1_Ind1_subEna) { printf("Received GGIO1.Ind1.subEna: %i\n", MmsValue_getBoolean(value)); @@ -160,6 +179,23 @@ writeAccessHandler (DataAttribute* dataAttribute, MmsValue* value, ClientConnect } } + else if (dataAttribute == IEDMODEL_LD1_GGIO1_Ind1_blkEna) { + printf("Received GGIO1.Ind1.blkEna: %i\n", MmsValue_getBoolean(value)); + + blkEnaInd1 = MmsValue_getBoolean(value); + + /* Update quality flags */ + + Quality quality = + Quality_fromMmsValue(IedServer_getAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_q)); + + if (blkEnaAnIn1) + Quality_setFlag(&quality, QUALITY_OPERATOR_BLOCKED); + else + Quality_unsetFlag(&quality, QUALITY_OPERATOR_BLOCKED); + + IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_Ind1_q, quality); + } return DATA_ACCESS_ERROR_SUCCESS; } @@ -179,10 +215,12 @@ main(int argc, char** argv) IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_subEna, writeAccessHandler, NULL); IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_subMag_f, writeAccessHandler, NULL); IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_subQ, writeAccessHandler, NULL); + IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_blkEna, writeAccessHandler, NULL); IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_Ind1_subEna, writeAccessHandler, NULL); IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_Ind1_subVal, writeAccessHandler, NULL); IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_Ind1_subQ, writeAccessHandler, NULL); + IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_Ind1_blkEna, writeAccessHandler, NULL); /* MMS server will be instructed to start listening for client connections. */ IedServer_start(iedServer, 102); @@ -226,4 +264,5 @@ main(int argc, char** argv) /* Cleanup - free all resources */ IedServer_destroy(iedServer); + return 0; } /* main() */ diff --git a/examples/server_example_substitution/static_model.c b/examples/server_example_substitution/static_model.c index 0f8bff5d..c59ba0df 100644 --- a/examples/server_example_substitution/static_model.c +++ b/examples/server_example_substitution/static_model.c @@ -1,7 +1,7 @@ /* * static_model.c * - * automatically generated from substitution_example.icd + * automatically generated from substitution_example.cid */ #include "static_model.h" @@ -242,7 +242,7 @@ DataAttribute iedModel_LD1_LPHD1_Proxy_subID = { DataAttributeModelType, "subID", (ModelNode*) &iedModel_LD1_LPHD1_Proxy, - NULL, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy_blkEna, NULL, 0, IEC61850_FC_SV, @@ -251,6 +251,19 @@ DataAttribute iedModel_LD1_LPHD1_Proxy_subID = { NULL, 0}; +DataAttribute iedModel_LD1_LPHD1_Proxy_blkEna = { + DataAttributeModelType, + "blkEna", + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_BL, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + LogicalNode iedModel_LD1_MMDC1 = { LogicalNodeModelType, "MMDC1", @@ -424,7 +437,7 @@ DataAttribute iedModel_LD1_MMDC1_Watt_subID = { DataAttributeModelType, "subID", (ModelNode*) &iedModel_LD1_MMDC1_Watt, - NULL, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_blkEna, NULL, 0, IEC61850_FC_SV, @@ -433,6 +446,19 @@ DataAttribute iedModel_LD1_MMDC1_Watt_subID = { NULL, 0}; +DataAttribute iedModel_LD1_MMDC1_Watt_blkEna = { + DataAttributeModelType, + "blkEna", + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + NULL, + NULL, + 0, + IEC61850_FC_BL, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + DataObject iedModel_LD1_MMDC1_Amp = { DataObjectModelType, "Amp", @@ -550,7 +576,7 @@ DataAttribute iedModel_LD1_MMDC1_Amp_subID = { DataAttributeModelType, "subID", (ModelNode*) &iedModel_LD1_MMDC1_Amp, - NULL, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_blkEna, NULL, 0, IEC61850_FC_SV, @@ -559,6 +585,19 @@ DataAttribute iedModel_LD1_MMDC1_Amp_subID = { NULL, 0}; +DataAttribute iedModel_LD1_MMDC1_Amp_blkEna = { + DataAttributeModelType, + "blkEna", + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + NULL, + NULL, + 0, + IEC61850_FC_BL, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + DataObject iedModel_LD1_MMDC1_Vol = { DataObjectModelType, "Vol", @@ -676,7 +715,7 @@ DataAttribute iedModel_LD1_MMDC1_Vol_subID = { DataAttributeModelType, "subID", (ModelNode*) &iedModel_LD1_MMDC1_Vol, - NULL, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_blkEna, NULL, 0, IEC61850_FC_SV, @@ -685,6 +724,19 @@ DataAttribute iedModel_LD1_MMDC1_Vol_subID = { NULL, 0}; +DataAttribute iedModel_LD1_MMDC1_Vol_blkEna = { + DataAttributeModelType, + "blkEna", + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + NULL, + NULL, + 0, + IEC61850_FC_BL, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + LogicalNode iedModel_LD1_GGIO1 = { LogicalNodeModelType, "GGIO1", @@ -832,7 +884,7 @@ DataAttribute iedModel_LD1_GGIO1_Ind1_subID = { DataAttributeModelType, "subID", (ModelNode*) &iedModel_LD1_GGIO1_Ind1, - NULL, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1_blkEna, NULL, 0, IEC61850_FC_SV, @@ -841,6 +893,19 @@ DataAttribute iedModel_LD1_GGIO1_Ind1_subID = { NULL, 0}; +DataAttribute iedModel_LD1_GGIO1_Ind1_blkEna = { + DataAttributeModelType, + "blkEna", + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + NULL, + NULL, + 0, + IEC61850_FC_BL, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + DataObject iedModel_LD1_GGIO1_AnIn1 = { DataObjectModelType, "AnIn1", @@ -958,7 +1023,7 @@ DataAttribute iedModel_LD1_GGIO1_AnIn1_subID = { DataAttributeModelType, "subID", (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, - NULL, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_blkEna, NULL, 0, IEC61850_FC_SV, @@ -967,6 +1032,19 @@ DataAttribute iedModel_LD1_GGIO1_AnIn1_subID = { NULL, 0}; +DataAttribute iedModel_LD1_GGIO1_AnIn1_blkEna = { + DataAttributeModelType, + "blkEna", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + NULL, + NULL, + 0, + IEC61850_FC_BL, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + extern ReportControlBlock iedModel_LD1_LLN0_report0; extern ReportControlBlock iedModel_LD1_LLN0_report1; diff --git a/examples/server_example_substitution/static_model.h b/examples/server_example_substitution/static_model.h index 1ad6a5e4..55fc628a 100644 --- a/examples/server_example_substitution/static_model.h +++ b/examples/server_example_substitution/static_model.h @@ -1,7 +1,7 @@ /* * static_model.h * - * automatically generated from substitution_example.icd + * automatically generated from substitution_example.cid */ #ifndef STATIC_MODEL_H_ @@ -32,6 +32,7 @@ extern DataAttribute iedModel_LD1_LPHD1_Proxy_subEna; extern DataAttribute iedModel_LD1_LPHD1_Proxy_subVal; extern DataAttribute iedModel_LD1_LPHD1_Proxy_subQ; extern DataAttribute iedModel_LD1_LPHD1_Proxy_subID; +extern DataAttribute iedModel_LD1_LPHD1_Proxy_blkEna; extern LogicalNode iedModel_LD1_MMDC1; extern DataObject iedModel_LD1_MMDC1_Beh; extern DataAttribute iedModel_LD1_MMDC1_Beh_stVal; @@ -47,6 +48,7 @@ extern DataAttribute iedModel_LD1_MMDC1_Watt_subMag; extern DataAttribute iedModel_LD1_MMDC1_Watt_subMag_f; extern DataAttribute iedModel_LD1_MMDC1_Watt_subQ; extern DataAttribute iedModel_LD1_MMDC1_Watt_subID; +extern DataAttribute iedModel_LD1_MMDC1_Watt_blkEna; extern DataObject iedModel_LD1_MMDC1_Amp; extern DataAttribute iedModel_LD1_MMDC1_Amp_mag; extern DataAttribute iedModel_LD1_MMDC1_Amp_mag_f; @@ -57,6 +59,7 @@ extern DataAttribute iedModel_LD1_MMDC1_Amp_subMag; extern DataAttribute iedModel_LD1_MMDC1_Amp_subMag_f; extern DataAttribute iedModel_LD1_MMDC1_Amp_subQ; extern DataAttribute iedModel_LD1_MMDC1_Amp_subID; +extern DataAttribute iedModel_LD1_MMDC1_Amp_blkEna; extern DataObject iedModel_LD1_MMDC1_Vol; extern DataAttribute iedModel_LD1_MMDC1_Vol_mag; extern DataAttribute iedModel_LD1_MMDC1_Vol_mag_f; @@ -67,6 +70,7 @@ extern DataAttribute iedModel_LD1_MMDC1_Vol_subMag; extern DataAttribute iedModel_LD1_MMDC1_Vol_subMag_f; extern DataAttribute iedModel_LD1_MMDC1_Vol_subQ; extern DataAttribute iedModel_LD1_MMDC1_Vol_subID; +extern DataAttribute iedModel_LD1_MMDC1_Vol_blkEna; extern LogicalNode iedModel_LD1_GGIO1; extern DataObject iedModel_LD1_GGIO1_Beh; extern DataAttribute iedModel_LD1_GGIO1_Beh_stVal; @@ -80,6 +84,7 @@ extern DataAttribute iedModel_LD1_GGIO1_Ind1_subEna; extern DataAttribute iedModel_LD1_GGIO1_Ind1_subVal; extern DataAttribute iedModel_LD1_GGIO1_Ind1_subQ; extern DataAttribute iedModel_LD1_GGIO1_Ind1_subID; +extern DataAttribute iedModel_LD1_GGIO1_Ind1_blkEna; extern DataObject iedModel_LD1_GGIO1_AnIn1; extern DataAttribute iedModel_LD1_GGIO1_AnIn1_mag; extern DataAttribute iedModel_LD1_GGIO1_AnIn1_mag_f; @@ -90,6 +95,7 @@ extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subMag; extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subMag_f; extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subQ; extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subID; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_blkEna; @@ -114,6 +120,7 @@ extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subID; #define IEDMODEL_LD1_LPHD1_Proxy_subVal (&iedModel_LD1_LPHD1_Proxy_subVal) #define IEDMODEL_LD1_LPHD1_Proxy_subQ (&iedModel_LD1_LPHD1_Proxy_subQ) #define IEDMODEL_LD1_LPHD1_Proxy_subID (&iedModel_LD1_LPHD1_Proxy_subID) +#define IEDMODEL_LD1_LPHD1_Proxy_blkEna (&iedModel_LD1_LPHD1_Proxy_blkEna) #define IEDMODEL_LD1_MMDC1 (&iedModel_LD1_MMDC1) #define IEDMODEL_LD1_MMDC1_Beh (&iedModel_LD1_MMDC1_Beh) #define IEDMODEL_LD1_MMDC1_Beh_stVal (&iedModel_LD1_MMDC1_Beh_stVal) @@ -129,6 +136,7 @@ extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subID; #define IEDMODEL_LD1_MMDC1_Watt_subMag_f (&iedModel_LD1_MMDC1_Watt_subMag_f) #define IEDMODEL_LD1_MMDC1_Watt_subQ (&iedModel_LD1_MMDC1_Watt_subQ) #define IEDMODEL_LD1_MMDC1_Watt_subID (&iedModel_LD1_MMDC1_Watt_subID) +#define IEDMODEL_LD1_MMDC1_Watt_blkEna (&iedModel_LD1_MMDC1_Watt_blkEna) #define IEDMODEL_LD1_MMDC1_Amp (&iedModel_LD1_MMDC1_Amp) #define IEDMODEL_LD1_MMDC1_Amp_mag (&iedModel_LD1_MMDC1_Amp_mag) #define IEDMODEL_LD1_MMDC1_Amp_mag_f (&iedModel_LD1_MMDC1_Amp_mag_f) @@ -139,6 +147,7 @@ extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subID; #define IEDMODEL_LD1_MMDC1_Amp_subMag_f (&iedModel_LD1_MMDC1_Amp_subMag_f) #define IEDMODEL_LD1_MMDC1_Amp_subQ (&iedModel_LD1_MMDC1_Amp_subQ) #define IEDMODEL_LD1_MMDC1_Amp_subID (&iedModel_LD1_MMDC1_Amp_subID) +#define IEDMODEL_LD1_MMDC1_Amp_blkEna (&iedModel_LD1_MMDC1_Amp_blkEna) #define IEDMODEL_LD1_MMDC1_Vol (&iedModel_LD1_MMDC1_Vol) #define IEDMODEL_LD1_MMDC1_Vol_mag (&iedModel_LD1_MMDC1_Vol_mag) #define IEDMODEL_LD1_MMDC1_Vol_mag_f (&iedModel_LD1_MMDC1_Vol_mag_f) @@ -149,6 +158,7 @@ extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subID; #define IEDMODEL_LD1_MMDC1_Vol_subMag_f (&iedModel_LD1_MMDC1_Vol_subMag_f) #define IEDMODEL_LD1_MMDC1_Vol_subQ (&iedModel_LD1_MMDC1_Vol_subQ) #define IEDMODEL_LD1_MMDC1_Vol_subID (&iedModel_LD1_MMDC1_Vol_subID) +#define IEDMODEL_LD1_MMDC1_Vol_blkEna (&iedModel_LD1_MMDC1_Vol_blkEna) #define IEDMODEL_LD1_GGIO1 (&iedModel_LD1_GGIO1) #define IEDMODEL_LD1_GGIO1_Beh (&iedModel_LD1_GGIO1_Beh) #define IEDMODEL_LD1_GGIO1_Beh_stVal (&iedModel_LD1_GGIO1_Beh_stVal) @@ -162,6 +172,7 @@ extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subID; #define IEDMODEL_LD1_GGIO1_Ind1_subVal (&iedModel_LD1_GGIO1_Ind1_subVal) #define IEDMODEL_LD1_GGIO1_Ind1_subQ (&iedModel_LD1_GGIO1_Ind1_subQ) #define IEDMODEL_LD1_GGIO1_Ind1_subID (&iedModel_LD1_GGIO1_Ind1_subID) +#define IEDMODEL_LD1_GGIO1_Ind1_blkEna (&iedModel_LD1_GGIO1_Ind1_blkEna) #define IEDMODEL_LD1_GGIO1_AnIn1 (&iedModel_LD1_GGIO1_AnIn1) #define IEDMODEL_LD1_GGIO1_AnIn1_mag (&iedModel_LD1_GGIO1_AnIn1_mag) #define IEDMODEL_LD1_GGIO1_AnIn1_mag_f (&iedModel_LD1_GGIO1_AnIn1_mag_f) @@ -172,6 +183,7 @@ extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subID; #define IEDMODEL_LD1_GGIO1_AnIn1_subMag_f (&iedModel_LD1_GGIO1_AnIn1_subMag_f) #define IEDMODEL_LD1_GGIO1_AnIn1_subQ (&iedModel_LD1_GGIO1_AnIn1_subQ) #define IEDMODEL_LD1_GGIO1_AnIn1_subID (&iedModel_LD1_GGIO1_AnIn1_subID) +#define IEDMODEL_LD1_GGIO1_AnIn1_blkEna (&iedModel_LD1_GGIO1_AnIn1_blkEna) #endif /* STATIC_MODEL_H_ */ diff --git a/examples/server_example_substitution/substitution_example.cid b/examples/server_example_substitution/substitution_example.cid index 32d62c33..30ac3635 100644 --- a/examples/server_example_substitution/substitution_example.cid +++ b/examples/server_example_substitution/substitution_example.cid @@ -99,6 +99,7 @@ + @@ -108,6 +109,7 @@ + diff --git a/src/iec61850/inc_private/ied_server_private.h b/src/iec61850/inc_private/ied_server_private.h index e866a503..9842c7a9 100644 --- a/src/iec61850/inc_private/ied_server_private.h +++ b/src/iec61850/inc_private/ied_server_private.h @@ -32,6 +32,7 @@ #define ALLOW_WRITE_ACCESS_SP 4 #define ALLOW_WRITE_ACCESS_SV 8 #define ALLOW_WRITE_ACCESS_SE 16 +#define ALLOW_WRITE_ACCESS_BL 32 struct sIedServer { diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 5f0957c6..5a9bdb83 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1414,45 +1414,9 @@ isReportControlBlock(char* separator) #endif /* (CONFIG_IEC61850_REPORT_SERVICE == 1) */ static bool -isFunctionalConstraintCF(char* separator) +isFunctionalConstraint(const char* fcStr, char* separator) { - if (strncmp(separator + 1, "CF", 2) == 0) - return true; - else - return false; -} - -static bool -isFunctionalConstraintDC(char* separator) -{ - if (strncmp(separator + 1, "DC", 2) == 0) - return true; - else - return false; -} - -static bool -isFunctionalConstraintSP(char* separator) -{ - if (strncmp(separator + 1, "SP", 2) == 0) - return true; - else - return false; -} - -static bool -isFunctionalConstraintSV(char* separator) -{ - if (strncmp(separator + 1, "SV", 2) == 0) - return true; - else - return false; -} - -static bool -isFunctionalConstraintSE(char* separator) -{ - if (strncmp(separator + 1, "SE", 2) == 0) + if (strncmp(separator + 1, fcStr, 2) == 0) return true; else return false; @@ -1751,16 +1715,18 @@ checkIfValueBelongsToModelNode(DataAttribute* dataAttribute, MmsValue* value, Mm static FunctionalConstraint getFunctionalConstraintForWritableNode(MmsMapping* self, char* separator) { - if (isFunctionalConstraintCF(separator)) + if (isFunctionalConstraint("CF", separator)) return IEC61850_FC_CF; - if (isFunctionalConstraintDC(separator)) + if (isFunctionalConstraint("DC", separator)) return IEC61850_FC_DC; - if (isFunctionalConstraintSP(separator)) + if (isFunctionalConstraint("SP", separator)) return IEC61850_FC_SP; - if (isFunctionalConstraintSV(separator)) + if (isFunctionalConstraint("SV", separator)) return IEC61850_FC_SV; - if (isFunctionalConstraintSE(separator)) + if (isFunctionalConstraint("SE", separator)) return IEC61850_FC_SE; + if (isFunctionalConstraint("BL", separator)) + return IEC61850_FC_BL; return IEC61850_FC_NONE; } @@ -1803,6 +1769,13 @@ getAccessPolicyForFC(MmsMapping* self, FunctionalConstraint fc) return ACCESS_POLICY_DENY; } + if (fc == IEC61850_FC_BL) { + if (self->iedServer->writeAccessPolicies & ALLOW_WRITE_ACCESS_BL) + return ACCESS_POLICY_ALLOW; + else + return ACCESS_POLICY_DENY; + } + return ACCESS_POLICY_DENY; } @@ -2071,7 +2044,7 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, printf("IED_SERVER: write to %s policy:%i\n", variableId, nodeAccessPolicy); #if (CONFIG_IEC61850_SETTING_GROUPS == 1) - if (isFunctionalConstraintSE(separator)) { + if (isFunctionalConstraint("SE", separator)) { SettingGroup* sg = getSettingGroupByMmsDomain(self, domain); if (sg != NULL) { @@ -2448,7 +2421,7 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS #if (CONFIG_IEC61850_SETTING_GROUPS == 1) if (separator) { - if (isFunctionalConstraintSE(separator)) { + if (isFunctionalConstraint("SE", separator)) { SettingGroup* sg = getSettingGroupByMmsDomain(self, domain); if (sg != NULL) {