diff --git a/src/iec61850/client/client_control.c b/src/iec61850/client/client_control.c index ad31648d..4cd837ac 100644 --- a/src/iec61850/client/client_control.c +++ b/src/iec61850/client/client_control.c @@ -1285,6 +1285,12 @@ ControlObjectClient_getLastApplError(ControlObjectClient self) return self->lastApplError; } +void +ControlObjectClient_setCtlNum(ControlObjectClient self, uint8_t ctlNum) +{ + self->ctlNum = ctlNum; +} + void controlObjectClient_invokeCommandTerminationHandler(ControlObjectClient self) { diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index d3b58d1a..9d1946e9 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -2231,6 +2231,12 @@ ControlObjectClient_enableInterlockCheck(ControlObjectClient self); LIB61850_API DEPRECATED void ControlObjectClient_enableSynchroCheck(ControlObjectClient self); +/** + * \deprecated Do not use (ctlNum is handled automatically by the library)! Intended for test purposes only. + */ +LIB61850_API DEPRECATED void +ControlObjectClient_setCtlNum(ControlObjectClient self, uint8_t ctlNum); + /** * \brief Set the value of the interlock check flag when a control command is sent * diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 452ac7fc..adb57611 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -2144,8 +2144,6 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari bool testCondition = MmsValue_getBoolean(test); - controlObject->testMode = testCondition; - if ((controlObject->ctlModel == 2) || (controlObject->ctlModel == 4)) { if (controlObject->mmsConnection != connection) { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; @@ -2163,7 +2161,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari MmsValue_equals(origin, controlObject->origin) && MmsValue_equals(ctlNum, controlObject->ctlNum) && (controlObject->interlockCheck == interlockCheck) && - (controlObject->synchroCheck == synchroCheck) + (controlObject->synchroCheck == synchroCheck) && + (controlObject->testMode == testCondition) ) == false) { indication = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; @@ -2191,6 +2190,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari controlObject->synchroCheck = synchroCheck; controlObject->interlockCheck = interlockCheck; controlObject->mmsConnection = connection; + controlObject->testMode = testCondition; CheckHandlerResult checkResult = CONTROL_ACCEPTED; if (controlObject->checkHandler != NULL) { /* perform operative tests */