From 34ae9ff77a5e7feb88c0e7a8529c169989562d1c 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 fe7c9aceb739dc672d0a28f62d8207d9ae66c60b..bbe56ce4cbea17c05bc486361bd25bfbfb753fe9 100644 GIT binary patch delta 26353 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 IoM@2$0dniktpET3 delta 25417 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 MfCy{J2mp8g9}!2Cr2qf` diff --git a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java index fdbdb40a..b1e04201 100644 --- a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java @@ -96,7 +96,7 @@ public class DynamicModelGenerator { output.println("}"); } - private void exportLogicalNodes(PrintStream output, LogicalDevice logicalDevice) { + private void exportLogicalNodes(PrintStream output, LogicalDevice logicalDevice) throws SclParserException { for (LogicalNode logicalNode : logicalDevice.getLogicalNodes()) { output.print("LN(" + logicalNode.getName() + "){\n"); @@ -110,7 +110,7 @@ public class DynamicModelGenerator { return iecString.replace('.', '$'); } - private void exportLogicalNode(PrintStream output, LogicalNode logicalNode, LogicalDevice logicalDevice) { + private void exportLogicalNode(PrintStream output, LogicalNode logicalNode, LogicalDevice logicalDevice) throws SclParserException { for (SettingControl sgcb : logicalNode.getSettingGroupControlBlocks()) { output.print("SG(" + sgcb.getActSG() + " " + sgcb.getNumOfSGs() + ")\n"); @@ -271,7 +271,7 @@ public class DynamicModelGenerator { output.println(");"); } - private void exportDataSet(PrintStream output, DataSet dataSet, LogicalNode logicalNode) { + private void exportDataSet(PrintStream output, DataSet dataSet, LogicalNode logicalNode) throws SclParserException { output.print("DS(" + dataSet.getName() + "){\n"); for (FunctionalConstraintData fcda : dataSet.getFcda()) { String mmsVariableName = ""; @@ -291,6 +291,40 @@ public class DynamicModelGenerator { if (fcda.getDaName() != null) mmsVariableName += "$" + toMmsString(fcda.getDaName()); + /* check for array index and component */ + + int arrayStart = mmsVariableName.indexOf('('); + + String variableName = mmsVariableName; + int arrayIndex = -1; + String componentName = null; + + if (arrayStart != -1) { + variableName = mmsVariableName.substring(0, arrayStart); + + int arrayEnd = mmsVariableName.indexOf(')'); + + String arrayIndexStr = mmsVariableName.substring(arrayStart + 1, arrayEnd); + arrayIndex = Integer.parseInt(arrayIndexStr); + + if (arrayIndex < 0) { + throw new SclParserException("Array index out of range in data set entry definition"); + } + + String componentNamePart = mmsVariableName.substring(arrayEnd + 1); + + if ((componentNamePart != null) && (componentNamePart.length() > 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;