diff --git a/tools/model_generator/genconfig.jar b/tools/model_generator/genconfig.jar index 5ad24fcb..8b2670b0 100644 Binary files a/tools/model_generator/genconfig.jar and b/tools/model_generator/genconfig.jar differ diff --git a/tools/model_generator/genmodel.jar b/tools/model_generator/genmodel.jar index e2b4f93f..9365b2df 100644 Binary files a/tools/model_generator/genmodel.jar and b/tools/model_generator/genmodel.jar differ diff --git a/tools/model_generator/src/com/libiec61850/scl/DataObjectDefinition.java b/tools/model_generator/src/com/libiec61850/scl/DataObjectDefinition.java index 29c01204..56c9477c 100644 --- a/tools/model_generator/src/com/libiec61850/scl/DataObjectDefinition.java +++ b/tools/model_generator/src/com/libiec61850/scl/DataObjectDefinition.java @@ -28,11 +28,18 @@ import org.w3c.dom.Node; public class DataObjectDefinition { private String name; private String type; + private boolean trans = false; /* transient attribute value */ private int count = 0; public DataObjectDefinition(Node dataObjectNode) throws SclParserException { this.name = ParserUtils.parseAttribute(dataObjectNode, "name"); this.type = ParserUtils.parseAttribute(dataObjectNode, "type"); + + + Boolean isTransient = ParserUtils.parseBooleanAttribute(dataObjectNode, "transient"); + + if (isTransient != null) + this.trans = isTransient; if ((this.type == null) || (this.name == null)) throw new SclParserException(dataObjectNode, "DO misses required attribute."); @@ -53,5 +60,9 @@ public class DataObjectDefinition { public int getCount() { return count; } + + public boolean isTransient() { + return trans; + } } diff --git a/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java b/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java index c7fae5e0..d61ef972 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java @@ -42,11 +42,13 @@ public class DataObject implements DataModelNode { private List subDataObjects = null; private SclType sclType; private DataModelNode parent; + private boolean trans = false; public DataObject(DataObjectDefinition doDefinition, TypeDeclarations typeDeclarations, DataModelNode parent) throws SclParserException { this.name = doDefinition.getName(); this.count = doDefinition.getCount(); this.parent = parent; + this.trans = doDefinition.isTransient(); this.dataAttributes = new LinkedList(); this.subDataObjects = new LinkedList(); @@ -109,6 +111,10 @@ public class DataObject implements DataModelNode { public int getCount() { return count; } + + public boolean isTransient() { + return trans; + } @Override public DataModelNode getChildByName(String childName) { diff --git a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java index 44d68303..d5ec7ffc 100644 --- a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java @@ -132,7 +132,7 @@ public class DynamicModelGenerator { for (DataObject dataObject : logicalNode.getDataObjects()) { output.print("DO(" + dataObject.getName() + " " + dataObject.getCount() + "){\n"); - exportDataObject(output, dataObject); + exportDataObject(output, dataObject, false); output.println("}"); } @@ -369,27 +369,37 @@ public class DynamicModelGenerator { output.println("}"); } - private void exportDataObject(PrintStream output, DataObject dataObject) { + private void exportDataObject(PrintStream output, DataObject dataObject, boolean isTransient) { + + if (dataObject.isTransient()) + isTransient = true; + for (DataObject subDataObject : dataObject.getSubDataObjects()) { output.print("DO(" + subDataObject.getName() + " " + subDataObject.getCount() + "){\n"); - exportDataObject(output, subDataObject); + exportDataObject(output, subDataObject, isTransient); output.println("}"); } for (DataAttribute dataAttribute : dataObject.getDataAttributes()) { - exportDataAttribute(output, dataAttribute); + exportDataAttribute(output, dataAttribute, isTransient); } } - private void exportDataAttribute(PrintStream output, DataAttribute dataAttribute) { + private void exportDataAttribute(PrintStream output, DataAttribute dataAttribute, boolean isTransient) { output.print("DA(" + dataAttribute.getName() + " "); output.print(dataAttribute.getCount() + " "); output.print(dataAttribute.getType().getIntValue() + " "); output.print(dataAttribute.getFc().getIntValue() + " "); - output.print(dataAttribute.getTriggerOptions().getIntValue() + " "); + + int trgOpsVal = dataAttribute.getTriggerOptions().getIntValue(); + + if (isTransient) + trgOpsVal += 128; + + output.print(trgOpsVal + " "); Long sAddr = null; @@ -471,7 +481,7 @@ public class DynamicModelGenerator { output.println("{"); for (DataAttribute subDataAttribute : dataAttribute.getSubDataAttributes()) { - exportDataAttribute(output, subDataAttribute); + exportDataAttribute(output, subDataAttribute, isTransient); } 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 c17b86a4..144c23a0 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -588,7 +588,7 @@ public class StaticModelGenerator { cOut.println("};\n"); - printDataObjectDefinitions(lnName, logicalNode.getDataObjects(), null); + printDataObjectDefinitions(lnName, logicalNode.getDataObjects(), null, false); printReportControlBlocks(lnName, logicalNode); @@ -604,7 +604,7 @@ public class StaticModelGenerator { } } - private void printDataObjectDefinitions(String lnName, List dataObjects, String dataAttributeSibling) { + private void printDataObjectDefinitions(String lnName, List dataObjects, String dataAttributeSibling, boolean isTransient) { for (int i = 0; i < dataObjects.size(); i++) { DataObject dataObject = dataObjects.get(i); @@ -644,17 +644,26 @@ public class StaticModelGenerator { cOut.println(" " + dataObject.getCount()); cOut.println("};\n"); + + boolean isDoTransient = false; + + if (isTransient) + isDoTransient = true; + else { + if (dataObject.isTransient()) + isDoTransient = true; + } if (dataObject.getSubDataObjects() != null) - printDataObjectDefinitions(doName, dataObject.getSubDataObjects(), firstDataAttributeName); + printDataObjectDefinitions(doName, dataObject.getSubDataObjects(), firstDataAttributeName, isDoTransient); if (dataObject.getDataAttributes() != null) - printDataAttributeDefinitions(doName, dataObject.getDataAttributes()); + printDataAttributeDefinitions(doName, dataObject.getDataAttributes(), isDoTransient); } } - private void printDataAttributeDefinitions(String doName, List dataAttributes) { + private void printDataAttributeDefinitions(String doName, List dataAttributes, boolean isTransient) { for (int i = 0; i < dataAttributes.size(); i++) { DataAttribute dataAttribute = dataAttributes.get(i); @@ -709,6 +718,9 @@ public class StaticModelGenerator { if (trgOps.isQchg()) cOut.print(" + TRG_OPT_QUALITY_CHANGED"); + + if (isTransient) + cOut.print(" + TRG_OPT_TRANSIENT"); cOut.println(","); @@ -731,7 +743,7 @@ public class StaticModelGenerator { cOut.println("};\n"); if (dataAttribute.getSubDataAttributes() != null) - printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes()); + printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes(), isTransient); DataModelValue value = dataAttribute.getValue();