diff --git a/examples/iec61850_9_2_LE_example/Makefile b/examples/iec61850_9_2_LE_example/Makefile index 0e3703ac..2ce35b73 100644 --- a/examples/iec61850_9_2_LE_example/Makefile +++ b/examples/iec61850_9_2_LE_example/Makefile @@ -9,6 +9,8 @@ PROJECT_ICD_FILE = sv.icd include $(LIBIEC_HOME)/make/target_system.mk include $(LIBIEC_HOME)/make/stack_includes.mk +LDFLAGS += -lm + all: $(PROJECT_BINARY_NAME) include $(LIBIEC_HOME)/make/common_targets.mk diff --git a/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c b/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c index 640fff3c..d63554d8 100644 --- a/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c +++ b/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c @@ -27,7 +27,7 @@ #include #include #include - +#include /* Include the generated header with the model access handles */ #include "static_model.h" @@ -131,9 +131,6 @@ main(int argc, char** argv) setupSVPublisher(svInterface); - int voltage = 1; - int current = 1; - SVControlBlock* svcb = IedModel_getSVControlBlock(&iedModel, IEDMODEL_MUnn_LLN0, "MSVCB01"); if (svcb == NULL) { @@ -145,61 +142,102 @@ main(int argc, char** argv) Quality q = QUALITY_VALIDITY_GOOD; + int vol = (int) (6350.f * sqrt(2)); + int amp = 0; + float phaseAngle = 0.f; + + int voltageA; + int voltageB; + int voltageC; + int voltageN; + int currentA; + int currentB; + int currentC; + int currentN; + + int sampleCount = 0; + + uint64_t nextCycleStart = Hal_getTimeInMs() + 1000; + while (running) { - uint64_t timeval = Hal_getTimeInMs(); + /* update measurement values */ + int samplePoint = sampleCount % 80; + + double angleA = (2 * M_PI / 80) * samplePoint; + double angleB = (2 * M_PI / 80) * samplePoint - ( 2 * M_PI / 3); + double angleC = (2 * M_PI / 80) * samplePoint - ( 4 * M_PI / 3); + + voltageA = (vol * sin(angleA)) * 100; + voltageB = (vol * sin(angleB)) * 100; + voltageC = (vol * sin(angleC)) * 100; + voltageN = voltageA + voltageB + voltageC; + + currentA = (amp * sin(angleA - phaseAngle)) * 1000; + currentB = (amp * sin(angleB - phaseAngle)) * 1000; + currentC = (amp * sin(angleC - phaseAngle)) * 1000; + currentN = currentA + currentB + currentC; IedServer_lockDataModel(iedServer); - IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TCTR1_Amp_instMag_i, current); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TCTR1_Amp_instMag_i, currentA); IedServer_updateQuality(iedServer, IEDMODEL_MUnn_TCTR1_Amp_q, q); - IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TCTR2_Amp_instMag_i, current); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TCTR2_Amp_instMag_i, currentB); IedServer_updateQuality(iedServer, IEDMODEL_MUnn_TCTR2_Amp_q, q); - IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TCTR3_Amp_instMag_i, current); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TCTR3_Amp_instMag_i, currentC); IedServer_updateQuality(iedServer, IEDMODEL_MUnn_TCTR3_Amp_q, q); - IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TCTR4_Amp_instMag_i, current); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TCTR4_Amp_instMag_i, currentN); IedServer_updateQuality(iedServer, IEDMODEL_MUnn_TCTR4_Amp_q, q); - IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TVTR1_Vol_instMag_i, voltage); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TVTR1_Vol_instMag_i, voltageA); IedServer_updateQuality(iedServer, IEDMODEL_MUnn_TVTR1_Vol_q, q); - IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TVTR2_Vol_instMag_i, voltage); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TVTR2_Vol_instMag_i, voltageB); IedServer_updateQuality(iedServer, IEDMODEL_MUnn_TVTR2_Vol_q, q); - IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TVTR3_Vol_instMag_i, voltage); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TVTR3_Vol_instMag_i, voltageC); IedServer_updateQuality(iedServer, IEDMODEL_MUnn_TVTR3_Vol_q, q); - IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TVTR4_Vol_instMag_i, voltage); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_MUnn_TVTR4_Vol_instMag_i, voltageN); IedServer_updateQuality(iedServer, IEDMODEL_MUnn_TVTR4_Vol_q, q); IedServer_unlockDataModel(iedServer); if (svcbEnabled) { - SVPublisher_ASDU_setINT32(asdu, amp1, current); + SVPublisher_ASDU_setINT32(asdu, amp1, currentA); SVPublisher_ASDU_setQuality(asdu, amp1q, q); - SVPublisher_ASDU_setINT32(asdu, amp2, current); + SVPublisher_ASDU_setINT32(asdu, amp2, currentB); SVPublisher_ASDU_setQuality(asdu, amp2q, q); - SVPublisher_ASDU_setINT32(asdu, amp3, current); + SVPublisher_ASDU_setINT32(asdu, amp3, currentC); SVPublisher_ASDU_setQuality(asdu, amp3q, q); - SVPublisher_ASDU_setINT32(asdu, amp4, current); + SVPublisher_ASDU_setINT32(asdu, amp4, currentN); SVPublisher_ASDU_setQuality(asdu, amp4q, q); - SVPublisher_ASDU_setINT32(asdu, vol1, voltage); + SVPublisher_ASDU_setINT32(asdu, vol1, voltageA); SVPublisher_ASDU_setQuality(asdu, vol1q, q); - SVPublisher_ASDU_setINT32(asdu, vol2, voltage); + SVPublisher_ASDU_setINT32(asdu, vol2, voltageB); SVPublisher_ASDU_setQuality(asdu, vol2q, q); - SVPublisher_ASDU_setINT32(asdu, vol3, voltage); + SVPublisher_ASDU_setINT32(asdu, vol3, voltageC); SVPublisher_ASDU_setQuality(asdu, vol3q, q); - SVPublisher_ASDU_setINT32(asdu, vol4, voltage); + SVPublisher_ASDU_setINT32(asdu, vol4, voltageN); SVPublisher_ASDU_setQuality(asdu, vol4q, q); - SVPublisher_ASDU_increaseSmpCnt(asdu); + SVPublisher_ASDU_setSmpCnt(asdu, (uint16_t) sampleCount); SVPublisher_publish(svPublisher); } - voltage++; - current++; + sampleCount = ((sampleCount + 1) % 4000); + + if ((sampleCount % 400) == 0) { + uint64_t timeval = Hal_getTimeInMs(); - Thread_sleep(1); + while (timeval < nextCycleStart + 100) { + Thread_sleep(1); + + timeval = Hal_getTimeInMs(); + } + + nextCycleStart = nextCycleStart + 100; + } } /* stop MMS server - close TCP server socket and all client sockets */ diff --git a/make/target_system.mk b/make/target_system.mk index 107f9b0b..b03a0ec7 100644 --- a/make/target_system.mk +++ b/make/target_system.mk @@ -1,10 +1,10 @@ UNAME := $(shell uname) MIPSEL_TOOLCHAIN_PREFIX=mipsel-openwrt-linux- -ARM_TOOLCHAIN_PREFIX=arm-linux- +#ARM_TOOLCHAIN_PREFIX=arm-linux- #ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi- #ARM_TOOLCHAIN_PREFIX=arm-poky-linux-gnueabi- -#ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi- +ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabihf- UCLINUX_ARM_TOOLCHAIN_PREFIX=arm-uclinux-elf- UCLINUX_XPORT_TOOLCHAIN_PREFIX=m68k-uclinux- MINGW_TOOLCHAIN_PREFIX=i586-mingw32msvc-