From 38fe325c907934176ee3245c3aab8bf59de62e6e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 1 May 2020 07:33:57 +0200 Subject: [PATCH] - IEC 61850 server: fixed - control model - peer connection is not always available when control handlers are called (#232) --- demos/beaglebone/beagle_demo.c | 3 +-- src/iec61850/server/mms_mapping/control.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/demos/beaglebone/beagle_demo.c b/demos/beaglebone/beagle_demo.c index f1ed46d1..c728ad84 100644 --- a/demos/beaglebone/beagle_demo.c +++ b/demos/beaglebone/beagle_demo.c @@ -244,7 +244,7 @@ int main(int argc, char** argv) { MmsValue* DPCSO1_stVal = IedServer_getAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1_stVal); MmsValue_setBitStringFromInteger(DPCSO1_stVal, 1); /* set DPC to OFF */ - /* Intitalize setting values */ + /* Initialize setting values */ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_OpDlTmms_setVal, ledOffTimeMs); IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_RsDlTmms_setVal, ledOnTimeMs); @@ -278,7 +278,6 @@ int main(int argc, char** argv) { if (automaticOperationMode) { if (nextLedToggleTime <= currentTime) { - if (ledStateValue) nextLedToggleTime = currentTime + ledOffTimeMs; else diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 7a39666a..77be9623 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -702,6 +702,8 @@ unselectObject(ControlObject* self) setStSeld(self, false); + self->mmsConnection = NULL; + if (DEBUG_IED_SERVER) printf("IED_SERVER: control %s/%s.%s unselected\n", MmsDomain_getName(self->mmsDomain), self->lnName, self->name); } @@ -1269,6 +1271,7 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia /* opRcvd must not be set here! */ controlObject->addCauseValue = ADD_CAUSE_UNKNOWN; + controlObject->mmsConnection = connection; if (controlObject->checkHandler != NULL) { /* perform operative tests */ @@ -1480,6 +1483,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari controlObject->isSelect = 1; + controlObject->mmsConnection = connection; + checkResult = controlObject->checkHandler((ControlAction) controlObject, controlObject->checkHandlerParameter, ctlVal, testCondition, interlockCheck); @@ -1500,6 +1505,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari ControlObject_sendLastApplError(controlObject, connection, "SBOw", 0, controlObject->addCauseValue, ctlNum, origin, true); + controlObject->mmsConnection = NULL; + if (DEBUG_IED_SERVER) printf("IED_SERVER: SBOw - select rejected by application!\n"); } @@ -1620,7 +1627,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari } - if(checkResult == CONTROL_ACCEPTED){ + if (checkResult == CONTROL_ACCEPTED) { initiateControlTask(controlObject); setState(controlObject, STATE_WAIT_FOR_ACTIVATION_TIME); @@ -1630,7 +1637,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari indication = DATA_ACCESS_ERROR_SUCCESS; } - else{ + else { indication = (MmsDataAccessError) checkResult; } } @@ -1649,6 +1656,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari setOpRcvd(controlObject, true); controlObject->addCauseValue = ADD_CAUSE_UNKNOWN; + controlObject->mmsConnection = connection; if (controlObject->checkHandler != NULL) { /* perform operative tests */