From 2e160d627997ea38883d7420e729a27873ea56d0 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 12 Jul 2018 16:01:56 +0200 Subject: [PATCH] - added server side example for the substitution service --- examples/CMakeLists.txt | 1 + examples/Makefile | 1 + .../CMakeLists.txt | 21 + examples/server_example_substitution/Makefile | 30 + .../server_example_substitution.c | 220 ++++ .../static_model.c | 998 ++++++++++++++++++ .../static_model.h | 177 ++++ .../substitution_example.icd | 229 ++++ 8 files changed, 1677 insertions(+) create mode 100644 examples/server_example_substitution/CMakeLists.txt create mode 100644 examples/server_example_substitution/Makefile create mode 100644 examples/server_example_substitution/server_example_substitution.c create mode 100644 examples/server_example_substitution/static_model.c create mode 100644 examples/server_example_substitution/static_model.h create mode 100644 examples/server_example_substitution/substitution_example.icd diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 2d802c9b..abd77fb7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -11,6 +11,7 @@ add_subdirectory(server_example_61400_25) add_subdirectory(server_example_setting_groups) add_subdirectory(server_example_logging) add_subdirectory(server_example_files) +add_subdirectory(server_example_substitution) add_subdirectory(iec61850_client_example1) add_subdirectory(iec61850_client_example2) diff --git a/examples/Makefile b/examples/Makefile index 543cb03b..6bf1c8f9 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -20,6 +20,7 @@ EXAMPLE_DIRS += server_example_threadless EXAMPLE_DIRS += server_example_setting_groups EXAMPLE_DIRS += server_example_logging EXAMPLE_DIRS += server_example_files +EXAMPLE_DIRS += server_example_substitution EXAMPLE_DIRS += goose_subscriber EXAMPLE_DIRS += goose_publisher EXAMPLE_DIRS += sv_subscriber diff --git a/examples/server_example_substitution/CMakeLists.txt b/examples/server_example_substitution/CMakeLists.txt new file mode 100644 index 00000000..d9ae3512 --- /dev/null +++ b/examples/server_example_substitution/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + . +) + +set(server_example_SRCS + server_example_substitution.c + static_model.c +) + +IF(WIN32) +set_source_files_properties(${server_example_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(server_example_substitution + ${server_example_SRCS} +) + +target_link_libraries(server_example_substitution + iec61850 +) diff --git a/examples/server_example_substitution/Makefile b/examples/server_example_substitution/Makefile new file mode 100644 index 00000000..f3b779f4 --- /dev/null +++ b/examples/server_example_substitution/Makefile @@ -0,0 +1,30 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = server_example_substitution +PROJECT_SOURCES = server_example_substitution.c +PROJECT_SOURCES += static_model.c + +PROJECT_ICD_FILE = substitution_example.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 + +LDLIBS += -lm + +CP = cp + +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) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) + + + diff --git a/examples/server_example_substitution/server_example_substitution.c b/examples/server_example_substitution/server_example_substitution.c new file mode 100644 index 00000000..043280a3 --- /dev/null +++ b/examples/server_example_substitution/server_example_substitution.c @@ -0,0 +1,220 @@ +/* + * server_example_substitution.c + * + * - How to use the IEC 61850 substitution service + * - Two data objects can be substituted: + * -- GGIO1.AnIn1 + * -- GGIO1.Ind1 + */ + +#include "iec61850_server.h" +#include "hal_thread.h" +#include +#include +#include +#include + +#include "static_model.h" + +/* import IEC 61850 device model created from SCL-File */ +extern IedModel iedModel; + +static int running = 0; +static IedServer iedServer = NULL; + +static bool subsAnIn1 = false; +static bool subsInd1 = false; + +void +sigint_handler(int signalId) +{ + running = 0; +} + + +static void +connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter) +{ + if (connected) + printf("Connection opened\n"); + else + printf("Connection closed\n"); +} + +static MmsDataAccessError +writeAccessHandler (DataAttribute* dataAttribute, MmsValue* value, ClientConnection connection, void* parameter) +{ + if (dataAttribute == IEDMODEL_LD1_GGIO1_AnIn1_subEna) { + + printf("Received GGIO1.AnIn1.subEna: %i\n", MmsValue_getBoolean(value)); + + if (MmsValue_getBoolean(value)) { + subsAnIn1 = true; + + /* Update values with substituted values */ + + Quality quality = + Quality_fromMmsValue(IedServer_getAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_subQ)); + + Quality_setFlag(&quality, QUALITY_SOURCE_SUBSTITUTED); + + IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_q, quality); + + IedServer_updateAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_mag_f, + IedServer_getAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_subMag_f)); + } + else { + subsAnIn1 = false; + } + + } + else if (dataAttribute == IEDMODEL_LD1_GGIO1_AnIn1_subMag_f) { + + if (subsAnIn1) { + IedServer_updateAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_mag_f, value); + } + + } + else if (dataAttribute == IEDMODEL_LD1_GGIO1_AnIn1_subQ) { + + if (subsAnIn1) { + Quality quality = Quality_fromMmsValue(value); + + Quality_setFlag(&quality, QUALITY_SOURCE_SUBSTITUTED); + + IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_q, quality); + } + + } + else if (dataAttribute == IEDMODEL_LD1_GGIO1_Ind1_subEna) { + printf("Received GGIO1.Ind1.subEna: %i\n", MmsValue_getBoolean(value)); + + if (MmsValue_getBoolean(value)) { + subsInd1 = true; + + /* Update values with substituted values */ + + Quality quality = + Quality_fromMmsValue(IedServer_getAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_subQ)); + + Quality_setFlag(&quality, QUALITY_SOURCE_SUBSTITUTED); + + IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_Ind1_q, quality); + + IedServer_updateAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_stVal, + IedServer_getAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_subVal)); + } + else { + subsInd1 = false; + } + } + else if (dataAttribute == IEDMODEL_LD1_GGIO1_Ind1_subVal) { + + if (subsInd1) { + IedServer_updateAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_stVal, value); + } + + } + else if (dataAttribute == IEDMODEL_LD1_GGIO1_Ind1_subQ) { + + if (subsInd1) { + Quality quality = Quality_fromMmsValue(value); + + Quality_setFlag(&quality, QUALITY_SOURCE_SUBSTITUTED); + + IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_Ind1_q, quality); + } + + } + + return DATA_ACCESS_ERROR_SUCCESS; +} + +int +main(int argc, char** argv) +{ + printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString()); + + + + + /* Create a new IEC 61850 server instance */ + iedServer = IedServer_create(&iedModel); + + IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL); + + /* Install write callback handler for substitution variables */ + + IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_subEna, writeAccessHandler, NULL); + IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_subMag_f, writeAccessHandler, NULL); + IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_subQ, writeAccessHandler, NULL); + + IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_Ind1_subEna, writeAccessHandler, NULL); + IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_Ind1_subVal, writeAccessHandler, NULL); + IedServer_handleWriteAccess(iedServer, IEDMODEL_LD1_GGIO1_Ind1_subQ, writeAccessHandler, NULL); + + /* MMS server will be instructed to start listening for 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 t = 0.f; + bool ind1 = true; + + while (running) { + uint64_t timestamp = Hal_getTimeInMs(); + + t += 0.1f; + + float an1 = sinf(t); + + if (ind1) + ind1 = false; + else + ind1 = true; + + Timestamp iecTimestamp; + + Timestamp_clearFlags(&iecTimestamp); + Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp); + Timestamp_setLeapSecondKnown(&iecTimestamp, true); + + + /* toggle clock-not-synchronized flag in timestamp */ + if (((int) t % 2) == 0) + Timestamp_setClockNotSynchronized(&iecTimestamp, true); + + IedServer_lockDataModel(iedServer); + + if (subsAnIn1 == false) { + IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_t, &iecTimestamp); + IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_q, QUALITY_VALIDITY_GOOD); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_AnIn1_mag_f, an1); + } + + if (subsInd1 == false) { + IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_t, &iecTimestamp); + IedServer_updateQuality(iedServer, IEDMODEL_LD1_GGIO1_Ind1_q, QUALITY_VALIDITY_GOOD); + IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_LD1_GGIO1_Ind1_stVal, ind1); + } + + IedServer_unlockDataModel(iedServer); + + Thread_sleep(100); + } + + /* stop MMS server - close TCP server socket and all client sockets */ + IedServer_stop(iedServer); + + /* Cleanup - free all resources */ + IedServer_destroy(iedServer); + +} /* main() */ diff --git a/examples/server_example_substitution/static_model.c b/examples/server_example_substitution/static_model.c new file mode 100644 index 00000000..bf53c61a --- /dev/null +++ b/examples/server_example_substitution/static_model.c @@ -0,0 +1,998 @@ +/* + * static_model.c + * + * automatically generated from substitution_example.icd + */ +#include "static_model.h" + +static void initializeValues(); + + + +LogicalDevice iedModel_LD1 = { + LogicalDeviceModelType, + "LD1", + (ModelNode*) &iedModel, + NULL, + (ModelNode*) &iedModel_LD1_LLN0 +}; + +LogicalNode iedModel_LD1_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_LD1, + (ModelNode*) &iedModel_LD1_LPHD1, + (ModelNode*) &iedModel_LD1_LLN0_Beh, +}; + +DataObject iedModel_LD1_LLN0_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_LD1_LLN0, + NULL, + (ModelNode*) &iedModel_LD1_LLN0_Beh_stVal, + 0 +}; + +DataAttribute iedModel_LD1_LLN0_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_LD1_LLN0_Beh, + (ModelNode*) &iedModel_LD1_LLN0_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_LLN0_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_LLN0_Beh, + (ModelNode*) &iedModel_LD1_LLN0_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_LLN0_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_LLN0_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_LD1_LPHD1 = { + LogicalNodeModelType, + "LPHD1", + (ModelNode*) &iedModel_LD1, + (ModelNode*) &iedModel_LD1_MMDC1, + (ModelNode*) &iedModel_LD1_LPHD1_PhyNam, +}; + +DataObject iedModel_LD1_LPHD1_PhyNam = { + DataObjectModelType, + "PhyNam", + (ModelNode*) &iedModel_LD1_LPHD1, + (ModelNode*) &iedModel_LD1_LPHD1_PhyHealth, + (ModelNode*) &iedModel_LD1_LPHD1_PhyNam_vendor, + 0 +}; + +DataAttribute iedModel_LD1_LPHD1_PhyNam_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_LD1_LPHD1_PhyNam, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_LD1_LPHD1_PhyHealth = { + DataObjectModelType, + "PhyHealth", + (ModelNode*) &iedModel_LD1_LPHD1, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + (ModelNode*) &iedModel_LD1_LPHD1_PhyHealth_stVal, + 0 +}; + +DataAttribute iedModel_LD1_LPHD1_PhyHealth_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_LD1_LPHD1_PhyHealth, + (ModelNode*) &iedModel_LD1_LPHD1_PhyHealth_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_LPHD1_PhyHealth_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_LPHD1_PhyHealth, + (ModelNode*) &iedModel_LD1_LPHD1_PhyHealth_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_LPHD1_PhyHealth_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_LPHD1_PhyHealth, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_LD1_LPHD1_Proxy = { + DataObjectModelType, + "Proxy", + (ModelNode*) &iedModel_LD1_LPHD1, + NULL, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy_stVal, + 0 +}; + +DataAttribute iedModel_LD1_LPHD1_Proxy_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_LPHD1_Proxy_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_LPHD1_Proxy_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy_subEna, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_LPHD1_Proxy_subEna = { + DataAttributeModelType, + "subEna", + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy_subVal, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_LPHD1_Proxy_subVal = { + DataAttributeModelType, + "subVal", + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy_subQ, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_LPHD1_Proxy_subQ = { + DataAttributeModelType, + "subQ", + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + (ModelNode*) &iedModel_LD1_LPHD1_Proxy_subID, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_LPHD1_Proxy_subID = { + DataAttributeModelType, + "subID", + (ModelNode*) &iedModel_LD1_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_VISIBLE_STRING_64, + 0, + NULL, + 0}; + +LogicalNode iedModel_LD1_MMDC1 = { + LogicalNodeModelType, + "MMDC1", + (ModelNode*) &iedModel_LD1, + (ModelNode*) &iedModel_LD1_GGIO1, + (ModelNode*) &iedModel_LD1_MMDC1_Beh, +}; + +DataObject iedModel_LD1_MMDC1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_LD1_MMDC1, + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + (ModelNode*) &iedModel_LD1_MMDC1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_LD1_MMDC1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_LD1_MMDC1_Beh, + (ModelNode*) &iedModel_LD1_MMDC1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_MMDC1_Beh, + (ModelNode*) &iedModel_LD1_MMDC1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_MMDC1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_LD1_MMDC1_Watt = { + DataObjectModelType, + "Watt", + (ModelNode*) &iedModel_LD1_MMDC1, + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_mag, + 0 +}; + +DataAttribute iedModel_LD1_MMDC1_Watt_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_q, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Watt_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_LD1_MMDC1_Watt_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Watt_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Watt_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_subEna, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Watt_subEna = { + DataAttributeModelType, + "subEna", + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_subMag, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Watt_subMag = { + DataAttributeModelType, + "subMag", + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_subQ, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_subMag_f, + 0, + IEC61850_FC_SV, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Watt_subMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_LD1_MMDC1_Watt_subMag, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Watt_subQ = { + DataAttributeModelType, + "subQ", + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + (ModelNode*) &iedModel_LD1_MMDC1_Watt_subID, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Watt_subID = { + DataAttributeModelType, + "subID", + (ModelNode*) &iedModel_LD1_MMDC1_Watt, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_VISIBLE_STRING_64, + 0, + NULL, + 0}; + +DataObject iedModel_LD1_MMDC1_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_LD1_MMDC1, + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_mag, + 0 +}; + +DataAttribute iedModel_LD1_MMDC1_Amp_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_q, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Amp_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_LD1_MMDC1_Amp_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Amp_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_subEna, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Amp_subEna = { + DataAttributeModelType, + "subEna", + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_subMag, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Amp_subMag = { + DataAttributeModelType, + "subMag", + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_subQ, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_subMag_f, + 0, + IEC61850_FC_SV, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Amp_subMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_LD1_MMDC1_Amp_subMag, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Amp_subQ = { + DataAttributeModelType, + "subQ", + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + (ModelNode*) &iedModel_LD1_MMDC1_Amp_subID, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Amp_subID = { + DataAttributeModelType, + "subID", + (ModelNode*) &iedModel_LD1_MMDC1_Amp, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_VISIBLE_STRING_64, + 0, + NULL, + 0}; + +DataObject iedModel_LD1_MMDC1_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_LD1_MMDC1, + NULL, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_mag, + 0 +}; + +DataAttribute iedModel_LD1_MMDC1_Vol_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_q, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Vol_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_LD1_MMDC1_Vol_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Vol_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_subEna, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Vol_subEna = { + DataAttributeModelType, + "subEna", + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_subMag, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Vol_subMag = { + DataAttributeModelType, + "subMag", + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_subQ, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_subMag_f, + 0, + IEC61850_FC_SV, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Vol_subMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_LD1_MMDC1_Vol_subMag, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Vol_subQ = { + DataAttributeModelType, + "subQ", + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + (ModelNode*) &iedModel_LD1_MMDC1_Vol_subID, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_MMDC1_Vol_subID = { + DataAttributeModelType, + "subID", + (ModelNode*) &iedModel_LD1_MMDC1_Vol, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_VISIBLE_STRING_64, + 0, + NULL, + 0}; + +LogicalNode iedModel_LD1_GGIO1 = { + LogicalNodeModelType, + "GGIO1", + (ModelNode*) &iedModel_LD1, + NULL, + (ModelNode*) &iedModel_LD1_GGIO1_Beh, +}; + +DataObject iedModel_LD1_GGIO1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_LD1_GGIO1, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + (ModelNode*) &iedModel_LD1_GGIO1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_LD1_GGIO1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_LD1_GGIO1_Beh, + (ModelNode*) &iedModel_LD1_GGIO1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_GGIO1_Beh, + (ModelNode*) &iedModel_LD1_GGIO1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_GGIO1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_LD1_GGIO1_Ind1 = { + DataObjectModelType, + "Ind1", + (ModelNode*) &iedModel_LD1_GGIO1, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1_stVal, + 0 +}; + +DataAttribute iedModel_LD1_GGIO1_Ind1_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_Ind1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_Ind1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1_subEna, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_Ind1_subEna = { + DataAttributeModelType, + "subEna", + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1_subVal, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_Ind1_subVal = { + DataAttributeModelType, + "subVal", + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1_subQ, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_Ind1_subQ = { + DataAttributeModelType, + "subQ", + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + (ModelNode*) &iedModel_LD1_GGIO1_Ind1_subID, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_Ind1_subID = { + DataAttributeModelType, + "subID", + (ModelNode*) &iedModel_LD1_GGIO1_Ind1, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_VISIBLE_STRING_64, + 0, + NULL, + 0}; + +DataObject iedModel_LD1_GGIO1_AnIn1 = { + DataObjectModelType, + "AnIn1", + (ModelNode*) &iedModel_LD1_GGIO1, + NULL, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_mag, + 0 +}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_q, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_subEna, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_subEna = { + DataAttributeModelType, + "subEna", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_subMag, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_subMag = { + DataAttributeModelType, + "subMag", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_subQ, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_subMag_f, + 0, + IEC61850_FC_SV, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_subMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_subMag, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_subQ = { + DataAttributeModelType, + "subQ", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1_subID, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_QUALITY, + 0, + NULL, + 0}; + +DataAttribute iedModel_LD1_GGIO1_AnIn1_subID = { + DataAttributeModelType, + "subID", + (ModelNode*) &iedModel_LD1_GGIO1_AnIn1, + NULL, + NULL, + 0, + IEC61850_FC_SV, + IEC61850_VISIBLE_STRING_64, + 0, + NULL, + 0}; + +extern ReportControlBlock iedModel_LD1_LLN0_report0; +extern ReportControlBlock iedModel_LD1_LLN0_report1; + +ReportControlBlock iedModel_LD1_LLN0_report0 = {&iedModel_LD1_LLN0, "urcb01", "13e08c78", false, "", 1, 23, 247, 3000, 5000, &iedModel_LD1_LLN0_report1}; +ReportControlBlock iedModel_LD1_LLN0_report1 = {&iedModel_LD1_LLN0, "urcb02", "13e08c78", false, "", 1, 23, 247, 3000, 5000, NULL}; + + + + + + + +IedModel iedModel = { + "IED1", + &iedModel_LD1, + NULL, + &iedModel_LD1_LLN0_report0, + NULL, + NULL, + NULL, + NULL, + NULL, + initializeValues +}; + +static void +initializeValues() +{ +} diff --git a/examples/server_example_substitution/static_model.h b/examples/server_example_substitution/static_model.h new file mode 100644 index 00000000..1ad6a5e4 --- /dev/null +++ b/examples/server_example_substitution/static_model.h @@ -0,0 +1,177 @@ +/* + * static_model.h + * + * automatically generated from substitution_example.icd + */ + +#ifndef STATIC_MODEL_H_ +#define STATIC_MODEL_H_ + +#include +#include "iec61850_model.h" + +extern IedModel iedModel; +extern LogicalDevice iedModel_LD1; +extern LogicalNode iedModel_LD1_LLN0; +extern DataObject iedModel_LD1_LLN0_Beh; +extern DataAttribute iedModel_LD1_LLN0_Beh_stVal; +extern DataAttribute iedModel_LD1_LLN0_Beh_q; +extern DataAttribute iedModel_LD1_LLN0_Beh_t; +extern LogicalNode iedModel_LD1_LPHD1; +extern DataObject iedModel_LD1_LPHD1_PhyNam; +extern DataAttribute iedModel_LD1_LPHD1_PhyNam_vendor; +extern DataObject iedModel_LD1_LPHD1_PhyHealth; +extern DataAttribute iedModel_LD1_LPHD1_PhyHealth_stVal; +extern DataAttribute iedModel_LD1_LPHD1_PhyHealth_q; +extern DataAttribute iedModel_LD1_LPHD1_PhyHealth_t; +extern DataObject iedModel_LD1_LPHD1_Proxy; +extern DataAttribute iedModel_LD1_LPHD1_Proxy_stVal; +extern DataAttribute iedModel_LD1_LPHD1_Proxy_q; +extern DataAttribute iedModel_LD1_LPHD1_Proxy_t; +extern DataAttribute iedModel_LD1_LPHD1_Proxy_subEna; +extern DataAttribute iedModel_LD1_LPHD1_Proxy_subVal; +extern DataAttribute iedModel_LD1_LPHD1_Proxy_subQ; +extern DataAttribute iedModel_LD1_LPHD1_Proxy_subID; +extern LogicalNode iedModel_LD1_MMDC1; +extern DataObject iedModel_LD1_MMDC1_Beh; +extern DataAttribute iedModel_LD1_MMDC1_Beh_stVal; +extern DataAttribute iedModel_LD1_MMDC1_Beh_q; +extern DataAttribute iedModel_LD1_MMDC1_Beh_t; +extern DataObject iedModel_LD1_MMDC1_Watt; +extern DataAttribute iedModel_LD1_MMDC1_Watt_mag; +extern DataAttribute iedModel_LD1_MMDC1_Watt_mag_f; +extern DataAttribute iedModel_LD1_MMDC1_Watt_q; +extern DataAttribute iedModel_LD1_MMDC1_Watt_t; +extern DataAttribute iedModel_LD1_MMDC1_Watt_subEna; +extern DataAttribute iedModel_LD1_MMDC1_Watt_subMag; +extern DataAttribute iedModel_LD1_MMDC1_Watt_subMag_f; +extern DataAttribute iedModel_LD1_MMDC1_Watt_subQ; +extern DataAttribute iedModel_LD1_MMDC1_Watt_subID; +extern DataObject iedModel_LD1_MMDC1_Amp; +extern DataAttribute iedModel_LD1_MMDC1_Amp_mag; +extern DataAttribute iedModel_LD1_MMDC1_Amp_mag_f; +extern DataAttribute iedModel_LD1_MMDC1_Amp_q; +extern DataAttribute iedModel_LD1_MMDC1_Amp_t; +extern DataAttribute iedModel_LD1_MMDC1_Amp_subEna; +extern DataAttribute iedModel_LD1_MMDC1_Amp_subMag; +extern DataAttribute iedModel_LD1_MMDC1_Amp_subMag_f; +extern DataAttribute iedModel_LD1_MMDC1_Amp_subQ; +extern DataAttribute iedModel_LD1_MMDC1_Amp_subID; +extern DataObject iedModel_LD1_MMDC1_Vol; +extern DataAttribute iedModel_LD1_MMDC1_Vol_mag; +extern DataAttribute iedModel_LD1_MMDC1_Vol_mag_f; +extern DataAttribute iedModel_LD1_MMDC1_Vol_q; +extern DataAttribute iedModel_LD1_MMDC1_Vol_t; +extern DataAttribute iedModel_LD1_MMDC1_Vol_subEna; +extern DataAttribute iedModel_LD1_MMDC1_Vol_subMag; +extern DataAttribute iedModel_LD1_MMDC1_Vol_subMag_f; +extern DataAttribute iedModel_LD1_MMDC1_Vol_subQ; +extern DataAttribute iedModel_LD1_MMDC1_Vol_subID; +extern LogicalNode iedModel_LD1_GGIO1; +extern DataObject iedModel_LD1_GGIO1_Beh; +extern DataAttribute iedModel_LD1_GGIO1_Beh_stVal; +extern DataAttribute iedModel_LD1_GGIO1_Beh_q; +extern DataAttribute iedModel_LD1_GGIO1_Beh_t; +extern DataObject iedModel_LD1_GGIO1_Ind1; +extern DataAttribute iedModel_LD1_GGIO1_Ind1_stVal; +extern DataAttribute iedModel_LD1_GGIO1_Ind1_q; +extern DataAttribute iedModel_LD1_GGIO1_Ind1_t; +extern DataAttribute iedModel_LD1_GGIO1_Ind1_subEna; +extern DataAttribute iedModel_LD1_GGIO1_Ind1_subVal; +extern DataAttribute iedModel_LD1_GGIO1_Ind1_subQ; +extern DataAttribute iedModel_LD1_GGIO1_Ind1_subID; +extern DataObject iedModel_LD1_GGIO1_AnIn1; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_mag; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_mag_f; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_q; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_t; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subEna; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subMag; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subMag_f; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subQ; +extern DataAttribute iedModel_LD1_GGIO1_AnIn1_subID; + + + +#define IEDMODEL_LD1 (&iedModel_LD1) +#define IEDMODEL_LD1_LLN0 (&iedModel_LD1_LLN0) +#define IEDMODEL_LD1_LLN0_Beh (&iedModel_LD1_LLN0_Beh) +#define IEDMODEL_LD1_LLN0_Beh_stVal (&iedModel_LD1_LLN0_Beh_stVal) +#define IEDMODEL_LD1_LLN0_Beh_q (&iedModel_LD1_LLN0_Beh_q) +#define IEDMODEL_LD1_LLN0_Beh_t (&iedModel_LD1_LLN0_Beh_t) +#define IEDMODEL_LD1_LPHD1 (&iedModel_LD1_LPHD1) +#define IEDMODEL_LD1_LPHD1_PhyNam (&iedModel_LD1_LPHD1_PhyNam) +#define IEDMODEL_LD1_LPHD1_PhyNam_vendor (&iedModel_LD1_LPHD1_PhyNam_vendor) +#define IEDMODEL_LD1_LPHD1_PhyHealth (&iedModel_LD1_LPHD1_PhyHealth) +#define IEDMODEL_LD1_LPHD1_PhyHealth_stVal (&iedModel_LD1_LPHD1_PhyHealth_stVal) +#define IEDMODEL_LD1_LPHD1_PhyHealth_q (&iedModel_LD1_LPHD1_PhyHealth_q) +#define IEDMODEL_LD1_LPHD1_PhyHealth_t (&iedModel_LD1_LPHD1_PhyHealth_t) +#define IEDMODEL_LD1_LPHD1_Proxy (&iedModel_LD1_LPHD1_Proxy) +#define IEDMODEL_LD1_LPHD1_Proxy_stVal (&iedModel_LD1_LPHD1_Proxy_stVal) +#define IEDMODEL_LD1_LPHD1_Proxy_q (&iedModel_LD1_LPHD1_Proxy_q) +#define IEDMODEL_LD1_LPHD1_Proxy_t (&iedModel_LD1_LPHD1_Proxy_t) +#define IEDMODEL_LD1_LPHD1_Proxy_subEna (&iedModel_LD1_LPHD1_Proxy_subEna) +#define IEDMODEL_LD1_LPHD1_Proxy_subVal (&iedModel_LD1_LPHD1_Proxy_subVal) +#define IEDMODEL_LD1_LPHD1_Proxy_subQ (&iedModel_LD1_LPHD1_Proxy_subQ) +#define IEDMODEL_LD1_LPHD1_Proxy_subID (&iedModel_LD1_LPHD1_Proxy_subID) +#define IEDMODEL_LD1_MMDC1 (&iedModel_LD1_MMDC1) +#define IEDMODEL_LD1_MMDC1_Beh (&iedModel_LD1_MMDC1_Beh) +#define IEDMODEL_LD1_MMDC1_Beh_stVal (&iedModel_LD1_MMDC1_Beh_stVal) +#define IEDMODEL_LD1_MMDC1_Beh_q (&iedModel_LD1_MMDC1_Beh_q) +#define IEDMODEL_LD1_MMDC1_Beh_t (&iedModel_LD1_MMDC1_Beh_t) +#define IEDMODEL_LD1_MMDC1_Watt (&iedModel_LD1_MMDC1_Watt) +#define IEDMODEL_LD1_MMDC1_Watt_mag (&iedModel_LD1_MMDC1_Watt_mag) +#define IEDMODEL_LD1_MMDC1_Watt_mag_f (&iedModel_LD1_MMDC1_Watt_mag_f) +#define IEDMODEL_LD1_MMDC1_Watt_q (&iedModel_LD1_MMDC1_Watt_q) +#define IEDMODEL_LD1_MMDC1_Watt_t (&iedModel_LD1_MMDC1_Watt_t) +#define IEDMODEL_LD1_MMDC1_Watt_subEna (&iedModel_LD1_MMDC1_Watt_subEna) +#define IEDMODEL_LD1_MMDC1_Watt_subMag (&iedModel_LD1_MMDC1_Watt_subMag) +#define IEDMODEL_LD1_MMDC1_Watt_subMag_f (&iedModel_LD1_MMDC1_Watt_subMag_f) +#define IEDMODEL_LD1_MMDC1_Watt_subQ (&iedModel_LD1_MMDC1_Watt_subQ) +#define IEDMODEL_LD1_MMDC1_Watt_subID (&iedModel_LD1_MMDC1_Watt_subID) +#define IEDMODEL_LD1_MMDC1_Amp (&iedModel_LD1_MMDC1_Amp) +#define IEDMODEL_LD1_MMDC1_Amp_mag (&iedModel_LD1_MMDC1_Amp_mag) +#define IEDMODEL_LD1_MMDC1_Amp_mag_f (&iedModel_LD1_MMDC1_Amp_mag_f) +#define IEDMODEL_LD1_MMDC1_Amp_q (&iedModel_LD1_MMDC1_Amp_q) +#define IEDMODEL_LD1_MMDC1_Amp_t (&iedModel_LD1_MMDC1_Amp_t) +#define IEDMODEL_LD1_MMDC1_Amp_subEna (&iedModel_LD1_MMDC1_Amp_subEna) +#define IEDMODEL_LD1_MMDC1_Amp_subMag (&iedModel_LD1_MMDC1_Amp_subMag) +#define IEDMODEL_LD1_MMDC1_Amp_subMag_f (&iedModel_LD1_MMDC1_Amp_subMag_f) +#define IEDMODEL_LD1_MMDC1_Amp_subQ (&iedModel_LD1_MMDC1_Amp_subQ) +#define IEDMODEL_LD1_MMDC1_Amp_subID (&iedModel_LD1_MMDC1_Amp_subID) +#define IEDMODEL_LD1_MMDC1_Vol (&iedModel_LD1_MMDC1_Vol) +#define IEDMODEL_LD1_MMDC1_Vol_mag (&iedModel_LD1_MMDC1_Vol_mag) +#define IEDMODEL_LD1_MMDC1_Vol_mag_f (&iedModel_LD1_MMDC1_Vol_mag_f) +#define IEDMODEL_LD1_MMDC1_Vol_q (&iedModel_LD1_MMDC1_Vol_q) +#define IEDMODEL_LD1_MMDC1_Vol_t (&iedModel_LD1_MMDC1_Vol_t) +#define IEDMODEL_LD1_MMDC1_Vol_subEna (&iedModel_LD1_MMDC1_Vol_subEna) +#define IEDMODEL_LD1_MMDC1_Vol_subMag (&iedModel_LD1_MMDC1_Vol_subMag) +#define IEDMODEL_LD1_MMDC1_Vol_subMag_f (&iedModel_LD1_MMDC1_Vol_subMag_f) +#define IEDMODEL_LD1_MMDC1_Vol_subQ (&iedModel_LD1_MMDC1_Vol_subQ) +#define IEDMODEL_LD1_MMDC1_Vol_subID (&iedModel_LD1_MMDC1_Vol_subID) +#define IEDMODEL_LD1_GGIO1 (&iedModel_LD1_GGIO1) +#define IEDMODEL_LD1_GGIO1_Beh (&iedModel_LD1_GGIO1_Beh) +#define IEDMODEL_LD1_GGIO1_Beh_stVal (&iedModel_LD1_GGIO1_Beh_stVal) +#define IEDMODEL_LD1_GGIO1_Beh_q (&iedModel_LD1_GGIO1_Beh_q) +#define IEDMODEL_LD1_GGIO1_Beh_t (&iedModel_LD1_GGIO1_Beh_t) +#define IEDMODEL_LD1_GGIO1_Ind1 (&iedModel_LD1_GGIO1_Ind1) +#define IEDMODEL_LD1_GGIO1_Ind1_stVal (&iedModel_LD1_GGIO1_Ind1_stVal) +#define IEDMODEL_LD1_GGIO1_Ind1_q (&iedModel_LD1_GGIO1_Ind1_q) +#define IEDMODEL_LD1_GGIO1_Ind1_t (&iedModel_LD1_GGIO1_Ind1_t) +#define IEDMODEL_LD1_GGIO1_Ind1_subEna (&iedModel_LD1_GGIO1_Ind1_subEna) +#define IEDMODEL_LD1_GGIO1_Ind1_subVal (&iedModel_LD1_GGIO1_Ind1_subVal) +#define IEDMODEL_LD1_GGIO1_Ind1_subQ (&iedModel_LD1_GGIO1_Ind1_subQ) +#define IEDMODEL_LD1_GGIO1_Ind1_subID (&iedModel_LD1_GGIO1_Ind1_subID) +#define IEDMODEL_LD1_GGIO1_AnIn1 (&iedModel_LD1_GGIO1_AnIn1) +#define IEDMODEL_LD1_GGIO1_AnIn1_mag (&iedModel_LD1_GGIO1_AnIn1_mag) +#define IEDMODEL_LD1_GGIO1_AnIn1_mag_f (&iedModel_LD1_GGIO1_AnIn1_mag_f) +#define IEDMODEL_LD1_GGIO1_AnIn1_q (&iedModel_LD1_GGIO1_AnIn1_q) +#define IEDMODEL_LD1_GGIO1_AnIn1_t (&iedModel_LD1_GGIO1_AnIn1_t) +#define IEDMODEL_LD1_GGIO1_AnIn1_subEna (&iedModel_LD1_GGIO1_AnIn1_subEna) +#define IEDMODEL_LD1_GGIO1_AnIn1_subMag (&iedModel_LD1_GGIO1_AnIn1_subMag) +#define IEDMODEL_LD1_GGIO1_AnIn1_subMag_f (&iedModel_LD1_GGIO1_AnIn1_subMag_f) +#define IEDMODEL_LD1_GGIO1_AnIn1_subQ (&iedModel_LD1_GGIO1_AnIn1_subQ) +#define IEDMODEL_LD1_GGIO1_AnIn1_subID (&iedModel_LD1_GGIO1_AnIn1_subID) + +#endif /* STATIC_MODEL_H_ */ + diff --git a/examples/server_example_substitution/substitution_example.icd b/examples/server_example_substitution/substitution_example.icd new file mode 100644 index 00000000..32d62c33 --- /dev/null +++ b/examples/server_example_substitution/substitution_example.icd @@ -0,0 +1,229 @@ + + +
+ + + +
+ + + +
+

1 3 9999 33

+

33

+

00 00 00 01

+

00 01

+

00 01

+

102

+

192.168.62.248

+

255.255.255.0

+

192.168.62.254

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + e1 + e2 + e3 + e4 + e5 + + + normal + high + low + high-high + low-low + + + none + m + kg + s + A + K + mol + cd + deg + rad + sr + Gy + q + °C + Sv + F + C + S + H + V + ohm + J + N + Hz + lx + Lm + Wb + T + W + Pa + + + m/s + m/s² + m³/s + m/m³ + M + kg/m³ + m²/s + W/m K + J/K + ppm + 1/s + rad/s + VA + Watts + VAr + theta + cos(theta) + Vs + + As + + A²t + VAh + Wh + VArh + V/Hz + + + Yocto + Zepto + Atto + Femto + Pico + Nano + Micro + Milli + Centi + Deci + zeroNoValue + Deca + Hecto + Kilo + Mega + Giga + Tera + Petra + Exa + Zetta + Yotta + + +