- IED server: make presence of BRCB.ResvTms configurable at runtime with function IedServerConfig_enableResvTmsForBRCB (F1558)

pull/331/head
Michael Zillgith 5 years ago
parent d546ebac6f
commit fd3847dcc5

@ -107,11 +107,18 @@ namespace IEC61850.Server
[return: MarshalAs(UnmanagedType.I1)] [return: MarshalAs(UnmanagedType.I1)]
static extern bool IedServerConfig_isLogServiceEnabled(IntPtr self); static extern bool IedServerConfig_isLogServiceEnabled(IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServerConfig_enableResvTmsForBRCB(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
static extern bool IedServerConfig_isResvTmsForBRCBEnabled(IntPtr self);
internal IntPtr self; internal IntPtr self;
public IedServerConfig () public IedServerConfig()
{ {
self = IedServerConfig_create (); self = IedServerConfig_create();
} }
/// <summary> /// <summary>
@ -120,11 +127,13 @@ namespace IEC61850.Server
/// <value>The size of the report buffer.</value> /// <value>The size of the report buffer.</value>
public int ReportBufferSize public int ReportBufferSize
{ {
get { get
return IedServerConfig_getReportBufferSize (self); {
return IedServerConfig_getReportBufferSize(self);
} }
set { set
IedServerConfig_setReportBufferSize (self, value); {
IedServerConfig_setReportBufferSize(self, value);
} }
} }
@ -150,11 +159,13 @@ namespace IEC61850.Server
/// <value>The file service base path.</value> /// <value>The file service base path.</value>
public string FileServiceBasePath public string FileServiceBasePath
{ {
get { get
return Marshal.PtrToStringAnsi (IedServerConfig_getFileServiceBasePath (self)); {
return Marshal.PtrToStringAnsi(IedServerConfig_getFileServiceBasePath(self));
} }
set { set
IedServerConfig_setFileServiceBasePath (self, value); {
IedServerConfig_setFileServiceBasePath(self, value);
} }
} }
@ -180,11 +191,13 @@ namespace IEC61850.Server
/// <value>The IEC 61850 edition to use.</value> /// <value>The IEC 61850 edition to use.</value>
public Iec61850Edition Edition public Iec61850Edition Edition
{ {
get { get
return (Iec61850Edition)IedServerConfig_getEdition (self); {
return (Iec61850Edition)IedServerConfig_getEdition(self);
} }
set { set
IedServerConfig_setEdition (self, (byte) value); {
IedServerConfig_setEdition(self, (byte)value);
} }
} }
@ -194,11 +207,13 @@ namespace IEC61850.Server
/// <value>The max number of MMS client connections.</value> /// <value>The max number of MMS client connections.</value>
public int MaxMmsConnections public int MaxMmsConnections
{ {
get { get
return IedServerConfig_getMaxMmsConnections (self); {
return IedServerConfig_getMaxMmsConnections(self);
} }
set { set
IedServerConfig_setMaxMmsConnections (self, value); {
IedServerConfig_setMaxMmsConnections(self, value);
} }
} }
@ -208,11 +223,13 @@ namespace IEC61850.Server
/// <value><c>true</c> if dynamic data set service enabled; otherwise, <c>false</c>.</value> /// <value><c>true</c> if dynamic data set service enabled; otherwise, <c>false</c>.</value>
public bool DynamicDataSetServiceEnabled public bool DynamicDataSetServiceEnabled
{ {
get { get
return IedServerConfig_isDynamicDataSetServiceEnabled (self); {
return IedServerConfig_isDynamicDataSetServiceEnabled(self);
} }
set { set
IedServerConfig_enableDynamicDataSetService (self, value); {
IedServerConfig_enableDynamicDataSetService(self, value);
} }
} }
@ -222,11 +239,13 @@ namespace IEC61850.Server
/// <value>The max. number data set entries.</value> /// <value>The max. number data set entries.</value>
public int MaxDataSetEntries public int MaxDataSetEntries
{ {
get { get
return IedServerConfig_getMaxDatasSetEntries (self); {
return IedServerConfig_getMaxDatasSetEntries(self);
} }
set { set
IedServerConfig_setMaxDataSetEntries (self, value); {
IedServerConfig_setMaxDataSetEntries(self, value);
} }
} }
@ -236,11 +255,13 @@ namespace IEC61850.Server
/// <value>The max. number of association specific data sets.</value> /// <value>The max. number of association specific data sets.</value>
public int MaxAssociationSpecificDataSets public int MaxAssociationSpecificDataSets
{ {
get { get
return IedServerConfig_getMaxAssociationSpecificDataSets (self); {
return IedServerConfig_getMaxAssociationSpecificDataSets(self);
} }
set { set
IedServerConfig_setMaxAssociationSpecificDataSets (self, value); {
IedServerConfig_setMaxAssociationSpecificDataSets(self, value);
} }
} }
@ -250,11 +271,13 @@ namespace IEC61850.Server
/// <value>The max. numebr of domain specific data sets.</value> /// <value>The max. numebr of domain specific data sets.</value>
public int MaxDomainSpecificDataSets public int MaxDomainSpecificDataSets
{ {
get { get
return IedServerConfig_getMaxDomainSpecificDataSets (self); {
return IedServerConfig_getMaxDomainSpecificDataSets(self);
} }
set { set
IedServerConfig_setMaxDomainSpecificDataSets (self, value); {
IedServerConfig_setMaxDomainSpecificDataSets(self, value);
} }
} }
@ -274,6 +297,22 @@ namespace IEC61850.Server
} }
} }
/// <summary>
/// Enable/Disable the presence of ResvTms attribute in BRCBs (buffered report control blocks)
/// </summary>
/// <value><c>true</c> if BRCB has ResvTms; otherwise, <c>false</c>.</value>
public bool BRCBHasResvTms
{
get
{
return IedServerConfig_isResvTmsForBRCBEnabled(self);
}
set
{
IedServerConfig_enableResvTmsForBRCB(self, value);
}
}
/// <summary> /// <summary>
/// Releases all resource used by the <see cref="IEC61850.Server.IedServerConfig"/> object. /// Releases all resource used by the <see cref="IEC61850.Server.IedServerConfig"/> object.
/// </summary> /// </summary>
@ -284,9 +323,11 @@ namespace IEC61850.Server
/// <see cref="IEC61850.Server.IedServerConfig"/> was occupying.</remarks> /// <see cref="IEC61850.Server.IedServerConfig"/> was occupying.</remarks>
public void Dispose() public void Dispose()
{ {
lock (this) { lock (this)
if (self != IntPtr.Zero) { {
IedServerConfig_destroy (self); if (self != IntPtr.Zero)
{
IedServerConfig_destroy(self);
self = IntPtr.Zero; self = IntPtr.Zero;
} }
} }
@ -294,7 +335,7 @@ namespace IEC61850.Server
~IedServerConfig() ~IedServerConfig()
{ {
Dispose (); Dispose();
} }
} }
} }

