/// <summary> /// Handles a reconnect event complete from the reconnect handler. /// </summary> private void Server_ReconnectComplete(object sender, EventArgs e) { try { // ignore callbacks from discarded objects. if (!Object.ReferenceEquals(sender, m_reconnectHandler)) { return; } lock (m_lock) { m_session = m_reconnectHandler.Session; m_reconnectHandler.Dispose(); m_reconnectHandler = null; foreach (Subscription subscription in m_session.Subscriptions) { m_subscription = subscription; break; } if (m_subscription != null) { foreach (MonitoredItem monitoredItem in m_subscription.MonitoredItems) { Opc.Ua.Server.MonitoredItem localItem = (Opc.Ua.Server.MonitoredItem)monitoredItem.Handle; if (m_monitoredItems.ContainsKey(localItem.Id)) { m_monitoredItems[localItem.Id] = monitoredItem; } else { m_subscription.RemoveItem(monitoredItem); } } m_subscription.ApplyChanges(); } } } catch (Exception exception) { Utils.Trace(exception, "Unexpected error doing reconnect."); } }
private void BeginReconnect() { if (m_subscription != null) { foreach (MonitoredItem monitoredItem in m_subscription.MonitoredItems) { Opc.Ua.Server.MonitoredItem localItem = (Opc.Ua.Server.MonitoredItem)monitoredItem.Handle; localItem.QueueValue(null, StatusCodes.BadDeviceFailure); } } if (m_reconnectHandler == null) { m_reconnectHandler = new SessionReconnectHandler(); m_reconnectHandler.BeginReconnect(m_session, m_reconnectPeriod * 1000, Server_ReconnectComplete); } m_session = null; m_subscription = null; }
/// <summary> /// Handles a datachange notifications. /// </summary> private void MonitoredItem_Notification(Subscription subscription, DataChangeNotification notification, IList <string> stringTable) { if (!Object.ReferenceEquals(subscription, m_subscription)) { return; } lock (m_lock) { for (int ii = 0; ii < notification.MonitoredItems.Count; ii++) { MonitoredItem monitoredItem = m_subscription.FindItemByClientHandle(notification.MonitoredItems[ii].ClientHandle); if (monitoredItem != null) { Opc.Ua.Server.MonitoredItem localItem = (Opc.Ua.Server.MonitoredItem)monitoredItem.Handle; localItem.QueueValue(notification.MonitoredItems[ii].Value, null); } } } }