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