@ -89,6 +89,9 @@ struct sIedServerConfig
/** enable visibility of SGCB.ResvTms (default: true) */ /** enable visibility of SGCB.ResvTms (default: true) */
bool enableResvTmsForSGCB; bool enableResvTmsForSGCB;
/** BRCB has resvTms attribute - only edition 2 (default: true) */
bool enableResvTmsForBRCB;
}; };
/** /**
@ -304,6 +307,22 @@ IedServerConfig_enableEditSG(IedServerConfig self, bool enable);
LIB61850_API void LIB61850_API void
IedServerConfig_enableResvTmsForSGCB(IedServerConfig self, bool enable); IedServerConfig_enableResvTmsForSGCB(IedServerConfig self, bool enable);
/**
* \brief Enable/disable the presence of BRCB.ResvTms
*
* \param[in] enable set true to enable, otherwise false (default value it true)
*/
LIB61850_API void
IedServerConfig_enableResvTmsForBRCB(IedServerConfig self, bool enable);
/**
* \brief ResvTms for BRCB enabled (visible)
*
* \return true if enabled, false otherwise
*/
LIB61850_API bool
IedServerConfig_isResvTmsForBRCBEnabled(IedServerConfig self);
/** /**
* \brief Enable/disable using the integrated GOOSE publisher for configured GoCBs * \brief Enable/disable using the integrated GOOSE publisher for configured GoCBs
* *

@ -47,6 +47,7 @@ struct sIedServer
#if (CONFIG_IEC61850_REPORT_SERVICE == 1) #if (CONFIG_IEC61850_REPORT_SERVICE == 1)
int reportBufferSizeBRCBs; int reportBufferSizeBRCBs;
int reportBufferSizeURCBs; int reportBufferSizeURCBs;
bool enableBRCBResvTms;
#endif #endif
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)

@ -482,10 +482,16 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio
if (serverConfiguration) { if (serverConfiguration) {
self->reportBufferSizeBRCBs = serverConfiguration->reportBufferSize; self->reportBufferSizeBRCBs = serverConfiguration->reportBufferSize;
self->reportBufferSizeURCBs = serverConfiguration->reportBufferSizeURCBs; self->reportBufferSizeURCBs = serverConfiguration->reportBufferSizeURCBs;
self->enableBRCBResvTms = serverConfiguration->enableResvTmsForBRCB;
} }
else { else {
self->reportBufferSizeBRCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->reportBufferSizeBRCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE;
self->reportBufferSizeURCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->reportBufferSizeURCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE;
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
self->enableBRCBResvTms = true;
#else
self->enableBRCBResvTms = false;
#endif
} }
#endif #endif

@ -55,6 +55,7 @@ IedServerConfig_create()
self->edition = IEC_61850_EDITION_2; self->edition = IEC_61850_EDITION_2;
self->maxMmsConnections = 5; self->maxMmsConnections = 5;
self->enableEditSG = true; self->enableEditSG = true;
self->enableResvTmsForBRCB = true;
} }
return self; return self;
@ -199,6 +200,19 @@ IedServerConfig_enableResvTmsForSGCB(IedServerConfig self, bool enable)
self->enableResvTmsForSGCB = enable; self->enableResvTmsForSGCB = enable;
} }
void
IedServerConfig_enableResvTmsForBRCB(IedServerConfig self, bool enable)
{
self->enableResvTmsForBRCB = enable;
}
bool
IedServerConfig_isResvTmsForBRCBEnabled(IedServerConfig self)
{
return self->enableResvTmsForBRCB;
}
void void
IedServerConfig_useIntegratedGoosePublisher(IedServerConfig self, bool enable) IedServerConfig_useIntegratedGoosePublisher(IedServerConfig self, bool enable)
{ {

@ -269,10 +269,16 @@ ReportControl_getRCBValue(ReportControl* rc, char* elementName)
if (rc->server->edition >= IEC_61850_EDITION_2) { if (rc->server->edition >= IEC_61850_EDITION_2) {
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (rc->server->enableBRCBResvTms) {
if (strcmp(elementName, "ResvTms") == 0) if (strcmp(elementName, "ResvTms") == 0)
return MmsValue_getElement(rc->rcbValues, 13); return MmsValue_getElement(rc->rcbValues, 13);
if (strcmp(elementName, "Owner") == 0) if (strcmp(elementName, "Owner") == 0)
return MmsValue_getElement(rc->rcbValues, 14); return MmsValue_getElement(rc->rcbValues, 14);
}
else {
if (strcmp(elementName, "Owner") == 0)
return MmsValue_getElement(rc->rcbValues, 13);
}
#else #else
if (strcmp(elementName, "Owner") == 0) if (strcmp(elementName, "Owner") == 0)
return MmsValue_getElement(rc->rcbValues, 13); return MmsValue_getElement(rc->rcbValues, 13);
@ -1118,6 +1124,7 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock,
if (reportControl->server->edition >= IEC_61850_EDITION_2) { if (reportControl->server->edition >= IEC_61850_EDITION_2) {
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (reportControl->server->enableBRCBResvTms)
brcbElementCount++; brcbElementCount++;
#endif #endif
@ -1249,9 +1256,9 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock,
int currentIndex = 13; int currentIndex = 13;
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
int resvTmsIndex = currentIndex; int resvTmsIndex = currentIndex;
if (reportControl->server->enableBRCBResvTms) {
namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification));
namedVariable->name = StringUtils_copyString("ResvTms"); namedVariable->name = StringUtils_copyString("ResvTms");
namedVariable->type = MMS_INTEGER; namedVariable->type = MMS_INTEGER;
@ -1259,6 +1266,7 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock,
rcb->typeSpec.structure.elements[currentIndex] = namedVariable; rcb->typeSpec.structure.elements[currentIndex] = namedVariable;
mmsValue->value.structure.components[currentIndex] = MmsValue_newInteger(16); mmsValue->value.structure.components[currentIndex] = MmsValue_newInteger(16);
currentIndex++; currentIndex++;
}
#endif /* (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) */ #endif /* (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) */
if (reportControl->hasOwner) { if (reportControl->hasOwner) {
@ -1281,7 +1289,9 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock,
} }
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (reportControl->server->enableBRCBResvTms) {
MmsValue_setInt16(mmsValue->value.structure.components[resvTmsIndex], reportControl->resvTms); MmsValue_setInt16(mmsValue->value.structure.components[resvTmsIndex], reportControl->resvTms);
}
#endif #endif
} }
@ -1569,9 +1579,11 @@ checkReservationTimeout(MmsMapping* self, ReportControl* rc)
printf("IED_SERVER: reservation timeout expired for %s.%s\n", rc->parentLN->name, rc->name); printf("IED_SERVER: reservation timeout expired for %s.%s\n", rc->parentLN->name, rc->name);
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (self->iedServer->enableBRCBResvTms) {
MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms"); MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms");
if (resvTmsVal) if (resvTmsVal)
MmsValue_setInt16(resvTmsVal, rc->resvTms); MmsValue_setInt16(resvTmsVal, rc->resvTms);
}
#endif #endif
rc->reservationTimeout = 0; rc->reservationTimeout = 0;
@ -1641,9 +1653,11 @@ reserveRcb(ReportControl* rc, MmsServerConnection connection)
if (rc->buffered) { if (rc->buffered) {
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (rc->server->enableBRCBResvTms) {
MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms"); MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms");
if (resvTmsVal) if (resvTmsVal)
MmsValue_setInt16(resvTmsVal, rc->resvTms); MmsValue_setInt16(resvTmsVal, rc->resvTms);
}
#endif #endif
} }
else { else {
@ -1655,7 +1669,6 @@ reserveRcb(ReportControl* rc, MmsServerConnection connection)
updateOwner(rc, connection); updateOwner(rc, connection);
} }
#if 1
MmsDataAccessError MmsDataAccessError
Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* elementName, MmsValue* value, Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* elementName, MmsValue* value,
MmsServerConnection connection) MmsServerConnection connection)
@ -2087,7 +2100,6 @@ exit_function:
return retVal; return retVal;
} }
#endif
void void
Reporting_deactivateReportsForConnection(MmsMapping* self, MmsServerConnection connection) Reporting_deactivateReportsForConnection(MmsMapping* self, MmsServerConnection connection)

Loading…
Cancel
Save