|
|
@ -29,6 +29,30 @@ reportCallbackFunction(void* parameter, ClientReport report)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
|
|
printValue(char* name, MmsValue* value)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
char buf[1000];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsValue_printToBuffer(value, buf, 1000);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("Received value for %s: %s\n", name, buf);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
|
|
readVariableHandler (int invokeId, void* parameter, MmsError mmsError, MmsValue* value)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (mmsError == MMS_ERROR_NONE) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printValue((char*) parameter, value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsValue_delete(value);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
printf("Failed to read %s (err=%i)\n", parameter, mmsError);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) {
|
|
|
|
int main(int argc, char** argv) {
|
|
|
|
|
|
|
|
|
|
|
|
char* hostname;
|
|
|
|
char* hostname;
|
|
|
@ -50,76 +74,171 @@ int main(int argc, char** argv) {
|
|
|
|
|
|
|
|
|
|
|
|
if (error == IED_ERROR_OK) {
|
|
|
|
if (error == IED_ERROR_OK) {
|
|
|
|
|
|
|
|
|
|
|
|
/* read an analog measurement value from server */
|
|
|
|
MmsConnection mmsCon = IedConnection_getMmsConnection(con);
|
|
|
|
MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (value != NULL) {
|
|
|
|
MmsError mmsErr;
|
|
|
|
float fval = MmsValue_toFloat(value);
|
|
|
|
|
|
|
|
printf("read float value: %f\n", fval);
|
|
|
|
|
|
|
|
MmsValue_delete(value);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* write a variable to the server */
|
|
|
|
MmsValue* val1 = MmsConnection_readVariable(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn1$mag$f");
|
|
|
|
value = MmsValue_newVisibleString("libiec61850.com");
|
|
|
|
|
|
|
|
IedConnection_writeObject(con, &error, "simpleIOGenericIO/GGIO1.NamPlt.vendor", IEC61850_FC_DC, value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (error != IED_ERROR_OK)
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
printf("failed to write simpleIOGenericIO/GGIO1.NamPlt.vendor!\n");
|
|
|
|
printf("Request 0 failed\n");
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
printValue("sync read", val1);
|
|
|
|
|
|
|
|
|
|
|
|
MmsValue_delete(value);
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn1$mag$f", readVariableHandler, "GGIO1$MX$AnIn1$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 1 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn2$mag$f", readVariableHandler, "GGIO1$MX$AnIn2$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
/* read data set */
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
ClientDataSet clientDataSet = IedConnection_readDataSetValues(con, &error, "simpleIOGenericIO/LLN0.Events", NULL);
|
|
|
|
printf("Request 2 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
if (clientDataSet == NULL)
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn3$mag$f", readVariableHandler, "GGIO1$MX$AnIn3$mag$f");
|
|
|
|
printf("failed to read dataset\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Read RCB values */
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
ClientReportControlBlock rcb =
|
|
|
|
printf("Request 3 failed\n");
|
|
|
|
IedConnection_getRCBValues(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01", NULL);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn4$mag$f", readVariableHandler, "GGIO1$MX$AnIn4$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
bool rptEna = ClientReportControlBlock_getRptEna(rcb);
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 4 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
printf("RptEna = %i\n", rptEna);
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn1$mag$f", readVariableHandler, "GGIO1$MX$AnIn1$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
/* Install handler for reports */
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
IedConnection_installReportHandler(con, "simpleIOGenericIO/LLN0.RP.EventsRCB01",
|
|
|
|
printf("Request 1 failed\n");
|
|
|
|
ClientReportControlBlock_getRptId(rcb), reportCallbackFunction, NULL);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Set trigger options and enable report */
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn2$mag$f", readVariableHandler, "GGIO1$MX$AnIn2$mag$f");
|
|
|
|
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)
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
printf("report activation failed (code: %i)\n", error);
|
|
|
|
printf("Request 2 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
Thread_sleep(1000);
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn3$mag$f", readVariableHandler, "GGIO1$MX$AnIn3$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
/* trigger GI report */
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
ClientReportControlBlock_setGI(rcb, true);
|
|
|
|
printf("Request 3 failed\n");
|
|
|
|
IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_GI, true);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (error != IED_ERROR_OK)
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn4$mag$f", readVariableHandler, "GGIO1$MX$AnIn4$mag$f");
|
|
|
|
printf("Error triggering a GI report (code: %i)\n", error);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Thread_sleep(60000);
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 4 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
/* disable reporting */
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn1$mag$f", readVariableHandler, "GGIO1$MX$AnIn1$mag$f");
|
|
|
|
ClientReportControlBlock_setRptEna(rcb, false);
|
|
|
|
|
|
|
|
IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA, true);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (error != IED_ERROR_OK)
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
printf("disable reporting failed (code: %i)\n", error);
|
|
|
|
printf("Request 1 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
ClientDataSet_destroy(clientDataSet);
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn2$mag$f", readVariableHandler, "GGIO1$MX$AnIn2$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
ClientReportControlBlock_destroy(rcb);
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 2 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
close_connection:
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn3$mag$f", readVariableHandler, "GGIO1$MX$AnIn3$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 3 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn4$mag$f", readVariableHandler, "GGIO1$MX$AnIn4$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 4 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn1$mag$f", readVariableHandler, "GGIO1$MX$AnIn1$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 1 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn2$mag$f", readVariableHandler, "GGIO1$MX$AnIn2$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 2 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn3$mag$f", readVariableHandler, "GGIO1$MX$AnIn3$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 3 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MmsConnection_readVariableAsync(mmsCon, &mmsErr, "simpleIOGenericIO", "GGIO1$MX$AnIn4$mag$f", readVariableHandler, "GGIO1$MX$AnIn4$mag$f");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mmsErr != MMS_ERROR_NONE)
|
|
|
|
|
|
|
|
printf("Request 4 failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Thread_sleep(10000);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// /* read an analog measurement value from server */
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
|
|
|
// MmsValue_delete(value);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// /* write a variable to the server */
|
|
|
|
|
|
|
|
// value = MmsValue_newVisibleString("libiec61850.com");
|
|
|
|
|
|
|
|
// 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");
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// MmsValue_delete(value);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// /* read data set */
|
|
|
|
|
|
|
|
// ClientDataSet clientDataSet = IedConnection_readDataSetValues(con, &error, "simpleIOGenericIO/LLN0.Events", NULL);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// if (clientDataSet == NULL)
|
|
|
|
|
|
|
|
// printf("failed to read dataset\n");
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// /* Read RCB values */
|
|
|
|
|
|
|
|
// ClientReportControlBlock rcb =
|
|
|
|
|
|
|
|
// IedConnection_getRCBValues(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01", NULL);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// bool rptEna = ClientReportControlBlock_getRptEna(rcb);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// printf("RptEna = %i\n", rptEna);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// /* 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);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// if (error != IED_ERROR_OK)
|
|
|
|
|
|
|
|
// printf("report activation failed (code: %i)\n", error);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Thread_sleep(1000);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// /* 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);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Thread_sleep(60000);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// /* 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);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// ClientDataSet_destroy(clientDataSet);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// ClientReportControlBlock_destroy(rcb);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// close_connection:
|
|
|
|
|
|
|
|
|
|
|
|
IedConnection_close(con);
|
|
|
|
IedConnection_close(con);
|
|
|
|
}
|
|
|
|
}
|
|
|
|