From db6cf1ec289f20d208c1c9c6ec1c102e40ffd663 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 24 Apr 2015 14:04:04 +0200 Subject: [PATCH] - fixed examples: all timestamp updates prior to corresponding value updates --- config/stack_config.h | 4 ++-- examples/server_example2/server_example2.c | 2 +- examples/server_example3/server_example3.c | 16 ++++++------- examples/server_example4/server_example4.c | 8 +++---- .../server_example_61400_25.c | 2 +- .../server_example_control.c | 19 +++++++++++---- .../server_example_goose.c | 22 +++++++++++++---- .../server_example_sg.c | 1 - .../server_example_threadless.c | 19 ++++++++------- src/iec61850/server/mms_mapping/reporting.c | 3 +-- src/mms/iso_mms/common/mms_value.c | 24 +++++++++---------- 11 files changed, 71 insertions(+), 49 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index f3186c1b..1c8ac382 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -17,7 +17,7 @@ #define DEBUG_COTP 0 #define DEBUG_ISO_SERVER 0 #define DEBUG_ISO_CLIENT 0 -#define DEBUG_IED_SERVER 0 +#define DEBUG_IED_SERVER 1 #define DEBUG_IED_CLIENT 0 #define DEBUG_MMS_CLIENT 0 #define DEBUG_MMS_SERVER 0 @@ -41,7 +41,7 @@ * * WARNING: If set to 1 normal single- and multi-threaded server are no longer working! */ -#define CONFIG_MMS_THREADLESS_STACK 1 +#define CONFIG_MMS_THREADLESS_STACK 0 /* number of concurrent MMS client connections the server accepts, -1 for no limit */ #define CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS 5 diff --git a/examples/server_example2/server_example2.c b/examples/server_example2/server_example2.c index e4d95e90..6d7f3519 100644 --- a/examples/server_example2/server_example2.c +++ b/examples/server_example2/server_example2.c @@ -71,8 +71,8 @@ main(int argc, char** argv) IedServer_lockDataModel(iedServer); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_Inverter_MMXU1_TotW_mag_f, power); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_Inverter_MMXU1_TotW_t, timeval); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_Inverter_MMXU1_TotW_mag_f, power); IedServer_unlockDataModel(iedServer); diff --git a/examples/server_example3/server_example3.c b/examples/server_example3/server_example3.c index b5f6e0b5..7e7e7eea 100644 --- a/examples/server_example3/server_example3.c +++ b/examples/server_example3/server_example3.c @@ -44,23 +44,23 @@ controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) uint64_t timeStamp = Hal_getTimeInMs(); if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); } return true; @@ -138,17 +138,17 @@ main(int argc, char** argv) if (((int) t % 2) == 0) Timestamp_setClockNotSynchronized(&iecTimestamp, true); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1); IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, &iecTimestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2); IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, &iecTimestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3); IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, &iecTimestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4); IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, &iecTimestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4); IedServer_unlockDataModel(iedServer); diff --git a/examples/server_example4/server_example4.c b/examples/server_example4/server_example4.c index 166515e1..b3aa07fc 100644 --- a/examples/server_example4/server_example4.c +++ b/examples/server_example4/server_example4.c @@ -84,23 +84,23 @@ controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) MmsValue* timeStamp = MmsValue_newUtcTimeByMsTime(Hal_getTimeInMs()); if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); } MmsValue_delete(timeStamp); diff --git a/examples/server_example_61400_25/server_example_61400_25.c b/examples/server_example_61400_25/server_example_61400_25.c index 890b5a3d..c0664114 100644 --- a/examples/server_example_61400_25/server_example_61400_25.c +++ b/examples/server_example_61400_25/server_example_61400_25.c @@ -53,8 +53,8 @@ controlHandlerForIntegerOutput(void* parameter, MmsValue* value, bool test) uint64_t timeStamp = Hal_getTimeInMs(); if (parameter == IEDMODEL_WTG_WTUR1_SetTurOp_actSt) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_WTG_WTUR1_SetTurOp_actSt_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_WTG_WTUR1_SetTurOp_actSt_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_WTG_WTUR1_SetTurOp_actSt_stVal, value); } return true; diff --git a/examples/server_example_control/server_example_control.c b/examples/server_example_control/server_example_control.c index 72fc6bc2..24aa7c30 100644 --- a/examples/server_example_control/server_example_control.c +++ b/examples/server_example_control/server_example_control.c @@ -53,18 +53,27 @@ checkHandler(void* parameter, MmsValue* ctlVal, bool test, bool interlockCheck, static ControlHandlerResult controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) { - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) + uint64_t timestamp = Hal_getTimeInMs(); + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timestamp); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); + } - else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) + else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timestamp); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); + } - else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) + else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timestamp); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); + } - else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) + else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timestamp); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); - + } else return CONTROL_RESULT_FAILED; diff --git a/examples/server_example_goose/server_example_goose.c b/examples/server_example_goose/server_example_goose.c index f014c42b..cc95890c 100644 --- a/examples/server_example_goose/server_example_goose.c +++ b/examples/server_example_goose/server_example_goose.c @@ -28,17 +28,27 @@ void sigint_handler(int signalId) void controlHandlerForBinaryOutput(void* parameter, MmsValue* value) { - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) + uint64_t timestamp = Hal_getTimeInMs(); + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timestamp); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); + } - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timestamp); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); + } - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timestamp); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); + } - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timestamp); IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); + } } int main(int argc, char** argv) { @@ -78,8 +88,10 @@ int main(int argc, char** argv) { while (running) { IedServer_lockDataModel(iedServer); + + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, Hal_getTimeInMs()); IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, anIn1); - IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, Hal_getTimeInMs()); + IedServer_unlockDataModel(iedServer); anIn1 += 0.1; diff --git a/examples/server_example_setting_groups/server_example_sg.c b/examples/server_example_setting_groups/server_example_sg.c index 9ddfecda..eb588f87 100644 --- a/examples/server_example_setting_groups/server_example_sg.c +++ b/examples/server_example_setting_groups/server_example_sg.c @@ -132,7 +132,6 @@ main(int argc, char** argv) IedServer_lockDataModel(iedServer); - IedServer_unlockDataModel(iedServer); power += 0.1f; diff --git a/examples/server_example_threadless/server_example_threadless.c b/examples/server_example_threadless/server_example_threadless.c index 371b46bf..7f1f5c8f 100644 --- a/examples/server_example_threadless/server_example_threadless.c +++ b/examples/server_example_threadless/server_example_threadless.c @@ -43,23 +43,23 @@ controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) uint64_t timeStamp = Hal_getTimeInMs(); if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); } if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); } return CONTROL_RESULT_OK; @@ -119,14 +119,17 @@ main(int argc, char** argv) IedServer_lockDataModel(iedServer); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, timestamp); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1); + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, timestamp); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2); + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, timestamp); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3); + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, timestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4); IedServer_unlockDataModel(iedServer); diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index c30c4a8a..daeb4173 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -2315,8 +2315,7 @@ ReportControl_valueUpdated(ReportControl* self, int dataSetEntryIndex, ReportInc if (self->triggered == false) { uint64_t currentTime = Hal_getTimeInMs(); - MmsValue* timeOfEntry = self->timeOfEntry; - MmsValue_setBinaryTime(timeOfEntry, currentTime); + MmsValue_setBinaryTime(self->timeOfEntry, currentTime); self->reportTime = currentTime + self->bufTm; } diff --git a/src/mms/iso_mms/common/mms_value.c b/src/mms/iso_mms/common/mms_value.c index 7093736f..074e732b 100644 --- a/src/mms/iso_mms/common/mms_value.c +++ b/src/mms/iso_mms/common/mms_value.c @@ -1607,11 +1607,11 @@ MmsValue_setBinaryTime(MmsValue* self, uint64_t timestamp) uint8_t* daysDiffBuf = (uint8_t*) &daysDiff; #if (ORDER_LITTLE_ENDIAN == 1) - binaryTimeBuf[4] = daysDiffBuf[1]; - binaryTimeBuf[5] = daysDiffBuf[0]; + binaryTimeBuf[4] = daysDiffBuf[1]; + binaryTimeBuf[5] = daysDiffBuf[0]; #else - binaryTimeBuf[4] = daysDiffBuf[0]; - binaryTimeBuf[5] = daysDiffBuf[1]; + binaryTimeBuf[4] = daysDiffBuf[0]; + binaryTimeBuf[5] = daysDiffBuf[1]; #endif } @@ -1620,15 +1620,15 @@ MmsValue_setBinaryTime(MmsValue* self, uint64_t timestamp) uint8_t* msSinceMidnightBuf = (uint8_t*) &msSinceMidnight; #if (ORDER_LITTLE_ENDIAN == 1) - binaryTimeBuf[0] = msSinceMidnightBuf[3]; - binaryTimeBuf[1] = msSinceMidnightBuf[2]; - binaryTimeBuf[2] = msSinceMidnightBuf[1]; - binaryTimeBuf[3] = msSinceMidnightBuf[0]; + binaryTimeBuf[0] = msSinceMidnightBuf[3]; + binaryTimeBuf[1] = msSinceMidnightBuf[2]; + binaryTimeBuf[2] = msSinceMidnightBuf[1]; + binaryTimeBuf[3] = msSinceMidnightBuf[0]; #else - binaryTimeBuf[0] = msSinceMidnightBuf[0]; - binaryTimeBuf[1] = msSinceMidnightBuf[1]; - binaryTimeBuf[2] = msSinceMidnightBuf[2]; - binaryTimeBuf[3] = msSinceMidnightBuf[3]; + binaryTimeBuf[0] = msSinceMidnightBuf[0]; + binaryTimeBuf[1] = msSinceMidnightBuf[1]; + binaryTimeBuf[2] = msSinceMidnightBuf[2]; + binaryTimeBuf[3] = msSinceMidnightBuf[3]; #endif }