From c5579758bbd1febb79d7d5339eaf9efb85811b51 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 29 Jul 2021 12:47:49 +0200 Subject: [PATCH] - IED server: improved accuracy of integrity report intervals --- src/iec61850/server/mms_mapping/reporting.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 25823dc7..525b0d06 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -3287,6 +3287,7 @@ processEventsForReport(ReportControl* rc, uint64_t currentTimeInMs) if (rc->triggerOps & TRG_OPT_INTEGRITY) { if (rc->intgPd > 0) { + if (currentTimeInMs >= rc->nextIntgReportTime) { /* send current events in event buffer before integrity report */ @@ -3295,12 +3296,24 @@ processEventsForReport(ReportControl* rc, uint64_t currentTimeInMs) rc->triggered = false; } - rc->nextIntgReportTime = currentTimeInMs + rc->intgPd; + rc->nextIntgReportTime = rc->nextIntgReportTime + rc->intgPd; + + /* check for system time change effects */ + if ((rc->nextIntgReportTime < currentTimeInMs) || (rc->nextIntgReportTime > currentTimeInMs + rc->intgPd)) { + rc->nextIntgReportTime = currentTimeInMs + rc->intgPd; + } enqueueReport(rc, true, false, currentTimeInMs); rc->triggered = false; } + else { + /* check for system time change effects */ + if ((rc->nextIntgReportTime < currentTimeInMs) || (rc->nextIntgReportTime > currentTimeInMs + rc->intgPd)) { + rc->nextIntgReportTime = currentTimeInMs + rc->intgPd; + } + + } } }