private void Da30ReadItemValues(List<ReadRequest> requests)
{
string[] itemIds = new string[requests.Count];
int[] maxAge = new int[requests.Count];
List<int> requestIndexes = new List<int>();
int count = 0;
for (int ii = 0; ii < requests.Count; ii++)
{
if (!requests[ii].ValueRequired)
{
continue;
}
itemIds[count] = requests[ii].ItemId;
maxAge[count] = 0;
requestIndexes.Add(ii);
count++;
}
if (count <= 0)
{
return;
}
IntPtr ppValues = IntPtr.Zero;
IntPtr ppQualities = IntPtr.Zero;
IntPtr ppTimeStamps = IntPtr.Zero;
IntPtr ppErrors = IntPtr.Zero;
string methodName = "IOPCItemIO.Read";
try
{
IOPCItemIO server = BeginComCall<IOPCItemIO>(methodName, true);
server.Read(
requestIndexes.Count,
itemIds,
maxAge,
out ppValues,
out ppQualities,
out ppTimeStamps,
out ppErrors);
}
catch (Exception e)
{
ComUtils.TraceComError(e, methodName);
return;
}
finally
{
EndComCall(methodName);
}
System.Runtime.InteropServices.ComTypes.FILETIME[] timeStamps = ComUtils.GetFILETIMEs(ref ppTimeStamps, requestIndexes.Count);
object[] values = ComUtils.GetVARIANTs(ref ppValues, count, true);
short[] qualities = ComUtils.GetInt16s(ref ppQualities, count, true);
int[] errors = ComUtils.GetInt32s(ref ppErrors, count, true);
DaValue[] daValues = ComDaGroup.GetItemValues(count, values, qualities, timeStamps, errors);
for (int ii = 0; ii < requestIndexes.Count; ii++)
{
requests[requestIndexes[ii]].Value = daValues[ii];
}
}