IEC 61850 client: ControlObjectClient_getLastError provides access to data access error information of last control action

pull/179/head
Michael Zillgith 6 years ago
parent dfaae6662d
commit 4254af3ff9

@ -57,6 +57,7 @@ struct sControlObjectClient
LastApplError lastApplError; LastApplError lastApplError;
MmsError lastMmsError; MmsError lastMmsError;
MmsDataAccessError lastAccessError; /* last error of read or write command */
CommandTerminationHandler commandTerminationHandler; CommandTerminationHandler commandTerminationHandler;
void* commandTerminaionHandlerParameter; void* commandTerminaionHandlerParameter;
@ -316,7 +317,10 @@ ControlObjectClient_getCtlValType(ControlObjectClient self)
IedClientError IedClientError
ControlObjectClient_getLastError(ControlObjectClient self) 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 void
@ -501,13 +505,14 @@ ControlObjectClient_operate(ControlObjectClient self, MmsValue* ctlVal, uint64_t
MmsError mmsError; MmsError mmsError;
MmsConnection_writeVariable(IedConnection_getMmsConnection(self->connection), MmsDataAccessError writeResult = MmsConnection_writeVariable(IedConnection_getMmsConnection(self->connection),
&mmsError, domainId, itemId, operParameters); &mmsError, domainId, itemId, operParameters);
MmsValue_setElement(operParameters, 0, NULL); MmsValue_setElement(operParameters, 0, NULL);
MmsValue_delete(operParameters); MmsValue_delete(operParameters);
self->lastMmsError = mmsError; self->lastMmsError = mmsError;
self->lastAccessError = writeResult;
if (mmsError != MMS_ERROR_NONE) { if (mmsError != MMS_ERROR_NONE) {
if (DEBUG_IED_CLIENT) if (DEBUG_IED_CLIENT)
@ -544,6 +549,9 @@ internalOperateHandler(uint32_t invokeId, void* parameter, MmsError err, MmsData
bool success = false; bool success = false;
self->lastMmsError = err;
self->lastAccessError = accessError;
if (iedError == IED_ERROR_OK) { if (iedError == IED_ERROR_OK) {
iedError = iedConnection_mapDataAccessErrorToIedError(accessError); iedError = iedConnection_mapDataAccessErrorToIedError(accessError);
@ -728,6 +736,7 @@ ControlObjectClient_selectWithValue(ControlObjectClient self, MmsValue* ctlVal)
MmsValue_delete(selValParameters); MmsValue_delete(selValParameters);
self->lastMmsError = mmsError; self->lastMmsError = mmsError;
self->lastAccessError = writeResult;
if (mmsError != MMS_ERROR_NONE) { if (mmsError != MMS_ERROR_NONE) {
if (DEBUG_IED_CLIENT) if (DEBUG_IED_CLIENT)
@ -765,6 +774,9 @@ internalSelWithValHandler(uint32_t invokeId, void* parameter, MmsError err, MmsD
bool success = false; bool success = false;
self->lastMmsError = err;
self->lastAccessError = accessError;
if (iedError == IED_ERROR_OK) { if (iedError == IED_ERROR_OK) {
iedError = iedConnection_mapDataAccessErrorToIedError(accessError); iedError = iedConnection_mapDataAccessErrorToIedError(accessError);
@ -881,6 +893,7 @@ ControlObjectClient_select(ControlObjectClient self)
self->ctlNum++; self->ctlNum++;
self->lastMmsError = mmsError; self->lastMmsError = mmsError;
self->lastAccessError = DATA_ACCESS_ERROR_SUCCESS;
if (value == NULL) { if (value == NULL) {
if (DEBUG_IED_CLIENT) if (DEBUG_IED_CLIENT)
@ -899,6 +912,12 @@ ControlObjectClient_select(ControlObjectClient self)
selected = true; 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 { else {
if (DEBUG_IED_CLIENT) if (DEBUG_IED_CLIENT)
printf("IED_CLIENT: select: unexpected response from server!\n"); 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; bool success = false;
self->lastMmsError = err;
self->lastAccessError = DATA_ACCESS_ERROR_SUCCESS;
self->ctlNum++; self->ctlNum++;
if (iedError == IED_ERROR_OK) { if (iedError == IED_ERROR_OK) {
if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) { 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) { else if (MmsValue_getType(value) == MMS_VISIBLE_STRING) {
@ -1082,6 +1106,7 @@ ControlObjectClient_cancel(ControlObjectClient self)
&mmsError, domainId, itemId, cancelParameters); &mmsError, domainId, itemId, cancelParameters);
self->lastMmsError = mmsError; self->lastMmsError = mmsError;
self->lastAccessError = writeResult;
MmsValue_setElement(cancelParameters, 0, NULL); MmsValue_setElement(cancelParameters, 0, NULL);
MmsValue_delete(cancelParameters); MmsValue_delete(cancelParameters);
@ -1117,6 +1142,9 @@ internalCancelHandler(uint32_t invokeId, void* parameter, MmsError err, MmsDataA
bool success = false; bool success = false;
self->lastMmsError = err;
self->lastAccessError = accessError;
if (iedError == IED_ERROR_OK) { if (iedError == IED_ERROR_OK) {
iedError = iedConnection_mapDataAccessErrorToIedError(accessError); iedError = iedConnection_mapDataAccessErrorToIedError(accessError);

Loading…
Cancel
Save