public QueueValue ( DataValue value, ServiceResult error ) : void | ||
value | DataValue | |
error | ServiceResult | |
return | void |
public void QueueValue(DataValue value, ServiceResult error)
{
lock (m_lock)
{
// check if value has changed.
if (!m_alwaysReportUpdates)
{
if (!Opc.Ua.Server.MonitoredItem.ValueChanged(value, error, m_lastValue, m_lastError, m_filter, m_range))
{
return;
}
}
// make a shallow copy of the value.
if (value != null)
{
DataValue copy = new DataValue();
copy.WrappedValue = value.WrappedValue;
copy.StatusCode = value.StatusCode;
copy.SourceTimestamp = value.SourceTimestamp;
copy.SourcePicoseconds = value.SourcePicoseconds;
copy.ServerTimestamp = value.ServerTimestamp;
copy.ServerPicoseconds = value.ServerPicoseconds;
value = copy;
// ensure the data value matches the error status code.
if (error != null && error.StatusCode.Code != 0)
{
value.StatusCode = error.StatusCode;
}
}
m_lastValue = value;
m_lastError = error;
// queue value.
if (m_queue != null)
{
m_queue.QueueValue(value, error);
}
// flag the item as ready to publish.
m_readyToPublish = true;
m_readyToTrigger = true;
}
}
/// <summary> /// Handles change events raised by the node. /// </summary> /// <param name="context">The system context.</param> /// <param name="state">The node that raised the event.</param> /// <param name="masks">What caused the event to be raised</param> public void OnNodeChange(ISystemContext context, NodeState state, NodeStateChangeMasks masks) { if (m_monitoredItems != null) { for (int ii = 0; ii < m_monitoredItems.Count; ii++) { DataChangeMonitoredItem monitoredItem = m_monitoredItems[ii]; // check if the node has been deleted. if ((masks & NodeStateChangeMasks.Deleted) != 0) { monitoredItem.QueueValue(null, StatusCodes.BadNodeIdUnknown); continue; } if (monitoredItem.AttributeId == Attributes.Value) { if ((masks & NodeStateChangeMasks.Value) != 0) { monitoredItem.ValueChanged(context); } } else { if ((masks & NodeStateChangeMasks.NonValue) != 0) { monitoredItem.ValueChanged(context); } } } } }