diff --git a/examples/server_example_substitution/server_example_substitution.c b/examples/server_example_substitution/server_example_substitution.c
index 0050f04f..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);
@@ -225,6 +263,6 @@ main(int argc, char** argv)
/* Cleanup - free all resources */
IedServer_destroy(iedServer);
- return 0;
+ 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 3d6aa3fd..6b1aad8a 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 86497ccf..12962443 100644
--- a/src/iec61850/server/mms_mapping/mms_mapping.c
+++ b/src/iec61850/server/mms_mapping/mms_mapping.c
@@ -2100,45 +2100,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;
@@ -2445,16 +2409,18 @@ checkIfValueBelongsToModelNode(DataAttribute* dataAttribute, MmsValue* value, Mm
static FunctionalConstraint
getFunctionalConstraintForWritableNode(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;
}
@@ -2497,6 +2463,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;
}
@@ -2811,7 +2784,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) {
@@ -3189,7 +3162,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) {