#java #opc-ua #milo
#java #opc-ua #мило
Вопрос:
Я использую банки eclipse-milo’s, версия 0.5.3.
Я хотел бы прочитать определенные узлы и сохранить их значения в базе данных. Я намерен динамически создавать столбец базы данных с учетом типа данных. Например: узел типа Float (Идентификаторы.Float) будет ПЛАВАЮЩИМ значением в базе данных.
Я могу подключиться к серверу OPCUA, получить адресное пространство и прочитать значение узла.
UaNode node = uaClient.getAddressSpace().getNode(nodeId);
DataValue dataValue = node.readAttribute(AttributeId.Value);
Object value = dataValue.getValue().getValue();
Как я могу прочитать тип значения данного узла? В приведенном выше примере тип данных узла.
Я попробовал следующее:
Optional<ExpandedNodeId> dataType = dataValue.getValue().getDataType();
if (dataType.isPresent()) {
ExpandedNodeId nodeDataType = dataType.get();
nodeDataType.getIdentifier();
}
Получен идентификатор типа данных (ns=0; i=10), но не тип.
Ответ №1:
Типы данных в OPC UA идентифицируются с помощью NodeID, поэтому то, что вы видите, является нормальным.
Если вам нужна помощь в преобразовании типа данных в «резервный» класс, вы можете обратиться за помощью к DataTypeTree
классу:
DataTypeTree tree = DataTypeTreeBuilder.build(client);
UaVariableNode currentTimeNode = client.getAddressSpace()
.getVariableNode(Identifiers.Server_ServerStatus_CurrentTime);
NodeId dataType = currentTimeNode.getDataType();
Class<?> clazz = tree.getBackingClass(dataType);
System.out.println(clazz); // class org.eclipse.milo.opcua.stack.core.types.builtin.DateTime
Ответ №2:
Это не решение, однако, возможно, стоит проверить класс Identifiers. Этот класс содержит типы данных OPC UA и создает NodeID на основе значения id типа данных. Вы могли бы написать класс, который отменяет этот процесс и находит тип данных на основе значения id.
Может быть лучшее решение, но я так долго не использовал Eclipse Milo, поэтому в настоящее время я не знаю.