diff --git a/dotnet/IEC61850forCSharp/IedServerConfig.cs b/dotnet/IEC61850forCSharp/IedServerConfig.cs
index acf7cbf3..368dc894 100644
--- a/dotnet/IEC61850forCSharp/IedServerConfig.cs
+++ b/dotnet/IEC61850forCSharp/IedServerConfig.cs
@@ -114,6 +114,13 @@ namespace IEC61850.Server
[return: MarshalAs(UnmanagedType.I1)]
static extern bool IedServerConfig_isResvTmsForBRCBEnabled(IntPtr self);
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void IedServerConfig_enableOwnerForRCB(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool IedServerConfig_isOwnerForRCBEnabled(IntPtr self);
+
internal IntPtr self;
public IedServerConfig()
@@ -300,7 +307,7 @@ namespace IEC61850.Server
///
/// Enable/Disable the presence of ResvTms attribute in BRCBs (buffered report control blocks)
///
- /// true if BRCB has ResvTms; otherwise, false.
+ /// true if BRCB has ResvTms; otherwise, false. Defaults to true
public bool BRCBHasResvTms
{
get
@@ -313,6 +320,22 @@ namespace IEC61850.Server
}
}
+ ///
+ /// Enable/Disable the presence of Owner attribute in RCBs (report control blocks)
+ ///
+ /// true if RCB has Owner; otherwise, false. Defaults to false
+ public bool RCBHasOwner
+ {
+ get
+ {
+ return IedServerConfig_isOwnerForRCBEnabled(self);
+ }
+ set
+ {
+ IedServerConfig_enableOwnerForRCB(self, value);
+ }
+ }
+
///
/// Releases all resource used by the object.
///
diff --git a/src/iec61850/inc/iec61850_common.h b/src/iec61850/inc/iec61850_common.h
index b9a8d32e..957883dd 100644
--- a/src/iec61850/inc/iec61850_common.h
+++ b/src/iec61850/inc/iec61850_common.h
@@ -108,9 +108,6 @@ typedef enum {
/** Report will be triggered by GI (general interrogation) request */
#define TRG_OPT_GI 16
-/** RCB has the owner attribute */
-#define RPT_OPT_HAS_OWNER 64
-
/** Report will be triggered only on rising edge (transient variable */
#define TRG_OPT_TRANSIENT 128
/** @} */
diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h
index 0615defa..92e55429 100644
--- a/src/iec61850/inc/iec61850_server.h
+++ b/src/iec61850/inc/iec61850_server.h
@@ -92,6 +92,9 @@ struct sIedServerConfig
/** BRCB has resvTms attribute - only edition 2 (default: true) */
bool enableResvTmsForBRCB;
+
+ /** RCB has owner attribute (default: true) */
+ bool enableOwnerForRCB;
};
/**
@@ -308,9 +311,9 @@ LIB61850_API void
IedServerConfig_enableResvTmsForSGCB(IedServerConfig self, bool enable);
/**
- * \brief Enable/disable the presence of BRCB.ResvTms
+ * \brief Enable/disable the presence of BRCB.ResvTms (default value is true)
*
- * \param[in] enable set true to enable, otherwise false (default value it true)
+ * \param[in] enable set true to enable, otherwise false
*/
LIB61850_API void
IedServerConfig_enableResvTmsForBRCB(IedServerConfig self, bool enable);
@@ -323,6 +326,22 @@ IedServerConfig_enableResvTmsForBRCB(IedServerConfig self, bool enable);
LIB61850_API bool
IedServerConfig_isResvTmsForBRCBEnabled(IedServerConfig self);
+/**
+ * \brief Enable/disable the presence of owner in report control blocks (default value is false);
+ *
+ * \param[in] enable set true to enable, otherwise false
+ */
+LIB61850_API void
+IedServerConfig_enableOwnerForRCB(IedServerConfig self, bool enable);
+
+/**
+ * \brief Owner for RCBs enabled (visible)
+ *
+ * \return true if enabled, false otherwise
+ */
+LIB61850_API bool
+IedServerConfig_isOwnerForRCBEnabled(IedServerConfig self);
+
/**
* \brief Enable/disable using the integrated GOOSE publisher for configured GoCBs
*
diff --git a/src/iec61850/inc_private/ied_server_private.h b/src/iec61850/inc_private/ied_server_private.h
index 0c05efe2..ed6af512 100644
--- a/src/iec61850/inc_private/ied_server_private.h
+++ b/src/iec61850/inc_private/ied_server_private.h
@@ -48,6 +48,7 @@ struct sIedServer
int reportBufferSizeBRCBs;
int reportBufferSizeURCBs;
bool enableBRCBResvTms;
+ bool enableOwnerForRCB;
#endif
#if (CONFIG_MMS_THREADLESS_STACK != 1)
diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c
index c24ee4a9..c55c115c 100644
--- a/src/iec61850/server/impl/ied_server.c
+++ b/src/iec61850/server/impl/ied_server.c
@@ -483,10 +483,12 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio
self->reportBufferSizeBRCBs = serverConfiguration->reportBufferSize;
self->reportBufferSizeURCBs = serverConfiguration->reportBufferSizeURCBs;
self->enableBRCBResvTms = serverConfiguration->enableResvTmsForBRCB;
+ self->enableOwnerForRCB = serverConfiguration->enableOwnerForRCB;
}
else {
self->reportBufferSizeBRCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE;
self->reportBufferSizeURCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE;
+ self->enableOwnerForRCB = false;
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
self->enableBRCBResvTms = true;
#else
diff --git a/src/iec61850/server/impl/ied_server_config.c b/src/iec61850/server/impl/ied_server_config.c
index 6d294765..999ab4cd 100644
--- a/src/iec61850/server/impl/ied_server_config.c
+++ b/src/iec61850/server/impl/ied_server_config.c
@@ -56,6 +56,7 @@ IedServerConfig_create()
self->maxMmsConnections = 5;
self->enableEditSG = true;
self->enableResvTmsForBRCB = true;
+ self->enableOwnerForRCB = false;
}
return self;
@@ -212,6 +213,17 @@ IedServerConfig_isResvTmsForBRCBEnabled(IedServerConfig self)
return self->enableResvTmsForBRCB;
}
+void
+IedServerConfig_enableOwnerForRCB(IedServerConfig self, bool enable)
+{
+ self->enableOwnerForRCB = enable;
+}
+
+bool
+IedServerConfig_isOwnerForRCBEnabled(IedServerConfig self)
+{
+ return self->enableOwnerForRCB;
+}
void
IedServerConfig_useIntegratedGoosePublisher(IedServerConfig self, bool enable)
diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c
index 1aa0cffa..25823dc7 100644
--- a/src/iec61850/server/mms_mapping/reporting.c
+++ b/src/iec61850/server/mms_mapping/reporting.c
@@ -1354,8 +1354,7 @@ Reporting_createMmsBufferedRCBs(MmsMapping* self, MmsDomain* domain,
ReportControlBlock* reportControlBlock = getRCBForLogicalNodeWithIndex(
self, logicalNode, currentReport, true);
- if (reportControlBlock->trgOps & RPT_OPT_HAS_OWNER)
- rc->hasOwner = true;
+ rc->hasOwner = self->iedServer->enableOwnerForRCB;
rc->name = StringUtils_createString(3, logicalNode->name, "$BR$",
reportControlBlock->name);
@@ -1396,8 +1395,7 @@ Reporting_createMmsUnbufferedRCBs(MmsMapping* self, MmsDomain* domain,
ReportControlBlock* reportControlBlock = getRCBForLogicalNodeWithIndex(
self, logicalNode, currentReport, false);
- if (reportControlBlock->trgOps & RPT_OPT_HAS_OWNER)
- rc->hasOwner = true;
+ rc->hasOwner = self->iedServer->enableOwnerForRCB;
rc->name = StringUtils_createString(3, logicalNode->name, "$RP$",
reportControlBlock->name);