private void Da30WriteItemValues(List<WriteRequest> requests)
{
int count = 0;
string[] itemIDs = new string[requests.Count];
OpcRcw.Da.OPCITEMVQT[] values = new OpcRcw.Da.OPCITEMVQT[requests.Count];
WriteRequest[] writeRequests = new WriteRequest[requests.Count];
for (int ii = 0; ii < requests.Count; ii++)
{
WriteRequest request = requests[ii];
if (request == null)
{
continue;
}
// convert to a DA compatible type.
object convertedValue = null;
request.Error = ComDaClientNodeManager.LocalToRemoteValue(request.Value.WrappedValue, out convertedValue);
if (request.Error < 0)
{
continue;
}
itemIDs[count] = request.ItemId;
values[count].vDataValue = convertedValue;
values[count].bQualitySpecified = 0;
values[count].bTimeStampSpecified = 0;
// check for quality.
values[count].wQuality = ComUtils.GetQualityCode(request.Value.StatusCode);
if (values[count].wQuality != Qualities.OPC_QUALITY_GOOD)
{
values[count].bQualitySpecified = 1;
}
// check for server timestamp.
if (request.Value.ServerTimestamp != DateTime.MinValue)
{
values[count].ftTimeStamp = ComUtils.GetFILETIME(request.Value.ServerTimestamp);
values[count].bTimeStampSpecified = 1;
}
// ignore server timestamp if source timestamp is provided.
if (request.Value.SourceTimestamp != DateTime.MinValue)
{
values[count].ftTimeStamp = ComUtils.GetFILETIME(request.Value.SourceTimestamp);
values[count].bTimeStampSpecified = 1;
}
writeRequests[count] = request;
count++;
}
IntPtr ppErrors = IntPtr.Zero;
string methodName = "IOPCItemIO.WriteVQT";
try
{
IOPCItemIO server = BeginComCall<IOPCItemIO>(methodName, true);
server.WriteVQT(
count,
itemIDs,
values,
out ppErrors);
}
catch (Exception e)
{
ComUtils.TraceComError(e, methodName);
return;
}
finally
{
EndComCall(methodName);
}
int[] errors = ComUtils.GetInt32s(ref ppErrors, count, true);
for (int ii = 0; ii < count; ii++)
{
writeRequests[ii].Error = errors[ii];
}
}