diff --git a/src/iec61850/client/client_control.c b/src/iec61850/client/client_control.c index ebe24319..1f64efed 100644 --- a/src/iec61850/client/client_control.c +++ b/src/iec61850/client/client_control.c @@ -57,6 +57,7 @@ struct sControlObjectClient LastApplError lastApplError; MmsError lastMmsError; + MmsDataAccessError lastAccessError; /* last error of read or write command */ CommandTerminationHandler commandTerminationHandler; void* commandTerminaionHandlerParameter; @@ -316,7 +317,10 @@ ControlObjectClient_getCtlValType(ControlObjectClient self) IedClientError ControlObjectClient_getLastError(ControlObjectClient self) { - return iedConnection_mapMmsErrorToIedError(self->lastMmsError); + if (self->lastAccessError != DATA_ACCESS_ERROR_SUCCESS) + return iedConnection_mapDataAccessErrorToIedError(self->lastAccessError); + else + return iedConnection_mapMmsErrorToIedError(self->lastMmsError); } void @@ -501,13 +505,14 @@ ControlObjectClient_operate(ControlObjectClient self, MmsValue* ctlVal, uint64_t MmsError mmsError; - MmsConnection_writeVariable(IedConnection_getMmsConnection(self->connection), + MmsDataAccessError writeResult = MmsConnection_writeVariable(IedConnection_getMmsConnection(self->connection), &mmsError, domainId, itemId, operParameters); MmsValue_setElement(operParameters, 0, NULL); MmsValue_delete(operParameters); self->lastMmsError = mmsError; + self->lastAccessError = writeResult; if (mmsError != MMS_ERROR_NONE) { if (DEBUG_IED_CLIENT) @@ -544,6 +549,9 @@ internalOperateHandler(uint32_t invokeId, void* parameter, MmsError err, MmsData bool success = false; + self->lastMmsError = err; + self->lastAccessError = accessError; + if (iedError == IED_ERROR_OK) { iedError = iedConnection_mapDataAccessErrorToIedError(accessError); @@ -728,6 +736,7 @@ ControlObjectClient_selectWithValue(ControlObjectClient self, MmsValue* ctlVal) MmsValue_delete(selValParameters); self->lastMmsError = mmsError; + self->lastAccessError = writeResult; if (mmsError != MMS_ERROR_NONE) { if (DEBUG_IED_CLIENT) @@ -765,6 +774,9 @@ internalSelWithValHandler(uint32_t invokeId, void* parameter, MmsError err, MmsD bool success = false; + self->lastMmsError = err; + self->lastAccessError = accessError; + if (iedError == IED_ERROR_OK) { iedError = iedConnection_mapDataAccessErrorToIedError(accessError); @@ -881,6 +893,7 @@ ControlObjectClient_select(ControlObjectClient self) self->ctlNum++; self->lastMmsError = mmsError; + self->lastAccessError = DATA_ACCESS_ERROR_SUCCESS; if (value == NULL) { if (DEBUG_IED_CLIENT) @@ -899,6 +912,12 @@ ControlObjectClient_select(ControlObjectClient self) selected = true; } } + else if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) { + self->lastAccessError = MmsValue_getDataAccessError(value); + + if (DEBUG_IED_CLIENT) + printf("IED_CLIENT: select returned data-access-error: %i\n", self->lastAccessError); + } else { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: select: unexpected response from server!\n"); @@ -925,12 +944,17 @@ internalSelectHandler(uint32_t invokeId, void* parameter, MmsError err, MmsValue bool success = false; + self->lastMmsError = err; + self->lastAccessError = DATA_ACCESS_ERROR_SUCCESS; + self->ctlNum++; if (iedError == IED_ERROR_OK) { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) { - iedError = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); + MmsDataAccessError dataAccessError = MmsValue_getDataAccessError(value); + self->lastAccessError = dataAccessError; + iedError = iedConnection_mapDataAccessErrorToIedError(dataAccessError); } else if (MmsValue_getType(value) == MMS_VISIBLE_STRING) { @@ -1082,6 +1106,7 @@ ControlObjectClient_cancel(ControlObjectClient self) &mmsError, domainId, itemId, cancelParameters); self->lastMmsError = mmsError; + self->lastAccessError = writeResult; MmsValue_setElement(cancelParameters, 0, NULL); MmsValue_delete(cancelParameters); @@ -1117,6 +1142,9 @@ internalCancelHandler(uint32_t invokeId, void* parameter, MmsError err, MmsDataA bool success = false; + self->lastMmsError = err; + self->lastAccessError = accessError; + if (iedError == IED_ERROR_OK) { iedError = iedConnection_mapDataAccessErrorToIedError(accessError);