- 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,6 +107,13 @@ namespace IEC61850.Server
[return: MarshalAs(UnmanagedType.I1)]
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;
public IedServerConfig()
@ -120,10 +127,12 @@ namespace IEC61850.Server
/// <value>The size of the report buffer.</value>
public int ReportBufferSize
{
get {
get
{
return IedServerConfig_getReportBufferSize(self);
}
set {
set
{
IedServerConfig_setReportBufferSize(self, value);
}
}
@ -150,10 +159,12 @@ namespace IEC61850.Server
/// <value>The file service base path.</value>
public string FileServiceBasePath
{
get {
get
{
return Marshal.PtrToStringAnsi(IedServerConfig_getFileServiceBasePath(self));
}
set {
set
{
IedServerConfig_setFileServiceBasePath(self, value);
}
}
@ -180,10 +191,12 @@ namespace IEC61850.Server
/// <value>The IEC 61850 edition to use.</value>
public Iec61850Edition Edition
{
get {
get
{
return (Iec61850Edition)IedServerConfig_getEdition(self);
}
set {
set
{
IedServerConfig_setEdition(self, (byte)value);
}
}
@ -194,10 +207,12 @@ namespace IEC61850.Server
/// <value>The max number of MMS client connections.</value>
public int MaxMmsConnections
{
get {
get
{
return IedServerConfig_getMaxMmsConnections(self);
}
set {
set
{
IedServerConfig_setMaxMmsConnections(self, value);
}
}
@ -208,10 +223,12 @@ namespace IEC61850.Server
/// <value><c>true</c> if dynamic data set service enabled; otherwise, <c>false</c>.</value>
public bool DynamicDataSetServiceEnabled
{
get {
get
{
return IedServerConfig_isDynamicDataSetServiceEnabled(self);
}
set {
set
{
IedServerConfig_enableDynamicDataSetService(self, value);
}
}
@ -222,10 +239,12 @@ namespace IEC61850.Server
/// <value>The max. number data set entries.</value>
public int MaxDataSetEntries
{
get {
get
{
return IedServerConfig_getMaxDatasSetEntries(self);
}
set {
set
{
IedServerConfig_setMaxDataSetEntries(self, value);
}
}
@ -236,10 +255,12 @@ namespace IEC61850.Server
/// <value>The max. number of association specific data sets.</value>
public int MaxAssociationSpecificDataSets
{
get {
get
{
return IedServerConfig_getMaxAssociationSpecificDataSets(self);
}
set {
set
{
IedServerConfig_setMaxAssociationSpecificDataSets(self, value);
}
}
@ -250,10 +271,12 @@ namespace IEC61850.Server
/// <value>The max. numebr of domain specific data sets.</value>
public int MaxDomainSpecificDataSets
{
get {
get
{
return IedServerConfig_getMaxDomainSpecificDataSets(self);
}
set {
set
{
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>
/// Releases all resource used by the <see cref="IEC61850.Server.IedServerConfig"/> object.
/// </summary>
@ -284,8 +323,10 @@ namespace IEC61850.Server
/// <see cref="IEC61850.Server.IedServerConfig"/> was occupying.</remarks>
public void Dispose()
{
lock (this) {
if (self != IntPtr.Zero) {
lock (this)
{
if (self != IntPtr.Zero)
{
IedServerConfig_destroy(self);
self = IntPtr.Zero;
}

@ -89,6 +89,9 @@ struct sIedServerConfig
/** enable visibility of SGCB.ResvTms (default: true) */
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
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
*

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

@ -482,10 +482,16 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio
if (serverConfiguration) {
self->reportBufferSizeBRCBs = serverConfiguration->reportBufferSize;
self->reportBufferSizeURCBs = serverConfiguration->reportBufferSizeURCBs;
self->enableBRCBResvTms = serverConfiguration->enableResvTmsForBRCB;
}
else {
self->reportBufferSizeBRCBs = 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

@ -55,6 +55,7 @@ IedServerConfig_create()
self->edition = IEC_61850_EDITION_2;
self->maxMmsConnections = 5;
self->enableEditSG = true;
self->enableResvTmsForBRCB = true;
}
return self;
@ -199,6 +200,19 @@ IedServerConfig_enableResvTmsForSGCB(IedServerConfig self, bool enable)
self->enableResvTmsForSGCB = enable;
}
void
IedServerConfig_enableResvTmsForBRCB(IedServerConfig self, bool enable)
{
self->enableResvTmsForBRCB = enable;
}
bool
IedServerConfig_isResvTmsForBRCBEnabled(IedServerConfig self)
{
return self->enableResvTmsForBRCB;
}
void
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 (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (rc->server->enableBRCBResvTms) {
if (strcmp(elementName, "ResvTms") == 0)
return MmsValue_getElement(rc->rcbValues, 13);
if (strcmp(elementName, "Owner") == 0)
return MmsValue_getElement(rc->rcbValues, 14);
}
else {
if (strcmp(elementName, "Owner") == 0)
return MmsValue_getElement(rc->rcbValues, 13);
}
#else
if (strcmp(elementName, "Owner") == 0)
return MmsValue_getElement(rc->rcbValues, 13);
@ -1118,6 +1124,7 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock,
if (reportControl->server->edition >= IEC_61850_EDITION_2) {
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (reportControl->server->enableBRCBResvTms)
brcbElementCount++;
#endif
@ -1249,9 +1256,9 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock,
int currentIndex = 13;
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
int resvTmsIndex = currentIndex;
if (reportControl->server->enableBRCBResvTms) {
namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification));
namedVariable->name = StringUtils_copyString("ResvTms");
namedVariable->type = MMS_INTEGER;
@ -1259,6 +1266,7 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock,
rcb->typeSpec.structure.elements[currentIndex] = namedVariable;
mmsValue->value.structure.components[currentIndex] = MmsValue_newInteger(16);
currentIndex++;
}
#endif /* (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) */
if (reportControl->hasOwner) {
@ -1281,7 +1289,9 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock,
}
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (reportControl->server->enableBRCBResvTms) {
MmsValue_setInt16(mmsValue->value.structure.components[resvTmsIndex], reportControl->resvTms);
}
#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);
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (self->iedServer->enableBRCBResvTms) {
MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms");
if (resvTmsVal)
MmsValue_setInt16(resvTmsVal, rc->resvTms);
}
#endif
rc->reservationTimeout = 0;
@ -1641,9 +1653,11 @@ reserveRcb(ReportControl* rc, MmsServerConnection connection)
if (rc->buffered) {
#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1)
if (rc->server->enableBRCBResvTms) {
MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms");
if (resvTmsVal)
MmsValue_setInt16(resvTmsVal, rc->resvTms);
}
#endif
}
else {
@ -1655,7 +1669,6 @@ reserveRcb(ReportControl* rc, MmsServerConnection connection)
updateOwner(rc, connection);
}
#if 1
MmsDataAccessError
Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* elementName, MmsValue* value,
MmsServerConnection connection)
@ -2087,7 +2100,6 @@ exit_function:
return retVal;
}
#endif
void
Reporting_deactivateReportsForConnection(MmsMapping* self, MmsServerConnection connection)

Loading…
Cancel
Save