# OPC Data Type Question

**URL:** <https://forum.inductiveautomation.com/t/opc-data-type-question/111972>\
**Category:** Module Development\
**Created:** [November 5, 2025, 7:23pm UTC](https://forum.inductiveautomation.com/t/opc-data-type-question/111972 "2025-11-05T19:23:20Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![AYOMIKUN\_ORUKOTAN](https://avatars.discourse-cdn.com/v4/letter/a/e5b9ba/32.png) [@AYOMIKUN\_ORUKOTAN](https://forum.inductiveautomation.com/u/AYOMIKUN_ORUKOTAN)\
**Post date:** [November 5, 2025, 7:23pm UTC](https://forum.inductiveautomation.com/t/opc-data-type-question/111972/1 "2025-11-05T19:23:20Z")

</div>

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.

```python
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"},]}

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/6/f/6f38ae94d5806c9460c7cf96cf12caa16f55ab18.png)

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

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/6/2/627fdec74036a4350bb7df12264b9cdb34d8e7b3.png)

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

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/c/e/ced53d117a75ff95d6fe89a2a4cf3236763ee47a.png)
