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-Classic in .NET
- Browsing, Browse Dialogs and Controls
- faster reads for recursive function
faster reads for recursive function
- The efficiency of the actual implementation. Assuming that the "slowness" does not come from your own processing of browse results, we are left with the OPC server, the connection in between, and the OPC Client part in QuickOPC. If you cannot influence the speed of the OPC Server or the connection to it, we are left with the QuickOPC. I have no indication that our implementation of browsing is significantly slower than that of other OPC clients, or ineffective in a particular way. If you have an information to the contrary, let me know, otherwise I think there is no room for improvement either.
- The general approach taken. There you must evaluate whether you actually do need to browse through the whole thing. But, if the answer is yes, then going from branch to branch and getting a list of sub-nodes is the only way to go: That's given by the design of OPC specs, not by our own decision in the client implementation.
As a side note, this kind of things (globally disabling/enabling alarms) is better handled with OPC specs designed with such requirements in mind. For example, in OPC Alarms&Events, all alarms residing in a hierarchical "area" can be enabled/disabled with a single call and with just identifying the area, without even having to know the individual alarms affected.
A cleverly designed system can achieve similar effect with OPC Data Access as well, but only with an OPC server that is already developed with the requirements in mind. There can be, for example, OPC Data Access tags that enable/disable the whole structure at alarms at will.
BTW. I understand that "hours" do not sound good as a time to start up a system. Can you provide some concrete information? Have you measured the actual speed? How many tags are you able to browse in what time?
Also, even if it were hours, why isn't is possible to go through this step once, store an information e.g. in a file, and cache it for long time? OPC is designed in such a way that while the address space CAN generally change, it is assumed to be generally stable for long periods of time.
Please Log in or Create an account to join the conversation.
- OndrejBlazek
- Offline
- Premium Member
- Posts: 10
- Thank you received: 0
support wrote: There isn't much that can be don to speed up the browse operations, maybe except that if that information is stable, you can gather the structure of the address space just once or on demand or infrequenrly, and store it, so that the browsing does not have to be repeated over and over.
I am writing an application with similar requirements. It is a module to disable/enable OPC tags to provide a SCADA inhibit function (e.g. when a faulty device is causing an alarm to constantly toggle, the inhibit module disables the corresponding OPC tag until the device is fixed). Since I want to be able to disable/enable alarms using wild cards, I need to get the complete AddressSpace, store it and then make queries against the stored AddressSpace (to eliminate the need to browse each time). However, the problem is getting that initial AddressSpace copy. I need something that can get the complete AddressSpace in a matter of seconds or minutes as opposed to hours.
Any suggestions on how to get the initial AddressSpace copy as fast as possible? I am currently using the recursive browse example with the leaf tag read functionality removed (i.e. just storing the tag name but not actually reading the tag). Even just that looks like it will take hours to complete.
Please Log in or Create an account to join the conversation.
The other part that affects the performance is the reading. Reading OPC items one by one is quite unefficient. Assuming that the branches contain (on average) significantly more than one item, you can gain speed by reading all items in each branch using the ReadMultipleItems or ReadMultipleItemValues method.
I will answer the part about Properties in the separate topic you have started.
Please Log in or Create an account to join the conversation.
I have an application that has to parse through the nodes, leaves and branches of an OPC server and put all tag names into a database table. some of these servers are gigantic and I was wondering if you could look at the code which was created utilizing your example and tell me if there is a way to get this to run faster. it takes forever to browse through and opc server with say 30,000 tags this takes over 5 hours.
private OpcLabs.EasyOpc.DataAccess.EasyDAClient easyDAClient1 = new OpcLabs.EasyOpc.DataAccess.EasyDAClient();
private void Get_OPCTagsNames(string parentItemID) { var nodeFilter = new DANodeFilter();
EasyDAClient.ClientParameters.TurnOffActivationSecurity = true;
OpcLabs.EasyOpc.DataAccess.DANodeElementCollection allNodes1 = easyDAClient1.BrowseNodes(IP, serverName, parentItemID, nodeFilter);
foreach (DANodeElement nodeElement in allNodes1) { if (nodeElement.IsLeaf) { string display; try { object value = client.ReadItemValue(IP, serverName, nodeElement.ItemId); display = String.Format("", value); } catch (OpcException ex) { display = String.Format("** {0} **", ex.GetBaseException().Message); } OPCTags.Add(nodeElement.ItemId + display); } else { if (nodeElement.IsBranch) Get_OPCTagsNames(nodeElement.ItemId);
}
}
}
Please Log in or Create an account to join the conversation.
Please Log in or Create an account to join the conversation.
Best regards
Please Log in or Create an account to join the conversation.
Please Log in or Create an account to join the conversation.
- Forum
- Discussions
- QuickOPC-Classic in .NET
- Browsing, Browse Dialogs and Controls
- faster reads for recursive function