Как я могу записать два элемента массива OPC-UA по порядку с помощью Eclipse Milo?

Я использую сервер OPC-UA, к которому подключаюсь с помощью клиента Eclipse Milo. Есть два узла, на которые я хочу иметь возможность писать, оба с двойным массивом DataType[60].

Чтобы переписать значения узлов, я скопировал один из клиентских примеров и интегрировал его в свой код:

    public void writeNodeValue(Node node, Object input) {
        Variant v = new Variant(input);
        DataValue dv = new DataValue(v, null, null);
        NodeId nodeId = node.getNodeId();
        
        CompletableFuture<StatusCode> f =
                client.writeValue(nodeId, dv);
        
        StatusCode statusCode = null;
        try {
            statusCode = f.get();
        } catch (Throwable t) {
            logger.error("Error writing value: {}", t.getMessage(), t);
            future.completeExceptionally(t);
        }
    }

Во-первых, есть ли проблема с этой реализацией, то есть с вводом объекта, а не определенного типа данных?

Кроме того, у меня есть два основных вопроса, касающихся записи в узел массива.

  1. Как я могу записать в определенный элемент одного из моих массивов?
  2. Как я могу гарантировать, что клиент обновит один массив раньше другого?

Спасибо за любой совет, который вы можете дать.


person Alex C    schedule 12.11.2020    source источник


Ответы (1)


Во-первых, есть ли проблема с этой реализацией, то есть с вводом объекта, а не определенного типа данных?

Можно использовать Object в сигнатуре типа, но на самом деле значение должно быть тем типом, который ожидает сервер.

Как я могу записать в определенный элемент одного из моих массивов?

Использование параметра indexRange для WriteValue и вызов метода OpcUaClient::write, который принимает список из WriteValue.

Или, если сервер предоставляет каждый элемент как свой собственный узел в AddressSpace, вы можете попробовать записать скалярное значение непосредственно в этот узел.

В любом случае нет гарантии, что сервер поддержит или разрешит это.

Как я могу гарантировать, что клиент обновит один массив раньше другого?

Сделайте два отдельных вызова записи и дождитесь завершения первого, прежде чем делать второй.

person Kevin Herron    schedule 12.11.2020