From 925c19bff6690ac8693bd66a67ef1d2726b5d36c Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 14 Jan 2020 18:06:34 +0100 Subject: [PATCH] - IED Server: added support for transient data objects --- src/iec61850/inc/iec61850_common.h | 5 ++++- src/iec61850/server/impl/ied_server.c | 25 ++++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/iec61850/inc/iec61850_common.h b/src/iec61850/inc/iec61850_common.h index 1cc04ebd..dfe1c553 100644 --- a/src/iec61850/inc/iec61850_common.h +++ b/src/iec61850/inc/iec61850_common.h @@ -92,7 +92,7 @@ typedef enum { * @{ */ -/** Report will be triggerd when data changes */ +/** Report will be triggered when data changes */ #define TRG_OPT_DATA_CHANGED 1 /** Report will be triggered when quality changes */ @@ -106,6 +106,9 @@ typedef enum { /** Report will be triggered by GI (general interrogation) request */ #define TRG_OPT_GI 16 + +/** Report will be triggered only on rising edge (transient variable */ +#define TRG_OPT_TRANSIENT 128 /** @} */ diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index f6b997ae..58a2afd1 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -989,17 +989,23 @@ IedServer_updateAttributeValue(IedServer self, DataAttribute* dataAttribute, Mms checkForUpdateTrigger(self, dataAttribute); else { + if (dataAttribute->type == IEC61850_BOOLEAN) { + /* Special treatment because of transient option */ + IedServer_updateBooleanAttributeValue(self, dataAttribute, MmsValue_getBoolean(value)); + } + else { #if (CONFIG_MMS_THREADLESS_STACK != 1) - Semaphore_wait(self->dataModelLock); + Semaphore_wait(self->dataModelLock); #endif - MmsValue_update(dataAttribute->mmsValue, value); + MmsValue_update(dataAttribute->mmsValue, value); #if (CONFIG_MMS_THREADLESS_STACK != 1) - Semaphore_post(self->dataModelLock); + Semaphore_post(self->dataModelLock); #endif - checkForChangedTriggers(self, dataAttribute); + checkForChangedTriggers(self, dataAttribute); + } } } @@ -1161,6 +1167,14 @@ IedServer_updateBooleanAttributeValue(IedServer self, DataAttribute* dataAttribu checkForUpdateTrigger(self, dataAttribute); } else { + + bool callCheckTriggers = true; + + if (dataAttribute->triggerOptions & TRG_OPT_TRANSIENT) { + if (currentValue == true) + callCheckTriggers = false; + } + #if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->dataModelLock); #endif @@ -1169,7 +1183,8 @@ IedServer_updateBooleanAttributeValue(IedServer self, DataAttribute* dataAttribu Semaphore_post(self->dataModelLock); #endif - checkForChangedTriggers(self, dataAttribute); + if (callCheckTriggers) + checkForChangedTriggers(self, dataAttribute); } }