Online Forums
Technical support is provided through Support Forums below. Anybody can view them; you need to Register/Login to our site (see links in upper right corner) in order to Post questions. You do not have to be a licensed user of our product.
Please read Rules for forum posts before reporting your issue or asking a question. OPC Labs team is actively monitoring the forums, and replies as soon as possible. Various technical information can also be found in our Knowledge Base. For your convenience, we have also assembled a Frequently Asked Questions page.
Do not use the Contact page for technical issues.
- Forum
- Discussions
- QuickOPC-UA in COM
- Discovery, Browsing, Browse Dialogs and Controls
- Browse Nodes OPC-UA in Delphi
Browse Nodes OPC-UA in Delphi
I will check whether that's compliant with the OPC spec.
Regards
Please Log in or Create an account to join the conversation.
But now, I have an issue with another UA server. It is a Simatic Panel TP700 Comfort with an integrated OPC UA server. I attached a file with the exception description that your browse dialog provided. Where is the problem? With the tool "UaExpert" I can access and browse the server with no issues.
Please Log in or Create an account to join the conversation.
I will provide example code if that proves necessary, but I do not think that is the case so far, because it is quite easy actually.
If you have a string form of the NodeId, just set it into the ExpandedText property of the UANodeId object. It will automatically parse it, and all other properties will change their values according to it.
If, however, you just want to use the Node ID returned from one browsing as the parent for new browsing, you do not even have to deal with the internals of the UANodeId. Simply take the whole NodeId reference returned to you from the browsing, and use it as a whole.
You are right that there is no custom/user filtering currently in our dialogs. This is on a list of possible future enhancements.
On the other hand, we do have a MultiSelect capability, if that's what you were also looking for. With that, the user can keep browsing through the tree, and keep "stacking" the chosen nodes, and then confirm the dialog when he is done. I am not sure if you were aware of the feature.
Best regards
Please Log in or Create an account to join the conversation.
With your dialog, filtering is not possible (I think). I implemented a wrapper for using OPC-UA variables with our existing general classes for I/Os. The only thing needed to instantiate an I/O with this class would be the nodeID. Copying all the single IDs for this purpose is not very nice when you have a lot of I/Os in a machine, so I want to implement my own browser wth some filtering and export functions to get the whole list of nodes and IDs needed. And of course, I can learn to understand the structure of OPC-UA a bit better by doing this
When my colleagues later use my I/O wrapper in a software, it would be easier for them to get just the data they need in clear and easy way, to create the I/Os needed. Not everybody can go into detail with OPC-UA and I spent quite a lot of time to get into it.
Please Log in or Create an account to join the conversation.
I addition (but it is not necessary), I recommend that you also use the browsePath from the returned element, and use it for the parent as well. This way 1) The browse path returned will actually "grow" from the original starting point (Objects, in your case), instead of starting over again at the parent node, and 2) if the user in the end selects something, and you persist both the node Id and the browse path, and want to start the browsing again at the same point, you will have the information needed for that (in the browse path; the NodeId won't tell you "how" to get there from the Objects).
All namespaces are already filled in in the browse path returned from the BrowseXXXX methods, therefore you do not need to deal with them in any way for passing it over to further calls.
May I ask you why are you re-implementing the browsing dialog yourself? Is there something specific missing in our component, or do you plan to have it very different from ours in the end? Can you elaborate on that? - we are always interested in the use cases from the real world.
Best regards
Please Log in or Create an account to join the conversation.
This is what my server looks like in your tool (I hope the attachments work):
I want to browse through the structure but I need some hint for getting there. What I have so far is the following (starting with the objects folder):
Can I browse using the nodeId of the current parent node? Do I need the DefaultNamespaceUriString when I have the nodeId like shown in my example?
Best regards
Please Log in or Create an account to join the conversation.
To achieve that, create a new NodeDescriptor (you have that already), and then do something like this (I have not tested it, but it should work; if not, let me know):
NodeDescriptor.NodeId.StandardName := 'Server';
2. In case you wanted to start at a specific place in the server: In our example we specify that place using a browse path from the 'Objects' folder, and for that we parse the browse path, and yes, in this case the DefaultNamespaceUriString is server-specific. We could have also used some "direct" NodeId (server-specific).
There are "standard" nodes in UA servers - for those you can use the approach in 1) above. For anything server-specific, you are on your own. Either you somehow "know" the NodeIds or browse paths (e.g. from the server documentation), or you obtain them by earlier browsing.
3. For browsing for data, you usually start with the 'Objects' folder. But there are other starting places as well (such as for object types, reference types etc.). Understanding of OPC UA spec is needed here to decide what you need - it is a large spec and I cannot explain that in couple of sentences here.
Best regards
Please Log in or Create an account to join the conversation.
I'm evaluating the test version of QuickOPC 5.4 at the moment. Reading and writing values to a OPC-UA Server is pretty easy, as long as you find out the nodeIDs with your example dialogs. But I tried to implement my own browsing dialog in Delphi, but I'm facing some problems which I don't know how to handle.
Actually I couldn't figure out, what to pass to the EasyUAClient.BrowseNodes Method for parameter nodeDescriptor. In the reference, UAObjectIDs.Server is passed for start browsing from root, but I didn't find any Delphi equivalent.
I tried to modify this example for my needs:
EndpointDescriptor := CoUAEndpointDescriptor.Create;
EndpointDescriptor.UrlString := 'http://opcua.demo-this.com:51211/UA/SampleServer'; // I replaced this with my server URL
NodeDescriptor := CoUANodeDescriptor.Create;
BrowsePathParser := CoUABrowsePathParser.Create;
BrowsePathParser.DefaultNamespaceUriString := 'http://test.org/UA/Data/'; // What do I need here? Server specific?
NodeDescriptor.BrowsePath := BrowsePathParser.Parse('[ObjectsFolder]/Data/Static/UserScalar'); // What do I need to start at the objectsfolder or server root?
BrowseParameters := CoUABrowseParameters.Create;
// Instantiate the client object
Client := TEasyUAClient.Create(nil);
NodeElements := Client.BrowseNodes(
EndpointDescriptor,
NodeDescriptor,
BrowseParameters);
I would really appreciate some sample code for this.
Best regards
Please Log in or Create an account to join the conversation.
- Forum
- Discussions
- QuickOPC-UA in COM
- Discovery, Browsing, Browse Dialogs and Controls
- Browse Nodes OPC-UA in Delphi