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;
}
}