diff --git a/demos/beaglebone/beagle_demo.c b/demos/beaglebone/beagle_demo.c index c48624a..bb76212 100644 --- a/demos/beaglebone/beagle_demo.c +++ b/demos/beaglebone/beagle_demo.c @@ -34,10 +34,10 @@ void sigint_handler(int signalId) running = 0; } -void +static void connectionIndicationHandler(IedServer server, ClientConnection connection, bool connected, void* parameter) { - char* clientAddress = ClientConnection_getPeerAddress(connection); + const char* clientAddress = ClientConnection_getPeerAddress(connection); if (connected) { printf("BeagleDemoServer: new client connection from %s\n", clientAddress); @@ -62,6 +62,12 @@ performCheckHandler(void* parameter, MmsValue* ctlVal, bool test, bool interlock automaticOperationMode = false; } + /* test command not accepted if mode is "on" */ + if (test) + return CONTROL_TEMPORARILY_UNAVAILABLE; + + printf("controllingClient: %p connection: %p\n", controllingClient, connection); + /* If there is already another client that controls the device reject the control attempt */ if (controllingClient == connection) return CONTROL_ACCEPTED; @@ -69,7 +75,7 @@ performCheckHandler(void* parameter, MmsValue* ctlVal, bool test, bool interlock return CONTROL_TEMPORARILY_UNAVAILABLE; } -void +static void updateLED1stVal(bool newLedState, uint64_t timeStamp) { switchLED(LED1, newLedState); @@ -78,7 +84,7 @@ updateLED1stVal(bool newLedState, uint64_t timeStamp) { IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp); } -void +static void updateLED2stVal(bool newLedState, uint64_t timeStamp) { switchLED(LED2, newLedState); @@ -87,7 +93,7 @@ updateLED2stVal(bool newLedState, uint64_t timeStamp) { IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp); } -void +static void updateLED3stVal(bool newLedState, uint64_t timeStamp) { switchLED(LED3, newLedState); @@ -96,14 +102,11 @@ updateLED3stVal(bool newLedState, uint64_t timeStamp) { IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp); } -bool +static ControlHandlerResult controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) { if (test) - return true; - - if (MmsValue_getType(value) != MMS_BOOLEAN) - return false; + return CONTROL_RESULT_OK; uint64_t timeStamp = Hal_getTimeInMs(); @@ -142,7 +145,7 @@ controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1_t, timeStamp); } - return true; + return CONTROL_RESULT_OK; } diff --git a/demos/beaglebone/beagle_demo.icd b/demos/beaglebone/beagle_demo.icd index 7d089f1..6169c81 100644 --- a/demos/beaglebone/beagle_demo.icd +++ b/demos/beaglebone/beagle_demo.icd @@ -19,42 +19,48 @@ + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + @@ -62,7 +68,9 @@ status-only + + @@ -77,7 +85,7 @@ - direct-with-normal-security + sbo-with-normal-security @@ -95,6 +103,7 @@ + @@ -183,7 +192,9 @@ + + @@ -209,6 +220,15 @@ + + + + + + + + + status-only direct-with-normal-security diff --git a/demos/beaglebone/beaglebone_leds.c b/demos/beaglebone/beaglebone_leds.c index a486b4e..314aa81 100644 --- a/demos/beaglebone/beaglebone_leds.c +++ b/demos/beaglebone/beaglebone_leds.c @@ -5,13 +5,15 @@ #include #include "beaglebone_leds.h" +#ifndef SIMULATED static void writeToFile(char* filename, char* text) { FILE* file = fopen(filename, "w"); - fprintf(file, text); + fprintf(file, "%s", text); fclose(file); } +#endif /* SIMULATED */ void flashLED(char* led) @@ -37,7 +39,7 @@ switchLED(char* led, int value) { #ifndef SIMULATED char filename[255]; - char* valueStr[10]; + char valueStr[10]; sprintf(filename, "%s/trigger", led); writeToFile(filename, "none"); diff --git a/demos/beaglebone/beaglebone_leds.h b/demos/beaglebone/beaglebone_leds.h index badcbf5..9a119f8 100644 --- a/demos/beaglebone/beaglebone_leds.h +++ b/demos/beaglebone/beaglebone_leds.h @@ -6,7 +6,7 @@ #define BEAGLEBONE_LEDS_H_ -//#define SIMULATED 1 +#define SIMULATED 1 #if 0 diff --git a/demos/beaglebone/static_model.c b/demos/beaglebone/static_model.c index a9ca591..9d2b861 100644 --- a/demos/beaglebone/static_model.c +++ b/demos/beaglebone/static_model.c @@ -3,190 +3,51 @@ * * automatically generated from beagle_demo.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_GenericIO; -extern LogicalNode iedModel_GenericIO_LLN0; -extern DataObject iedModel_GenericIO_LLN0_Mod; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_q; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_t; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel; -extern DataObject iedModel_GenericIO_LLN0_Beh; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_q; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_t; -extern DataObject iedModel_GenericIO_LLN0_Health; -extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Health_q; -extern DataAttribute iedModel_GenericIO_LLN0_Health_t; -extern DataObject iedModel_GenericIO_LLN0_NamPlt; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_GenericIO_LPHD1; -extern DataObject iedModel_GenericIO_LPHD1_PhyNam; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor; -extern DataObject iedModel_GenericIO_LPHD1_PhyHealth; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t; -extern DataObject iedModel_GenericIO_LPHD1_Proxy; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t; -extern LogicalNode iedModel_GenericIO_GGIO1; -extern DataObject iedModel_GenericIO_GGIO1_Mod; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_Beh; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t; -extern DataObject iedModel_GenericIO_GGIO1_Health; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_t; -extern DataObject iedModel_GenericIO_GGIO1_NamPlt; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d; -extern DataObject iedModel_GenericIO_GGIO1_AnIn1; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn2; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn3; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn4; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO1; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO3; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t; -extern DataObject iedModel_GenericIO_GGIO1_DPCSO1; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind1; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind2; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind3; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind4; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; -extern DataSet ds_GenericIO_LLN0_Events; +extern DataSet iedModelds_GenericIO_LLN0_Events; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda3; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3; -DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0 = { "GenericIO", + false, "GGIO1$ST$SPCSO1$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda1 + &iedModelds_GenericIO_LLN0_Events_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { "GenericIO", + false, "GGIO1$ST$SPCSO2$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda2 + &iedModelds_GenericIO_LLN0_Events_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { "GenericIO", + false, "GGIO1$ST$SPCSO3$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda3 + &iedModelds_GenericIO_LLN0_Events_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { "GenericIO", + false, "GGIO1$ST$DPCSO1$stVal", -1, NULL, @@ -194,11 +55,11 @@ DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { NULL }; -DataSet ds_GenericIO_LLN0_Events = { +DataSet iedModelds_GenericIO_LLN0_Events = { "GenericIO", "LLN0$Events", 4, - &ds_GenericIO_LLN0_Events_fcda0, + &iedModelds_GenericIO_LLN0_Events_fcda0, NULL }; @@ -1223,7 +1084,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { DataAttributeModelType, "q", (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_SBO, NULL, 0, IEC61850_FC_ST, @@ -1232,11 +1093,24 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { NULL, 0}; +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO = { + DataAttributeModelType, + "SBO", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + NULL, + 0, + IEC61850_FC_CO, + VISIBLE_STRING_64, + 0, + NULL, + 0}; + DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { DataAttributeModelType, "Oper", (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, 0, IEC61850_FC_CO, @@ -1349,6 +1223,110 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { NULL, 0}; +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel = { + DataAttributeModelType, + "Cancel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal, + 0, + IEC61850_FC_CO, + CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin, + NULL, + 0, + IEC61850_FC_CO, + INT8, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat, + 0, + IEC61850_FC_CO, + CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T, + NULL, + 0, + IEC61850_FC_CO, + INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test, + NULL, + 0, + IEC61850_FC_CO, + TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel, + NULL, + NULL, + 0, + IEC61850_FC_CO, + BOOLEAN, + 0, + NULL, + 0}; + DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { DataAttributeModelType, "ctlModel", @@ -1925,9 +1903,15 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { extern ReportControlBlock iedModel_GenericIO_LLN0_report0; extern ReportControlBlock iedModel_GenericIO_LLN0_report1; +extern ReportControlBlock iedModel_GenericIO_LLN0_report2; +extern ReportControlBlock iedModel_GenericIO_LLN0_report3; +extern ReportControlBlock iedModel_GenericIO_LLN0_report4; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; -ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCB201", "Events2", false, "Events", 1, 8, 111, 50, 1000, NULL}; +ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCB02", "Events1", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2}; +ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsRCB03", "Events1", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3}; +ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsRCB04", "Events1", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report4}; +ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "EventsRCB05", "Events1", false, "Events", 1, 8, 111, 50, 1000, NULL}; @@ -1935,7 +1919,7 @@ ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, IedModel iedModel = { "beagle", &iedModel_GenericIO, - &ds_GenericIO_LLN0_Events, + &iedModelds_GenericIO_LLN0_Events, &iedModel_GenericIO_LLN0_report0, NULL, NULL, @@ -1952,7 +1936,7 @@ iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0) iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); -iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); +iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(2); iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); diff --git a/demos/beaglebone/static_model.h b/demos/beaglebone/static_model.h index c090e81..36a7e0f 100644 --- a/demos/beaglebone/static_model.h +++ b/demos/beaglebone/static_model.h @@ -97,6 +97,7 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t; extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin; @@ -106,6 +107,14 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T; +extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t; extern DataObject iedModel_GenericIO_GGIO1_SPCSO3; @@ -241,6 +250,7 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; #define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal (&iedModel_GenericIO_GGIO1_SPCSO2_stVal) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_q (&iedModel_GenericIO_GGIO1_SPCSO2_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_SBO (&iedModel_GenericIO_GGIO1_SPCSO2_SBO) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper (&iedModel_GenericIO_GGIO1_SPCSO2_Oper) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin) @@ -250,6 +260,14 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; #define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_T) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO2_ctlModel) #define IEDMODEL_GenericIO_GGIO1_SPCSO2_t (&iedModel_GenericIO_GGIO1_SPCSO2_t) #define IEDMODEL_GenericIO_GGIO1_SPCSO3 (&iedModel_GenericIO_GGIO1_SPCSO3) diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 078d5aa..1e5a604 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -130,6 +130,9 @@ MmsValue* Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* variableIdOrig, MmsServerConnection connection); +static void +unselectObject(ControlObject* self); + static void setState(ControlObject* self, int newState) { @@ -315,7 +318,7 @@ abortControlOperation(ControlObject* self) if ((self->ctlModel == 2) || (self->ctlModel == 4)) { if (isSboClassOperateOnce(self)) - setState(self, STATE_UNSELECTED); + unselectObject(self); else setState(self, STATE_READY); } @@ -604,6 +607,9 @@ ControlObject_getMmsValue(ControlObject* self) static void selectObject(ControlObject* self, uint64_t selectTime, MmsServerConnection connection) { + if (DEBUG_IED_SERVER) + printf("IED_SERVER: control %s selected\n", self->ctlObjectName); + updateSboTimeoutValue(self); self->selected = true; self->selectTime = selectTime; @@ -611,6 +617,15 @@ selectObject(ControlObject* self, uint64_t selectTime, MmsServerConnection conne setState(self, STATE_READY); } +static void +unselectObject(ControlObject* self) +{ + setState(self, STATE_UNSELECTED); + + if (DEBUG_IED_SERVER) + printf("IED_SERVER: control %s unselected\n", self->ctlObjectName); +} + static void checkSelectTimeout(ControlObject* self, uint64_t currentTime) { @@ -620,8 +635,10 @@ checkSelectTimeout(ControlObject* self, uint64_t currentTime) if (self->selectTimeout > 0) { if (currentTime > (self->selectTime + self->selectTimeout)) { if (DEBUG_IED_SERVER) - printf("isSelected: select-timeout (timeout-val = %i)\n", self->selectTimeout); - setState(self, STATE_UNSELECTED); + printf("IED_SERVER: select-timeout (timeout-val = %i) for control %s\n", + self->selectTimeout, self->ctlObjectName); + + unselectObject(self); } } } @@ -681,9 +698,13 @@ Control_processControlActions(MmsMapping* self, uint64_t currentTimeInMs) CheckHandlerResult checkResult = CONTROL_ACCEPTED; if (controlObject->checkHandler != NULL) { /* perform operative tests */ + + ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, + controlObject->mmsConnection); + checkResult = controlObject->checkHandler( controlObject->checkHandlerParameter, controlObject->ctlVal, controlObject->testMode, - controlObject->interlockCheck, (ClientConnection) controlObject->mmsConnection); + controlObject->interlockCheck, clientConnection); } if (checkResult == CONTROL_ACCEPTED) { @@ -1121,9 +1142,13 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia CheckHandlerResult checkResult = CONTROL_ACCEPTED; if (controlObject->checkHandler != NULL) { /* perform operative tests */ + + ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, + connection); + checkResult = controlObject->checkHandler( controlObject->checkHandlerParameter, NULL, false, false, - (ClientConnection) connection); + clientConnection); } if (checkResult == CONTROL_ACCEPTED) { @@ -1419,7 +1444,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari if (controlObject->mmsConnection != connection) { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; if (DEBUG_IED_SERVER) - printf("Oper: operate from wrong client connection!\n"); + printf("IED_SERVER: Oper - operate from wrong client connection!\n"); goto free_and_return; } @@ -1537,7 +1562,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari if (state != STATE_UNSELECTED) { if (controlObject->mmsConnection == connection) { indication = DATA_ACCESS_ERROR_SUCCESS; - setState(controlObject, STATE_UNSELECTED); + unselectObject(controlObject); goto free_and_return; } else {