From 3a820f354694b790bfb456011023501baa54eefd Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 13 Nov 2019 12:30:06 +0100 Subject: [PATCH] - improved error handling in iec61850_client_example1 --- .../client_example1.c | 75 +++++++++++-------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/examples/iec61850_client_example1/client_example1.c b/examples/iec61850_client_example1/client_example1.c index f5b23575..eb085a6b 100644 --- a/examples/iec61850_client_example1/client_example1.c +++ b/examples/iec61850_client_example1/client_example1.c @@ -54,8 +54,15 @@ int main(int argc, char** argv) { MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX); if (value != NULL) { - float fval = MmsValue_toFloat(value); - printf("read float value: %f\n", fval); + + if (MmsValue_getType(value) == MMS_FLOAT) { + float fval = MmsValue_toFloat(value); + printf("read float value: %f\n", fval); + } + else if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) { + printf("Failed to read value (error code: %i)\n", MmsValue_getDataAccessError(value)); + } + MmsValue_delete(value); } @@ -64,62 +71,64 @@ int main(int argc, char** argv) { IedConnection_writeObject(con, &error, "simpleIOGenericIO/GGIO1.NamPlt.vendor", IEC61850_FC_DC, value); if (error != IED_ERROR_OK) - printf("failed to write simpleIOGenericIO/GGIO1.NamPlt.vendor!\n"); + printf("failed to write simpleIOGenericIO/GGIO1.NamPlt.vendor! (error code: %i)\n", error); MmsValue_delete(value); - /* read data set */ ClientDataSet clientDataSet = IedConnection_readDataSetValues(con, &error, "simpleIOGenericIO/LLN0.Events", NULL); - if (clientDataSet == NULL) + if (clientDataSet == NULL) { printf("failed to read dataset\n"); + goto close_connection; + } /* Read RCB values */ ClientReportControlBlock rcb = IedConnection_getRCBValues(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01", NULL); + if (rcb) { + bool rptEna = ClientReportControlBlock_getRptEna(rcb); - bool rptEna = ClientReportControlBlock_getRptEna(rcb); + printf("RptEna = %i\n", rptEna); - printf("RptEna = %i\n", rptEna); + /* Install handler for reports */ + IedConnection_installReportHandler(con, "simpleIOGenericIO/LLN0.RP.EventsRCB01", + ClientReportControlBlock_getRptId(rcb), reportCallbackFunction, NULL); - /* Install handler for reports */ - IedConnection_installReportHandler(con, "simpleIOGenericIO/LLN0.RP.EventsRCB01", - ClientReportControlBlock_getRptId(rcb), reportCallbackFunction, NULL); + /* Set trigger options and enable report */ + ClientReportControlBlock_setTrgOps(rcb, TRG_OPT_DATA_UPDATE | TRG_OPT_INTEGRITY | TRG_OPT_GI); + ClientReportControlBlock_setRptEna(rcb, true); + ClientReportControlBlock_setIntgPd(rcb, 5000); + IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA | RCB_ELEMENT_TRG_OPS | RCB_ELEMENT_INTG_PD, true); - /* Set trigger options and enable report */ - ClientReportControlBlock_setTrgOps(rcb, TRG_OPT_DATA_UPDATE | TRG_OPT_INTEGRITY | TRG_OPT_GI); - ClientReportControlBlock_setRptEna(rcb, true); - ClientReportControlBlock_setIntgPd(rcb, 5000); - IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA | RCB_ELEMENT_TRG_OPS | RCB_ELEMENT_INTG_PD, true); + if (error != IED_ERROR_OK) + printf("report activation failed (code: %i)\n", error); - if (error != IED_ERROR_OK) - printf("report activation failed (code: %i)\n", error); + Thread_sleep(1000); - Thread_sleep(1000); + /* trigger GI report */ + ClientReportControlBlock_setGI(rcb, true); + IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_GI, true); - /* trigger GI report */ - ClientReportControlBlock_setGI(rcb, true); - IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_GI, true); + if (error != IED_ERROR_OK) + printf("Error triggering a GI report (code: %i)\n", error); - if (error != IED_ERROR_OK) - printf("Error triggering a GI report (code: %i)\n", error); - - Thread_sleep(60000); + Thread_sleep(60000); - /* disable reporting */ - ClientReportControlBlock_setRptEna(rcb, false); - IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA, true); + /* disable reporting */ + ClientReportControlBlock_setRptEna(rcb, false); + IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA, true); - if (error != IED_ERROR_OK) - printf("disable reporting failed (code: %i)\n", error); + if (error != IED_ERROR_OK) + printf("disable reporting failed (code: %i)\n", error); - ClientDataSet_destroy(clientDataSet); + ClientDataSet_destroy(clientDataSet); - ClientReportControlBlock_destroy(rcb); + ClientReportControlBlock_destroy(rcb); + } - close_connection: +close_connection: IedConnection_close(con); }