diff --git a/demos/beaglebone/beagle_demo.c b/demos/beaglebone/beagle_demo.c index 916bb6fb..c48624a6 100644 --- a/demos/beaglebone/beagle_demo.c +++ b/demos/beaglebone/beagle_demo.c @@ -8,7 +8,7 @@ #include "iec61850_server.h" #include "iso_server.h" #include "acse.h" -#include "thread.h" +#include "hal_thread.h" #include #include #include diff --git a/demos/beaglebone/static_model.c b/demos/beaglebone/static_model.c index 5c8824c5..902f64e4 100644 --- a/demos/beaglebone/static_model.c +++ b/demos/beaglebone/static_model.c @@ -4,7 +4,7 @@ * automatically generated from beagle_demo.icd */ #include -#include "model.h" +#include "iec61850_model.h" extern IedModel iedModel; static void initializeValues(); @@ -150,13 +150,16 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q; extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; -static DataSetEntry ds_GenericIO_LLN0_Events_fcda0; -static DataSetEntry ds_GenericIO_LLN0_Events_fcda1; -static DataSetEntry ds_GenericIO_LLN0_Events_fcda2; -static DataSetEntry ds_GenericIO_LLN0_Events_fcda3; +extern DataSet ds_GenericIO_LLN0_Events; -static DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = { - "beagleGenericIO", + +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; + +DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = { + "GenericIO", "GGIO1$ST$SPCSO1$stVal", -1, NULL, @@ -164,8 +167,8 @@ static DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = { &ds_GenericIO_LLN0_Events_fcda1 }; -static DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { - "beagleGenericIO", +DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { + "GenericIO", "GGIO1$ST$SPCSO2$stVal", -1, NULL, @@ -173,8 +176,8 @@ static DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { &ds_GenericIO_LLN0_Events_fcda2 }; -static DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { - "beagleGenericIO", +DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { + "GenericIO", "GGIO1$ST$SPCSO3$stVal", -1, NULL, @@ -182,8 +185,8 @@ static DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { &ds_GenericIO_LLN0_Events_fcda3 }; -static DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { - "beagleGenericIO", +DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { + "GenericIO", "GGIO1$ST$DPCSO1$stVal", -1, NULL, @@ -191,16 +194,17 @@ static DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { NULL }; -static DataSet ds_GenericIO_LLN0_Events = { - "beagleGenericIO", +DataSet ds_GenericIO_LLN0_Events = { + "GenericIO", "LLN0$Events", 4, - &ds_GenericIO_LLN0_Events_fcda0 + &ds_GenericIO_LLN0_Events_fcda0, + NULL }; LogicalDevice iedModel_GenericIO = { LogicalDeviceModelType, - "beagleGenericIO", + "GenericIO", (ModelNode*) &iedModel, NULL, (ModelNode*) &iedModel_GenericIO_LLN0 @@ -1919,21 +1923,11 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { NULL, 0}; +extern ReportControlBlock iedModel_GenericIO_LLN0_report0; +extern ReportControlBlock iedModel_GenericIO_LLN0_report1; -static ReportControlBlock iedModel_GenericIO_LLN0_report0; -static ReportControlBlock iedModel_GenericIO_LLN0_report1; - -static ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB", "Events1", false, "Events", 1, 16, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; -static ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCB2", "Events2", false, "Events", 1, 16, 111, 50, 1000, NULL}; - - - - - - - - - +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}; @@ -1944,6 +1938,7 @@ IedModel iedModel = { &ds_GenericIO_LLN0_Events, &iedModel_GenericIO_LLN0_report0, NULL, + NULL, initializeValues }; diff --git a/demos/beaglebone/static_model.h b/demos/beaglebone/static_model.h index be0806ff..c090e815 100644 --- a/demos/beaglebone/static_model.h +++ b/demos/beaglebone/static_model.h @@ -8,7 +8,7 @@ #define STATIC_MODEL_H_ #include -#include "model.h" +#include "iec61850_model.h" extern IedModel iedModel; extern LogicalDevice iedModel_GenericIO; diff --git a/examples/server_example3/simpleIO_direct_control.icd b/examples/server_example3/simpleIO_direct_control.icd index d17242cf..aae342df 100644 --- a/examples/server_example3/simpleIO_direct_control.icd +++ b/examples/server_example3/simpleIO_direct_control.icd @@ -53,6 +53,17 @@ + + + + + + + + + + + @@ -65,6 +76,12 @@ + + + + + + diff --git a/examples/server_example3/static_model.c b/examples/server_example3/static_model.c index 90017480..90a4eb51 100644 --- a/examples/server_example3/static_model.c +++ b/examples/server_example3/static_model.c @@ -152,6 +152,7 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; extern DataSet ds_GenericIO_LLN0_Events; extern DataSet ds_GenericIO_LLN0_Events2; +extern DataSet ds_GenericIO_LLN0_Measurements; extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0; @@ -249,6 +250,95 @@ DataSet ds_GenericIO_LLN0_Events2 = { "LLN0$Events2", 4, &ds_GenericIO_LLN0_Events2_fcda0, + &ds_GenericIO_LLN0_Measurements +}; + +extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda0; +extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda1; +extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda2; +extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda3; +extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda4; +extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda5; +extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda6; +extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda7; + +DataSetEntry ds_GenericIO_LLN0_Measurements_fcda0 = { + "GenericIO", + "GGIO1$MX$AnIn1$mag$f", + -1, + NULL, + NULL, + &ds_GenericIO_LLN0_Measurements_fcda1 +}; + +DataSetEntry ds_GenericIO_LLN0_Measurements_fcda1 = { + "GenericIO", + "GGIO1$MX$AnIn1$q", + -1, + NULL, + NULL, + &ds_GenericIO_LLN0_Measurements_fcda2 +}; + +DataSetEntry ds_GenericIO_LLN0_Measurements_fcda2 = { + "GenericIO", + "GGIO1$MX$AnIn2$mag$f", + -1, + NULL, + NULL, + &ds_GenericIO_LLN0_Measurements_fcda3 +}; + +DataSetEntry ds_GenericIO_LLN0_Measurements_fcda3 = { + "GenericIO", + "GGIO1$MX$AnIn2$q", + -1, + NULL, + NULL, + &ds_GenericIO_LLN0_Measurements_fcda4 +}; + +DataSetEntry ds_GenericIO_LLN0_Measurements_fcda4 = { + "GenericIO", + "GGIO1$MX$AnIn3$mag$f", + -1, + NULL, + NULL, + &ds_GenericIO_LLN0_Measurements_fcda5 +}; + +DataSetEntry ds_GenericIO_LLN0_Measurements_fcda5 = { + "GenericIO", + "GGIO1$MX$AnIn3$q", + -1, + NULL, + NULL, + &ds_GenericIO_LLN0_Measurements_fcda6 +}; + +DataSetEntry ds_GenericIO_LLN0_Measurements_fcda6 = { + "GenericIO", + "GGIO1$MX$AnIn4$mag$f", + -1, + NULL, + NULL, + &ds_GenericIO_LLN0_Measurements_fcda7 +}; + +DataSetEntry ds_GenericIO_LLN0_Measurements_fcda7 = { + "GenericIO", + "GGIO1$MX$AnIn4$q", + -1, + NULL, + NULL, + NULL +}; + +DataSet ds_GenericIO_LLN0_Measurements = { + "GenericIO", + "LLN0$Measurements", + 8, + &ds_GenericIO_LLN0_Measurements_fcda0, NULL }; @@ -1977,11 +2067,17 @@ 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; +extern ReportControlBlock iedModel_GenericIO_LLN0_report5; +extern ReportControlBlock iedModel_GenericIO_LLN0_report6; 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, "EventsIndexed01", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2}; ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3}; -ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 8, 111, 50, 1000, NULL}; +ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report4}; +ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, &iedModel_GenericIO_LLN0_report5}; +ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, &iedModel_GenericIO_LLN0_report6}; +ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, NULL}; diff --git a/src/iec61850/inc_private/reporting.h b/src/iec61850/inc_private/reporting.h index 448f1b81..dfba9df0 100644 --- a/src/iec61850/inc_private/reporting.h +++ b/src/iec61850/inc_private/reporting.h @@ -40,6 +40,7 @@ typedef struct { ReportBufferEntry* oldestReport; ReportBufferEntry* lastEnqueuedReport; ReportBufferEntry* nextToTransmit; + bool isOverflow; /* true if overflow condition is active */ } ReportBuffer; typedef struct { diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index d54bbfaf..ad89d318 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -53,6 +53,7 @@ ReportBuffer_create(void) self->memoryBlockSize = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->memoryBlock = (uint8_t*) GLOBAL_MALLOC(self->memoryBlockSize); self->reportsCount = 0; + self->isOverflow = false; return self; } @@ -1336,7 +1337,7 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme goto exit_function; } - else if (strcmp(elementName, "ConfRev") == 0) { + else if ((strcmp(elementName, "ConfRev") == 0) || (strcmp(elementName, "SqNum") == 0)) { retVal = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; goto exit_function; } @@ -1587,6 +1588,8 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI) printf("\n"); #endif + buffer->isOverflow = true; + buffer->oldestReport = buffer->oldestReport->next; buffer->reportsCount--; @@ -1877,7 +1880,10 @@ sendNextReportEntry(ReportControl* self) bufOvfl->deleteValue = 0; bufOvfl->type = MMS_BOOLEAN; - bufOvfl->value.boolean = false; + bufOvfl->value.boolean = self->reportBuffer->isOverflow; + + if (self->reportBuffer->isOverflow) + self->reportBuffer->isOverflow = false; if (MemAllocLinkedList_add(reportElements, bufOvfl) == NULL) goto return_out_of_memory; diff --git a/src/mms/iso_mms/server/mms_information_report.c b/src/mms/iso_mms/server/mms_information_report.c index 4380d727..4b6c7940 100644 --- a/src/mms/iso_mms/server/mms_information_report.c +++ b/src/mms/iso_mms/server/mms_information_report.c @@ -230,7 +230,7 @@ MmsServerConnection_sendInformationReportVMDSpecific(MmsServerConnection* self, accessResultSize += mmsServer_encodeAccessResult(data, NULL, 0, false); - value = LinkedList_getNext(value); + value = LinkedList_getNext(value); } listOfAccessResultSize = accessResultSize +