/// <summary> /// Reads the initial value for a monitored item. /// </summary> /// <param name="context">The context.</param> /// <param name="handle">The item handle.</param> /// <param name="monitoredItem">The monitored item.</param> protected virtual void ReadInitialValue( ServerSystemContext context, NodeHandle handle, MonitoredItem monitoredItem) { DataValue initialValue = new DataValue(); initialValue.Value = null; initialValue.ServerTimestamp = DateTime.UtcNow; initialValue.SourceTimestamp = DateTime.MinValue; initialValue.StatusCode = StatusCodes.BadWaitingForInitialData; ServiceResult error = handle.Node.ReadAttribute( context, monitoredItem.AttributeId, monitoredItem.IndexRange, monitoredItem.DataEncoding, initialValue); monitoredItem.QueueValue(initialValue, error); }
/// <summary> /// Reads the value of an attribute and reports it to the MonitoredItem. /// </summary> public void QueueValue( ISystemContext context, NodeState node, MonitoredItem monitoredItem) { DataValue value = new DataValue(); value.Value = null; value.ServerTimestamp = DateTime.UtcNow; value.SourceTimestamp = DateTime.MinValue; value.StatusCode = StatusCodes.Good; ServiceResult error = node.ReadAttribute( context, monitoredItem.AttributeId, monitoredItem.IndexRange, monitoredItem.DataEncoding, value); if (ServiceResult.IsBad(error)) { value = null; } monitoredItem.QueueValue(value, error); }
/// <summary> /// Queues the value to the monitored item. /// </summary> /// <param name="context">The context.</param> /// <param name="request">The request.</param> /// <param name="monitoredItem">The monitored item.</param> public void QueueValue(ServerSystemContext context, ReadRequest request, MonitoredItem monitoredItem) { NodeHandle handle = monitoredItem.ManagerHandle as NodeHandle; if (handle == null) { return; } ReadValueId nodeToRead = monitoredItem.GetReadValueId(); DataValue value = new DataValue(); ServiceResult error = null; // read item value. DaItemState item = handle.Node as DaItemState; DaPropertyState daProperty = handle.Node as DaPropertyState; PropertyState uaProperty = handle.Node as PropertyState; if (item != null) { error = request.GetResult(context, item, nodeToRead, value, monitoredItem.DiagnosticsMasks); } // read vendor defined property value. else if (daProperty != null) { error = request.GetResult(context, daProperty, nodeToRead, value, monitoredItem.DiagnosticsMasks); } // read UA defined property value. else if (uaProperty != null) { error = request.GetResult(context, uaProperty, nodeToRead, value, monitoredItem.DiagnosticsMasks); } value.ServerTimestamp = DateTime.UtcNow; if (value.StatusCode != StatusCodes.BadNotFound) { monitoredItem.QueueValue(value, error); } else { monitoredItem.QueueValue(value, StatusCodes.BadNodeIdUnknown); } }
/// <summary> /// Queues the value to the monitored item. /// </summary> /// <param name="context">The context.</param> /// <param name="request">The request.</param> /// <param name="monitoredItem">The monitored item.</param> private void QueueValue(ServerSystemContext context, HdaReadRequest request, MonitoredItem monitoredItem) { NodeHandle handle = monitoredItem.ManagerHandle as NodeHandle; if (handle == null) { return; } ReadValueId nodeToRead = monitoredItem.GetReadValueId(); DataValue value = new DataValue(); ServiceResult error = null; HdaItemState item = handle.Node as HdaItemState; HdaAttributeState attribute = handle.Node as HdaAttributeState; if (item != null) { error = request.GetResult(context, item, nodeToRead, value, monitoredItem.DiagnosticsMasks); } else if (attribute != null) { error = request.GetResult(context, attribute, nodeToRead, value, monitoredItem.DiagnosticsMasks); } value.ServerTimestamp = DateTime.UtcNow; if (value.StatusCode != StatusCodes.BadNotFound) { monitoredItem.QueueValue(value, error); } }
/// <summary> /// Reads the initial value for a monitored item. /// </summary> /// <param name="context">The context.</param> /// <param name="handle">The item handle.</param> /// <param name="monitoredItem">The monitored item.</param> protected override void ReadInitialValue( ServerSystemContext context, NodeHandle handle, MonitoredItem monitoredItem) { ArchiveItemState item = handle.Node as ArchiveItemState; if (item == null || monitoredItem.AttributeId != Attributes.Value) { base.ReadInitialValue(context, handle, monitoredItem); return; } AggregateFilter filter = monitoredItem.Filter as AggregateFilter; if (filter == null || filter.StartTime >= DateTime.UtcNow.AddMilliseconds(-filter.ProcessingInterval)) { base.ReadInitialValue(context, handle, monitoredItem); return; } ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = filter.StartTime; details.EndTime = DateTime.UtcNow; details.ReturnBounds = true; details.IsReadModified = false; details.NumValuesPerNode = 0; HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = handle.NodeId; nodeToRead.ParsedIndexRange = NumericRange.Empty; try { HistoryReadRequest request = CreateHistoryReadRequest( context, details, handle, nodeToRead); while (request.Values.Count > 0) { if (request.Values.Count == 0) { break; } DataValue value = request.Values.First.Value; request.Values.RemoveFirst(); monitoredItem.QueueValue(value, null); } } catch (Exception e) { ServiceResult error = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, "Unexpected error fetching initial values."); monitoredItem.QueueValue(null, error); } }