簡體   English   中英

我如何(僅)使用 Eclipse Milo OpcUa 服務器更新 OPC UA 節點的時間戳?

[英]How do I (only) update the timestamp of an OPC UA Node using an Eclipse Milo OpcUa Server?

感謝您閱讀這篇文章。 我很感激每一個幫助!

目標:

我正在嘗試在 Eclipse Milo OpcUa 服務器上編寫一個具有相同值但時間戳不同的 ValueNode。 我正在用 Java 11 和 Milo 0.3.7 做這一切。

我使用 github 項目中的示例對其進行了測試。 我修改了 ExampleNamespace 類中的函數 addScalarNodes,以每秒一次的更新時間戳寫入相同的值。 使用 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) 正在更新僅在 OPC UA 規范中允許的時間戳。

2) 我怎樣才能用 Milo 做到這一點?

提前致謝!

編輯我通過主動閱讀檢查時間戳:

服務端寫法:

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();

您是通過閱讀(刷新屬性窗格)還是通過訂閱和受監控項目進行檢查?

如果您正在使用 MonitoredItems,則默認的 MonitoringFilter 在未另行指定時使用DataChangeTrigger.StatusValue ,其中包括對值或質量的更改,但不包括時間戳,因此默認情況下大多數客戶端不會要求或接收僅時間戳更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM