using System; using System.Collections; using Opc.Ua; using Opc.Ua.Client; namespace Siemens.OpcUA { public class Subscription { System.Collections.Generic.List itemsrefresh = new System.Collections.Generic.List();//20150103增加断网恢复 #region Construction public Subscription() { } #endregion #region Fields /// /// Keeps the session. /// private Session m_Session = null; /// /// Keeps the subscription. /// private Opc.Ua.Client.Subscription m_Subscription = null; #endregion #region Properties // Session public Session Session { get { return m_Session; } set { m_Session = value; } } // Subscription public Opc.Ua.Client.Subscription innerSubscription { get { return m_Subscription; } set { m_Subscription = value; } } #endregion #region MonitoredItem /// /// Creates a monitored item and adds it to the existing subscription. /// /// The according nodeid. /// The handle of the client registering items. /// The callback to retrieve value changes. /// The requested sampling rate. /// The handle of the item. public void AddDataMonitoredItem(NodeId variableNodeId, object clientHandle, valueChanged callback, uint samplingRate, out object serverHandle) { serverHandle = null; try { MonitoredItem monitoredItem = new MonitoredItem(m_Subscription.DefaultItem); ClientMonitoredItemData clientData = new ClientMonitoredItemData(); clientData.callback = callback; clientData.clientHandle = clientHandle; // Monitored item settings: monitoredItem.StartNodeId = variableNodeId; monitoredItem.AttributeId = Attributes.Value; monitoredItem.MonitoringMode = MonitoringMode.Reporting;//20151120 monitoredItem.SamplingInterval = (int)samplingRate; // Affects the read cycle between UA Server and data source monitoredItem.QueueSize = 1; monitoredItem.DiscardOldest = true;//20151120 monitoredItem.Handle = clientData; // Add item to subscription. m_Subscription.AddItem(monitoredItem); // Call the server and apply any changes to the state of the subscription or monitored items. m_Subscription.ApplyChanges(); // Check result of add. if (monitoredItem.Status.Error != null && StatusCode.IsBad(monitoredItem.Status.Error.StatusCode)) { throw ServiceResultException.Create( monitoredItem.Status.Error.StatusCode.Code, "Creation of data monitored item failed"); } serverHandle = monitoredItem; if (itemsrefresh.Exists(aa => aa.StartNodeId == variableNodeId) == false) {//20150103增加断网恢复 itemsrefresh.Add(monitoredItem); } } catch (Exception e) { throw e; } } /// /// Modifies a monitored item. /// public void ModifyMonitoredItem(object serverHandle) { try { m_Subscription.ApplyChanges(); } catch (Exception e) { throw e; } } /// /// Removes a monitored item. /// public void RemoveMonitoredItem(object serverHandle) { try { m_Subscription.RemoveItem((MonitoredItem)serverHandle); m_Subscription.ApplyChanges(); } catch (Exception e) { throw e; } } /// /// /// public void RemoveAllMonitoredItems() {//20150103增加断网恢复 if (itemsrefresh.Count > 0) { itemsrefresh.RemoveAll(aa => aa.Handle != null); } } /// /// 通过设置订阅的监控模式,刷新订阅 /// /// public bool RefreshMonitoringMode() {//20150103增加断网恢复 try { if (itemsrefresh.Count > 0) { m_Subscription.SetMonitoringMode(MonitoringMode.Disabled, itemsrefresh); m_Subscription.SetMonitoringMode(MonitoringMode.Reporting, itemsrefresh); } return true; } catch (Exception e) { throw e; } } #endregion } public class ClientMonitoredItemData { public object clientHandle = null; public valueChanged callback = null; } }