16:12, EEST
June 21, 2021
9:20, EEST
Moderators
February 11, 2020
Hello,
First of all, OPC UA doesn’t have a strict parent-child hierarchy for Nodes. While you could say that a Node that targets another Node with a forward (non-inverse) Reference is the parent of the targeted Node, there could be other Nodes that also target the same Node making it possible for a Node to have multiple parents. And since there are multiple ReferenceTypes, the hierarchy of Nodes could look completely different for two different ReferenceTypes depending on the semantics of the used ReferenceTypes.
OPC UA Information Models use ParentNodeIds to express parent-child relationships between Nodes. However, the specification states (in https://reference.opcfoundation.org/Core/docs/Part6/F.7/) that “this information does not appear in the AddressSpace and is intended for use by design tools”, which is why there is no method that could be used to get this NodeId.
You could use UaNode.getReferences(NodeId referenceTypeId, boolean isInverse) where you specify a ReferenceType, e.g. HasComponent, with its NodeId, or use null for all ReferenceTypes, and set isInverse to true to get inverse References. Note, that the Prosys OPC UA SDK for Java handles all References internally as non-inverse References, which means that the UaNode that called the method is the target Node of the returned UaReferences! You could consider the source Nodes of the returned UaReferences as the parents of the UaNode.
14:44, EEST
June 21, 2021
18:44, EEST
November 6, 2019
I am trying to do a similar thing (find the parent nodes of a given node). I have tried this:
UaNode node = uaClient.getAddressSpace().getNode(nodeId);
UaReference[] parentReferences = node.getReferences(Identifiers.HasComponent, true);
However, the UaReference array is always empty, and I know the node has a parent.
I also tried this (as mentioned in https://forum.prosysopc.com/forum/opc-ua-java-sdk/get-browse-path-by-nodeid/):
UaReference[] parentReferences = node.getReferences(Identifiers.HierarchicalReferences, true);
But the same, the array is empty.
10:33, EEST
April 3, 2012
Hi,
Please define what you mean by “parent node”. See Matti’s answer above. The closest OPC UA ReferenceTypes that would model these are Identifiers.HasChild or Identifiers.Aggregates, but note that once you reach a “top-lvl-node”, that wont have a “parent”. It should have inverse hierarchical references though, such as Organizes.
Can you verify the ReferenceType between “this node” and the “parent node” via https://www.prosysopc.com/products/opc-ua-browser/?
If you use Identifiers.HierarchicalReferences, then it should get all hierarchical references (to that direction), which covers all of the abovementioned referecetypes as it also finds subtypes.
P.S.
Technically the client-side SDK only shows data it has received from the server. See near the end of https://reference.opcfoundation.org/Core/Part3/v104/docs/5.3.2 “Although not required, it is recommended that all hierarchical References be instantiated as bidirectional to ensure browse connectivity.”, thus technically it is possible (but not recommended) that e.g. a server would only provide the reference when browsing from the “parent node”.
If the server was made with our SDK, then it has bidirectional references. If not (and I guess anyway), https://www.prosysopc.com/blog/opc-ua-wireshark/ could be used to validate what the server does send. Or you could do a client.getAddressSpace().browse as well (note that some convenience methods do not take a BrowseDirection and the default is BrowseDirection.Forward unless set via setBrowseDirection(..)). In case you wonder, SDK itself (at least in anything modern versions) doesn’t use that convenience method when it Browses for .getNode (thus the default BrowseDirection should have no effect on that).
12:38, EEST
November 6, 2019
Thanks for your reply.
The OPC server type we are most likely to connect to is Kepware, but it could be any other type too.
In my application I am dealing only with FolderType nodes which may have one or more Folder or Variable types as child components.
I’m using the Prosys OPC UA Browser app as a tool whilst working on this.
In the Reference section the Folders have:
HasTypeDefinition: FolderType
Organizes (x N): Other sub-folders
HasComponent (x N): Variables in this particular folder
In the Reference section the Variables have:
HasTypeDefinition: BaseVariableType
All of the references above are in the Forward direction. If I change the Browser direction to ‘Inverse’ then I get ‘No content in table’ for the both Folders and Variables alike.
The aim of the module I’m writing is that if I am passed a NodeId, to be able to construct the ‘Folder browse path’ to it. I understand that a Node might have several ‘parents’, but in this application it will be 99/100 that there will only be one ‘parent’ reference. If there is more than one then I will simply indicate that.
It looks like the Kepware server does not supply the Inverse references hence explaining why the array is empty – is my understanding correct? Does that mean that with this particular OPC server (Kepware), it is not possible to browse in the Inverse direction? If that is the case is there any way to implement what I am trying to achieve?
Thanks
13:28, EEST
April 3, 2012
Just to be sure, can you also check with https://www.unified-automation.com/products/development-tools/uaexpert.html just to rule out it wouldn’t be something specific to our SDK. If that doesn’t either show them, then it is very likely that the server doesn’t support inverse references here. In that case I’m afraid there aren’t any good options. Most likely the best option would be to contact the server manufacturer and hope they can add them. I guess you can also technically Browse from a known node in the forward direction and try to find the the node this way. But, if you must start e.g. from the ‘Objects’ folder then it can be a pain.
Also, I must note that that kind of an address space is very basic. Thus do not expect every OPC UA Server out there be like that.
P.S.
It is also technically an error if the server HasTypeDefinition points to BaseVariableType, that is an abstract type (https://reference.opcfoundation.org/Core/Part5/v105/docs/7.2). Instead the most basic one is BaseDataVariableType (https://reference.opcfoundation.org/Core/Part5/v105/docs/7.4).
14:52, EEST
November 6, 2019
Thanks for the suggestions, it is all making more sense now.
I checked with the UA Expert browser, and it is the same, so it looks like Inverse references are not supported/provided by the Kepware server I am testing on.
My application has to support a variety of OPC server types, so we cannot rely on special configurations, and as you say the requirement for Inverse references seems to be optional anyway, and therefore cannot be relied on.
I think maybe the only way to acheive this would be some kind of browse tree generator that runs in the background and caches the paths to the nodes. As it does not appear to be a trivial task and is ‘expensive’, it may be that we decide not to try to implement it anyway, as it was more of a ‘nice to have’ feature rather than a necessity.
Most Users Ever Online: 1919
Currently Online:
37 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: 726
Moderators: 7
Admins: 1
Forum Stats:
Groups: 3
Forums: 15
Topics: 1529
Posts: 6471
Newest Members:
gabriellabachus, Deakin, KTP25Zof, Wojciech Kubala, efrennowell431, wilfredostuart, caitlynfajardo, jeromechubb7, franciscagrimwad, adult_galleryModerators: Jouni Aro: 1026, Pyry: 1, Petri: 0, Bjarne Boström: 1032, Jimmy Ni: 26, Matti Siponen: 349, Lusetti: 0
Administrators: admin: 1