[英]How do I (only) update the timestamp of an OPC UA Node using an Eclipse Milo OpcUa Server?
[英]How do i access Node Instances which were built by the NodeFactory on the Server Side in Eclipse Milo?
關於服務器端的實現:哪種是訪問(和修改)由NodeFactory生成的特定節點實例的最佳方法? 例如,在NameSpaceExample中,有一個自定義對象類型MyObjectType,其組件為“ foo”和“ bar”。
// Define a new ObjectType called "MyObjectType".
UaObjectTypeNode objectTypeNode = UaObjectTypeNode.builder(server.getNodeMap())
.setNodeId(new NodeId(namespaceIndex, "ObjectTypes/MyObjectType"))
.setBrowseName(new QualifiedName(namespaceIndex, "MyObjectType"))
.setDisplayName(LocalizedText.english("MyObjectType"))
.setIsAbstract(false)
.build();
// "Foo" and "Bar" are members. These nodes are what are called "instance declarations" by the spec.
UaVariableNode foo = UaVariableNode.builder(server.getNodeMap())
.setNodeId(new NodeId(namespaceIndex, "ObjectTypes/MyObjectType.Foo"))
.setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
.setBrowseName(new QualifiedName(namespaceIndex, "Foo"))
.setDisplayName(LocalizedText.english("Foo"))
.setDataType(Identifiers.Int16)
.setTypeDefinition(Identifiers.BaseDataVariableType)
.build();
foo.setValue(new DataValue(new Variant(0)));
objectTypeNode.addComponent(foo);
UaVariableNode bar = UaVariableNode.builder(server.getNodeMap())
.setNodeId(new NodeId(namespaceIndex, "ObjectTypes/MyObjectType.Bar"))
.setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
.setBrowseName(new QualifiedName(namespaceIndex, "Bar"))
.setDisplayName(LocalizedText.english("Bar"))
.setDataType(Identifiers.String)
.setTypeDefinition(Identifiers.BaseDataVariableType)
.build();
bar.setValue(new DataValue(new Variant("bar")));
bar.addReference(new Reference(bar.getNodeId(), Identifiers.HasModellingRule, Identifiers.ModellingRule_MandatoryPlaceholder.expanded(), NodeClass.ObjectType, true));
objectTypeNode.addComponent(bar);
// Tell the ObjectTypeManager about our new type.
// This let's us use NodeFactory to instantiate instances of the type.
server.getObjectTypeManager().registerObjectType(
objectTypeNode.getNodeId(),
UaObjectNode.class,
UaObjectNode::new
);
// Add our ObjectTypeNode as a subtype of BaseObjectType.
server.getUaNamespace().addReference(
Identifiers.BaseObjectType,
Identifiers.HasSubtype,
true,
objectTypeNode.getNodeId().expanded(),
NodeClass.ObjectType
);
// Add the inverse SubtypeOf relationship.
objectTypeNode.addReference(new Reference(
objectTypeNode.getNodeId(),
Identifiers.HasSubtype,
Identifiers.BaseObjectType.expanded(),
NodeClass.ObjectType,
false
));
// Add it into the address space.
server.getNodeMap().addNode(objectTypeNode);
// Use NodeFactory to create instance of MyObjectType called "MyObject".
// NodeFactory takes care of recursively instantiating MyObject member nodes
// as well as adding all nodes to the address space.
UaObjectNode myObject = nodeFactory.createObject(
new NodeId(namespaceIndex, "HelloWorld/MyObject"),
new QualifiedName(namespaceIndex, "MyObject"),
LocalizedText.english("MyObject"),
objectTypeNode.getNodeId()
);
// Add forward and inverse references from the root folder.
rootFolder.addOrganizes(myObject);
myObject.addReference(new Reference(
myObject.getNodeId(),
Identifiers.Organizes,
rootFolder.getNodeId().expanded(),
rootFolder.getNodeClass(),
false
));
使用節點工廠,將創建MyObjectType的實例MyObject,該實例具有(由於類型定義)組件“ foo”和“ bar”。 哪種是最好的訪問方式? 在客戶端,它會像
VariableNode node = client.getAddressSpace().createVariableNode(new NodeId(namespaceIndex, "HelloWorld/MyObject"));
我知道可以獲取MyObject的引用並遵循它們,但是必須有更好的方法。
任何輸入,不勝感激!
您現在必須通過瀏覽引用或推斷NodeId來獲取它們。
新的NodeFactory工作已經完成,並在PR中等待0.3分支,因此希望在您可以使用NodeFactory實現之前不會太久。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.