java - 如何(仅)使用 Eclipse Milo OpcUa 服务器更新 OPC UA 节点的时间戳?

标签 java datetime opc-ua instant milo

感谢您阅读这篇文章。我非常感谢每一个帮助!

目标:

我正在尝试在 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();

最佳答案

您是通过阅读(刷新属性 Pane )还是通过订阅和受监控项目进行检查?

如果您使用的是 MonitoredItems,则默认的 MonitoringFilter 在未另行指定的情况下会使用 DataChangeTrigger.StatusValue,其中包括对值或质量的更改,但不包括时间戳,因此大多数客户端不会请求或接收时间戳-默认情况下仅更改。

关于java - 如何(仅)使用 Eclipse Milo OpcUa 服务器更新 OPC UA 节点的时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60035739/

相关文章:

java - 我需要在 jboss 运行后保留一个值。我需要在tomcat启动之前使用

java - Spring Boot - Docker 日志

java - 在 Java 的 System.out 中以表格格式输出

java - 以秒为单位获取两个 Joda 日期之间的差异

MySQL,根据日期列选择行

python - freeopcua c++客户端和python opcua的组合在getChild()上引发错误

c++ - 如何使用 Softing 工具包从 OPC UA 服务器异步读取操作的回调中从 DataValue 响应中获取 NodeId 详细信息

java - 在虚拟机中从 Linux 启动 Windows 程序。

python - 我如何在 django 中查询当年,当月的对象

c# - 使用 Visual Studio 2017 构建 open62541 DLL