OPC Data Type Question

Hi Kevin, I have a problem with my code. I want to have value, lower limits and upper limit in a folder but I discover that when I have the data Type as real using my xml file, I get all 3 folders but I want my values in float/double. When I change it to dataType to float in my xml file. upper limit and lowerlimit does not appear in my Tag structure. I don’t know what is causing it. Here is a snippet of my code.

if ("float".equalsIgnoreCase(dataType) || "double".equalsIgnoreCase(dataType)) {
    float defaultValue = (float) currParam.getDouble("dval");
    float upperLimit = (float) currParam.getDouble("ul");
    float lowerLimit = (float) currParam.getDouble("ll");
    logger.info("Creating Value node for " + paramName);

    // Create the Default Value Node
    UaVariableNode defaultValueNode = UaVariableNode.builder(getNodeContext())
            .setNodeId(deviceContext.nodeId(String.format("Medtronic.Recipe.Parameters.%s.Value", paramName)))
            .setBrowseName(deviceContext.qualifiedName("Value"))
            .setDisplayName(new LocalizedText("Value"))
            .setDataType(BuiltinDataType.Float.getNodeId())
            .setTypeDefinition(Identifiers.BaseDataVariableType)
            .setAccessLevel(AccessLevel.READ_WRITE)
            .setUserAccessLevel(AccessLevel.READ_WRITE)
            .build();

    defaultValueNode.setValue(new DataValue(new Variant((float)defaultValue)));
    getNodeManager().addNode(defaultValueNode);
    paramFolder.addOrganizes(defaultValueNode);

    // Create the Upper Limit Node
    UaVariableNode upperLimitNode = UaVariableNode.builder(getNodeContext())
            .setNodeId(deviceContext.nodeId(String.format("Medtronic.Recipe.Parameters.%s.UpperLimit", paramName)))
            .setBrowseName(deviceContext.qualifiedName("UpperLimit"))
            .setDisplayName(new LocalizedText("Upper Limit"))
            .setDataType(BuiltinDataType.Float.getNodeId())
            .setTypeDefinition(Identifiers.BaseDataVariableType)
            .setAccessLevel(AccessLevel.READ_WRITE)
            .setUserAccessLevel(AccessLevel.READ_WRITE)
            .build();

    upperLimitNode.setValue(new DataValue(new Variant((float)upperLimit)));
    getNodeManager().addNode(upperLimitNode);
    paramFolder.addOrganizes(upperLimitNode);

    // Create the Lower Limit Node
    UaVariableNode lowerLimitNode = UaVariableNode.builder(getNodeContext())
            .setNodeId(deviceContext.nodeId(String.format("Medtronic.Recipe.Parameters.%s.LowerLimit", paramName)))
            .setBrowseName(deviceContext.qualifiedName("LowerLimit"))
            .setDisplayName(new LocalizedText("Lower Limit"))
            .setDataType(BuiltinDataType.Float.getNodeId())
            .setTypeDefinition(Identifiers.BaseDataVariableType)
            .setAccessLevel(AccessLevel.READ_WRITE)
            .setUserAccessLevel(AccessLevel.READ_WRITE)
            .build();

    lowerLimitNode.setValue(new DataValue(new Variant((float)lowerLimit)));
    getNodeManager().addNode(lowerLimitNode);
    paramFolder.addOrganizes(lowerLimitNode);

    logger.info("Created Value, UpperLimit, and LowerLimit under folder: " + paramName);
}
else {
    String defaultValue = currParam.getString("dval");
    // Create the Default Value Tag for non-real types
    UaVariableNode defaultValueNode = UaVariableNode.builder(getNodeContext())
            .setNodeId(deviceContext.nodeId(String.format("Medtronic.Recipe.%s", paramName)))
            .setBrowseName(deviceContext.qualifiedName(paramName))
            .setDisplayName(new LocalizedText(paramName))
            .setDataType(BuiltinDataType.String.getNodeId())
            .setTypeDefinition(Identifiers.BaseDataVariableType)
            .setAccessLevel(AccessLevel.READ_WRITE)
            .setUserAccessLevel(AccessLevel.READ_WRITE)
            .build();

    defaultValueNode.setValue(new DataValue(new Variant(defaultValue)));
    getNodeManager().addNode(defaultValueNode);
    paramFolder.addOrganizes(defaultValueNode);
}

This is my xml file as well: {"params":
[{"name":"AIR_RATE_BOT","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"AIR_RATE_TOP","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"AREA_SPEED_BOT","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"AREA_SPEED_TOP","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"FLOW_RATE_1_BOT","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"FLOW_RATE_1_TOP","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"FLOW_RATE_2_BOT","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"FLOW_RATE_2_TOP","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"PUMP1_BOT","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"PUMP1_TOP","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"PUMP2_BOT","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"PUMP2_TOP","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"Z_HEIGHT_BOT","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"Z_HEIGHT_TOP","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"NOZZLE_1_POWER_BOT","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"NOZZLE_1_POWER_TOP","dt":"float","dval":3,"ul":5,"ll":1},
{"name":"Mix Lot A Consumable Name","dt":"string","dval":"testing"},
{"name":"Mix Lot B Consumable Name","dt":"string","dval":"testing"},]}

When my dataType is set to “Float” in my xml data

When my dataType is set to “real” in my xml