- updated model generator code for update data model structures

v1.6_develop_rgoose_sntp
Michael Zillgith 3 years ago
parent 659dd49338
commit 637b750d7f

@ -159,24 +159,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<Node> 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);
if (dataAttribute == null)

@ -740,8 +740,14 @@ public class StaticModelGenerator {
private void printDataAttributeDefinitions(String doName, List<DataAttribute> 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();
if (dataAttribute.getFc() == FunctionalConstraint.SE) {
@ -771,72 +777,197 @@ 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,");
cOut.println(" " + dataAttribute.getCount() + ",");
cOut.println(" -1,");
cOut.println(" IEC61850_FC_" + dataAttribute.getFc().toString() + ",");
cOut.println(" IEC61850_" + dataAttribute.getType() + ",");
//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");
}
/* print trigger options */
cOut.print(" 0");
if (sAddr != null)
cOut.print(" " + sAddr.longValue());
else
cOut.print(" 0");
TriggerOptions trgOps = dataAttribute.getTriggerOptions();
// <<<<<<<<<<<<<<<<<<<<<<<<
if (trgOps.isDchg())
cOut.print(" + TRG_OPT_DATA_CHANGED");
cOut.println("};\n");
if (trgOps.isDupd())
cOut.print(" + TRG_OPT_DATA_UPDATE");
//if (dataAttribute.getSubDataAttributes() != null)
// printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes(), isTransient, -1);
if (trgOps.isQchg())
cOut.print(" + TRG_OPT_QUALITY_CHANGED");
//TODO implement ARRAY case!
if (isTransient)
cOut.print(" + TRG_OPT_TRANSIENT");
/* Print array elements */
cOut.println(",");
for (int idx = 0; idx < dataAttribute.getCount(); idx++) {
cOut.println(" NULL,");
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() + ",");
/* print trigger options */
cOut.print(" 0");
trgOps = dataAttribute.getTriggerOptions();
if (trgOps.isDchg())
cOut.print(" + TRG_OPT_DATA_CHANGED");
Long sAddr = null;
if (trgOps.isDupd())
cOut.print(" + TRG_OPT_DATA_UPDATE");
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 (trgOps.isQchg())
cOut.print(" + TRG_OPT_QUALITY_CHANGED");
if (isTransient)
cOut.print(" + TRG_OPT_TRANSIENT");
cOut.println(",");
cOut.println(" NULL,");
cOut.print(" 0"); /* sAddr --> REMOVE */
cOut.println("};\n");
if (dataAttribute.getSubDataAttributes() != null)
printDataAttributeDefinitions(arrayElementdaName, dataAttribute.getSubDataAttributes(), isTransient, -1);
}
}
else {
if ((dataAttribute.getSubDataAttributes() != null) && (dataAttribute.getSubDataAttributes().size() > 0))
cOut.println(" (ModelNode*) &" + daName + "_" + dataAttribute.getSubDataAttributes().get(0).getName() + ",");
else
cOut.println(" NULL,");
if (sAddr != null)
cOut.print(" " + sAddr.longValue());
else
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");
TriggerOptions trgOps = dataAttribute.getTriggerOptions();
if (dataAttribute.getSubDataAttributes() != null)
printDataAttributeDefinitions(daName, dataAttribute.getSubDataAttributes(), isTransient, -1);
//TODO handle array case
if (trgOps.isDchg())
cOut.print(" + TRG_OPT_DATA_CHANGED");
DataModelValue value = dataAttribute.getValue();
if (trgOps.isDupd())
cOut.print(" + TRG_OPT_DATA_UPDATE");
/* if no value is given use default value for type if present */
if (value == null) {
value = dataAttribute.getDefinition().getValue();
if (trgOps.isQchg())
cOut.print(" + TRG_OPT_QUALITY_CHANGED");
if (value != null)
if (value.getValue() == null)
value.updateEnumOrdValue(ied.getTypeDeclarations());
}
if (isTransient)
cOut.print(" + TRG_OPT_TRANSIENT");
cOut.println(",");
cOut.println(" NULL,");
//TODO REMOVE sAddr code >>>>>
Long sAddr = null;
if (value != null) {
printValue(daName, dataAttribute, value);
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);
}
}
}
}
@ -1007,8 +1138,21 @@ public class StaticModelGenerator {
hOut.println("extern DataAttribute " + daName + ";");
if (dataAttribute.getSubDataAttributes() != null)
printDataAttributeForwardDeclarations(daName, dataAttribute.getSubDataAttributes());
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());
}
}
}

Loading…
Cancel
Save