2:25, EET
January 20, 2024
Hello,
Is there a way to get the NodeId from a path to the node? In their C# client Traegar will let you get to the node with something like “ns=2;s=WI_OPC/Database.FreeSpace” and I’m hoping for something similar. If I browse to the previous example in your ProsysOPCUAClient, it shows up as:
Root > Objects > WI_OPC
Nodes
——————————————————————————
Database.FreeSpace
I know I can get to it by calling
NodeId rootNodeId = Identifiers.RootFolder;
List references = client.getAddressSpace().browse(rootNodeId);
List references2 = client.getAddressSpace().browse(references.get(0).getNodeId()); // Objects
List references3 = client.getAddressSpace().browse(references2.get(1).getNodeId()); // WI_OPC
NodeId freeSpaceNodeId = references3.get(222).getReferenceTypeId(); // Database.FreeSpace
UaNode node = client.getAddressSpace().getNode(freeSpaceNodeId);
but that seems awfully clumsy, so I assume I’m missing the correct way to do it.
Bill
9:11, EET
Moderators
February 11, 2020
Hello,
In general, there is no way to get a NodeId from a “String path” to the Node. Some Nodes in some OPC UA Servers might use this type of convention for their NodeIds, but the NodeIds could be just numbers or GUID so you can’t assume this type of logic would always work.
However, there is TranslateBrowsePathsToNodeIds Service(see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.4). Various overloads of translateBrowsePathsToNodeIds are available in the com.prosysopc.ua.client.AddressSpace class that can be accessed by calling the getAddressSpace method of UaClient instance. These methods require you to know the BrowsePath to the Node, but if you do know these, then you could use these methods to get the NodeIds. And do note that these Methods can return multiple NodeIds if there are multiple Nodes that match the BrowsePath.
But, it seems to me that you already know that the NodeId is “ns=2;s=WI_OPC/Database.FreeSpace”. Thus, you can just use
NodeId freeSpaceNodeId = new NodeId(2, “WI_OPC/Database.FreeSpace”);
or
NodeId freeSpaceNodeId = NodeId.parse(“ns=2;s=WI_OPC/Database.FreeSpace”);
to generate the NodeId and then call
UaNode node = client.getAddressSpace().getNode(freeSpaceNodeId);
to get the Node. If you already know the NodeId, there is no need to get it by browsing the AddressSpace starting from the root. Or am I missing something?
Most Users Ever Online: 1919
Currently Online:
59 Guest(s)
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Heikki Tahvanainen: 402
hbrackel: 144
rocket science: 88
pramanj: 86
Francesco Zambon: 83
Ibrahim: 78
Sabari: 62
kapsl: 57
gjevremovic: 49
Xavier: 43
Member Stats:
Guest Posters: 0
Members: 737
Moderators: 7
Admins: 1
Forum Stats:
Groups: 3
Forums: 15
Topics: 1524
Posts: 6450
Newest Members:
fannielima, kristiewinkle8, rust, christamcdowall, redaahern07571, nigelbdhmp, travistimmons, AnnelCib, dalenegettinger, howardkennerleyModerators: Jouni Aro: 1026, Pyry: 1, Petri: 0, Bjarne Boström: 1026, Jimmy Ni: 26, Matti Siponen: 346, Lusetti: 0
Administrators: admin: 1