Спасибо за чтение этого поста. Я благодарен за любую помощь!
Цель:
Я пытаюсь написать 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();