- IEC 61850 server: added support for segmented reporting

pull/147/head
Michael Zillgith 7 years ago
parent c879cb433e
commit 68876a46b2

@ -68,7 +68,13 @@
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q" /> <FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q" />
</DataSet> </DataSet>
<ReportControl name="EventsRCB" confRev="4294967295" 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" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<ReportControl name="EventsBRCB" confRev="1" datSet="Events" rptID="Events2" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="true" /> <TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" /> <OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1" /> <RptEnabled max="1" />

@ -2008,14 +2008,16 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report3;
extern ReportControlBlock iedModel_GenericIO_LLN0_report4; extern ReportControlBlock iedModel_GenericIO_LLN0_report4;
extern ReportControlBlock iedModel_GenericIO_LLN0_report5; extern ReportControlBlock iedModel_GenericIO_LLN0_report5;
extern ReportControlBlock iedModel_GenericIO_LLN0_report6; extern ReportControlBlock iedModel_GenericIO_LLN0_report6;
extern ReportControlBlock iedModel_GenericIO_LLN0_report7;
ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report1};
ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report2}; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report1};
ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report3}; ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsBRCB01", "Events2", true, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report2};
ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report4}; ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report3};
ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report5}; ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report4};
ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report6}; ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report5};
ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, NULL}; ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report6};
ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report7};
ReportControlBlock iedModel_GenericIO_LLN0_report7 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, NULL};

@ -10,11 +10,11 @@ include_directories(
set(server_example_SRCS set(server_example_SRCS
server_example_logging.c server_example_logging.c
static_model.c static_model.c
${CMAKE_SOURCE_DIR}/src/logging/drivers/sqlite/log_storage_sqlite.c ${CMAKE_CURRENT_LIST_DIR}/../../src/logging/drivers/sqlite/log_storage_sqlite.c
) )
set(sqlite_SRCS set(sqlite_SRCS
${CMAKE_SOURCE_DIR}/third_party/sqlite/sqlite3.c ${CMAKE_CURRENT_LIST_DIR}/../../third_party/sqlite/sqlite3.c
) )
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION")

@ -42,6 +42,8 @@ typedef struct {
ReportBufferEntry* lastEnqueuedReport; ReportBufferEntry* lastEnqueuedReport;
ReportBufferEntry* nextToTransmit; ReportBufferEntry* nextToTransmit;
bool isOverflow; /* true if overflow condition is active */ bool isOverflow; /* true if overflow condition is active */
Semaphore lock; /* protect access to report buffer */
} ReportBuffer; } ReportBuffer;
typedef struct { typedef struct {
@ -53,6 +55,7 @@ typedef struct {
MmsValue* rcbValues; MmsValue* rcbValues;
MmsValue* inclusionField; MmsValue* inclusionField;
MmsValue* confRev; MmsValue* confRev;
DataSet* dataSet; DataSet* dataSet;
bool isDynamicDataSet; bool isDynamicDataSet;
bool enabled; bool enabled;
@ -76,6 +79,12 @@ typedef struct {
int triggerOps; int triggerOps;
/* information for segmented reporting */
bool segmented; /* indicates that a segmented report is in process */
int startIndexForNextSegment; /* start data set index for the next report segment */
MmsValue* subSeqVal; /* sub sequence value for segmented reporting */
uint64_t segmentedReportTimestamp; /* time stamp used for all report segments */
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore createNotificationsMutex; /* { covered by mutex } */ Semaphore createNotificationsMutex; /* { covered by mutex } */
#endif #endif

File diff suppressed because it is too large Load Diff

@ -48,6 +48,12 @@ MmsServerConnection_init(MmsServerConnection connection, MmsServer server, IsoCo
void void
MmsServerConnection_destroy(MmsServerConnection connection); MmsServerConnection_destroy(MmsServerConnection connection);
int
MmsServerConnection_getMaxMmsPduSize(MmsServerConnection self);
void
MmsServerConnection_sendMessage(MmsServerConnection self, ByteBuffer* message, bool handlerMode);
bool bool
MmsServerConnection_addNamedVariableList(MmsServerConnection self, MmsNamedVariableList variableList); MmsServerConnection_addNamedVariableList(MmsServerConnection self, MmsNamedVariableList variableList);

@ -315,7 +315,6 @@ MmsValue*
MmsValue_newBitString(int bitSize) MmsValue_newBitString(int bitSize)
{ {
MmsValue* self = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue)); MmsValue* self = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue));
;
if (self == NULL) if (self == NULL)
return NULL; return NULL;

@ -220,7 +220,6 @@ exit_function:
return; return;
} }
void /* send information report for a named variable list */ void /* send information report for a named variable list */
MmsServerConnection_sendInformationReportVMDSpecific(MmsServerConnection self, char* itemId, LinkedList values, MmsServerConnection_sendInformationReportVMDSpecific(MmsServerConnection self, char* itemId, LinkedList values,
bool handlerMode) bool handlerMode)
@ -254,6 +253,7 @@ MmsServerConnection_sendInformationReportVMDSpecific(MmsServerConnection self, c
uint32_t informationReportContentSize = variableAccessSpecSize + listOfAccessResultSize; uint32_t informationReportContentSize = variableAccessSpecSize + listOfAccessResultSize;
informationReportSize = 1 + informationReportContentSize + informationReportSize = 1 + informationReportContentSize +
BerEncoder_determineLengthSize(informationReportContentSize); BerEncoder_determineLengthSize(informationReportContentSize);
@ -266,8 +266,6 @@ MmsServerConnection_sendInformationReportVMDSpecific(MmsServerConnection self, c
goto exit_function; goto exit_function;
} }
if (DEBUG_MMS_SERVER) printf("MMS_SERVER: sendInfReport\n");
ByteBuffer* reportBuffer = MmsServer_reserveTransmitBuffer(self->server); ByteBuffer* reportBuffer = MmsServer_reserveTransmitBuffer(self->server);
uint8_t* buffer = reportBuffer->buffer; uint8_t* buffer = reportBuffer->buffer;

@ -739,6 +739,18 @@ MmsServerConnection_destroy(MmsServerConnection self)
GLOBAL_FREEMEM(self); GLOBAL_FREEMEM(self);
} }
int
MmsServerConnection_getMaxMmsPduSize(MmsServerConnection self)
{
return self->maxPduSize;
}
void
MmsServerConnection_sendMessage(MmsServerConnection self, ByteBuffer* message, bool handlerMode)
{
IsoConnection_sendMessage(self->isoConnection, message, false);
}
#if (MMS_DYNAMIC_DATA_SETS == 1) #if (MMS_DYNAMIC_DATA_SETS == 1)
bool bool
MmsServerConnection_addNamedVariableList(MmsServerConnection self, MmsNamedVariableList variableList) MmsServerConnection_addNamedVariableList(MmsServerConnection self, MmsNamedVariableList variableList)

@ -80,7 +80,6 @@ mmsServer_createMmsWriteResponse(MmsServerConnection connection,
response->size = bufPos; response->size = bufPos;
} }
void void
MmsServerConnection_sendWriteResponse(MmsServerConnection self, uint32_t invokeId, MmsDataAccessError indication, bool handlerMode) MmsServerConnection_sendWriteResponse(MmsServerConnection self, uint32_t invokeId, MmsDataAccessError indication, bool handlerMode)
{ {

Loading…
Cancel
Save