/// <summary> /// Releases any continuation points. /// </summary> private void ReleaseContinuationPoints() { if (m_details != null) { HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(m_nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(m_details), TimestampsToReturn.Neither, true, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); NextBTN.Visible = false; StopBTN.Enabled = false; GoBTN.Visible = true; m_details = null; m_nodeToRead = null; } }
public override void Execute(OpcSession session) { LogExecutionStart(session); NormalizeNodeId(session); HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection { new HistoryReadValueId { NodeId = OpcUaNodeId } }; Opc.Ua.Client.Session uaSession = session.OpcUaClientSession; Logger.Debug("About to perform a HistoryRead:"); Logger.Debug("Details:"); Logger.Debug($" Start time: {details.StartTime}"); Logger.Debug($" End time: {details.EndTime}"); Logger.Debug($" Read modified: {details.IsReadModified}"); Logger.Debug($" Values per node: {details.NumValuesPerNode}"); Logger.Debug($" Return bounds: {details.ReturnBounds}"); Logger.Debug("Nodes to read:"); nodesToRead.ForEach(n => Logger.Debug($" {n}({n.NodeId})")); uaSession.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Both, false, nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnostics ); Logger.Debug($"HistoryRead got {results.Count} results, {diagnostics.Count} diagnostics."); HistoryReadResult hrr = results[0]; HistoryData histData = (HistoryData)ExtensionObject.ToEncodeable(hrr.HistoryData); if (StatusCode.IsBad(hrr.StatusCode)) { Logger.Information($"Bad result ({hrr.StatusCode}) reading {OpcNodeId}"); } else { if (StatusCode.IsGood(hrr.StatusCode)) { Logger.Debug($"Good result: {histData}, {histData.DataValues.Count} values."); } if (StatusCode.IsUncertain(hrr.StatusCode)) { Logger.Information($"Uncertain result: {hrr}"); } } foreach (DataValue dv in histData.DataValues) { Logger.Debug($" {dv} ({dv.SourceTimestamp})"); dataValue1 = new DataValue(); // Acá debería asignarse algo que viene desde «results». if (Program.HaveToWriteCsv) { WriteDataValueToCsvFile(dv); } } }
/// <summary> /// read History data /// </summary> /// <param name="tag">节点的索引</param> /// <param name="start">开始时间</param> /// <param name="end">结束时间</param> /// <param name="count">读取的个数</param> /// <param name="containBound">是否包含边界</param> /// <returns>读取的数据列表</returns> public IEnumerable <DataValue> ReadHistoryRawDataValues(string tag, DateTime start, DateTime end, uint count = 1, bool containBound = false) { HistoryReadValueId m_nodeToContinue = new HistoryReadValueId() { NodeId = new NodeId(tag), }; RequestHeader requestHeader = new RequestHeader(); ReadRawModifiedDetails m_details = new ReadRawModifiedDetails { StartTime = start.ToUniversalTime(), EndTime = end.ToUniversalTime(), NumValuesPerNode = count, IsReadModified = false, ReturnBounds = containBound }; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(m_nodeToContinue); m_session.HistoryRead( requestHeader, new ExtensionObject(m_details), TimestampsToReturn.Both, false, nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } if (results[0].HistoryData != null) { HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; foreach (var value in values.DataValues) { if (value.SourceTimestamp < m_details.StartTime || value.SourceTimestamp > m_details.EndTime) { var difference = (m_details.StartTime - value.SourceTimestamp).Hours; value.SourceTimestamp = value.SourceTimestamp.AddHours(difference); } yield return(value); } } }
/// <summary> /// Continues a read operation. /// </summary> private void ReadNext(ReadEventDetails details, HistoryReadValueId nodeToRead) { HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; ResponseHeader responseHeader = m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw ServiceResultException.Create(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable); } // display results. HistoryEvent data = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryEvent; ResultsLV.AddEventHistory(data); // check if a continuation point exists. if (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { nodeToRead.ContinuationPoint = results[0].ContinuationPoint; NextBTN.Visible = true; StopBTN.Enabled = true; GoBTN.Visible = false; m_details = details; m_nodeToRead = nodeToRead; } // all done. else { NextBTN.Visible = false; StopBTN.Enabled = false; GoBTN.Visible = true; m_details = null; m_nodeToRead = null; } }
public async Task <TimeSeries> GetTimeSeriesAsync(DateTime dateTimeFrom, DateTime dateTimeTo, double lessThen, double moreThen) { return(await Task.Run(() => { var details = new ReadRawModifiedDetails { StartTime = dateTimeFrom, EndTime = dateTimeTo, ReturnBounds = false }; var nodesToRead = new HistoryReadValueIdCollection { new HistoryReadValueId { NodeId = NodeId } }; Client.Session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, false, nodesToRead, out var results, out var diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } var data = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; var ts = new TimeSeries(); if (data == null) { return ts; } foreach (var result in data.DataValues) { ts.Add(result.SourceTimestamp.ToLocalTime(), (double)result.Value); } return ts; })); }
public IEnumerable <DataValue> ReadHistoryProcessed(string tag, DateTime start, DateTime end, string aggregateFunction, double processingInterval, uint count = 1, bool containBound = false) { HistoryReadValueId m_nodeToContinue = new HistoryReadValueId() { NodeId = new NodeId(tag), }; AggregateConfiguration aggregate = new AggregateConfiguration(); NodeIdCollection aggregateTypes = new NodeIdCollection(); aggregateTypes.Add(new NodeId(aggregateFunction)); ReadProcessedDetails m_details = new ReadProcessedDetails { StartTime = start.ToUniversalTime(), EndTime = end.ToUniversalTime(), AggregateConfiguration = aggregate, AggregateType = aggregateTypes, ProcessingInterval = processingInterval, }; m_logger.Information("start {0}/end {0}", m_details.StartTime, m_details.EndTime); HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(m_nodeToContinue); m_session.HistoryRead( null, new ExtensionObject(m_details), TimestampsToReturn.Both, false, nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; foreach (var value in values.DataValues) { yield return(value); } }
/// <summary> /// Saves a continuation point for later use. /// </summary> private void SaveContinuationPoint(HistoryReadDetails details, HistoryReadValueId nodeToRead, byte[] continuationPoint) { // clear existing continuation point. if (m_nodeToContinue != null) { HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(m_nodeToContinue); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(m_details), TimestampsToReturn.Neither, true, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); } m_details = null; m_nodeToContinue = null; // save new continutation point. if (continuationPoint != null && continuationPoint.Length > 0) { m_details = details; m_nodeToContinue = nodeToRead; m_nodeToContinue.ContinuationPoint = continuationPoint; } // update controls. if (m_nodeToContinue != null) { GoBTN.Visible = false; NextBTN.Visible = true; NextBTN.Enabled = true; StopBTN.Enabled = true; } else { GoBTN.Visible = true; GoBTN.Enabled = true; NextBTN.Visible = false; StopBTN.Enabled = false; } }
/// <summary> /// Fetches the recent history. /// </summary> private void ReadHistory(ReadEventDetails details, NodeId areaId) { HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = areaId; nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryEvent events = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryEvent; foreach (HistoryEventFieldList e in events.Events) { DisplayEvent(e.EventFields); } // release continuation points. if (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { nodeToRead.ContinuationPoint = results[0].ContinuationPoint; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, true, nodesToRead, out results, out diagnosticInfos); } }
/// <summary> /// 读取一连串的历史数据,并将其转化成指定的类型 /// </summary> /// <param name="tag">节点的索引</param> /// <param name="start">开始时间</param> /// <param name="end">结束时间</param> /// <param name="count">读取的个数</param> /// <param name="containBound">是否包含边界</param> /// <returns>读取的数据列表</returns> public IEnumerable <T> ReadHistoryRawDataValues <T>(string tag, DateTime start, DateTime end, uint count = 1, bool containBound = false) { HistoryReadValueId m_nodeToContinue = new HistoryReadValueId() { NodeId = new NodeId(tag), }; ReadRawModifiedDetails m_details = new ReadRawModifiedDetails { StartTime = start.ToUniversalTime(), EndTime = end.ToUniversalTime(), NumValuesPerNode = count, IsReadModified = false, ReturnBounds = containBound }; m_logger.Information("start {0}/end {0}", m_details.StartTime, m_details.EndTime); HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(m_nodeToContinue); m_session.HistoryRead( null, new ExtensionObject(m_details), TimestampsToReturn.Both, false, nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; m_logger.Information("values {0}", values); foreach (var value in values.DataValues) { yield return((T)value.Value); } }
public static Entry For(HistoryReadValueIdCollection collection) { if (collection == null) { return(new NullEntry()); } else { ArrayEntry array = new ArrayEntry(); HistoryReadValueIdCollection.Enumerator e = collection.GetEnumerator(); while (e.MoveNext()) { array.Add(For(e.Current)); } return(array); } }
/// <summary> /// Fetches the recent history. /// </summary> private void ReadAtTime() { ReadAtTimeDetails details = new ReadAtTimeDetails(); // generate times DateTime startTime = StartTimeDP.Value.ToUniversalTime(); for (int ii = 0; ii < MaxReturnValuesNP.Value; ii++) { details.ReqTimes.Add(startTime.AddMilliseconds((double)(ii * TimeStepNP.Value))); } HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Both, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; DisplayResults(values); // save any continuation point. SaveContinuationPoint(details, nodeToRead, results[0].ContinuationPoint); }
/// <summary> /// Fetches the recent history. /// </summary> private void ReadProcessed() { AvailableAggregate aggregate = (AvailableAggregate)AggregateCB.SelectedItem; ReadProcessedDetails details = new ReadProcessedDetails(); details.StartTime = StartTimeDP.Value.ToUniversalTime(); details.EndTime = EndTimeDP.Value.ToUniversalTime(); details.ProcessingInterval = (double)ResampleIntervalNP.Value; details.AggregateType.Add(aggregate.NodeId); details.AggregateConfiguration.UseServerCapabilitiesDefaults = true; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Both, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; DisplayResults(values); // save any continuation point. SaveContinuationPoint(details, nodeToRead, results[0].ContinuationPoint); }
/// <summary> /// Invokes the HistoryRead service. /// </summary> public virtual ResponseHeader HistoryRead( RequestHeader requestHeader, ExtensionObject historyReadDetails, TimestampsToReturn timestampsToReturn, bool releaseContinuationPoints, HistoryReadValueIdCollection nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { results = null; diagnosticInfos = null; ValidateRequest(requestHeader); // Insert implementation. return(CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported)); }
/// <summary> /// read History data /// </summary> /// <param name="tag">节点的索引</param> /// <param name="start">开始时间</param> /// <param name="end">结束时间</param> /// <param name="count">读取的个数</param> /// <param name="containBound">是否包含边界</param> /// <returns>读取的数据列表</returns> public IEnumerable <DataValue> ReadHistoryRawDataValues(string tag, DateTime start, DateTime end, uint count = 1, bool containBound = false) { var m_nodeToContinue = new HistoryReadValueId() { NodeId = new NodeId(tag), }; var m_details = new ReadRawModifiedDetails { StartTime = start, EndTime = end, NumValuesPerNode = count, IsReadModified = false, ReturnBounds = containBound }; var nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(m_nodeToContinue); Session.HistoryRead( null, new ExtensionObject(m_details), TimestampsToReturn.Both, false, nodesToRead, out var results, out var diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } var values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; foreach (var value in values.DataValues) { yield return(value); } }
public async Task HistoryReadAsync(bool eventDetails) { // there are no historizing nodes, but create some real ones var testSet = GetTestSetSimulation(Session.NamespaceUris); HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection( testSet.Select(nodeId => new HistoryReadValueId { NodeId = nodeId })); var response = await Session.HistoryReadAsync( null, eventDetails?ReadEventDetails() : ReadRawModifiedDetails(), TimestampsToReturn.Source, false, nodesToRead, CancellationToken.None).ConfigureAwait(false); Session.ValidateResponse(response.Results, nodesToRead); Session.ValidateDiagnosticInfos(response.DiagnosticInfos, nodesToRead); }
/// <summary> /// Fetches the recent history. /// </summary> private void ReadRaw(bool isReadModified) { ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = (StartTimeCK.Checked)?StartTimeDP.Value.ToUniversalTime():DateTime.MinValue; details.EndTime = (EndTimeCK.Checked)?EndTimeDP.Value.ToUniversalTime():DateTime.MinValue; details.NumValuesPerNode = (MaxReturnValuesCK.Checked)?(uint)MaxReturnValuesNP.Value:0; details.IsReadModified = isReadModified; details.ReturnBounds = (isReadModified)?false:ReturnBoundsCK.Checked; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Both, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; DisplayResults(values); // save any continuation point. SaveContinuationPoint(details, nodeToRead, results[0].ContinuationPoint); }
/// <summary>读取一连串的历史数据,并将其转化成指定的类型</summary> /// <param name="url">节点的索引</param> /// <param name="start">开始时间</param> /// <param name="end">结束时间</param> /// <param name="count">读取的个数</param> /// <param name="containBound">是否包含边界</param> /// <returns></returns> public IEnumerable <T> ReadHistoryRawDataValues <T>(string url, DateTime start, DateTime end, uint count = 1, bool containBound = false) { HistoryReadValueId m_nodeToContinue = new HistoryReadValueId() { NodeId = new NodeId(url) }; ReadRawModifiedDetails rawModifiedDetails = new ReadRawModifiedDetails(); rawModifiedDetails.StartTime = start.ToUniversalTime(); rawModifiedDetails.EndTime = end.ToUniversalTime(); rawModifiedDetails.NumValuesPerNode = count; int num1 = 0; rawModifiedDetails.IsReadModified = num1 != 0; int num2 = containBound ? 1 : 0; rawModifiedDetails.ReturnBounds = num2 != 0; ReadRawModifiedDetails m_details = rawModifiedDetails; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(m_nodeToContinue); HistoryReadResultCollection results; DiagnosticInfoCollection diagnosticInfos; this.m_session.HistoryRead((RequestHeader)null, new ExtensionObject((object)m_details), TimestampsToReturn.Both, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse((IList)results, (IList)nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, (IList)nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException((ServiceResult)results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; foreach (DataValue dataValue in (List <DataValue>)values.DataValues) { DataValue value = dataValue; yield return((T)value.Value); value = (DataValue)null; } List <DataValue> .Enumerator enumerator = new List <DataValue> .Enumerator(); }
public void HistoryRead(bool eventDetails) { HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; // there are no historizing nodes, but create some real ones var testSet = GetTestSetSimulation(Session.NamespaceUris); HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection( testSet.Select(nodeId => new HistoryReadValueId { NodeId = nodeId })); var responseHeader = Session.HistoryRead( null, eventDetails ? ReadEventDetails() : ReadRawModifiedDetails(), TimestampsToReturn.Source, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); }
private void ReleaseContinuationPoints() { ReadRawModifiedDetails details = new ReadRawModifiedDetails(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; if (m_result != null) { nodeToRead.ContinuationPoint = m_result.ContinuationPoint; } HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, true, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); m_result = null; ShowResults(); }
public static void GetData(TimeSeriesBlock tsb) { if (session != null) { ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = startTime; details.EndTime = endTime; details.NumValuesPerNode = 0; details.IsReadModified = false; details.ReturnBounds = true; var nodesToRead = new HistoryReadValueIdCollection(); for (int i = 0; i < tsb.opcNodes.Count; i++) { var nodeToRead = new HistoryReadValueId(); string[] split = tsb.opcNodes[i].Split(','); nodeToRead.NodeId = new NodeId(split[1], (ushort)Convert.ToInt32(split[0])); nodesToRead.Add(nodeToRead); } table = new List <List <object> >(); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; bool loop = true; while (loop) { session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Both, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); foreach (var res in results) { if (StatusCode.IsBad(res.StatusCode)) { throw new ServiceResultException(res.StatusCode); } } var historyData1 = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; var historyData2 = ExtensionObject.ToEncodeable(results[1].HistoryData) as HistoryData; for (int i = 0; i < historyData1.DataValues.Count; i++) { var row = new List <object>(); row.Add(historyData1.DataValues[i].SourceTimestamp); row.Add(historyData1.DataValues[i].Value); row.Add(historyData2.DataValues[i].Value); table.Add(row); } for (int i = 0; i < results.Count; i++) { if (results[i].ContinuationPoint == null || results[i].ContinuationPoint.Length == 0) { loop = false; break; } nodesToRead[i].ContinuationPoint = results[i].ContinuationPoint; } } } }
/// <summary> /// Fetches the next batch of history. /// </summary> private void ReadNext() { if (m_nodeToContinue == null) { return; } HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(m_nodeToContinue); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(m_details), TimestampsToReturn.Both, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; DisplayResults(values); // save any continuation point. SaveContinuationPoint(m_details, m_nodeToContinue, results[0].ContinuationPoint); }
/// <summary> /// Invokes the HistoryRead service. /// </summary> public virtual ResponseHeader HistoryRead( RequestHeader requestHeader, ExtensionObject historyReadDetails, TimestampsToReturn timestampsToReturn, bool releaseContinuationPoints, HistoryReadValueIdCollection nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { HistoryReadRequest request = new HistoryReadRequest(); HistoryReadResponse response = null; request.RequestHeader = requestHeader; request.HistoryReadDetails = historyReadDetails; request.TimestampsToReturn = timestampsToReturn; request.ReleaseContinuationPoints = releaseContinuationPoints; request.NodesToRead = nodesToRead; UpdateRequestHeader(request, requestHeader == null, "HistoryRead"); try { if (UseTransportChannel) { IServiceResponse genericResponse = TransportChannel.SendRequest(request); if (genericResponse == null) { throw new ServiceResultException(StatusCodes.BadUnknownResponse); } ValidateResponse(genericResponse.ResponseHeader); response = (HistoryReadResponse)genericResponse; } else { HistoryReadResponseMessage responseMessage = InnerChannel.HistoryRead(new HistoryReadMessage(request)); if (responseMessage == null || responseMessage.HistoryReadResponse == null) { throw new ServiceResultException(StatusCodes.BadUnknownResponse); } response = responseMessage.HistoryReadResponse; ValidateResponse(response.ResponseHeader); } results = response.Results; diagnosticInfos = response.DiagnosticInfos; } finally { RequestCompleted(request, response, "HistoryRead"); } return response.ResponseHeader; }
private void ReadHistory(DateTime StartTime, DateTime EndTime, NodeId node, uint HCount, String DriverName) { ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = DateTime.MinValue; details.EndTime = DateTime.MinValue; details.IsReadModified = false; details.NumValuesPerNode = HCount; details.ReturnBounds = true; details.StartTime = StartTime.ToUniversalTime(); details.EndTime = EndTime.ToUniversalTime(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = node; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, false, nodesToRead, out results, out diagnosticInfos); for (int i = 0; i < results.Count; i++) { HistoryData hd_results = ExtensionObject.ToEncodeable(results[i].HistoryData) as HistoryData; if (hd_results != null) { for (int ii = 0; ii < hd_results.DataValues.Count; ii++) { StatusCode status = hd_results.DataValues[ii].StatusCode; string timestamp = hd_results.DataValues[ii].SourceTimestamp.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); string value = Utils.Format("{0}", hd_results.DataValues[ii].WrappedValue); string quality = Utils.Format("{0}", (StatusCode)status.CodeBits); string historyInfo = Utils.Format("{0:X2}", (int)status.AggregateBits); Log("UID:" + S80(node.ToString()) + " \tTime: " + timestamp + "\tValue: " + value); // + ", Q:" + quality + ", histInfo:" + historyInfo); dr = dt.NewRow(); dr["UID"] = node.ToString(); dr["SourceTime"] = timestamp; dr["Value"] = value; dr["Name"] = DriverName; dt.Rows.Add(dr); } } } }
private void ReadProcessed() { ReadProcessedDetails details = new ReadProcessedDetails(); details.StartTime = StartTimeDP.Value.ToUniversalTime(); details.EndTime = EndTimeDP.Value.ToUniversalTime(); details.ProcessingInterval = (double)ResampleIntervalNP.Value; NodeId aggregateId = null; switch ((string)AggregateCB.SelectedItem) { case BrowseNames.AggregateFunction_Interpolative: { aggregateId = ObjectIds.AggregateFunction_Interpolative; break; } case BrowseNames.AggregateFunction_TimeAverage: { aggregateId = ObjectIds.AggregateFunction_TimeAverage; break; } case BrowseNames.AggregateFunction_Average: { aggregateId = ObjectIds.AggregateFunction_Average; break; } case BrowseNames.AggregateFunction_Count: { aggregateId = ObjectIds.AggregateFunction_Count; break; } case BrowseNames.AggregateFunction_Maximum: { aggregateId = ObjectIds.AggregateFunction_Maximum; break; } case BrowseNames.AggregateFunction_Minimum: { aggregateId = ObjectIds.AggregateFunction_Minimum; break; } case BrowseNames.AggregateFunction_Total: { aggregateId = ObjectIds.AggregateFunction_Total; break; } } details.AggregateType.Add(aggregateId); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; if (m_result != null) { nodeToRead.ContinuationPoint = m_result.ContinuationPoint; } HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } m_result = results[0]; ShowResults(); }
/// <summary> /// Returns the UTC timestamp of the first event in the archive. /// </summary> private DateTime ReadFirstDate() { // read the time of the first event in the archive. ReadEventDetails details = new ReadEventDetails(); details.StartTime = new DateTime(1970, 1, 1); details.EndTime = DateTime.MinValue; details.NumValuesPerNode = 1; details.Filter = new EventFilter(); details.Filter.AddSelectClause(Opc.Ua.ObjectTypeIds.BaseEventType, Opc.Ua.BrowseNames.Time); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_areaId; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } // get the data. HistoryEvent data = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryEvent; // release the continuation point. if (results[0].ContinuationPoint != null) { nodeToRead.ContinuationPoint = results[0].ContinuationPoint; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, true, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); } // check if an event found. if (data == null || data.Events.Count == 0 || data.Events[0].EventFields.Count == 0) { throw new ServiceResultException(StatusCodes.BadNoDataAvailable); } // get the event time. DateTime? eventTime = data.Events[0].EventFields[0].Value as DateTime?; if (eventTime == null) { throw new ServiceResultException(StatusCodes.BadTypeMismatch); } // return time as UTC value. return eventTime.Value; }
/// <summary> /// Reads the history of attributes for Bucket Brigade.Int1. /// </summary> static void HistoryReadAttributes(Session session) { List<string> VariableBrowsePaths = new List<string>(); VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:Description"); VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:DataType"); VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:ITEMID"); // translate browse paths. IList<NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); DiagnosticInfoCollection diagnosticInfos; ReadRawModifiedDetails readDetails = new ReadRawModifiedDetails(); readDetails.StartTime = DateTime.MinValue; readDetails.EndTime = DateTime.Now; readDetails.IsReadModified = false; readDetails.NumValuesPerNode = 100; readDetails.ReturnBounds = false; ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails); HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { HistoryReadValueId readValueId = new HistoryReadValueId(); readValueId.NodeId = nodeIds[ii].NodeId; readValueId.Processed = false; idCollection.Add(readValueId); } HistoryReadResultCollection historyReadResults; ResponseHeader responseHeader = session.HistoryRead(null, eo, TimestampsToReturn.Both, true, idCollection, out historyReadResults, out diagnosticInfos); // process results. for (int ii = 0; ii < historyReadResults.Count; ii++) { HistoryReadResult historyReadResult = historyReadResults[ii]; HistoryData historyData = null; DataValueCollection dataValues = null; if (historyReadResult.HistoryData != null) { historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData; dataValues = historyData.DataValues; } ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader); Console.WriteLine("\nHistoryRead result code for {0}: {1}", VariableBrowsePaths[ii], result.StatusCode.ToString()); if (StatusCode.IsBad(historyReadResult.StatusCode)) { continue; } if (dataValues == null) { Console.WriteLine("dataValues == null"); continue; } for (int jj = 0; jj < dataValues.Count; jj++) { DataValue dataValue = dataValues[jj]; // write value. Console.WriteLine("\t{0}: V={1}",jj, dataValue.Value == null ? "null" : dataValue.Value.ToString()); Console.WriteLine("\t Q={0}, SrvT={1}, SrcT={2}\n", dataValue.StatusCode.ToString(), dataValue.ServerTimestamp, dataValue.SourceTimestamp); } } }
static void HistoryReadProcessed(Session session) { // translate browse paths. IList<NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); DiagnosticInfoCollection diagnosticInfos; NodeId aggregateNodeId = null; RequestHeader rh = null; ViewDescription vd = null; ReferenceDescriptionCollection references; byte[] cp; //Get the list of avalilable aggregate functions: session.Browse( rh, vd, Opc.Ua.ObjectIds.Server_ServerCapabilities_AggregateFunctions, 1000, BrowseDirection.Forward, ReferenceTypeIds.Aggregates, false, 0, out cp, out references); Console.WriteLine("{0} aggregates are detected:", references.Count); //Print the list of avalible aggregates: int i = 0; foreach (ReferenceDescription rd in references) { i++; Console.WriteLine("{0}. {1} {2}", i, rd.BrowseName, rd.NodeId.Identifier.ToString()); } //Select aggregate function: Console.WriteLine("\nEnter aggregate number: "); string str = Console.ReadLine(); i = System.Int16.Parse(str); if (i > 0 && i <= references.Count) { aggregateNodeId = ExpandedNodeId.ToNodeId(references[i - 1].NodeId, session.NamespaceUris); } //Prepare arguments to pass to read processed history ReadProcessedDetails readDetails = new ReadProcessedDetails(); readDetails.StartTime = new DateTime(2008, 1, 1, 12, 0, 0); readDetails.EndTime = new DateTime(2008, 1, 1, 12, 0, 12); readDetails.AggregateType = new NodeIdCollection(nodeIds.Count); for (int x = 0; x < nodeIds.Count; x++) { readDetails.AggregateType.Add (aggregateNodeId); } readDetails.ProcessingInterval = 500; //500 milliseconds ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails); HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { HistoryReadValueId readValueId = new HistoryReadValueId(); readValueId.NodeId = nodeIds[ii].NodeId; readValueId.Processed = true; idCollection.Add(readValueId); } HistoryReadResultCollection historyReadResults; //Read processed history: ResponseHeader responseHeader = session.HistoryRead(null, eo, TimestampsToReturn.Both, true, idCollection, out historyReadResults, out diagnosticInfos); //Print results: for (int ii = 0; ii < historyReadResults.Count; ii++) { HistoryReadResult historyReadResult = historyReadResults[ii]; ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader); HistoryData historyData = null; DataValueCollection dataValues = null; if ( !(historyReadResult.HistoryData == null) ) { historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData; if (historyData == null) dataValues = null; else dataValues = historyData.DataValues; } Console.WriteLine("\nHistoryRead result code for {0}: {1}", VariableBrowsePaths[ii], result.StatusCode.ToString()); if (dataValues == null) { Console.WriteLine("dataValues == null"); continue; } for (int jj = 0; jj < dataValues.Count; jj++) { DataValue dataValue = dataValues[jj]; if (dataValue == null) continue; // write value. Console.WriteLine("{0}: V={1}, Q={2}, SrvT={3}, SrcT={4}", jj, dataValue.Value == null ? "null" : dataValue.Value.ToString(), dataValue.StatusCode.ToString(), dataValue.ServerTimestamp, dataValue.SourceTimestamp); } } }
/// <summary> /// Reads the history of a set of items. /// </summary> public virtual void HistoryRead( OperationContext context, ExtensionObject historyReadDetails, TimestampsToReturn timestampsToReturn, bool releaseContinuationPoints, HistoryReadValueIdCollection nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { // validate history details parameter. if (ExtensionObject.IsNull(historyReadDetails)) { throw new ServiceResultException(StatusCodes.BadHistoryOperationInvalid); } HistoryReadDetails details = historyReadDetails.Body as HistoryReadDetails; if (details == null) { throw new ServiceResultException(StatusCodes.BadHistoryOperationUnsupported); } // create result lists. bool diagnosticsExist = false; results = new HistoryReadResultCollection(nodesToRead.Count); diagnosticInfos = new DiagnosticInfoCollection(nodesToRead.Count); // pre-validate items. bool validItems = false; for (int ii = 0; ii < nodesToRead.Count; ii++) { HistoryReadResult result = null; DiagnosticInfo diagnosticInfo = null; // pre-validate and pre-parse parameter. ServiceResult error = HistoryReadValueId.Validate(nodesToRead[ii]); // return error status. if (ServiceResult.IsBad(error)) { nodesToRead[ii].Processed = true; result = new HistoryReadResult(); result.StatusCode = error.Code; // add diagnostics if requested. if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { diagnosticInfo = ServerUtils.CreateDiagnosticInfo(m_server, context, error); diagnosticsExist = true; } } // found at least one valid item. else { nodesToRead[ii].Processed = false; validItems = true; } results.Add(result); diagnosticInfos.Add(diagnosticInfo); } // call each node manager. if (validItems) { List<ServiceResult> errors = new List<ServiceResult>(results.Count); for (int ii = 0; ii < nodesToRead.Count; ii++) { errors.Add(null); } foreach (INodeManager nodeManager in m_nodeManagers) { nodeManager.HistoryRead( context, details, timestampsToReturn, releaseContinuationPoints, nodesToRead, results, errors); } for (int ii = 0; ii < nodesToRead.Count; ii++) { HistoryReadResult result = results[ii]; // set an error code for nodes that were not handled by any node manager. if (!nodesToRead[ii].Processed) { nodesToRead[ii].Processed = true; result = results[ii] = new HistoryReadResult(); result.StatusCode = StatusCodes.BadNodeIdUnknown; errors[ii] = results[ii].StatusCode; } // update the diagnostic info and ensure the status code in the result is the same as the error code. if (errors[ii] != null && errors[ii].Code != StatusCodes.Good) { if (result == null) { result = results[ii] = new HistoryReadResult(); } result.StatusCode = errors[ii].Code; // add diagnostics if requested. if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { diagnosticInfos[ii] = ServerUtils.CreateDiagnosticInfo(m_server, context, errors[ii]); diagnosticsExist = true; } } } } // clear the diagnostics array if no diagnostics requested or no errors occurred. UpdateDiagnostics(context, diagnosticsExist, ref diagnosticInfos); }
public async Task <List <OPCUATag> > ReadRaw(string serverUrl, bool bIsReadModified, DateTime dateStartDateTime, DateTime dateEndDateTime, int iMaxReturnVal, List <string> lstNodeId) { List <OPCUATag> tags = new List <OPCUATag>(); HistoryReadResultCollection objHistoryReadResult = new HistoryReadResultCollection(); try { Session session = await GetSessionAsync(serverUrl); ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = DateTime.MinValue; details.EndTime = DateTime.MinValue; details.IsReadModified = bIsReadModified; details.NumValuesPerNode = 0; details.StartTime = dateStartDateTime.ToUniversalTime(); details.EndTime = dateEndDateTime.ToUniversalTime(); details.NumValuesPerNode = (uint)iMaxReturnVal; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); foreach (string strNodeId in lstNodeId)//OA-2018-03-13 { HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = (NodeId)strNodeId;//_reference.NodeId; nodesToRead.Add(nodeToRead); } HistoryReadResultCollection HistoryResults = null; DiagnosticInfoCollection diagnosticInfos = null; session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, false, nodesToRead, out HistoryResults, out diagnosticInfos); Session.ValidateResponse(HistoryResults, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); #region Prepare result objHistoryReadResult = HistoryResults; if (objHistoryReadResult.Count > 0) { var m_index = 0; foreach (var result in objHistoryReadResult) { HistoryData results = ExtensionObject.ToEncodeable(result.HistoryData) as HistoryData; if (results == null) { return(tags); } for (int ii = 0; ii < results.DataValues.Count; ii++) { StatusCode status = results.DataValues[ii].StatusCode; string index = Utils.Format("[{0}]", m_index++); var timestamp = results.DataValues[ii].SourceTimestamp.ToLocalTime(); var sec = results.DataValues[ii].SourceTimestamp.Millisecond; string value = Utils.Format("{0}", results.DataValues[ii].WrappedValue); string quality = Utils.Format("{0}", (StatusCode)status.CodeBits); string historyInfo = Utils.Format("{0:X2}", (int)status.AggregateBits); var date = String.Format("{0}.{1}", timestamp.ToString("MM/dd/yyyy HH:mm:ss"), sec.ToString().PadLeft(3, '0')); OPCUATag tag = new OPCUATag(index, date, value, quality); tags.Add(tag); } } } #endregion return(tags); } catch (Exception e) { return(tags); } }
/// <summary> /// Reads the next batch of values from the server. /// </summary> private bool ReadNext( Session session, ExtensionObject details, List<HdaReadRequest> requests, bool releaseContinuationPoints) { // get the value. HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); for (int ii = 0; ii < requests.Count; ii++) { HdaReadRequest request = requests[ii]; if (request.IsComplete || request.Error < 0) { continue; } if (NodeId.IsNull(request.NodeId)) { request.Error = ResultIds.S_NODATA; continue; } HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = request.NodeId; nodeToRead.ContinuationPoint = request.ContinuationPoint; nodeToRead.Handle = request; nodesToRead.Add(nodeToRead); } // check if something to do. if (nodesToRead.Count == 0) { return false; } HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.HistoryRead( null, details, TimestampsToReturn.Source, releaseContinuationPoints, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); // check if nothing more to do. if (releaseContinuationPoints) { return false; } // process results. bool continuationPoints = false; for (int ii = 0; ii < nodesToRead.Count; ii++) { HdaReadRequest request = (HdaReadRequest)nodesToRead[ii].Handle; if (request.Values == null) { request.Values = new List<DaValue>(); } request.Error = ProcessReadResults( session, results[ii], request.AttributeId, request.Values, request.ModificationInfos); request.ContinuationPoint = results[ii].ContinuationPoint; // check if continuation point provided. if (request.ContinuationPoint != null && request.ContinuationPoint.Length > 0) { request.Error = ResultIds.S_MOREDATA; continuationPoints = true; } else { request.IsComplete = true; } } return continuationPoints; }
/// <summary> /// Fetches the recent history. /// </summary> private void ReadRaw(bool isReadModified) { ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime =(StartTimeCK.Checked)?StartTimeDP.Value.ToUniversalTime():DateTime.MinValue; details.EndTime = (EndTimeCK.Checked)?EndTimeDP.Value.ToUniversalTime():DateTime.MinValue; details.NumValuesPerNode = (MaxReturnValuesCK.Checked)?(uint)MaxReturnValuesNP.Value:0; details.IsReadModified = isReadModified; details.ReturnBounds = (isReadModified)?false:ReturnBoundsCK.Checked; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Both, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; DisplayResults(values); // save any continuation point. SaveContinuationPoint(details, nodeToRead, results[0].ContinuationPoint); }
/// <summary> /// Begins an asynchronous invocation of the HistoryRead service. /// </summary> public IAsyncResult BeginHistoryRead( RequestHeader requestHeader, ExtensionObject historyReadDetails, TimestampsToReturn timestampsToReturn, bool releaseContinuationPoints, HistoryReadValueIdCollection nodesToRead, AsyncCallback callback, object asyncState) { HistoryReadRequest request = new HistoryReadRequest(); request.RequestHeader = requestHeader; request.HistoryReadDetails = historyReadDetails; request.TimestampsToReturn = timestampsToReturn; request.ReleaseContinuationPoints = releaseContinuationPoints; request.NodesToRead = nodesToRead; UpdateRequestHeader(request, requestHeader == null, "HistoryRead"); if (UseTransportChannel) { return TransportChannel.BeginSendRequest(request, callback, asyncState); } return InnerChannel.BeginHistoryRead(new HistoryReadMessage(request), callback, asyncState); }
/// <summary> /// Fetches the recent history. /// </summary> private void ReadAtTime() { ReadAtTimeDetails details = new ReadAtTimeDetails(); // generate times DateTime startTime = StartTimeDP.Value.ToUniversalTime(); for (int ii = 0; ii < MaxReturnValuesNP.Value; ii++) { details.ReqTimes.Add(startTime.AddMilliseconds((double)(ii*TimeStepNP.Value))); } HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Both, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryData values = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; DisplayResults(values); // save any continuation point. SaveContinuationPoint(details, nodeToRead, results[0].ContinuationPoint); }
/// <summary> /// Invokes the HistoryRead service. /// </summary> /// <param name="requestHeader">The request header.</param> /// <param name="historyReadDetails">The history read details.</param> /// <param name="timestampsToReturn">The timestamps to return.</param> /// <param name="releaseContinuationPoints">if set to <c>true</c> continuation points are released.</param> /// <param name="nodesToRead">The nodes to read.</param> /// <param name="results">The results.</param> /// <param name="diagnosticInfos">The diagnostic information for the results.</param> /// <returns> /// Returns a <see cref="ResponseHeader"/> object /// </returns> public override ResponseHeader HistoryRead( RequestHeader requestHeader, ExtensionObject historyReadDetails, TimestampsToReturn timestampsToReturn, bool releaseContinuationPoints, HistoryReadValueIdCollection nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { OperationContext context = ValidateRequest(requestHeader, RequestType.HistoryRead); try { if (nodesToRead == null || nodesToRead.Count == 0) { throw new ServiceResultException(StatusCodes.BadNothingToDo); } m_serverInternal.NodeManager.HistoryRead( context, historyReadDetails, timestampsToReturn, releaseContinuationPoints, nodesToRead, out results, out diagnosticInfos); return CreateResponse(requestHeader, context.StringTable); } catch (ServiceResultException e) { lock (ServerInternal.DiagnosticsLock) { ServerInternal.ServerDiagnostics.RejectedRequestsCount++; if (IsSecurityError(e.StatusCode)) { ServerInternal.ServerDiagnostics.SecurityRejectedRequestsCount++; } } throw TranslateException(context, e); } finally { OnRequestComplete(context); } }
/// <summary> /// Returns the UTC timestamp of the first event in the archive. /// </summary> private DateTime ReadFirstDate() { // read the time of the first event in the archive. ReadEventDetails details = new ReadEventDetails(); details.StartTime = new DateTime(1970, 1, 1); details.EndTime = DateTime.MinValue; details.NumValuesPerNode = 1; details.Filter = new EventFilter(); details.Filter.AddSelectClause(Opc.Ua.ObjectTypeIds.BaseEventType, Opc.Ua.BrowseNames.Time); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_areaId; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } // get the data. HistoryEvent data = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryEvent; // release the continuation point. if (results[0].ContinuationPoint != null) { nodeToRead.ContinuationPoint = results[0].ContinuationPoint; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, true, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); } // check if an event found. if (data == null || data.Events.Count == 0 || data.Events[0].EventFields.Count == 0) { throw new ServiceResultException(StatusCodes.BadNoDataAvailable); } // get the event time. DateTime?eventTime = data.Events[0].EventFields[0].Value as DateTime?; if (eventTime == null) { throw new ServiceResultException(StatusCodes.BadTypeMismatch); } // return time as UTC value. return(eventTime.Value); }
/// <summary> /// Reads the history of values for a set of variables at given time. /// </summary> static void HistoryReadAtTime(Session session) { // translate browse paths. IList<NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); DiagnosticInfoCollection diagnosticInfos; ReadAtTimeDetails readDetails = new ReadAtTimeDetails(); readDetails.ReqTimes = new DateTimeCollection(); for (int jj = 0; jj < 10; jj++) { readDetails.ReqTimes.Add(new DateTime(2008, 01, 01, 12, 0, jj)); readDetails.ReqTimes.Add(new DateTime(2008, 01, 01, 12, 0, jj, (int) 500)); } ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails); HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { HistoryReadValueId readValueId = new HistoryReadValueId(); readValueId.NodeId = nodeIds[ii].NodeId; readValueId.Processed = false; idCollection.Add(readValueId); } HistoryReadResultCollection historyReadResults; ResponseHeader responseHeader = session.HistoryRead(null, eo, TimestampsToReturn.Both, true, idCollection, out historyReadResults, out diagnosticInfos); // process results. for (int ii = 0; ii < historyReadResults.Count; ii++) { HistoryReadResult historyReadResult = historyReadResults[ii]; HistoryData historyData = null; DataValueCollection dataValues = null; if (historyReadResult.HistoryData != null) { historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData; dataValues = historyData.DataValues; } ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader); Console.WriteLine("HistoryRead result code for {0}: {1}", VariableBrowsePaths[ii], result.StatusCode.ToString()); if (StatusCode.IsBad(historyReadResult.StatusCode)) { continue; } if (dataValues == null) { Console.WriteLine("dataValues == null"); continue; } for (int jj = 0; jj < dataValues.Count; jj++) { DataValue dataValue = dataValues[jj]; // write value. Console.WriteLine("{0}: V={1}, Q={2}, SrvT={3}, SrcT={4}", jj, dataValue.Value == null ? "null" : dataValue.Value.ToString(), dataValue.StatusCode.ToString(), dataValue.ServerTimestamp, dataValue.SourceTimestamp); } } }
/// <summary> /// Fetches the recent history. /// </summary> private void ReadHistory(ReadEventDetails details, NodeId areaId) { HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = areaId; nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, false, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } HistoryEvent events = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryEvent; AddEventHistory(events); // release continuation points. if (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { nodeToRead.ContinuationPoint = results[0].ContinuationPoint; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Neither, true, nodesToRead, out results, out diagnosticInfos); } }
private void ReadRaw(bool isReadModified) { ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = DateTime.MinValue; details.EndTime = DateTime.MinValue; details.IsReadModified = isReadModified; details.NumValuesPerNode = 0; details.ReturnBounds = ReturnBoundsCK.Checked; if (StartTimeCK.Checked) { details.StartTime = StartTimeDP.Value.ToUniversalTime(); } if (EndTimeCK.Checked) { details.EndTime = EndTimeDP.Value.ToUniversalTime(); } if (MaxReturnValuesCK.Checked) { details.NumValuesPerNode = (uint)MaxReturnValuesNP.Value; } HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; if (m_result != null) { nodeToRead.ContinuationPoint = m_result.ContinuationPoint; } HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } m_result = results[0]; ShowResults(); }
/// <summary> /// Invokes the HistoryRead service. /// </summary> public virtual ResponseHeader HistoryRead( RequestHeader requestHeader, ExtensionObject historyReadDetails, TimestampsToReturn timestampsToReturn, bool releaseContinuationPoints, HistoryReadValueIdCollection nodesToRead, out HistoryReadResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { results = null; diagnosticInfos = null; ValidateRequest(requestHeader); // Insert implementation. return CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported); }
/// <summary> /// Reads the history of attributes for Bucket Brigade.Int1. /// </summary> static void HistoryReadAttributes(Session session) { List <string> VariableBrowsePaths = new List <string>(); VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:Description"); VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:DataType"); VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:ITEMID"); // translate browse paths. IList <NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); DiagnosticInfoCollection diagnosticInfos; ReadRawModifiedDetails readDetails = new ReadRawModifiedDetails(); readDetails.StartTime = DateTime.MinValue; readDetails.EndTime = DateTime.Now; readDetails.IsReadModified = false; readDetails.NumValuesPerNode = 100; readDetails.ReturnBounds = false; ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails); HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { HistoryReadValueId readValueId = new HistoryReadValueId(); readValueId.NodeId = nodeIds[ii].NodeId; readValueId.Processed = false; idCollection.Add(readValueId); } HistoryReadResultCollection historyReadResults; ResponseHeader responseHeader = session.HistoryRead(null, eo, TimestampsToReturn.Both, true, idCollection, out historyReadResults, out diagnosticInfos); // process results. for (int ii = 0; ii < historyReadResults.Count; ii++) { HistoryReadResult historyReadResult = historyReadResults[ii]; HistoryData historyData = null; DataValueCollection dataValues = null; if (historyReadResult.HistoryData != null) { historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData; dataValues = historyData.DataValues; } ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader); Console.WriteLine("\nHistoryRead result code for {0}: {1}", VariableBrowsePaths[ii], result.StatusCode.ToString()); if (StatusCode.IsBad(historyReadResult.StatusCode)) { continue; } if (dataValues == null) { Console.WriteLine("dataValues == null"); continue; } for (int jj = 0; jj < dataValues.Count; jj++) { DataValue dataValue = dataValues[jj]; // write value. Console.WriteLine("\t{0}: V={1}", jj, dataValue.Value == null ? "null" : dataValue.Value.ToString()); Console.WriteLine("\t Q={0}, SrvT={1}, SrcT={2}\n", dataValue.StatusCode.ToString(), dataValue.ServerTimestamp, dataValue.SourceTimestamp); } } }
/// <summary> /// Reads the last date in the archive (truncates milliseconds and converts to local). /// </summary> private DateTime ReadLastDate() { ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = DateTime.MinValue; details.EndTime = DateTime.UtcNow.AddDays(1); details.NumValuesPerNode = 1; details.IsReadModified = false; details.ReturnBounds = false; HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { return(DateTime.MinValue); } HistoryData data = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; if (results == null) { return(DateTime.MinValue); } DateTime endTime = data.DataValues[0].SourceTimestamp; if (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { nodeToRead.ContinuationPoint = results[0].ContinuationPoint; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, true, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); } endTime = new DateTime(endTime.Year, endTime.Month, endTime.Day, endTime.Hour, endTime.Minute, endTime.Second, 0, DateTimeKind.Utc); endTime = endTime.AddSeconds(1); endTime = endTime.ToLocalTime(); return(endTime); }
/// <summary> /// Reads the history of values for a set of variables at given time. /// </summary> static void HistoryReadAtTime(Session session) { // translate browse paths. IList <NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); DiagnosticInfoCollection diagnosticInfos; ReadAtTimeDetails readDetails = new ReadAtTimeDetails(); readDetails.ReqTimes = new DateTimeCollection(); for (int jj = 0; jj < 10; jj++) { readDetails.ReqTimes.Add(new DateTime(2008, 01, 01, 12, 0, jj)); readDetails.ReqTimes.Add(new DateTime(2008, 01, 01, 12, 0, jj, (int)500)); } ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails); HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { HistoryReadValueId readValueId = new HistoryReadValueId(); readValueId.NodeId = nodeIds[ii].NodeId; readValueId.Processed = false; idCollection.Add(readValueId); } HistoryReadResultCollection historyReadResults; ResponseHeader responseHeader = session.HistoryRead(null, eo, TimestampsToReturn.Both, true, idCollection, out historyReadResults, out diagnosticInfos); // process results. for (int ii = 0; ii < historyReadResults.Count; ii++) { HistoryReadResult historyReadResult = historyReadResults[ii]; HistoryData historyData = null; DataValueCollection dataValues = null; if (historyReadResult.HistoryData != null) { historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData; dataValues = historyData.DataValues; } ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader); Console.WriteLine("HistoryRead result code for {0}: {1}", VariableBrowsePaths[ii], result.StatusCode.ToString()); if (StatusCode.IsBad(historyReadResult.StatusCode)) { continue; } if (dataValues == null) { Console.WriteLine("dataValues == null"); continue; } for (int jj = 0; jj < dataValues.Count; jj++) { DataValue dataValue = dataValues[jj]; // write value. Console.WriteLine("{0}: V={1}, Q={2}, SrvT={3}, SrcT={4}", jj, dataValue.Value == null ? "null" : dataValue.Value.ToString(), dataValue.StatusCode.ToString(), dataValue.ServerTimestamp, dataValue.SourceTimestamp); } } }
/// <summary> /// Reads the first date in the archive (truncates milliseconds and converts to local). /// </summary> private DateTime ReadFirstDate() { // use the historical data configuration if available. if (m_configuration != null) { if (StatusCode.IsGood(m_configuration.StartOfOnlineArchive.StatusCode)) { return m_configuration.StartOfOnlineArchive.Value.ToLocalTime(); } if (StatusCode.IsGood(m_configuration.StartOfArchive.StatusCode)) { return m_configuration.StartOfArchive.Value.ToLocalTime(); } } // do it the hard way (may take a long time with some servers). ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = new DateTime(1970, 1, 1); details.EndTime = DateTime.MinValue; details.NumValuesPerNode = 1; details.IsReadModified = false; details.ReturnBounds = false; HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { return DateTime.MinValue; } HistoryData data = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; if (results == null) { return DateTime.MinValue; } DateTime startTime = data.DataValues[0].SourceTimestamp; if (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { nodeToRead.ContinuationPoint = results[0].ContinuationPoint; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, true, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); } startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, startTime.Minute, startTime.Second, 0, DateTimeKind.Utc); startTime = startTime.ToLocalTime(); return startTime; }
static void HistoryReadProcessed(Session session) { // translate browse paths. IList <NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); DiagnosticInfoCollection diagnosticInfos; NodeId aggregateNodeId = null; RequestHeader rh = null; ViewDescription vd = null; ReferenceDescriptionCollection references; byte[] cp; //Get the list of avalilable aggregate functions: session.Browse( rh, vd, Opc.Ua.ObjectIds.Server_ServerCapabilities_AggregateFunctions, 1000, BrowseDirection.Forward, ReferenceTypeIds.Aggregates, false, 0, out cp, out references); Console.WriteLine("{0} aggregates are detected:", references.Count); //Print the list of avalible aggregates: int i = 0; foreach (ReferenceDescription rd in references) { i++; Console.WriteLine("{0}. {1} {2}", i, rd.BrowseName, rd.NodeId.Identifier.ToString()); } //Select aggregate function: Console.WriteLine("\nEnter aggregate number: "); string str = Console.ReadLine(); i = System.Int16.Parse(str); if (i > 0 && i <= references.Count) { aggregateNodeId = ExpandedNodeId.ToNodeId(references[i - 1].NodeId, session.NamespaceUris); } //Prepare arguments to pass to read processed history ReadProcessedDetails readDetails = new ReadProcessedDetails(); readDetails.StartTime = new DateTime(2008, 1, 1, 12, 0, 0); readDetails.EndTime = new DateTime(2008, 1, 1, 12, 0, 12); readDetails.AggregateType = new NodeIdCollection(nodeIds.Count); for (int x = 0; x < nodeIds.Count; x++) { readDetails.AggregateType.Add(aggregateNodeId); } readDetails.ProcessingInterval = 500; //500 milliseconds ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails); HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { HistoryReadValueId readValueId = new HistoryReadValueId(); readValueId.NodeId = nodeIds[ii].NodeId; readValueId.Processed = true; idCollection.Add(readValueId); } HistoryReadResultCollection historyReadResults; //Read processed history: ResponseHeader responseHeader = session.HistoryRead(null, eo, TimestampsToReturn.Both, true, idCollection, out historyReadResults, out diagnosticInfos); //Print results: for (int ii = 0; ii < historyReadResults.Count; ii++) { HistoryReadResult historyReadResult = historyReadResults[ii]; ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader); HistoryData historyData = null; DataValueCollection dataValues = null; if (!(historyReadResult.HistoryData == null)) { historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData; if (historyData == null) { dataValues = null; } else { dataValues = historyData.DataValues; } } Console.WriteLine("\nHistoryRead result code for {0}: {1}", VariableBrowsePaths[ii], result.StatusCode.ToString()); if (dataValues == null) { Console.WriteLine("dataValues == null"); continue; } for (int jj = 0; jj < dataValues.Count; jj++) { DataValue dataValue = dataValues[jj]; if (dataValue == null) { continue; } // write value. Console.WriteLine("{0}: V={1}, Q={2}, SrvT={3}, SrcT={4}", jj, dataValue.Value == null ? "null" : dataValue.Value.ToString(), dataValue.StatusCode.ToString(), dataValue.ServerTimestamp, dataValue.SourceTimestamp); } } }
private DateTime ReadFirstDate() { ReadRawModifiedDetails details = new ReadRawModifiedDetails(); details.StartTime = new DateTime(1970, 1, 1); details.EndTime = DateTime.UtcNow.AddDays(1); details.IsReadModified = false; details.NumValuesPerNode = 1; details.ReturnBounds = false; HistoryReadValueId nodeToRead = new HistoryReadValueId(); nodeToRead.NodeId = m_nodeId; HistoryReadValueIdCollection nodesToRead = new HistoryReadValueIdCollection(); nodesToRead.Add(nodeToRead); HistoryReadResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, false, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); if (StatusCode.IsBad(results[0].StatusCode)) { return DateTime.MinValue; } HistoryData data = ExtensionObject.ToEncodeable(results[0].HistoryData) as HistoryData; if (results == null) { return DateTime.MinValue; } DateTime startTime = data.DataValues[0].SourceTimestamp; if (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { nodeToRead.ContinuationPoint = results[0].ContinuationPoint; m_session.HistoryRead( null, new ExtensionObject(details), TimestampsToReturn.Source, true, nodesToRead, out results, out diagnosticInfos); Session.ValidateResponse(results, nodesToRead); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); } return startTime; }