- Posts: 71
- Thank you received: 10
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
- OPC Alarms&Events
- GetConditionState and AcknowledgeCondition
GetConditionState and AcknowledgeCondition
I could not find anything wrong with the code, in principle.
I assume that, when pressing the button for Acknowledge, the first condition in the list has not yet *again* transitioned into the active state again? Please confirm - because in the opposite case, the exception you are getting would be legitimate.
Here is something that might also be related to the issue:
The active time for acknowledgement must be a precise match in OPC A&E. This spec is, as you known, COM based, and the dates/times are expressed using the Windows FILETIME data type. For use in .NET, the FILETIME gets converted to/from a System.DateTime type. The problem is that the precision of DateTime is slightly less than that of FILETIME. This means that when the alarms's active time makes its way as DateTime to .NET and then back through the Acknowledge method, it may be slightly off - which would cause the OPC server to reject it with the error message you are seeing.
HOWEVER, QuickOPC has a special measurements to prevent this from happening. It observes the event active times, and assures that the conversion roundtrip is precise. So, if things works as designed, the problem is circumvented. We have tested this approach, and I believe that the tests included KepServerEX as well. But o ne never knows... I am writing this to explain that alarm active times are "risky" area.
Do you perhaps have a KepServerEX simulated configuration with which this issue can be reproduced?
Regards
Please Log in or Create an account to join the conversation.
Thank you for our help,
I joint a printscreen of the exception and a zip file of the project.
There a 3 butons,
The first to create client.
The secont to subscrite.
the tird to ascknolege first AE received.
Thank you very mutch a have a nice day.
Please Log in or Create an account to join the conversation.
I think that the use of GetConditionState distracts from the actual problem, and it has issues of its own. First of all, it is not a recommended approach, because there is always a delay between the event time and this call, and the condition may change in between. Second, in your case, it is clear that not only the quality, but also other properties returned by GetConditionState are not valid - including the dates/times. I do not know why that is so, but your input parameters might be wrong. I suspect the FindSourceNodeDescriptor - code is not provided, and it is not clear what is meant to do, because the QualifiedSourceName already contains a usable source ID that can directly be used as node descriptor for the purpose of acknowledgement or getting the condition state.
Let's go back to the case when GetConditionState was not used. I am missing how the code looked like back then. Please send that over.
Best regards
Please Log in or Create an account to join the conversation.
My OPC Server is a KepeWare :
string adressIp = "localhost";
string opcSrv = "Kepware.KEPServerEX_AE.V6"
Q2:
First time, I try to use "e.EventData.ActiveTime". This value generate an exception in _easyAEClient1.AcknowledgeCondition(...).
The second time I try to get ActiveTime by call GetConditionState(). But there are "conditionState.Quality.IsBad == true"
Q3:
I attach a image of visual Studio Watch 1window.
there are some values. :
conditionState.AcknowledgeTime {1/1/1601 12:00:00 AM}
conditionState.AcknowledgeTimeLocal {12/31/1600 7:00:00 PM}
conditionState.Acknowledged true
conditionState.Active false
conditionState.ActiveTime {1/1/1601 12:00:00 AM}
conditionState.ActiveTimeLocal {12/31/1600 7:00:00 PM}
conditionState.Enabled true
conditionState.Quality.IsBad true
Please Log in or Create an account to join the conversation.
before I answer, can you please provide more details?
1. Which OPC server are you connecting to?
2. You mentioned that you use "e.EventData.ActiveTime". But that's in the code snippet you have provided. Please clarify. Is it that "e.EventData.ActiveTime" was the first thing you have tried, and it was giving the same error?
3. Have you inspected/displayed the times from e.EventData.ActiveTime and GetConditionState? Do they look reasonable, or are they, for example, equal to DateTime.MinValue or some other special value?
Thank you
Please Log in or Create an account to join the conversation.
My goal is a send to an Acknowledge to an OPC Server when I receive a notification (A&E).
When I call "_easyAEClient.AcknowledgeCondition", there are this exception:
Exception.InnerException.Message == "The time does not match the latest active time. "
I use the Active time of the class "AEEventData" (e.EventData.ActiveTime)
But, i try to obtain the Active time by call "easyAEClient.GetConditionState()". This method return always a bad data:
conditionState.Quality.IsBad == true
Please, can you help me ?
Best regards
this is my Code:
public void AcknowledgeAlarm(AEEventData e)
{
if (e.AcknowledgeRequired && e.Active)
{
// ok
AENodeDescriptor nodeSrc = FindSourceNodeDescriptor(e.QualifiedSourceName);
//
// e.QualifiedSourceName == "_CustomAlarms.test.Simulation Examples_Functions_Ramp1"
// nodeSrc.NodeId == "_CustomAlarms.test.Simulation Examples_Functions_Ramp1"
//
var conditionState = _easyAEClient1.GetConditionState(_descriptor, nodeSrc, e.ConditionName);
// conditionState:
//
// nconditionState.Quality.IsBad == true
conditionState = _easyAEClient1.GetConditionState(_ip,_opcServer, e.QualifiedSourceName, e.ConditionName);
// conditionState:
//
// conditionState.Quality.IsBad == true
_easyAEClient1.AcknowledgeCondition(_descriptor, nodeSrc, e.ConditionName, e.ActiveTime, e.Cookie);
// Exception:
//
// Exception.InnerException.Message == "The time does not match the latest active time. "
}
Please Log in or Create an account to join the conversation.
- Forum
- Discussions
- QuickOPC-Classic in .NET
- OPC Alarms&Events
- GetConditionState and AcknowledgeCondition