From a5bcd3c2514581b91fbf6d306192baddf2ba3600 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 13 Nov 2020 12:25:44 +0100 Subject: [PATCH] - IED server: fixed problem - control not unselected after connection is closed for sboClass "operate-many" --- src/iec61850/server/mms_mapping/control.c | 25 ++++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index cb09e8a0..54f8c563 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -620,14 +620,19 @@ exitControlTask(ControlObject* self) } static void -abortControlOperation(ControlObject* self) +abortControlOperation(ControlObject* self, bool unconditional) { if ((self->ctlModel == 2) || (self->ctlModel == 4)) { - if (isSboClassOperateOnce(self)) + if (unconditional) { unselectObject(self); - else - setState(self, STATE_READY); + } + else { + if (isSboClassOperateOnce(self)) + unselectObject(self); + else + setState(self, STATE_READY); + } } else setState(self, STATE_READY); @@ -796,7 +801,7 @@ executeStateMachine: resetAddCause(controlObject); - abortControlOperation(controlObject); + abortControlOperation(controlObject, false); exitControlTask(controlObject); } else if (dynamicCheckResult == CONTROL_RESULT_OK) { @@ -861,7 +866,7 @@ executeStateMachine: #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ } - abortControlOperation(controlObject); + abortControlOperation(controlObject, false); exitControlTask(controlObject); setOpOk(controlObject, false, currentTimeInMs); @@ -1284,7 +1289,7 @@ bool ControlObject_unselect(ControlObject* self, MmsServerConnection connection) { if (self->mmsConnection == connection) { - abortControlOperation(self); + abortControlOperation(self, true); return true; } else @@ -1386,7 +1391,7 @@ Control_processControlActions(MmsMapping* self, uint64_t currentTimeInMs) /* leave state Perform Test */ setOpRcvd(controlObject, false); - abortControlOperation(controlObject); + abortControlOperation(controlObject, false); resetAddCause(controlObject); } @@ -2189,7 +2194,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari /* leave state Perform Test */ setOpRcvd(controlObject, false); - abortControlOperation(controlObject); + abortControlOperation(controlObject, false); if ((controlObject->ctlModel == 2) || (controlObject->ctlModel == 4)) unselectObject(controlObject); @@ -2263,7 +2268,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari if (controlObject->timeActivatedOperate) { controlObject->timeActivatedOperate = false; - abortControlOperation(controlObject); + abortControlOperation(controlObject, false); indication = DATA_ACCESS_ERROR_SUCCESS;