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); } diff --git a/examples/iec61850_client_example_reporting/client_example_reporting.c b/examples/iec61850_client_example_reporting/client_example_reporting.c index 13423668..f070248a 100644 --- a/examples/iec61850_client_example_reporting/client_example_reporting.c +++ b/examples/iec61850_client_example_reporting/client_example_reporting.c @@ -1,7 +1,7 @@ /* * client_example_reporting.c * - * This example is intended to be used with server_example3 or server_example_goose. + * This example is intended to be used with server_example_basic_io or server_example_goose. */ #include "iec61850_client.h" @@ -40,8 +40,7 @@ reportCallbackFunction(void* parameter, ClientReport report) ctime_r(&unixTime, timeBuf); #endif - printf(" report contains timestamp (%u):", (unsigned int) unixTime); - printf("%s \n", timeBuf); + printf(" report contains timestamp (%u): %s", (unsigned int) unixTime, timeBuf); } int i; @@ -85,9 +84,12 @@ main(int argc, char** argv) if (error == IED_ERROR_OK) { + ClientReportControlBlock rcb = NULL; + ClientDataSet clientDataSet = NULL; + LinkedList dataSetDirectory = NULL; + /* read data set directory */ - LinkedList dataSetDirectory = - IedConnection_getDataSetDirectory(con, &error, "simpleIOGenericIO/LLN0.Events", NULL); + dataSetDirectory = IedConnection_getDataSetDirectory(con, &error, "simpleIOGenericIO/LLN0.Events", NULL); if (error != IED_ERROR_OK) { printf("Reading data set directory failed!\n"); @@ -95,8 +97,6 @@ main(int argc, char** argv) } /* read data set */ - ClientDataSet clientDataSet; - clientDataSet = IedConnection_readDataSetValues(con, &error, "simpleIOGenericIO/LLN0.Events", NULL); if (clientDataSet == NULL) { @@ -105,8 +105,7 @@ main(int argc, char** argv) } /* Read RCB values */ - ClientReportControlBlock rcb = - IedConnection_getRCBValues(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01", NULL); + rcb = IedConnection_getRCBValues(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01", NULL); if (error != IED_ERROR_OK) { printf("getRCBValues service error!\n"); @@ -115,6 +114,7 @@ main(int argc, char** argv) /* prepare the parameters of the RCP */ ClientReportControlBlock_setResv(rcb, true); + ClientReportControlBlock_setTrgOps(rcb, TRG_OPT_DATA_CHANGED | TRG_OPT_QUALITY_CHANGED | TRG_OPT_GI); ClientReportControlBlock_setDataSetReference(rcb, "simpleIOGenericIO/LLN0$Events"); /* NOTE the "$" instead of "." ! */ ClientReportControlBlock_setRptEna(rcb, true); ClientReportControlBlock_setGI(rcb, true); @@ -124,7 +124,7 @@ main(int argc, char** argv) (void*) dataSetDirectory); /* Write RCB parameters and enable report */ - IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RESV | RCB_ELEMENT_DATSET | RCB_ELEMENT_RPT_ENA | RCB_ELEMENT_GI, true); + IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RESV | RCB_ELEMENT_DATSET | RCB_ELEMENT_TRG_OPS | RCB_ELEMENT_RPT_ENA | RCB_ELEMENT_GI, true); if (error != IED_ERROR_OK) { printf("setRCBValues service error!\n"); @@ -156,12 +156,18 @@ main(int argc, char** argv) ClientReportControlBlock_setRptEna(rcb, false); IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA, true); - exit_error: +exit_error: IedConnection_close(con); - ClientDataSet_destroy(clientDataSet); - ClientReportControlBlock_destroy(rcb); + if (clientDataSet) + ClientDataSet_destroy(clientDataSet); + + if (rcb) + ClientReportControlBlock_destroy(rcb); + + if (dataSetDirectory) + LinkedList_destroy(dataSetDirectory); } else { printf("Failed to connect to %s:%i\n", hostname, tcpPort); diff --git a/src/common/inc/libiec61850_common_api.h b/src/common/inc/libiec61850_common_api.h index a233ccc9..b1a0d049 100644 --- a/src/common/inc/libiec61850_common_api.h +++ b/src/common/inc/libiec61850_common_api.h @@ -9,6 +9,11 @@ #include #include #include +#ifdef _MSC_VER +#if (_MSC_VER <= 1600) +#define bool int +#endif +#endif #include #ifdef __GNUC__