- added bufOvfl support for buffered reports

pull/6/head
Michael Zillgith 11 years ago
parent b5e319b904
commit f53b254097

@ -8,7 +8,7 @@
#include "iec61850_server.h" #include "iec61850_server.h"
#include "iso_server.h" #include "iso_server.h"
#include "acse.h" #include "acse.h"
#include "thread.h" #include "hal_thread.h"
#include <signal.h> #include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>

@ -4,7 +4,7 @@
* automatically generated from beagle_demo.icd * automatically generated from beagle_demo.icd
*/ */
#include <stdlib.h> #include <stdlib.h>
#include "model.h" #include "iec61850_model.h"
extern IedModel iedModel; extern IedModel iedModel;
static void initializeValues(); 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_q;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
static DataSetEntry ds_GenericIO_LLN0_Events_fcda0; extern DataSet ds_GenericIO_LLN0_Events;
static DataSetEntry ds_GenericIO_LLN0_Events_fcda1;
static DataSetEntry ds_GenericIO_LLN0_Events_fcda2;
static DataSetEntry ds_GenericIO_LLN0_Events_fcda3;
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", "GGIO1$ST$SPCSO1$stVal",
-1, -1,
NULL, NULL,
@ -164,8 +167,8 @@ static DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = {
&ds_GenericIO_LLN0_Events_fcda1 &ds_GenericIO_LLN0_Events_fcda1
}; };
static DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = {
"beagleGenericIO", "GenericIO",
"GGIO1$ST$SPCSO2$stVal", "GGIO1$ST$SPCSO2$stVal",
-1, -1,
NULL, NULL,
@ -173,8 +176,8 @@ static DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = {
&ds_GenericIO_LLN0_Events_fcda2 &ds_GenericIO_LLN0_Events_fcda2
}; };
static DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = {
"beagleGenericIO", "GenericIO",
"GGIO1$ST$SPCSO3$stVal", "GGIO1$ST$SPCSO3$stVal",
-1, -1,
NULL, NULL,
@ -182,8 +185,8 @@ static DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = {
&ds_GenericIO_LLN0_Events_fcda3 &ds_GenericIO_LLN0_Events_fcda3
}; };
static DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = {
"beagleGenericIO", "GenericIO",
"GGIO1$ST$DPCSO1$stVal", "GGIO1$ST$DPCSO1$stVal",
-1, -1,
NULL, NULL,
@ -191,16 +194,17 @@ static DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = {
NULL NULL
}; };
static DataSet ds_GenericIO_LLN0_Events = { DataSet ds_GenericIO_LLN0_Events = {
"beagleGenericIO", "GenericIO",
"LLN0$Events", "LLN0$Events",
4, 4,
&ds_GenericIO_LLN0_Events_fcda0 &ds_GenericIO_LLN0_Events_fcda0,
NULL
}; };
LogicalDevice iedModel_GenericIO = { LogicalDevice iedModel_GenericIO = {
LogicalDeviceModelType, LogicalDeviceModelType,
"beagleGenericIO", "GenericIO",
(ModelNode*) &iedModel, (ModelNode*) &iedModel,
NULL, NULL,
(ModelNode*) &iedModel_GenericIO_LLN0 (ModelNode*) &iedModel_GenericIO_LLN0
@ -1919,21 +1923,11 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = {
NULL, NULL,
0}; 0};
extern ReportControlBlock iedModel_GenericIO_LLN0_report0;
extern ReportControlBlock iedModel_GenericIO_LLN0_report1;
static ReportControlBlock iedModel_GenericIO_LLN0_report0; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1};
static ReportControlBlock iedModel_GenericIO_LLN0_report1; ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCB201", "Events2", false, "Events", 1, 8, 111, 50, 1000, NULL};
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};
@ -1944,6 +1938,7 @@ IedModel iedModel = {
&ds_GenericIO_LLN0_Events, &ds_GenericIO_LLN0_Events,
&iedModel_GenericIO_LLN0_report0, &iedModel_GenericIO_LLN0_report0,
NULL, NULL,
NULL,
initializeValues initializeValues
}; };

