3

我是一个 OPC-UA 新手,使用 Milo 堆栈将非 OPC-UA 系统集成到 OPC-UA 服务器。其中一部分包括将值写入 OPC-UA 服务器中的节点。我的问题之一是来自其他系统的值以 Java 字符串的形式出现,因此需要转换为节点的正确数据类型。我的第一个蛮力概念验证使用下面的代码来创建一个我可以用来写入节点的变体(如在 WriteExample.java 中)。变量是包含要写入的数据的 Java 字符串,例如“123”表示 Integer 或“32.3”表示 Double。该解决方案现在包括对 Identifiers 类(org.eclipse.milo.opcua.stack.core,参见 switch 语句)中的“类型”进行硬编码,这并不漂亮,我相信有更好的方法来做到这一点?另外,如果我想将“123”转换并写入一个节点,例如,UInt64,我该如何进行?

       try {
            VariableNode node = client.getAddressSpace().createVariableNode(nodeId);
            Object val = new Object();
            Object identifier = node.getDataType().get().getIdentifier();
            UInteger id = UInteger.valueOf(0);

            if(identifier instanceof UInteger) {
                id = (UInteger) identifier;
            }

            System.out.println("getIdentifier: " + node.getDataType().get().getIdentifier());
            switch (id.intValue()) {
                // Based on the Identifiers class in org.eclipse.milo.opcua.stack.core; 
                case 11: // Double
                    val = Double.valueOf(value);
                    break;
                case 6: //Int32
                    val = Integer.valueOf(value);
                    break;
            }

            DataValue data = new DataValue(new Variant(val),StatusCode.GOOD, null);
            StatusCode status = client.writeValue(nodeId, data).get();
            System.out.println("Wrote DataValue: " + data + " status: " + status);
            returnString = status.toString();
        } catch (Exception e) {
            System.out.println("ERROR: " + e.toString());
        }

我查看了 Kevin 对此线程的回复:如何可靠地写入 OPC UA 服务器?但我还是有点迷茫......一些小代码示例真的很有帮助。

4

1 回答 1

2

你离得并不远。每个相当大的代码库最终都会有一个或多个“TypeUtilities”类,而您将在这里需要一个。

您需要能够将系统中的类型映射到 OPC UA 类型,反之亦然。

对于无符号类型,您将使用包中的UShortUIntegerULongorg.eclipse.milo.opcua.stack.core.types.builtin.unsigned。有一些方便的静态工厂方法可以让它们的使用不那么冗长:

UShort us = ushort(foo);
UInteger ui = uint(foo);
ULong ul = ulong(foo);

我将探讨为即将发布的版本包含某种类型转换实用程序的想法,但即便如此,OPC UA 的工作方式你必须知道要写入它的节点的 DataType,并且在大多数情况下你想要也知道 ValueRank 和 ArrayDimensions。

您可以先验地知道这些属性值,通过其他一些带外机制获取它们,或者从服务器读取它们。

于 2019-11-28T17:19:36.180 回答