Как (только) обновить временную метку узла OP C UA, используя сервер Eclipse Milo OpcUa? - PullRequest
0 голосов
/ 03 февраля 2020

Спасибо за чтение этого поста. Я благодарен за любую помощь!

Цель:

Я пытаюсь написать ValueNode с тем же значением, но другой меткой времени на сервере Eclipse Milo OpcUa. Я делаю все это с Java 11 и Milo 0.3.7.

Я протестировал это среди других на примере в проекте github. Я изменил функцию addScalarNodes в классе ExampleNamespace, чтобы записывать одно и то же значение с обновленной отметкой времени один раз в секунду. При проверке узла с помощью UaExpert отметка времени остается на том же значении. Только если я тоже обновлю значение, отметка времени обновится.

private void addScalarNodes(UaFolderNode rootNode) {
        UaFolderNode scalarTypesFolder = new UaFolderNode(
            getNodeContext(),
            newNodeId("HelloWorld/ScalarTypes"),
            newQualifiedName("ScalarTypes"),
            LocalizedText.english("ScalarTypes")
        );

        getNodeManager().addNode(scalarTypesFolder);
        rootNode.addOrganizes(scalarTypesFolder);

        for (Object[] os : STATIC_SCALAR_NODES) {
            String name = (String) os[0];
            NodeId typeId = (NodeId) os[1];
            Variant variant = (Variant) os[2];

            UaVariableNode node = new UaVariableNode.UaVariableNodeBuilder(getNodeContext())
                .setNodeId(newNodeId("HelloWorld/ScalarTypes/" + name))
                .setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
                .setUserAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
                .setBrowseName(newQualifiedName(name))
                .setDisplayName(LocalizedText.english(name))
                .setDataType(typeId)
                .setTypeDefinition(Identifiers.BaseDataVariableType)
                .build();

            node.setValue(new DataValue(variant));

            node.setAttributeDelegate(new ValueLoggingDelegate());

            getNodeManager().addNode(node);
            scalarTypesFolder.addOrganizes(node);

            if (name.equals("Boolean")) {
                Thread t = new Thread(() -> {
                    while (true) {
                        try {
                            Thread.sleep(1000L);
                            node.setValue(new DataValue(new Variant(Boolean.FALSE)));
                            System.out.println(node.getValue().getSourceTime());
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    }
                });
                t.start();
            }
        }
    }

Мой вопрос (ы):

1) Обновление отметки времени разрешено только в OP C Спецификации UA.

2) Как мне добиться этого с Майло?

Заранее спасибо!

РЕДАКТИРОВАТЬ Я проверяю метку времени активным чтение:

запись на стороне сервера:

private void handleValueUpdate(Object value, DateTime dateTime) {
        node.setValue(new DataValue(
            new Variant(value),
            StatusCode.GOOD,
            dateTime));
    }

чтение на стороне клиента:

VariableNode variableNode = getOpcClient().getAddressSpace().getVariableNode(new NodeId(namespaceIndex, nodeIdentifier)).get();
return variableNode.readValue().get().getSourceTime();

1 Ответ

0 голосов
/ 03 февраля 2020

Проверяете ли вы, читая (панель обновления атрибутов) или с подпиской и отслеживаемым элементом?

Если вы используете MonitoredItems, по умолчанию MonitoringFilter, если не указано иное, использует DataChangeTrigger.StatusValue, который включает в себя изменения в значении или качество, но не отметка времени, поэтому большинство клиентов по умолчанию не будут запрашивать или получать изменения только отметки времени.

...