如何(仅)使用 Eclipse Milo OpcUa 服务器更新 OPC UA 节点的时间戳?
How do I (only) update the timestamp of an OPC UA Node using an Eclipse Milo OpcUa Server?
感谢阅读本文post。我很感激你的帮助!
目标:
我正在尝试在 Eclipse Milo OpcUa 服务器上编写具有相同值但时间戳不同的 ValueNode。我正在用 Java 11 和 Milo 0.3.7.
做这一切
我用 github 项目中的示例对其进行了测试。我修改了 class 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
,其中包括对值或质量的更改,但不包括时间戳,因此大多数客户端不会请求或接收仅时间戳的更改默认情况下。
感谢阅读本文post。我很感激你的帮助!
目标:
我正在尝试在 Eclipse Milo OpcUa 服务器上编写具有相同值但时间戳不同的 ValueNode。我正在用 Java 11 和 Milo 0.3.7.
做这一切我用 github 项目中的示例对其进行了测试。我修改了 class 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
,其中包括对值或质量的更改,但不包括时间戳,因此大多数客户端不会请求或接收仅时间戳的更改默认情况下。