From 2bc47a6a6c2ed82d7093fc694d30a44351da2570 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 21 Sep 2020 11:47:50 +0200 Subject: [PATCH] - IED server: added configuration file support for data set entries with array elements or array element components --- .../server/model/config_file_parser.c | 32 +++++++++- tools/model_generator/genconfig.jar | Bin 94595 -> 95278 bytes .../tools/DynamicModelGenerator.java | 56 +++++++++++++++--- .../tools/StaticModelGenerator.java | 2 + 4 files changed, 79 insertions(+), 11 deletions(-) diff --git a/src/iec61850/server/model/config_file_parser.c b/src/iec61850/server/model/config_file_parser.c index 98240366..b6e4b5b0 100644 --- a/src/iec61850/server/model/config_file_parser.c +++ b/src/iec61850/server/model/config_file_parser.c @@ -434,10 +434,36 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) } } else if (StringUtils_startsWith((char*) lineBuffer, "DE")) { - sscanf((char*) lineBuffer, "DE(%s)", nameString); - terminateString(nameString, ')'); + char* start = strchr(lineBuffer, '('); + + if (start) { + start++; + strncpy(nameString, start, 129); + terminateString(nameString, ')'); + + int indexVal = -1; + char* componentVal = NULL; + + /* check for index */ + char* sep = strchr(nameString, ' '); + + if (sep) { + char* indexStr = sep + 1; + *sep = 0; + + /* check for component */ + char* sep = strchr(indexStr, ' '); - DataSetEntry_create(currentDataSet, nameString, -1, NULL); + if (sep) { + componentVal = sep + 1; + *sep = 0; + } + + indexVal = atoi(indexStr); + } + + DataSetEntry_create(currentDataSet, nameString, indexVal, componentVal); + } } else if (StringUtils_startsWith((char*) lineBuffer, "PA")) { uint32_t vlanPrio; diff --git a/tools/model_generator/genconfig.jar b/tools/model_generator/genconfig.jar index 915ca9640dc4befdce41d22699334cddc762e1e1..6da279bbe98ee084e60f2e42dad4163e5fc435a1 100644 GIT binary patch delta 26353 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 D!Ty8Y delta 25417 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 0)) { + if (componentNamePart.charAt(0) == '$') { + componentNamePart = componentNamePart.substring(1); + } + + if ((componentNamePart != null) && (componentNamePart.length() > 0)) + componentName = componentNamePart; + } + } + + /* check for LD name */ + String logicalDeviceName = null; if (fcda.getLdInstance() != null) { @@ -300,12 +334,18 @@ public class DynamicModelGenerator { } } + if (logicalDeviceName != null) + variableName = logicalDeviceName + "/" + variableName; - if (logicalDeviceName != null) - output.print("DE(" + logicalDeviceName + "/" + mmsVariableName + ");\n"); - else - output.print("DE(" + mmsVariableName + ");\n"); - + if (variableName != null && arrayIndex != -1 && componentName != null) { + output.print("DE(" + variableName + " " + arrayIndex + " " + componentName + ");\n"); + } + else if (variableName != null && arrayIndex != -1) { + output.print("DE(" + variableName + " " + arrayIndex + ");\n"); + } + else if (variableName != null) { + output.print("DE(" + variableName + ");\n"); + } } output.println("}"); } diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index 6198bb76..18460784 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -1566,6 +1566,8 @@ public class StaticModelGenerator { if (fcda.getDaName() != null) mmsVariableName += "$" + toMmsString(fcda.getDaName()); + /* check for array index and component */ + int arrayStart = mmsVariableName.indexOf('('); String variableName = mmsVariableName;