Professional Communication
Software Development Tools

OPC Foundation member and certified logos

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 or issues. You do not have to own a commercial license in order to use the OPC Labs supportOur team is actively monitoring the forums, and provides replies as soon as possible.

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.

When single item's quality is not good, all of the items become null

More
25 Dec 2025 15:11 #14523 by support
Hello.
there is a single OPC call made for reading all the items you specify in ReadMultipleItems. And all results are thus returned at once.

What happens here is that when you include the "problematic" nodes, the OPC server takes much longer to process. Until has it has *all* results, *no* results can be returned to the client. While waiting for the results, QuickOPC times out. It cannot give you any data, because at that moment, that server had not returned any data yet.

This is one of the reasons why in OPC, subscriptions are highly preferred over periodic reads.

You could increase the timeout, or make two ReadMultipleItems calls, one with the "OK" items and then the one with "dangerous" items.

Regards
 

Please Log in or Create an account to join the conversation.

More
24 Dec 2025 16:04 #14522 by sigasec
Thanks for reply.

1. If I remove the problematic nodes from the list (there are currently 2 of them), I get the rest 370 node values in under 100 milliseconds.
2. If I add the problematic nodes back, the first call to _easyDAC.ReadMultipleItems waits exactly the number of milliseconds specified as read timeout:
_easyDAC.InstanceParameters.Timeouts.ReadItem = 15000;
and then throws an exception:
The time alloted for the OPC DA operation has expired. The timeout value was 15000 milliseconds.
So, vtqResults.Succeeded is never true, and ErrorMessageBrief of every item in vtqResults is exactly the same:
The time alloted for the OPC DA operation has expired. The timeout value was 15000 milliseconds.

So when timeout is reached, why the entire results collection is invalidated?
Also, is OPC server reports that specific node's quality is not 192 (Good), why EasyDAC still waits for timeout instead of returning the actual VTQ?

Please Log in or Create an account to join the conversation.

More
18 Dec 2025 07:30 - 18 Dec 2025 07:30 #14505 by support
Hello.

1. What makes you think that the observed data are not simply what the OPC server sends to the client?

2. Is "vtqResults.Succeeded" true or false for the remaining items?

3. If it is true, what is the QUality of those remaining items? If it is false, what is the error associated with them (for start, ErrorMessageBrief)?

Thank you
 
Last edit: 18 Dec 2025 07:30 by support.

Please Log in or Create an account to join the conversation.

More
17 Dec 2025 23:32 #14504 by sigasec
We use QuickOPC 5.83 with .NET 8. Our app is Windows Service that queries local OPC-DA server with 373 node items every 1000 milliseconds. Normally, everything works just fine, but sometimes one of the node's quality differs from 192 (Good), and in this case all the items values become NULL. The code is below:
Code:
var results = new List<double?>(); var serverDescriptor = new ServerDescriptor(Parameters.OPCServerName); var newVal = new List<DAItemDescriptor>(); foreach (var tag in Parameters.OPCTagList) {     newVal.Add(tag); } Stopwatch timer = new Stopwatch(); timer.Start(); _easyDAC.InstanceParameters.Timeouts.ReadItem = 10000; var readParameters = new DAReadParameters(0); // Taking the measurement of the current time even if it has not changed DAVtqResult[] vtqResults = _easyDAC.ReadMultipleItems(serverDescriptor, newVal.ToArray(), readParameters); if (vtqResults.Length > 0) {     validMeasumentExist = true; } timer.Stop(); if (_isDebug_OPC_Read) {     Trace.WriteInfo("Elapsed milliseconds: " + timer.ElapsedMilliseconds.ToString() + ", vtqResults.Length=" + vtqResults.Length, true); } for (int i = 0; i < vtqResults.Length; i++) {     Debug.Assert(vtqResults[i] != null);          if (vtqResults[i].Succeeded)     {         results.Add((vtqResults[i].Vtq.Quality == DAQualities.GoodNonspecific) ? Convert.ToDouble(vtqResults[i].Vtq.Value) : null);      }     else     {         Trace.WriteException(new Exception(vtqResults[i].ErrorMessageBrief));         results.Add(null);     } } return results;

Please Log in or Create an account to join the conversation.

Moderators: supportvaclav.zaloudek
Time to create page: 0.141 seconds