From 0193902da1a707ab6994ecc3bcb717bd68c9c5c5 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 10 Nov 2015 17:41:45 +0100 Subject: [PATCH] - M/U SVCB implementation WIP - added example project for IEC 61850-9-2 LE --- .../iec61850_9_2_LE_example/CMakeLists.txt | 21 + examples/iec61850_9_2_LE_example/Makefile | 24 + .../iec61850_9_2_LE_example/server_example2.c | 86 ++ .../iec61850_9_2_LE_example/static_model.c | 1009 +++++++++++++++++ .../iec61850_9_2_LE_example/static_model.h | 161 +++ examples/iec61850_9_2_LE_example/sv.icd | 148 +++ examples/mms_utility/mms_utility.c | 48 +- src/iec61850/inc/iec61850_model.h | 2 +- src/iec61850/inc_private/mms_sv.h | 12 + src/iec61850/server/impl/ied_server.c | 11 +- src/iec61850/server/mms_mapping/mms_mapping.c | 46 +- src/iec61850/server/mms_mapping/mms_sv.c | 122 +- src/mms/inc/mms_client_connection.h | 3 +- tools/model_generator/genconfig.jar | Bin 75506 -> 78699 bytes tools/model_generator/genmodel.jar | Bin 75518 -> 79544 bytes .../scl/communication/ConnectedAP.java | 10 +- .../libiec61850/scl/model/LogicalNode.java | 5 +- .../scl/model/SampledValueControl.java | 7 +- .../com/libiec61850/scl/model/SmvOpts.java | 23 +- .../tools/StaticModelGenerator.java | 135 ++- 20 files changed, 1845 insertions(+), 28 deletions(-) create mode 100644 examples/iec61850_9_2_LE_example/CMakeLists.txt create mode 100644 examples/iec61850_9_2_LE_example/Makefile create mode 100644 examples/iec61850_9_2_LE_example/server_example2.c create mode 100644 examples/iec61850_9_2_LE_example/static_model.c create mode 100644 examples/iec61850_9_2_LE_example/static_model.h create mode 100644 examples/iec61850_9_2_LE_example/sv.icd diff --git a/examples/iec61850_9_2_LE_example/CMakeLists.txt b/examples/iec61850_9_2_LE_example/CMakeLists.txt new file mode 100644 index 00000000..994caae3 --- /dev/null +++ b/examples/iec61850_9_2_LE_example/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + . +) + +set(server_example2_SRCS + server_example2.c + static_model.c +) + +IF(WIN32) +set_source_files_properties(${server_example2_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(server_example2 + ${server_example2_SRCS} +) + +target_link_libraries(server_example2 + iec61850 +) diff --git a/examples/iec61850_9_2_LE_example/Makefile b/examples/iec61850_9_2_LE_example/Makefile new file mode 100644 index 00000000..3781758b --- /dev/null +++ b/examples/iec61850_9_2_LE_example/Makefile @@ -0,0 +1,24 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = server_example2 +PROJECT_SOURCES = server_example2.c +PROJECT_SOURCES += static_model.c + +PROJECT_ICD_FILE = complexModel.icd + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +model: $(PROJECT_ICD_FILE) + java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDFLAGS) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) + diff --git a/examples/iec61850_9_2_LE_example/server_example2.c b/examples/iec61850_9_2_LE_example/server_example2.c new file mode 100644 index 00000000..662cf501 --- /dev/null +++ b/examples/iec61850_9_2_LE_example/server_example2.c @@ -0,0 +1,86 @@ +/* + * server_example2.c + * + * Copyright 2013 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#include "iec61850_server.h" +#include "hal_thread.h" +#include +#include +#include + + +/* Include the generated header with the model access handles */ +#include "static_model.h" + +/* import IEC 61850 device model created from SCL-File */ +extern IedModel iedModel; + +static int running = 0; + +void sigint_handler(int signalId) +{ + running = 0; +} + +int +main(int argc, char** argv) +{ + IedServer iedServer = IedServer_create(&iedModel); + + // TODO get stored values from persistent storage + + // TODO set initial measurement and status values from process + + /* MMS server will be instructed to start listening to client connections. */ + IedServer_start(iedServer, 102); + + if (!IedServer_isRunning(iedServer)) { + printf("Starting server failed! Exit.\n"); + IedServer_destroy(iedServer); + exit(-1); + } + + running = 1; + + signal(SIGINT, sigint_handler); + + float power = 500.f; + + while (running) { + + uint64_t timeval = Hal_getTimeInMs(); + + IedServer_unlockDataModel(iedServer); + + power += 0.1f; + + Thread_sleep(500); + } + + /* stop MMS server - close TCP server socket and all client sockets */ + IedServer_stop(iedServer); + + /* Cleanup - free all resources */ + IedServer_destroy(iedServer); + + return 0; +} /* main() */ diff --git a/examples/iec61850_9_2_LE_example/static_model.c b/examples/iec61850_9_2_LE_example/static_model.c new file mode 100644 index 00000000..ecc29bfb --- /dev/null +++ b/examples/iec61850_9_2_LE_example/static_model.c @@ -0,0 +1,1009 @@ +/* + * static_model.c + * + * automatically generated from sv.icd + */ +#include "static_model.h" + +static void initializeValues(); + +extern DataSet iedModelds_MUnn_LLN0_PhsMeas1; + + +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda0; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda1; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda2; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda3; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda4; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda5; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda6; +extern DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda7; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda0 = { + "1", + false, + "TCTR$MX$Amp", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda1 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda1 = { + "2", + false, + "TCTR$MX$Amp", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda2 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda2 = { + "3", + false, + "TCTR$MX$Amp", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda3 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda3 = { + "4", + false, + "TCTR$MX$Amp", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda4 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda4 = { + "1", + false, + "TVTR$MX$Vol", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda5 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda5 = { + "2", + false, + "TVTR$MX$Vol", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda6 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda6 = { + "3", + false, + "TVTR$MX$Vol", + -1, + NULL, + NULL, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda7 +}; + +DataSetEntry iedModelds_MUnn_LLN0_PhsMeas1_fcda7 = { + "4", + false, + "TVTR$MX$Vol", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_MUnn_LLN0_PhsMeas1 = { + "MUnn", + "LLN0$PhsMeas1", + 8, + &iedModelds_MUnn_LLN0_PhsMeas1_fcda0, + NULL +}; + +LogicalDevice iedModel_MUnn = { + LogicalDeviceModelType, + "MUnn", + (ModelNode*) &iedModel, + NULL, + (ModelNode*) &iedModel_MUnn_LLN0 +}; + +LogicalNode iedModel_MUnn_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TCTR1, + (ModelNode*) &iedModel_MUnn_LLN0_Mod, +}; + +DataObject iedModel_MUnn_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_MUnn_LLN0, + NULL, + (ModelNode*) &iedModel_MUnn_LLN0_Mod_ctlVal, + 0 +}; + +DataAttribute iedModel_MUnn_LLN0_Mod_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_MUnn_LLN0_Mod, + (ModelNode*) &iedModel_MUnn_LLN0_Mod_stVal, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_LLN0_Mod_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_MUnn_LLN0_Mod, + (ModelNode*) &iedModel_MUnn_LLN0_Mod_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_MUnn_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_LLN0_Mod, + (ModelNode*) &iedModel_MUnn_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_MUnn_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_MUnn_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TCTR1 = { + LogicalNodeModelType, + "TCTR1", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TCTR2, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp, +}; + +DataObject iedModel_MUnn_TCTR1_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_MUnn_TCTR1, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_q, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC, + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR1_Amp_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TCTR1_Amp_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TCTR2 = { + LogicalNodeModelType, + "TCTR2", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TCTR3, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp, +}; + +DataObject iedModel_MUnn_TCTR2_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_MUnn_TCTR2, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_q, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC, + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR2_Amp_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TCTR2_Amp_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TCTR3 = { + LogicalNodeModelType, + "TCTR3", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TCTR4, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp, +}; + +DataObject iedModel_MUnn_TCTR3_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_MUnn_TCTR3, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_q, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC, + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR3_Amp_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TCTR3_Amp_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TCTR4 = { + LogicalNodeModelType, + "TCTR4", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TVTR1, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp, +}; + +DataObject iedModel_MUnn_TCTR4_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_MUnn_TCTR4, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_q, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp, + NULL, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC, + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TCTR4_Amp_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TCTR4_Amp_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TVTR1 = { + LogicalNodeModelType, + "TVTR1", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TVTR2, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol, +}; + +DataObject iedModel_MUnn_TVTR1_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_MUnn_TVTR1, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_q, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC, + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR1_Vol_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TVTR1_Vol_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TVTR2 = { + LogicalNodeModelType, + "TVTR2", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TVTR3, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol, +}; + +DataObject iedModel_MUnn_TVTR2_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_MUnn_TVTR2, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_q, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC, + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR2_Vol_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TVTR2_Vol_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TVTR3 = { + LogicalNodeModelType, + "TVTR3", + (ModelNode*) &iedModel_MUnn, + (ModelNode*) &iedModel_MUnn_TVTR4, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol, +}; + +DataObject iedModel_MUnn_TVTR3_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_MUnn_TVTR3, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_q, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC, + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR3_Vol_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TVTR3_Vol_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +LogicalNode iedModel_MUnn_TVTR4 = { + LogicalNodeModelType, + "TVTR4", + (ModelNode*) &iedModel_MUnn, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol, +}; + +DataObject iedModel_MUnn_TVTR4_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_MUnn_TVTR4, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_instMag, + 0 +}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_instMag = { + DataAttributeModelType, + "instMag", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_q, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_instMag_i, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_instMag_i = { + DataAttributeModelType, + "i", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_instMag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_sVC = { + DataAttributeModelType, + "sVC", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol, + NULL, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor = { + DataAttributeModelType, + "scaleFactor", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC, + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC_offset, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_MUnn_TVTR4_Vol_sVC_offset = { + DataAttributeModelType, + "offset", + (ModelNode*) &iedModel_MUnn_TVTR4_Vol_sVC, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + + + +extern SVControlBlock iedModel_MUnn_LLN0_smv0; + +static PhyComAddress iedModel_MUnn_LLN0_smv0_address = { + 4, + 1, + 4097, + {0x1, 0xc, 0xcd, 0x4, 0x0, 0x1} +}; + +SVControlBlock iedModel_MUnn_LLN0_smv0 = {&iedModel_MUnn_LLN0, "MSVCB01", "xxxxMUnn01", "PhsMeas1", 2, 0, 80, 1, &iedModel_MUnn_LLN0_smv0_address, true, 1, NULL}; + + + + +IedModel iedModel = { + "TEMPLATE", + &iedModel_MUnn, + &iedModelds_MUnn_LLN0_PhsMeas1, + NULL, + NULL, + &iedModel_MUnn_LLN0_smv0, + NULL, + initializeValues +}; + +static void +initializeValues() +{ + +iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.001); + +iedModel_MUnn_TCTR1_Amp_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.001); + +iedModel_MUnn_TCTR2_Amp_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.001); + +iedModel_MUnn_TCTR3_Amp_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.001); + +iedModel_MUnn_TCTR4_Amp_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.01); + +iedModel_MUnn_TVTR1_Vol_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.01); + +iedModel_MUnn_TVTR2_Vol_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.01); + +iedModel_MUnn_TVTR3_Vol_sVC_offset.mmsValue = MmsValue_newFloat(0.0); + +iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor.mmsValue = MmsValue_newFloat(0.01); + +iedModel_MUnn_TVTR4_Vol_sVC_offset.mmsValue = MmsValue_newFloat(0.0); +} diff --git a/examples/iec61850_9_2_LE_example/static_model.h b/examples/iec61850_9_2_LE_example/static_model.h new file mode 100644 index 00000000..f45de247 --- /dev/null +++ b/examples/iec61850_9_2_LE_example/static_model.h @@ -0,0 +1,161 @@ +/* + * static_model.h + * + * automatically generated from sv.icd + */ + +#ifndef STATIC_MODEL_H_ +#define STATIC_MODEL_H_ + +#include +#include "iec61850_model.h" + +extern IedModel iedModel; +extern LogicalDevice iedModel_MUnn; +extern LogicalNode iedModel_MUnn_LLN0; +extern DataObject iedModel_MUnn_LLN0_Mod; +extern DataAttribute iedModel_MUnn_LLN0_Mod_ctlVal; +extern DataAttribute iedModel_MUnn_LLN0_Mod_stVal; +extern DataAttribute iedModel_MUnn_LLN0_Mod_q; +extern DataAttribute iedModel_MUnn_LLN0_Mod_t; +extern LogicalNode iedModel_MUnn_TCTR1; +extern DataObject iedModel_MUnn_TCTR1_Amp; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_instMag; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_instMag_i; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_q; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_sVC; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TCTR1_Amp_sVC_offset; +extern LogicalNode iedModel_MUnn_TCTR2; +extern DataObject iedModel_MUnn_TCTR2_Amp; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_instMag; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_instMag_i; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_q; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_sVC; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TCTR2_Amp_sVC_offset; +extern LogicalNode iedModel_MUnn_TCTR3; +extern DataObject iedModel_MUnn_TCTR3_Amp; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_instMag; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_instMag_i; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_q; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_sVC; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TCTR3_Amp_sVC_offset; +extern LogicalNode iedModel_MUnn_TCTR4; +extern DataObject iedModel_MUnn_TCTR4_Amp; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_instMag; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_instMag_i; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_q; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_sVC; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TCTR4_Amp_sVC_offset; +extern LogicalNode iedModel_MUnn_TVTR1; +extern DataObject iedModel_MUnn_TVTR1_Vol; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_instMag; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_instMag_i; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_q; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_sVC; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TVTR1_Vol_sVC_offset; +extern LogicalNode iedModel_MUnn_TVTR2; +extern DataObject iedModel_MUnn_TVTR2_Vol; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_instMag; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_instMag_i; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_q; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_sVC; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TVTR2_Vol_sVC_offset; +extern LogicalNode iedModel_MUnn_TVTR3; +extern DataObject iedModel_MUnn_TVTR3_Vol; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_instMag; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_instMag_i; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_q; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_sVC; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TVTR3_Vol_sVC_offset; +extern LogicalNode iedModel_MUnn_TVTR4; +extern DataObject iedModel_MUnn_TVTR4_Vol; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_instMag; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_instMag_i; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_q; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_sVC; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor; +extern DataAttribute iedModel_MUnn_TVTR4_Vol_sVC_offset; + + + +#define IEDMODEL_MUnn (&iedModel_MUnn) +#define IEDMODEL_MUnn_LLN0 (&iedModel_MUnn_LLN0) +#define IEDMODEL_MUnn_LLN0_Mod (&iedModel_MUnn_LLN0_Mod) +#define IEDMODEL_MUnn_LLN0_Mod_ctlVal (&iedModel_MUnn_LLN0_Mod_ctlVal) +#define IEDMODEL_MUnn_LLN0_Mod_stVal (&iedModel_MUnn_LLN0_Mod_stVal) +#define IEDMODEL_MUnn_LLN0_Mod_q (&iedModel_MUnn_LLN0_Mod_q) +#define IEDMODEL_MUnn_LLN0_Mod_t (&iedModel_MUnn_LLN0_Mod_t) +#define IEDMODEL_MUnn_TCTR1 (&iedModel_MUnn_TCTR1) +#define IEDMODEL_MUnn_TCTR1_Amp (&iedModel_MUnn_TCTR1_Amp) +#define IEDMODEL_MUnn_TCTR1_Amp_instMag (&iedModel_MUnn_TCTR1_Amp_instMag) +#define IEDMODEL_MUnn_TCTR1_Amp_instMag_i (&iedModel_MUnn_TCTR1_Amp_instMag_i) +#define IEDMODEL_MUnn_TCTR1_Amp_q (&iedModel_MUnn_TCTR1_Amp_q) +#define IEDMODEL_MUnn_TCTR1_Amp_sVC (&iedModel_MUnn_TCTR1_Amp_sVC) +#define IEDMODEL_MUnn_TCTR1_Amp_sVC_scaleFactor (&iedModel_MUnn_TCTR1_Amp_sVC_scaleFactor) +#define IEDMODEL_MUnn_TCTR1_Amp_sVC_offset (&iedModel_MUnn_TCTR1_Amp_sVC_offset) +#define IEDMODEL_MUnn_TCTR2 (&iedModel_MUnn_TCTR2) +#define IEDMODEL_MUnn_TCTR2_Amp (&iedModel_MUnn_TCTR2_Amp) +#define IEDMODEL_MUnn_TCTR2_Amp_instMag (&iedModel_MUnn_TCTR2_Amp_instMag) +#define IEDMODEL_MUnn_TCTR2_Amp_instMag_i (&iedModel_MUnn_TCTR2_Amp_instMag_i) +#define IEDMODEL_MUnn_TCTR2_Amp_q (&iedModel_MUnn_TCTR2_Amp_q) +#define IEDMODEL_MUnn_TCTR2_Amp_sVC (&iedModel_MUnn_TCTR2_Amp_sVC) +#define IEDMODEL_MUnn_TCTR2_Amp_sVC_scaleFactor (&iedModel_MUnn_TCTR2_Amp_sVC_scaleFactor) +#define IEDMODEL_MUnn_TCTR2_Amp_sVC_offset (&iedModel_MUnn_TCTR2_Amp_sVC_offset) +#define IEDMODEL_MUnn_TCTR3 (&iedModel_MUnn_TCTR3) +#define IEDMODEL_MUnn_TCTR3_Amp (&iedModel_MUnn_TCTR3_Amp) +#define IEDMODEL_MUnn_TCTR3_Amp_instMag (&iedModel_MUnn_TCTR3_Amp_instMag) +#define IEDMODEL_MUnn_TCTR3_Amp_instMag_i (&iedModel_MUnn_TCTR3_Amp_instMag_i) +#define IEDMODEL_MUnn_TCTR3_Amp_q (&iedModel_MUnn_TCTR3_Amp_q) +#define IEDMODEL_MUnn_TCTR3_Amp_sVC (&iedModel_MUnn_TCTR3_Amp_sVC) +#define IEDMODEL_MUnn_TCTR3_Amp_sVC_scaleFactor (&iedModel_MUnn_TCTR3_Amp_sVC_scaleFactor) +#define IEDMODEL_MUnn_TCTR3_Amp_sVC_offset (&iedModel_MUnn_TCTR3_Amp_sVC_offset) +#define IEDMODEL_MUnn_TCTR4 (&iedModel_MUnn_TCTR4) +#define IEDMODEL_MUnn_TCTR4_Amp (&iedModel_MUnn_TCTR4_Amp) +#define IEDMODEL_MUnn_TCTR4_Amp_instMag (&iedModel_MUnn_TCTR4_Amp_instMag) +#define IEDMODEL_MUnn_TCTR4_Amp_instMag_i (&iedModel_MUnn_TCTR4_Amp_instMag_i) +#define IEDMODEL_MUnn_TCTR4_Amp_q (&iedModel_MUnn_TCTR4_Amp_q) +#define IEDMODEL_MUnn_TCTR4_Amp_sVC (&iedModel_MUnn_TCTR4_Amp_sVC) +#define IEDMODEL_MUnn_TCTR4_Amp_sVC_scaleFactor (&iedModel_MUnn_TCTR4_Amp_sVC_scaleFactor) +#define IEDMODEL_MUnn_TCTR4_Amp_sVC_offset (&iedModel_MUnn_TCTR4_Amp_sVC_offset) +#define IEDMODEL_MUnn_TVTR1 (&iedModel_MUnn_TVTR1) +#define IEDMODEL_MUnn_TVTR1_Vol (&iedModel_MUnn_TVTR1_Vol) +#define IEDMODEL_MUnn_TVTR1_Vol_instMag (&iedModel_MUnn_TVTR1_Vol_instMag) +#define IEDMODEL_MUnn_TVTR1_Vol_instMag_i (&iedModel_MUnn_TVTR1_Vol_instMag_i) +#define IEDMODEL_MUnn_TVTR1_Vol_q (&iedModel_MUnn_TVTR1_Vol_q) +#define IEDMODEL_MUnn_TVTR1_Vol_sVC (&iedModel_MUnn_TVTR1_Vol_sVC) +#define IEDMODEL_MUnn_TVTR1_Vol_sVC_scaleFactor (&iedModel_MUnn_TVTR1_Vol_sVC_scaleFactor) +#define IEDMODEL_MUnn_TVTR1_Vol_sVC_offset (&iedModel_MUnn_TVTR1_Vol_sVC_offset) +#define IEDMODEL_MUnn_TVTR2 (&iedModel_MUnn_TVTR2) +#define IEDMODEL_MUnn_TVTR2_Vol (&iedModel_MUnn_TVTR2_Vol) +#define IEDMODEL_MUnn_TVTR2_Vol_instMag (&iedModel_MUnn_TVTR2_Vol_instMag) +#define IEDMODEL_MUnn_TVTR2_Vol_instMag_i (&iedModel_MUnn_TVTR2_Vol_instMag_i) +#define IEDMODEL_MUnn_TVTR2_Vol_q (&iedModel_MUnn_TVTR2_Vol_q) +#define IEDMODEL_MUnn_TVTR2_Vol_sVC (&iedModel_MUnn_TVTR2_Vol_sVC) +#define IEDMODEL_MUnn_TVTR2_Vol_sVC_scaleFactor (&iedModel_MUnn_TVTR2_Vol_sVC_scaleFactor) +#define IEDMODEL_MUnn_TVTR2_Vol_sVC_offset (&iedModel_MUnn_TVTR2_Vol_sVC_offset) +#define IEDMODEL_MUnn_TVTR3 (&iedModel_MUnn_TVTR3) +#define IEDMODEL_MUnn_TVTR3_Vol (&iedModel_MUnn_TVTR3_Vol) +#define IEDMODEL_MUnn_TVTR3_Vol_instMag (&iedModel_MUnn_TVTR3_Vol_instMag) +#define IEDMODEL_MUnn_TVTR3_Vol_instMag_i (&iedModel_MUnn_TVTR3_Vol_instMag_i) +#define IEDMODEL_MUnn_TVTR3_Vol_q (&iedModel_MUnn_TVTR3_Vol_q) +#define IEDMODEL_MUnn_TVTR3_Vol_sVC (&iedModel_MUnn_TVTR3_Vol_sVC) +#define IEDMODEL_MUnn_TVTR3_Vol_sVC_scaleFactor (&iedModel_MUnn_TVTR3_Vol_sVC_scaleFactor) +#define IEDMODEL_MUnn_TVTR3_Vol_sVC_offset (&iedModel_MUnn_TVTR3_Vol_sVC_offset) +#define IEDMODEL_MUnn_TVTR4 (&iedModel_MUnn_TVTR4) +#define IEDMODEL_MUnn_TVTR4_Vol (&iedModel_MUnn_TVTR4_Vol) +#define IEDMODEL_MUnn_TVTR4_Vol_instMag (&iedModel_MUnn_TVTR4_Vol_instMag) +#define IEDMODEL_MUnn_TVTR4_Vol_instMag_i (&iedModel_MUnn_TVTR4_Vol_instMag_i) +#define IEDMODEL_MUnn_TVTR4_Vol_q (&iedModel_MUnn_TVTR4_Vol_q) +#define IEDMODEL_MUnn_TVTR4_Vol_sVC (&iedModel_MUnn_TVTR4_Vol_sVC) +#define IEDMODEL_MUnn_TVTR4_Vol_sVC_scaleFactor (&iedModel_MUnn_TVTR4_Vol_sVC_scaleFactor) +#define IEDMODEL_MUnn_TVTR4_Vol_sVC_offset (&iedModel_MUnn_TVTR4_Vol_sVC_offset) + +#endif /* STATIC_MODEL_H_ */ + diff --git a/examples/iec61850_9_2_LE_example/sv.icd b/examples/iec61850_9_2_LE_example/sv.icd new file mode 100644 index 00000000..78ade53b --- /dev/null +++ b/examples/iec61850_9_2_LE_example/sv.icd @@ -0,0 +1,148 @@ + + + +
+ + + Station bus + 10 + +
+

