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
- Reading, Writing, Subscriptions, Property Access
- Window Service and OPC Subscription
Window Service and OPC Subscription
Regards
Please Log in or Create an account to join the conversation.
Since I already said, those objects are used by another applications which we are also developing and already installing in some production machines.
Those same objects are being used by this service to monitor some others variables collected by the PLC, so changing the version of OPC right is complicated.
The objects mentioned worked without any problem in the Application, but I am having problems to get the events in the service.
Regards
Please Log in or Create an account to join the conversation.
Note that the newer version do not have the "MultipleItemsChanged" event; there is just an "ItemChanged" event, delivering each change separately. So you will not have to loop over the array. This event has been removed because it was left-over from earlier COM interfaces/versions, but was actually no longer bringing any performance benefit, for which it was originally introduced.
Also, just to be absolutely sure, have you checked that by some kind of simple bug, it's not the line below that is throwing away all the notifications when run on the test machine?
if (DesignHelpers.IsDesignTime) return;
Regards
Please Log in or Create an account to join the conversation.
We had a problem with this version some months ago, you recommend me to move to a newer version, which implies to Update our version of Visual Studio, since we have VS10, and it does not support newer .NET Framework, at the moment we are working with .NET Framework 4,
We were planning to get a newer version of VS, but we need to check which are the changes in the application that we have to do.
www.opclabs.com/forum/browsing/1437-opcbrowsedialog-bug
Please Log in or Create an account to join the conversation.
Regards
Please Log in or Create an account to join the conversation.
Please Log in or Create an account to join the conversation.
In the event I launch, I save the status of my alarms in a database, I got the status from the first read in the database, but the events which come afterwards I just dont get any data.
private static void SubscribeItems()
{
DateTime now = DateTime.Now;
ExceptionHandler.LogException(new Exception("Start Subscribe Alarms OPC " + DateTime.Now.ToString()));
List<DAReadItemArguments> ListReadItemsArguments = new List<DAReadItemArguments>();
//subscribe all the alarms to the OPC server
foreach (Alarm AlarmItem in ListOfAlarms)
{
ListReadItemsArguments.Add(new DAReadItemArguments(AlarmItem.OPCDescriptor.MachineName,
AlarmItem.OPCDescriptor.ServerName,
AlarmItem.OPCDescriptor.OPCItem, 0));
}
DAVtqResult[] _DAVtq;
_DAVtq = new DAVtqResult[ListReadItemsArguments.Count];
_DAVtq = OPCClient.ReadMultipleItems(ListReadItemsArguments.ToArray());
//This Read works correctly /////////////////////
ExceptionHandler.LogException(new Exception("Read Alarms OPC " + (DateTime.Now - now).ToString()));
int i = 0;
foreach (Alarm AlarmItem in ListOfAlarms)
{
if (_DAVtq[i] != null && _DAVtq[i].Succeeded && _DAVtq[i].Vtq != null)
{
if (_DAVtq[i].Vtq.Value != null)
{
AlarmItem.State = (Alarm.AlarmState)(Convert.ToInt16(_DAVtq[i].Vtq.Value));
}
else
{
AlarmItem.State = Alarm.AlarmState.Inactive;
}
}
i++;
}
ExceptionHandler.LogException(new Exception("fire Alarms OPC event 1st time " + (DateTime.Now - now).ToString()));
// raise the AlarmEvent:
OnGlobalAlarmsEvent(null, new AlarmSignalEventArgs(ListOfAlarms));
OPCClient.UnsubscribeAllItems();
ExceptionHandler.LogException(new Exception("Subscribe OPC Alarms " + (DateTime.Now - now).ToString()));
//subscribe all the alarms to the OPC server
foreach (Alarm AlarmItem in ListOfAlarms)
{
int SubscriptionID = OPCClient.SubscribeItem(AlarmItem.OPCDescriptor.MachineName, AlarmItem.OPCDescriptor.ServerName, AlarmItem.OPCDescriptor.OPCItem, 50, null);
//copy the subscription ID, to know later which alarm fired the OPC event
AlarmItem.OPCDescriptor.SubscriptionID = SubscriptionID;
}
OPCClient.MultipleItemsChanged += new EventHandler<EasyDAMultipleItemsChangedEventArgs>(OPCClient_MultipleItemsChanged);
ExceptionHandler.LogException(new Exception("END OPC Alarms " + ( DateTime.Now - now ).ToString()));
}
}
/// <summary>
/// Handles the event that occurs if at least one OPC Alarm variable changed its state (from true to false or vice versa)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void OPCClient_MultipleItemsChanged(object sender, EasyDAMultipleItemsChangedEventArgs e)
{
if (DesignHelpers.IsDesignTime) return;
lock (ListOfAlarms)
{
foreach (Alarm AlarmItem in ListOfAlarms)
{
//bool changed = false;
//Search for all the arguments given in the opc event, which are actives and look for the alarm that fired that event
foreach (EasyDAItemChangedEventArgs TempEventArg in e.ArgsArray)
{
// if the Subscription ID was found, and the Argument is value then set the status of the alarm
if ((AlarmItem.OPCDescriptor.SubscriptionID == TempEventArg.Handle) && (TempEventArg.Vtq != null))
{
Alarm.AlarmState TempValue = (Alarm.AlarmState)(Convert.ToInt16(TempEventArg.Vtq.Value));
}
}
}
}
// raise the AlarmEvent:
OnGlobalAlarmsEvent(null, new AlarmSignalEventArgs(ListOfAlarms));
////////This event is not fired
}
Best Regards.
Please Log in or Create an account to join the conversation.
Can you post a code of your event handler code here, or at least its "skeleton" where the logic can be seen?
What I want to verify is whether the error checking is done right.
You are supposed to get SOME event notification even in case of problems/failures. In case of configuration issues (and thus also security-related errors), you should still get an event which carries the necessary error information. So I find it the described behavior unusual.
Thank you
Please Log in or Create an account to join the conversation.
I am developing a new Windows service to monitor some OPC variables periodically. The service seems to work correctly in the computer where I am developing, It reads the OPC items at the start, and later on, it makes a subscription to those items to check any status change of those same items. So far everything seems ok, but at the moment when I install the service in my test environment, the service does not work as desired, It performs the initial read, which is performed by OPCClient.ReadMultipleItems(ListReadItemsArguments.ToArray());
but the events from the OPC are not fired, I have logged every time when the event is fired, In the development machine it works ok, but in the test machine it does not log anything.
I think it should be a problem with the settings between the user used in developing computer and the user used in the test computer, but even installing the service and logging with the administration account, does I have the same problem
Do you have any recommendation that I should follow...
Thanks in advance
Luis Garcia.
Please Log in or Create an account to join the conversation.
- Forum
- Discussions
- QuickOPC-Classic in .NET
- Reading, Writing, Subscriptions, Property Access
- Window Service and OPC Subscription