From 637b750d7f064152425b03e11c261dd31356abb1 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 20 Apr 2022 15:51:16 +0200 Subject: [PATCH] - updated model generator code for update data model structures --- tools/model_generator/genmodel.jar | Bin 97845 -> 98337 bytes .../libiec61850/scl/model/LogicalNode.java | 34 ++- .../tools/StaticModelGenerator.java | 252 ++++++++++++++---- 3 files changed, 229 insertions(+), 57 deletions(-) diff --git a/tools/model_generator/genmodel.jar b/tools/model_generator/genmodel.jar index ff915a65413230699d91c0b4a86f4122be473f25..7dbfb4c4dbd6dfd5f3c6af265e6dbfe7883c2816 100644 GIT binary patch delta 21362 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 delta 20726 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 asHB%O{P6O%9Y7x{?*keNT{}^G5dR1FP0GUn 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 c43c5860..378459f2 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java @@ -158,24 +158,52 @@ public class LogicalNode implements DataModelNode { for (Node doiNode : doiNodes) { String doiName = ParserUtils.parseAttribute(doiNode, "name"); - + + int idx = -1; + + String ixAttr = ParserUtils.parseAttribute(doiNode, "ix"); + + if (ixAttr != null) { + try { + idx = Integer.decode(ixAttr); + } + catch (NumberFormatException ex) + { + throw new SclParserException(doiNode, "Invalid ix attribute in \"" + doiName + "\""); + } + } + DataObject dataObject = (DataObject) getChildByName(doiName); if (dataObject == null) throw new SclParserException(doiNode, "Missing data object with name \"" + doiName + "\""); - parseDataAttributeNodes(doiNode, dataObject); + parseDataAttributeNodes(doiNode, dataObject, idx); parseSubDataInstances(doiNode, dataObject); } } - private void parseDataAttributeNodes(Node doiNode, DataModelNode dataObject) + private void parseDataAttributeNodes(Node doiNode, DataModelNode dataObject, int parendIdx) throws SclParserException { List daiNodes = ParserUtils.getChildNodesWithTag(doiNode, "DAI"); for (Node daiNode : daiNodes) { String daiName = ParserUtils.parseAttribute(daiNode, "name"); + + int idx = parendIdx; + + String ixAttr = ParserUtils.parseAttribute(doiNode, "ix"); + + if (ixAttr != null) { + try { + idx = Integer.decode(ixAttr); + } + catch (NumberFormatException ex) + { + throw new SclParserException(doiNode, "Invalid ix attribute in \"" + daiName + "\""); + } + } DataAttribute dataAttribute = (DataAttribute) dataObject.getChildByName(daiName); diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index ce3ed472..a3497857 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -740,7 +740,13 @@ public class StaticModelGenerator { private void printDataAttributeDefinitions(String doName, List dataAttributes, boolean isTransient, int arrayIdx) { for (int i = 0; i < dataAttributes.size(); i++) { + boolean isArray = false; + DataAttribute dataAttribute = dataAttributes.get(i); + + if (dataAttribute.getCount() > 0) { + isArray = true; + } String daName = doName + "_" + dataAttribute.getName(); @@ -771,71 +777,196 @@ public class StaticModelGenerator { } else cOut.println(" NULL,"); - if ((dataAttribute.getSubDataAttributes() != null) && (dataAttribute.getSubDataAttributes().size() > 0)) - cOut.println(" (ModelNode*) &" + daName + "_" + dataAttribute.getSubDataAttributes().get(0).getName() + ","); - else + + if (isArray) { + + /* first child is array element 0 */ + cOut.println(" (ModelNode*) &" + daName + "_0,"); + + cOut.println(" " + dataAttribute.getCount() + ","); + cOut.println(" -1,"); + + cOut.println(" IEC61850_FC_" + dataAttribute.getFc().toString() + ","); + cOut.println(" IEC61850_" + dataAttribute.getType() + ","); + + /* print trigger options */ + cOut.print(" 0"); + + TriggerOptions trgOps = dataAttribute.getTriggerOptions(); + + if (trgOps.isDchg()) + cOut.print(" + TRG_OPT_DATA_CHANGED"); + + if (trgOps.isDupd()) + cOut.print(" + TRG_OPT_DATA_UPDATE"); + + if (trgOps.isQchg()) + cOut.print(" + TRG_OPT_QUALITY_CHANGED"); + + if (isTransient) + cOut.print(" + TRG_OPT_TRANSIENT"); + + cOut.println(","); + cOut.println(" NULL,"); + + //TODO REMOVE sAddr code >>>>> + Long sAddr = null; + + try { + if (dataAttribute.getShortAddress() != null) + sAddr = new Long(dataAttribute.getShortAddress()); + } catch (NumberFormatException e) { + System.out.println("WARNING: short address \"" + dataAttribute.getShortAddress() + "\" is not valid for libIEC61850!\n"); + } - cOut.println(" " + dataAttribute.getCount() + ","); - cOut.println(" -1,"); - cOut.println(" IEC61850_FC_" + dataAttribute.getFc().toString() + ","); - cOut.println(" IEC61850_" + dataAttribute.getType() + ","); + if (sAddr != null) + cOut.print(" " + sAddr.longValue()); + else + cOut.print(" 0"); + + // <<<<<<<<<<<<<<<<<<<<<<<< + + cOut.println("};\n"); - /* print trigger options */ - cOut.print(" 0"); + //if (dataAttribute.getSubDataAttributes() != null) + // printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes(), isTransient, -1); + + //TODO implement ARRAY case! + + /* Print array elements */ + + for (int idx = 0; idx < dataAttribute.getCount(); idx++) { + + String arrayElementdaName = daName + "_" + idx; + + variablesList.add(arrayElementdaName); + + cOut.println("DataAttribute " + arrayElementdaName + " = {"); + cOut.println(" DataAttributeModelType,"); + cOut.println(" \"" + dataAttribute.getName() + "\","); + cOut.println(" (ModelNode*) &" + daName + ","); + + if (idx != dataAttribute.getCount() - 1) { + String nextArrayElementdaName = daName + "_" + (idx + 1); + + cOut.println(" (ModelNode*) &" + nextArrayElementdaName + ","); + } + else + cOut.println(" NULL,"); + + if ((dataAttribute.getSubDataAttributes() != null) && (dataAttribute.getSubDataAttributes().size() > 0)) + cOut.println(" (ModelNode*) &" + arrayElementdaName + "_" + dataAttribute.getSubDataAttributes().get(0).getName() + ","); + else + cOut.println(" NULL,"); + + cOut.println(" 0,"); /* number of array elements = 0 */ + cOut.println(" " + idx + ","); + + cOut.println(" IEC61850_FC_" + dataAttribute.getFc().toString() + ","); + cOut.println(" IEC61850_" + dataAttribute.getType() + ","); - TriggerOptions trgOps = dataAttribute.getTriggerOptions(); + /* print trigger options */ + cOut.print(" 0"); - if (trgOps.isDchg()) - cOut.print(" + TRG_OPT_DATA_CHANGED"); + trgOps = dataAttribute.getTriggerOptions(); - if (trgOps.isDupd()) - cOut.print(" + TRG_OPT_DATA_UPDATE"); + if (trgOps.isDchg()) + cOut.print(" + TRG_OPT_DATA_CHANGED"); - if (trgOps.isQchg()) - cOut.print(" + TRG_OPT_QUALITY_CHANGED"); - - if (isTransient) - cOut.print(" + TRG_OPT_TRANSIENT"); + if (trgOps.isDupd()) + cOut.print(" + TRG_OPT_DATA_UPDATE"); - cOut.println(","); + if (trgOps.isQchg()) + cOut.print(" + TRG_OPT_QUALITY_CHANGED"); + + if (isTransient) + cOut.print(" + TRG_OPT_TRANSIENT"); - cOut.println(" NULL,"); - - Long sAddr = null; - - try { - if (dataAttribute.getShortAddress() != null) - sAddr = new Long(dataAttribute.getShortAddress()); - } catch (NumberFormatException e) { - System.out.println("WARNING: short address \"" + dataAttribute.getShortAddress() + "\" is not valid for libIEC61850!\n"); + cOut.println(","); + + cOut.println(" NULL,"); + + cOut.print(" 0"); /* sAddr --> REMOVE */ + + cOut.println("};\n"); + + if (dataAttribute.getSubDataAttributes() != null) + printDataAttributeDefinitions(arrayElementdaName, dataAttribute.getSubDataAttributes(), isTransient, -1); + } } - - if (sAddr != null) - cOut.print(" " + sAddr.longValue()); - else + else { + if ((dataAttribute.getSubDataAttributes() != null) && (dataAttribute.getSubDataAttributes().size() > 0)) + cOut.println(" (ModelNode*) &" + daName + "_" + dataAttribute.getSubDataAttributes().get(0).getName() + ","); + else + cOut.println(" NULL,"); + + cOut.println(" " + dataAttribute.getCount() + ","); + cOut.println(" -1,"); + + cOut.println(" IEC61850_FC_" + dataAttribute.getFc().toString() + ","); + cOut.println(" IEC61850_" + dataAttribute.getType() + ","); + + /* print trigger options */ cOut.print(" 0"); - - cOut.println("};\n"); - if (dataAttribute.getSubDataAttributes() != null) - printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes(), isTransient, -1); - //TODO handle array case - - DataModelValue value = dataAttribute.getValue(); - - /* if no value is given use default value for type if present */ - if (value == null) { - value = dataAttribute.getDefinition().getValue(); - - if (value != null) - if (value.getValue() == null) - value.updateEnumOrdValue(ied.getTypeDeclarations()); - } - - if (value != null) { - printValue(daName, dataAttribute, value); + TriggerOptions trgOps = dataAttribute.getTriggerOptions(); + + if (trgOps.isDchg()) + cOut.print(" + TRG_OPT_DATA_CHANGED"); + + if (trgOps.isDupd()) + cOut.print(" + TRG_OPT_DATA_UPDATE"); + + if (trgOps.isQchg()) + cOut.print(" + TRG_OPT_QUALITY_CHANGED"); + + if (isTransient) + cOut.print(" + TRG_OPT_TRANSIENT"); + + cOut.println(","); + + cOut.println(" NULL,"); + + //TODO REMOVE sAddr code >>>>> + Long sAddr = null; + + try { + if (dataAttribute.getShortAddress() != null) + sAddr = new Long(dataAttribute.getShortAddress()); + } catch (NumberFormatException e) { + System.out.println("WARNING: short address \"" + dataAttribute.getShortAddress() + "\" is not valid for libIEC61850!\n"); + } + + if (sAddr != null) + cOut.print(" " + sAddr.longValue()); + else + cOut.print(" 0"); + + // <<<<<<<<<<<<<<<<<<<<<<<< + + cOut.println("};\n"); + + if (dataAttribute.getSubDataAttributes() != null) + printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes(), isTransient, -1); + //TODO handle array case + + DataModelValue value = dataAttribute.getValue(); + + /* if no value is given use default value for type if present */ + if (value == null) { + value = dataAttribute.getDefinition().getValue(); + + if (value != null) + if (value.getValue() == null) + value.updateEnumOrdValue(ied.getTypeDeclarations()); + } + + if (value != null) { + printValue(daName, dataAttribute, value); + } } + } @@ -1006,9 +1137,22 @@ public class StaticModelGenerator { } hOut.println("extern DataAttribute " + daName + ";"); + + if (dataAttribute.getCount() > 0) { + for (int idx = 0; idx < dataAttribute.getCount(); idx++) { + String arrayElemDaName = daName + "_" + idx; + + hOut.println("extern DataAttribute " + arrayElemDaName + ";"); + + if (dataAttribute.getSubDataAttributes() != null) + printDataAttributeForwardDeclarations(arrayElemDaName, dataAttribute.getSubDataAttributes()); + } + } + else { + if (dataAttribute.getSubDataAttributes() != null) + printDataAttributeForwardDeclarations(daName, dataAttribute.getSubDataAttributes()); + } - if (dataAttribute.getSubDataAttributes() != null) - printDataAttributeForwardDeclarations(daName, dataAttribute.getSubDataAttributes()); } }