10.0.0.2

+

255.255.255.0

+

10.0.0.1

+

0001

+

00000001

+

0001

+
+ + +
+

1

+

4

+

01-0c-cd-04-00-01

+

1001

+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.001 + + +0 + + + + +0.01 + + +0 + + + + + diff --git a/examples/mms_utility/mms_utility.c b/examples/mms_utility/mms_utility.c index b59d3337..51976a6f 100644 --- a/examples/mms_utility/mms_utility.c +++ b/examples/mms_utility/mms_utility.c @@ -15,6 +15,8 @@ print_help() printf("-d show list of MMS domains\n"); printf("-i show server identity\n"); printf("-t show domain directory\n"); + printf("-r read domain variable\n"); + printf("-a specify domain for read or write command"); } int main(int argc, char** argv) { @@ -24,14 +26,18 @@ int main(int argc, char** argv) { int maxPduSize = 65000; char* domainName = NULL; + char* variableName = NULL; int readDeviceList = 0; int getDeviceDirectory = 0; int identifyDevice = 0; + int readWriteHasDomain = 0; + int readVariable = 0; + int c; - while ((c = getopt(argc, argv, "idh:p:l:t:")) != -1) + while ((c = getopt(argc, argv, "idh:p:l:t:a:r:")) != -1) switch (c) { case 'h': hostname = copyString(optarg); @@ -52,6 +58,15 @@ int main(int argc, char** argv) { getDeviceDirectory = 1; domainName = copyString(optarg); break; + case 'a': + readWriteHasDomain = 1; + domainName = copyString(optarg); + break; + case 'r': + readVariable = 1; + variableName = copyString(optarg); + break; + default: print_help(); return 0; @@ -103,12 +118,39 @@ int main(int argc, char** argv) { while ((element = LinkedList_getNext(element)) != NULL) { char* name = (char*) element->data; - if (strchr(name, '$') == NULL) - printf(" %s\n", name); + printf(" %s\n", name); } } + if (readVariable) { + if (readWriteHasDomain) { + MmsValue* result = MmsConnection_readVariable(con, &error, domainName, variableName); + + if (error != MMS_ERROR_NONE) { + printf("Reading variable failed: (ERROR %i)\n", error); + } + else { + printf("Read SUCCESS\n"); + + + if (result != NULL) { + char outbuf[1024]; + + MmsValue_printToBuffer(result, outbuf, 1024); + + printf("%s\n", outbuf); + } + else + printf("result: NULL\n"); + } + + } + else + printf("Reading VMD scope variable not yet supported!\n"); + } + + exit: MmsConnection_destroy(con); } diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index 258c9b10..376593b0 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -1,7 +1,7 @@ /* * model.h * - * Copyright 2013, 2014 Michael Zillgith + * Copyright 2013, 2014, 2015 Michael Zillgith * * This file is part of libIEC61850. * diff --git a/src/iec61850/inc_private/mms_sv.h b/src/iec61850/inc_private/mms_sv.h index 4af77fe5..6f59a374 100644 --- a/src/iec61850/inc_private/mms_sv.h +++ b/src/iec61850/inc_private/mms_sv.h @@ -24,8 +24,20 @@ #ifndef LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ #define LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ + +typedef struct sMmsSampledValueControlBlock* MmsSampledValueControlBlock; + +MmsSampledValueControlBlock +MmsSampledValueControlBlock_create(void); + +void +MmsSampledValueControlBlock_destroy(MmsSampledValueControlBlock self); + MmsVariableSpecification* LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, LogicalNode* logicalNode, int svCount, bool unicast); +MmsValue* +LIBIEC61850_SV_readAccessSampledValueControlBlock(MmsMapping* self, MmsDomain* domain, char* variableIdOrig); + #endif /* LIBIEC61850_SRC_IEC61850_INC_PRIVATE_MMS_SV_H_ */ diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index 7652650a..83a3a9ef 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -188,7 +188,16 @@ createMmsServerCache(IedServer self) #endif /* (CONFIG_IEC61850_CONTROL_SERVICE == 1) */ if ((strcmp(fcName, "BR") != 0) && (strcmp(fcName, "RP") != 0) - && (strcmp(fcName, "GO") != 0)) + +#if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) + && (strcmp(fcName, "GO") != 0) +#endif + +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + && (strcmp(fcName, "MS") != 0) && (strcmp(fcName, "US") != 0) +#endif + + ) { char* variableName = createString(3, lnName, "$", fcName); diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 0a488866..7e873698 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1,7 +1,7 @@ /* * mms_mapping.c * - * Copyright 2013, 2014 Michael Zillgith + * Copyright 2013, 2014, 2015 Michael Zillgith * * This file is part of libIEC61850. * @@ -28,6 +28,7 @@ #include "stack_config.h" #include "mms_goose.h" +#include "mms_sv.h" #include "reporting.h" #include "control.h" #include "ied_server_private.h" @@ -1008,14 +1009,14 @@ createNamedVariableFromLogicalNode(MmsMapping* self, MmsDomain* domain, /* Add MS and US named variables */ if (msvcbCount > 0) { namedVariable->typeSpec.structure.elements[currentComponent] = - LIBIEC61850_SV_creatSVControlBlocks(self, domain, logicalNode, msvcbCount, false); + LIBIEC61850_SV_createSVControlBlocks(self, domain, logicalNode, msvcbCount, false); currentComponent++; } if (usvcbCount > 0) { namedVariable->typeSpec.structure.elements[currentComponent] = - LIBIEC61850_SV_creatSVControlBlocks(self, domain, logicalNode, msvcbCount, true); + LIBIEC61850_SV_createSVControlBlocks(self, domain, logicalNode, msvcbCount, true); currentComponent++; } @@ -1243,7 +1244,7 @@ MmsMapping_destroy(MmsMapping* self) #endif #if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) - LinkedList_destroyDeep(self->svControls, (LinkedListValueDeleteFunction) MmsSvControlBlock_destroy); + LinkedList_destroyDeep(self->svControls, (LinkedListValueDeleteFunction) MmsSampledValueControlBlock_destroy); #endif #if (CONFIG_IEC61850_CONTROL_SERVICE == 1) @@ -1353,6 +1354,23 @@ isGooseControlBlock(char* separator) #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ + +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + +static bool +isSampledValueControlBlock(char* separator) +{ + if (strncmp(separator + 1, "MS", 2) == 0) + return true; + + if (strncmp(separator + 1, "US", 2) == 0) + return true; + + return false; +} + +#endif /* (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) */ + char* MmsMapping_getNextNameElement(char* name) { @@ -1679,6 +1697,14 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, } #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + /* Sampled Value control block - MS/US */ + if (isSampledValueControlBlock(separator)) { + //TODO handle write access to SVCB + } +#endif /* (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) */ + + #if (CONFIG_IEC61850_REPORT_SERVICE == 1) /* Report control blocks - BR, RP */ if (isReportControlBlock(separator)) { @@ -2075,6 +2101,7 @@ readAccessGooseControlBlock(MmsMapping* self, MmsDomain* domain, char* variableI #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ + static MmsValue* mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerConnection connection) { @@ -2100,14 +2127,23 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo } #endif - /* GOOSE control blocks - GO */ + #if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) + /* GOOSE control blocks - GO */ if (isGooseControlBlock(separator)) { retValue = readAccessGooseControlBlock(self, domain, variableId); goto exit_function; } #endif +#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) + /* Sampled Value control blocks - MS/US */ + if (isSampledValueControlBlock(separator)) { + retValue = LIBIEC61850_SV_readAccessSampledValueControlBlock(self, domain, variableId); + goto exit_function; + } +#endif + #if (CONFIG_IEC61850_REPORT_SERVICE == 1) /* Report control blocks - BR, RP */ if (isReportControlBlock(separator)) { diff --git a/src/iec61850/server/mms_mapping/mms_sv.c b/src/iec61850/server/mms_mapping/mms_sv.c index 56e8674b..c4f1c1ce 100644 --- a/src/iec61850/server/mms_mapping/mms_sv.c +++ b/src/iec61850/server/mms_mapping/mms_sv.c @@ -30,10 +30,109 @@ #include "linked_list.h" #include "array_list.h" +#include "mms_sv.h" + #include "mms_mapping_internal.h" +struct sMmsSampledValueControlBlock { + char* name; + bool svEna; + + char* dstAddress; + + MmsDomain* domain; + LogicalNode* logicalNode; + + MmsVariableSpecification* mmsType; + MmsValue* mmsValue; + + //MmsMapping* mmsMapping; +}; + +MmsSampledValueControlBlock +MmsSampledValueControlBlock_create() +{ + MmsSampledValueControlBlock self = (MmsSampledValueControlBlock) GLOBAL_CALLOC(1, sizeof(struct sMmsSampledValueControlBlock)); + + return self; +} + + +void +MmsSampledValueControlBlock_destroy(MmsSampledValueControlBlock self) +{ + MmsValue_delete(self->mmsValue); + + GLOBAL_FREEMEM(self); +} + +static MmsSampledValueControlBlock +lookupSVCB(MmsMapping* self, MmsDomain* domain, char* lnName, char* objectName) +{ + LinkedList element = LinkedList_getNext(self->svControls); + + while (element != NULL) { + MmsSampledValueControlBlock mmsSVCB = (MmsSampledValueControlBlock) element->data; + + if (mmsSVCB->domain == domain) { + if (strcmp(mmsSVCB->logicalNode->name, lnName) == 0) { + if (strcmp(mmsSVCB->name, objectName) == 0) { + return mmsSVCB; + } + } + } + + element = LinkedList_getNext(element); + } + + return NULL; +} + + +MmsValue* +LIBIEC61850_SV_readAccessSampledValueControlBlock(MmsMapping* self, MmsDomain* domain, char* variableIdOrig) +{ + MmsValue* value = NULL; + + char variableId[130]; + + strncpy(variableId, variableIdOrig, 129); + + char* separator = strchr(variableId, '$'); + + *separator = 0; + + char* lnName = variableId; + + if (lnName == NULL) + return NULL; + + char* objectName = MmsMapping_getNextNameElement(separator + 1); -static GSEControlBlock* + if (objectName == NULL) + return NULL; + + char* varName = MmsMapping_getNextNameElement(objectName); + + if (varName != NULL) + *(varName - 1) = 0; + + MmsSampledValueControlBlock mmsSVCB = lookupSVCB(self, domain, lnName, objectName); + + if (mmsSVCB != NULL) { + if (varName != NULL) { + value = MmsValue_getSubElement(mmsSVCB->mmsValue, mmsSVCB->mmsType, varName); + } + else { + value = mmsSVCB->mmsValue; + } + } + + return value; +} + + +static SVControlBlock* getSVCBForLogicalNodeWithIndex(MmsMapping* self, LogicalNode* logicalNode, int index, bool isUnicast) { int svCount = 0; @@ -88,6 +187,8 @@ createSVControlBlockMmsStructure(char* gcbName, bool isUnicast) namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("Resv"); namedVariable->type = MMS_BOOLEAN; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; } namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); @@ -128,6 +229,13 @@ createSVControlBlockMmsStructure(char* gcbName, bool isUnicast) gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = copyString("SmpMod"); + namedVariable->type = MMS_INTEGER; + namedVariable->typeSpec.integer = 8; + + gcb->typeSpec.structure.elements[currentElement++] = namedVariable; + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("DstAddress"); MmsMapping_createPhyComAddrStructure(namedVariable); @@ -205,7 +313,7 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, /* SmpMod */ MmsValue* smpMod = MmsValue_getElement(svValues, currentIndex++); - MmsValue_setInt32(smpRate, svControlBlock->smpMod); + MmsValue_setInt32(smpMod, svControlBlock->smpMod); /* Set communication parameters - DstAddress */ uint8_t priority = CONFIG_GOOSE_DEFAULT_PRIORITY; @@ -242,6 +350,16 @@ LIBIEC61850_SV_createSVControlBlocks(MmsMapping* self, MmsDomain* domain, MmsValue* noASDU = MmsValue_getElement(svValues, currentIndex++); MmsValue_setInt32(noASDU, svControlBlock->noASDU); + MmsSampledValueControlBlock mmsSvCb = MmsSampledValueControlBlock_create(); + + mmsSvCb->mmsValue = svValues; + mmsSvCb->mmsType = svTypeSpec; + mmsSvCb->domain = domain; + mmsSvCb->logicalNode = logicalNode; + mmsSvCb->name = svControlBlock->name; + + LinkedList_add(self->svControls, (void*) mmsSvCb); + currentSVCB++; } diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index d87667e2..621bbb51 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -292,7 +292,8 @@ MmsConnection_getVariableListNamesAssociationSpecific(MmsConnection self, MmsErr * \param itemId name of the variable to be read * * \return Returns a MmsValue object or NULL if the request failed. The MmsValue object can - * either be a simple value or a complex value or array. + * either be a simple value or a complex value or array. It is also possible that the return value is NULL + * even if mmsError = MMS_ERROR_NON. This is the case when the servers returns an empty result list. */ MmsValue* MmsConnection_readVariable(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId); diff --git a/tools/model_generator/genconfig.jar b/tools/model_generator/genconfig.jar index 3a36f546cb36137d86762913311c85d342a55ab9..9e3e43d5ede294468f6e815bf79c9a53658a62d3 100644 GIT binary patch delta 30589 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 Q(0{|wsR|~AE@GJf1F)$uuK)l5 delta 27390 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�i`NNFMSGLv^eU- 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�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 delta 27441 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 N4|*>kfS&Mh{|8WsmyZAd diff --git a/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java b/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java index 2aceca49..bfa61d39 100644 --- a/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java +++ b/tools/model_generator/src/com/libiec61850/scl/communication/ConnectedAP.java @@ -48,17 +48,15 @@ public class ConnectedAP { List gseNodes = ParserUtils.getChildNodesWithTag(node, "GSE"); - for (Node gseNode : gseNodes) { + for (Node gseNode : gseNodes) gses.add(new GSE(gseNode)); - } - + smvs = new LinkedList(); List smvNodes = ParserUtils.getChildNodesWithTag(node, "SMV"); - for (Node smvNode : smvNodes) { - smvs.add(new SMV(smvNode)); - } + for (Node smvNode : smvNodes) + smvs.add(new SMV(smvNode)); } public String getIedName() { diff --git a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java index 5d34675f..6033732f 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java @@ -116,7 +116,10 @@ public class LogicalNode implements DataModelNode { /* Parse Sampled Values (SV) control block definitions */ smvControlBlocks = new LinkedList(); - + + List svControlNodes = ParserUtils.getChildNodesWithTag(lnNode, "SampledValueControl"); + for (Node svControlNode : svControlNodes) + smvControlBlocks.add(new SampledValueControl(svControlNode)); /* Parse log control block definitions */ logControlBlocks = new LinkedList(); diff --git a/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java b/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java index 77993e77..f2f03b66 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/SampledValueControl.java @@ -14,7 +14,7 @@ public class SampledValueControl { private String smvID; private int smpRate; private int nofASDU; - private boolean multicast; + private boolean multicast = false; private SmvOpts smvOpts; @@ -31,7 +31,10 @@ public class SampledValueControl { this.smvID = ParserUtils.parseAttribute(smvControlNode, "smvID"); - this.multicast = ParserUtils.parseBooleanAttribute(smvControlNode, "multicast"); + Boolean multicast = ParserUtils.parseBooleanAttribute(smvControlNode, "multicast"); + + if (multicast != null) + this.multicast = multicast; String smpRateString = ParserUtils.parseAttribute(smvControlNode, "smpRate"); diff --git a/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java b/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java index 1dcd59ad..02646af9 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/SmvOpts.java @@ -8,11 +8,12 @@ import com.libiec61850.scl.SclParserException; public class SmvOpts { - private boolean refreshTime = false; - private boolean sampleRate = false; - private boolean dataSet = false; - private boolean security = false; - private boolean sampleSynchronized = false; + private boolean refreshTime = false; /* 1 */ + private boolean sampleSynchronized = false; /* 2 */ + private boolean sampleRate = false; /* 4 */ + private boolean dataSet = false; /* 8 */ + private boolean security = false; /* 16 */ + public SmvOpts(Node smvOptsNode) throws SclParserException { @@ -38,4 +39,16 @@ public class SmvOpts { } + + public int getIntValue() { + int intValue = 0; + + if (refreshTime) intValue += 1; + if (sampleSynchronized) intValue += 2; + if (sampleRate) intValue += 4; + if (dataSet) intValue += 8; + if (security) intValue += 16; + + return intValue; + } } diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index a7e3ff42..cad7d5ec 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -51,6 +51,7 @@ import com.libiec61850.scl.model.IED; import com.libiec61850.scl.model.LogicalDevice; import com.libiec61850.scl.model.LogicalNode; import com.libiec61850.scl.model.ReportControlBlock; +import com.libiec61850.scl.model.SampledValueControl; import com.libiec61850.scl.model.Server; import com.libiec61850.scl.model.SettingControl; import com.libiec61850.scl.model.TriggerOptions; @@ -71,6 +72,10 @@ public class StaticModelGenerator { private List gseVariableNames; private int currentGseVariableNumber = 0; + private StringBuffer smvControlBlocks; + private List smvVariableNames; + private int currentSvCBVariableNumber = 0; + private StringBuffer settingGroupControlBlocks; private List sgcbVariableNames; private int currentSGCBVariableNumber = 0; @@ -101,6 +106,9 @@ public class StaticModelGenerator { this.gseControlBlocks = new StringBuffer(); this.gseVariableNames = new LinkedList(); + this.smvControlBlocks = new StringBuffer(); + this.smvVariableNames = new LinkedList(); + this.settingGroupControlBlocks = new StringBuffer(); this.sgcbVariableNames = new LinkedList(); @@ -267,6 +275,8 @@ public class StaticModelGenerator { createGooseVariableList(logicalDevices); + createSmvVariableList(logicalDevices); + createSettingControlsVariableList(logicalDevices); for (int i = 0; i < logicalDevices.size(); i++) { @@ -308,6 +318,11 @@ public class StaticModelGenerator { cOut.println(reportControlBlocks); + for (String smv : smvVariableNames) + cOut.println("extern SVControlBlock " + smv + ";"); + + cOut.println(smvControlBlocks); + for (String gcb : gseVariableNames) cOut.println("extern GSEControlBlock " + gcb + ";"); @@ -338,6 +353,11 @@ public class StaticModelGenerator { else cOut.println(" NULL,"); + if (smvVariableNames.size() > 0) + cOut.println(" &" + smvVariableNames.get(0) + ","); + else + cOut.println(" NULL,"); + if (sgcbVariableNames.size() > 0) cOut.println(" &" + sgcbVariableNames.get(0) + ","); else @@ -366,6 +386,28 @@ public class StaticModelGenerator { } } + + private void createSmvVariableList(List logicalDevices) { + for (LogicalDevice ld : logicalDevices) { + List lnodes = ld.getLogicalNodes(); + + String ldName = ld.getInst(); + + + for (LogicalNode ln : lnodes) { + List svCBs = ln.getSampledValueControlBlocks(); + + int smvCount = 0; + + for (SampledValueControl smv : svCBs) { + String smvVariableName = modelPrefix + "_" + ldName + "_" + ln.getName() + "_smv" + smvCount; + smvVariableNames.add(smvVariableName); + smvCount++; + } + } + } + } + private void createReportVariableList(List logicalDevices) { for (LogicalDevice ld : logicalDevices) { @@ -445,6 +487,8 @@ public class StaticModelGenerator { printGSEControlBlocks(ldName, lnName, logicalNode); + printSVControlBlocks(ldName, lnName, logicalNode); + printSettingControlBlock(lnName, logicalNode); } } @@ -742,11 +786,100 @@ public class StaticModelGenerator { hOut.println("#endif /* " + hDefineName + " */\n"); } + private void printSVControlBlocks(String ldName, String lnPrefix, LogicalNode logicalNode) { + List svControlBlocks = logicalNode.getSampledValueControlBlocks(); + + /* strip "iedModel_" from ldName */ + String[] ldNameComponents = ldName.split("_"); + String logicalDeviceName = ldNameComponents[1]; + + int smvControlNumber = 0; + + for (SampledValueControl svCB : svControlBlocks) { + + System.out.println("SVCB: " + svCB.getName()); + + PhyComAddress svAddress = connectedAP.lookupSMVAddress(logicalDeviceName, svCB.getName()); + + String svString = ""; + + String phyComAddrName = ""; + + if (svAddress != null) { + phyComAddrName = lnPrefix + "_smv" + smvControlNumber + "_address"; + + svString += "\nstatic PhyComAddress " + phyComAddrName + " = {\n"; + svString += " " + svAddress.getVlanPriority() + ",\n"; + svString += " " + svAddress.getVlanId() + ",\n"; + svString += " " + svAddress.getAppId() + ",\n"; + svString += " {"; + + for (int i = 0; i < 6; i++) { + svString += "0x" + Integer.toHexString(svAddress.getMacAddress()[i]); + if (i == 5) + svString += "}\n"; + else + svString += ", "; + } + + svString += "};\n\n"; + } + + String smvVariableName = lnPrefix + "_smv" + smvControlNumber; + + svString += "SVControlBlock " + smvVariableName + " = {"; + svString += "&" + lnPrefix + ", "; + + svString += "\"" + svCB.getName() + "\", "; + + if (svCB.getSmvID() == null) + svString += "NULL, "; + else + svString += "\"" + svCB.getSmvID() + "\", "; + + if (svCB.getDatSet() != null) + svString += "\"" + svCB.getDatSet() + "\", "; + else + svString += "NULL, "; + + svString += svCB.getSmvOpts().getIntValue() + ", "; + + svString += "0, " + svCB.getSmpRate() + ", "; + + svString += svCB.getConfRev() + ", "; + + if (svAddress != null) + svString += "&" + phyComAddrName + ", "; + else + svString += "NULL, "; + + if (svCB.isMulticast()) + svString += "false, "; + else + svString += "true, "; + + svString += svCB.getNofASDI() + ", "; + + currentSvCBVariableNumber++; + + if (currentSvCBVariableNumber < smvVariableNames.size()) + svString += "&" + smvVariableNames.get(currentSvCBVariableNumber); + else + svString += "NULL"; + + svString += "};\n"; + + this.smvControlBlocks.append(svString); + + smvControlNumber++; + } + } + private void printGSEControlBlocks(String ldName, String lnPrefix, LogicalNode logicalNode) { List gseControlBlocks = logicalNode.getGSEControlBlocks(); + /* strip "iedModel_" from ldName */ String[] ldNameComponents = ldName.split("_"); - String logicalDeviceName = ldNameComponents[1]; int gseControlNumber = 0;