写入 Milo 中的 OPC-UA 节点时如何设置正确的数据类型?
How to set the proper data type when writing to an OPC-UA node in Milo?
我是一名 OPC-UA 新手,使用 Milo 堆栈将非 OPC-UA 系统集成到 OPC-UA 服务器。其中一部分包括将值写入 OPC-UA 服务器中的节点。我的问题之一是来自其他系统的值以 Java 字符串的形式出现,因此需要转换为节点的正确数据类型。我的第一个强力概念验证使用以下代码来创建一个我可以用来写入节点的变体(如 WriteExample.java 中所示)。变量 value 是包含要写入的数据的 Java 字符串,例如整数为“123”,双精度为“32.3”。该解决方案现在包括从标识符 class(org.eclipse.milo.opcua.stack.core,请参阅 switch 语句)中对 "types" 进行硬编码,这并不漂亮,我相信有更好的方法来做到这一点?
另外,如果我想将“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 对此主题的回复: 但我还是有点迷茫...一些小代码示例真的很有帮助。
你离得不远了。每个规模庞大的代码库最终都会有一个或多个 "TypeUtilities" 类,您将需要一个。
您需要能够将系统中的类型映射到 OPC UA 类型,反之亦然。
对于无符号类型,您将使用 org.eclipse.milo.opcua.stack.core.types.builtin.unsigned
包中的 UShort
、UInteger
和 ULong
类。有方便的静态工厂方法使它们的使用不那么冗长:
UShort us = ushort(foo);
UInteger ui = uint(foo);
ULong ul = ulong(foo);
我将探索为即将发布的版本包含某种类型转换实用程序的想法,但即便如此,OPC UA 的工作方式你必须知道节点的数据类型才能写入它,并且在大多数情况下,您还想知道 ValueRank 和 ArrayDimensions。
您要么事先知道这些属性值,通过其他一些带外机制获取它们,要么从服务器读取它们。
我是一名 OPC-UA 新手,使用 Milo 堆栈将非 OPC-UA 系统集成到 OPC-UA 服务器。其中一部分包括将值写入 OPC-UA 服务器中的节点。我的问题之一是来自其他系统的值以 Java 字符串的形式出现,因此需要转换为节点的正确数据类型。我的第一个强力概念验证使用以下代码来创建一个我可以用来写入节点的变体(如 WriteExample.java 中所示)。变量 value 是包含要写入的数据的 Java 字符串,例如整数为“123”,双精度为“32.3”。该解决方案现在包括从标识符 class(org.eclipse.milo.opcua.stack.core,请参阅 switch 语句)中对 "types" 进行硬编码,这并不漂亮,我相信有更好的方法来做到这一点? 另外,如果我想将“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 对此主题的回复:
你离得不远了。每个规模庞大的代码库最终都会有一个或多个 "TypeUtilities" 类,您将需要一个。
您需要能够将系统中的类型映射到 OPC UA 类型,反之亦然。
对于无符号类型,您将使用 org.eclipse.milo.opcua.stack.core.types.builtin.unsigned
包中的 UShort
、UInteger
和 ULong
类。有方便的静态工厂方法使它们的使用不那么冗长:
UShort us = ushort(foo);
UInteger ui = uint(foo);
ULong ul = ulong(foo);
我将探索为即将发布的版本包含某种类型转换实用程序的想法,但即便如此,OPC UA 的工作方式你必须知道节点的数据类型才能写入它,并且在大多数情况下,您还想知道 ValueRank 和 ArrayDimensions。
您要么事先知道这些属性值,通过其他一些带外机制获取它们,要么从服务器读取它们。