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