- IED Server: added support for transient data objects

pull/202/head
Michael Zillgith 6 years ago
parent 9f86812002
commit 925c19bff6

@ -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 #define TRG_OPT_DATA_CHANGED 1
/** Report will be triggered when quality changes */ /** Report will be triggered when quality changes */
@ -106,6 +106,9 @@ typedef enum {
/** Report will be triggered by GI (general interrogation) request */ /** Report will be triggered by GI (general interrogation) request */
#define TRG_OPT_GI 16 #define TRG_OPT_GI 16
/** Report will be triggered only on rising edge (transient variable */
#define TRG_OPT_TRANSIENT 128
/** @} */ /** @} */

@ -989,6 +989,11 @@ IedServer_updateAttributeValue(IedServer self, DataAttribute* dataAttribute, Mms
checkForUpdateTrigger(self, dataAttribute); checkForUpdateTrigger(self, dataAttribute);
else { 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) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->dataModelLock); Semaphore_wait(self->dataModelLock);
#endif #endif
@ -1002,6 +1007,7 @@ IedServer_updateAttributeValue(IedServer self, DataAttribute* dataAttribute, Mms
checkForChangedTriggers(self, dataAttribute); checkForChangedTriggers(self, dataAttribute);
} }
} }
}
void void
IedServer_updateFloatAttributeValue(IedServer self, DataAttribute* dataAttribute, float value) IedServer_updateFloatAttributeValue(IedServer self, DataAttribute* dataAttribute, float value)
@ -1161,6 +1167,14 @@ IedServer_updateBooleanAttributeValue(IedServer self, DataAttribute* dataAttribu
checkForUpdateTrigger(self, dataAttribute); checkForUpdateTrigger(self, dataAttribute);
} }
else { else {
bool callCheckTriggers = true;
if (dataAttribute->triggerOptions & TRG_OPT_TRANSIENT) {
if (currentValue == true)
callCheckTriggers = false;
}
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->dataModelLock); Semaphore_wait(self->dataModelLock);
#endif #endif
@ -1169,6 +1183,7 @@ IedServer_updateBooleanAttributeValue(IedServer self, DataAttribute* dataAttribu
Semaphore_post(self->dataModelLock); Semaphore_post(self->dataModelLock);
#endif #endif
if (callCheckTriggers)
checkForChangedTriggers(self, dataAttribute); checkForChangedTriggers(self, dataAttribute);
} }
} }

Loading…
Cancel
Save