Как мне надежно записать на сервер OPC UA? - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь записать некоторые значения на сервер OPC UA. Чтобы сделать это надежно, мне, вероятно, нужно знать DataType узла, в который я пытаюсь записать, иначе мне кажется, что я склонен к получению несовпадений типов данных.

Допустим, мой сервер имеетузел TestNodeOne с типом данных Int16

Мой API получает указание записать значение 3 в этот узел. Теперь мне нужно принять решение: обрабатывать ли я 3 как целое число или как короткую строку? Для этого кажется, что мне понадобится тип данных моего узла.

То, что я пробовал

Мой подход состоял в том, чтобы просто просмотреть сервер и создать кэш всех его узлов ссоответствующий тип данных. Вот как это выглядит:

// Recursively browse entire server
@SuppressWarnings("deprecation")
private HashMap<String, NodeId> browseNode(String indent, OpcUaClient client, NodeId browseRoot, HashMap<String, NodeId> nodesMap) {

    BrowseDescription browse = new BrowseDescription(
            browseRoot,
            BrowseDirection.Forward,
            Identifiers.References,
            true, uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()),
            uint(BrowseResultMask.All.getValue()));

    try {
        BrowseResult browseResult = client.browse(browse).get();
        List<ReferenceDescription> references = toList(browseResult.getReferences());

        for (ReferenceDescription rd : references) {

            UShort namespaceIndex = rd.getNodeId().getNamespaceIndex();
            String identifier = rd.getNodeId().getIdentifier().toString();
            NodeId node = new NodeId(namespaceIndex, identifier);
            nodesMap.put(rd.getNodeId().getIdentifier().toString(), node);

            logger.info("----------------------------------------------------------------");
            logger.info(identifier);
            logger.info("TYPE " + rd.getTypeDefinition()); // Not the right node
            logger.info("TYPE " + rd.getTypeId().getIdentifier().toString()); // Not the right node
            logger.info("TYPE " + rd.getReferenceTypeId().getIdentifier().toString()); // Not the right node

            rd.getNodeId().local().ifPresent(nodeId -> {
                browseNode(indent + "  ", client, nodeId, nodesMap);
            });
        }

    } catch (InterruptedException | ExecutionException e) {
        logger.error("Browsing nodeId={} failed: {}", browseRoot, e.getMessage(), e);
    }

    return nodesMap;
}

Я не могу понять, как получить тип данных узла. Я думаю, что я не на том пути. Как я могу узнать тип данных узла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...