@ -8,7 +8,7 @@
#define STATIC_MODEL_H_ #define STATIC_MODEL_H_
#include <stdlib.h> #include <stdlib.h>
#include "model.h" #include "iec61850_model.h"
extern IedModel iedModel; extern IedModel iedModel;
extern LogicalDevice iedModel_GenericIO; extern LogicalDevice iedModel_GenericIO;

@ -53,6 +53,17 @@
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" /> <FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" />
</DataSet> </DataSet>
<DataSet name="Measurements" desc="Events2">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q" />
</DataSet>
<ReportControl name="EventsRCB" confRev="1" datSet="Events" rptID="Events1" buffered="false" intgPd="1000" bufTime="50"> <ReportControl name="EventsRCB" confRev="1" datSet="Events" rptID="Events1" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" /> <TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" /> <OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
@ -65,6 +76,12 @@
<RptEnabled max="3" /> <RptEnabled max="3" />
</ReportControl> </ReportControl>
<ReportControl name="Measurements" indexed="true" confRev="1" datSet="Measurements" rptID="Measurements" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="false" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="3" />
</ReportControl>
<LogControl name="EventLog" datSet="Events" logName="EventLog"> <LogControl name="EventLog" datSet="Events" logName="EventLog">
<TrgOps dchg="true" qchg="true"/> <TrgOps dchg="true" qchg="true"/>
</LogControl> </LogControl>

@ -152,6 +152,7 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
extern DataSet ds_GenericIO_LLN0_Events; extern DataSet ds_GenericIO_LLN0_Events;
extern DataSet ds_GenericIO_LLN0_Events2; extern DataSet ds_GenericIO_LLN0_Events2;
extern DataSet ds_GenericIO_LLN0_Measurements;
extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0; extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0;
@ -249,6 +250,95 @@ DataSet ds_GenericIO_LLN0_Events2 = {
"LLN0$Events2", "LLN0$Events2",
4, 4,
&ds_GenericIO_LLN0_Events2_fcda0, &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 NULL
}; };
@ -1977,11 +2067,17 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report0;
extern ReportControlBlock iedModel_GenericIO_LLN0_report1; extern ReportControlBlock iedModel_GenericIO_LLN0_report1;
extern ReportControlBlock iedModel_GenericIO_LLN0_report2; extern ReportControlBlock iedModel_GenericIO_LLN0_report2;
extern ReportControlBlock iedModel_GenericIO_LLN0_report3; 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_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_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_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};

@ -40,6 +40,7 @@ typedef struct {
ReportBufferEntry* oldestReport; ReportBufferEntry* oldestReport;
ReportBufferEntry* lastEnqueuedReport; ReportBufferEntry* lastEnqueuedReport;
ReportBufferEntry* nextToTransmit; ReportBufferEntry* nextToTransmit;
bool isOverflow; /* true if overflow condition is active */
} ReportBuffer; } ReportBuffer;
typedef struct { typedef struct {

@ -53,6 +53,7 @@ ReportBuffer_create(void)
self->memoryBlockSize = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->memoryBlockSize = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE;
self->memoryBlock = (uint8_t*) GLOBAL_MALLOC(self->memoryBlockSize); self->memoryBlock = (uint8_t*) GLOBAL_MALLOC(self->memoryBlockSize);
self->reportsCount = 0; self->reportsCount = 0;
self->isOverflow = false;
return self; return self;
} }
@ -1336,7 +1337,7 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme
goto exit_function; 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; retVal = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED;
goto exit_function; goto exit_function;
} }
@ -1587,6 +1588,8 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI)
printf("\n"); printf("\n");
#endif #endif
buffer->isOverflow = true;
buffer->oldestReport = buffer->oldestReport->next; buffer->oldestReport = buffer->oldestReport->next;
buffer->reportsCount--; buffer->reportsCount--;
@ -1877,7 +1880,10 @@ sendNextReportEntry(ReportControl* self)
bufOvfl->deleteValue = 0; bufOvfl->deleteValue = 0;
bufOvfl->type = MMS_BOOLEAN; 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) if (MemAllocLinkedList_add(reportElements, bufOvfl) == NULL)
goto return_out_of_memory; goto return_out_of_memory;

Loading…
Cancel
Save