You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
5.4 KiB
169 lines
5.4 KiB
using System;
|
|
using System.Collections;
|
|
|
|
using Opc.Ua;
|
|
using Opc.Ua.Client;
|
|
|
|
namespace Siemens.OpcUA
|
|
{
|
|
public class Subscription
|
|
{
|
|
System.Collections.Generic.List<MonitoredItem> itemsrefresh = new System.Collections.Generic.List<MonitoredItem>();//20150103Ôö¼Ó¶ÏÍø»Ö¸´
|
|
#region Construction
|
|
public Subscription()
|
|
{ }
|
|
#endregion
|
|
|
|
#region Fields
|
|
/// <summary>
|
|
/// Keeps the session.
|
|
/// </summary>
|
|
private Session m_Session = null;
|
|
/// <summary>
|
|
/// Keeps the subscription.
|
|
/// </summary>
|
|
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
|
|
/// <summary>
|
|
/// Creates a monitored item and adds it to the existing subscription.
|
|
/// </summary>
|
|
/// <param name="variableNodeId">The according nodeid.</param>
|
|
/// <param name="clientHandle">The handle of the client registering items.</param>
|
|
/// <param name="callback">The callback to retrieve value changes.</param>
|
|
/// <param name="samplingRate">The requested sampling rate.</param>
|
|
/// <param name="serverHandle">The handle of the item.</param>
|
|
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;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Modifies a monitored item.
|
|
/// </summary>
|
|
public void ModifyMonitoredItem(object serverHandle)
|
|
{
|
|
try
|
|
{
|
|
m_Subscription.ApplyChanges();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Removes a monitored item.
|
|
/// </summary>
|
|
public void RemoveMonitoredItem(object serverHandle)
|
|
{
|
|
try
|
|
{
|
|
m_Subscription.RemoveItem((MonitoredItem)serverHandle);
|
|
m_Subscription.ApplyChanges();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw e;
|
|
}
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public void RemoveAllMonitoredItems()
|
|
{//20150103Ôö¼Ó¶ÏÍø»Ö¸´
|
|
if (itemsrefresh.Count > 0)
|
|
{
|
|
itemsrefresh.RemoveAll(aa => aa.Handle != null);
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// ͨ¹ýÉèÖö©ÔÄµÄ¼à¿ØÄ£Ê½£¬Ë¢Ð¶©ÔÄ
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
}
|