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;
MmsError lastMmsError;
MmsDataAccessError lastAccessError; /* last error of read or write command */
CommandTerminationHandler commandTerminationHandler;
void* commandTerminaionHandlerParameter;
@ -316,6 +317,9 @@ ControlObjectClient_getCtlValType(ControlObjectClient self)
IedClientError
ControlObjectClient_getLastError(ControlObjectClient self)
{
if (self->lastAccessError != DATA_ACCESS_ERROR_SUCCESS)
return iedConnection_mapDataAccessErrorToIedError(self->lastAccessError);
else
return iedConnection_mapMmsErrorToIedError(self->lastMmsError);
}
@ -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);

Loading…
Cancel
Save