private List<HdaReadRequest> CreateReadRequests(
Session session,
DateTime startTime,
DateTime endTime,
double resampleInterval,
int[] serverHandles,
uint[] aggregateIds,
ReadProcessedDetails details)
{
// start time or end time must be specified.
if (startTime == DateTime.MinValue || endTime == DateTime.MinValue || startTime == endTime || resampleInterval < 0)
{
throw ComUtils.CreateComException(ResultIds.E_INVALIDARG);
}
// check the number of intervals.
if (m_configuration.MaxReturnValues > 0 && resampleInterval != 0)
{
long range = Math.Abs(((endTime - startTime).Ticks));
if (range/(TimeSpan.TicksPerMillisecond*resampleInterval) > m_configuration.MaxReturnValues)
{
throw ComUtils.CreateComException(ResultIds.E_MAXEXCEEDED);
}
}
details.StartTime = startTime;
details.EndTime = endTime;
details.ProcessingInterval = resampleInterval;
// build the list of requests.
List<HdaReadRequest> requests = new List<HdaReadRequest>();
for (int ii = 0; ii < serverHandles.Length; ii++)
{
HdaReadRequest request = new HdaReadRequest();
requests.Add(request);
// initialize request.
request.AggregateId = aggregateIds[ii];
// look up server handle.
request.Handle = m_itemManager.LookupHandle(serverHandles[ii]);
if (request.Handle == null)
{
request.Error = ResultIds.E_INVALIDHANDLE;
continue;
}
// set node id to use.
request.NodeId = request.Handle.NodeId;
request.ClientHandle = request.Handle.ClientHandle;
// check aggregate.
NodeId aggregateId = ComUtils.GetHdaAggregateId(aggregateIds[ii]);
if (aggregateId == null)
{
aggregateId = m_mapper.GetRemoteIntegerIdMapping(Opc.Ua.BrowseNames.AggregateFunctions, aggregateIds[ii]);
}
if (aggregateId == null)
{
request.Error = ResultIds.E_NOT_AVAIL;
continue;
}
details.AggregateType.Add(aggregateId);
}
return requests;
}
#endregion