function TOPCDataCallback.OnDataChange(dwTransid: DWORD; hGroup: OPCHANDLE; hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD; phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray; pwQualities: PWordArray; pftTimeStamps: PFileTimeArray; pErrors: PResultList): HResult;stdcall; var ClientItems: POPCHANDLEARRAY; Values: POleVariantArray; Qualities: PWORDARRAY; I: Integer; NewValue:array [0..1] of string; OutputValue:array [0..1] of string; begin Result := S_OK; ClientItems := POPCHANDLEARRAY(phClientItems); Values:=POleVariantArray(pvValues); Qualities:=PWORDARRAY(pwQualities); for I:= 0 to dwCount-1 do begin if Qualities[I] = OPC_QUALITY_GOOD then begin NewValue[i]:= VarToStr(Values[I]); OutputValue[i]:=format(' %d , value: %s', [ClientItems[i],NewValue[i]]); //form1.Label1.Caption:=inttostr(ClientItems[0]); // form1.Label2.Caption:=inttostr(ClientItems[1]); end else begin ShowMessage('Callback received for item , but quality not good'); end; end; end; 这个是数据变化触发的回调函数,里面的dwCount得到的是数据变化的item数量,所以ClientItems[i]我得到的和我实际的item是有出入的
hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
pErrors: PResultList): HResult;stdcall;
var
ClientItems: POPCHANDLEARRAY;
Values: POleVariantArray;
Qualities: PWORDARRAY;
I: Integer;
NewValue:array [0..1] of string;
OutputValue:array [0..1] of string;
begin
Result := S_OK;
ClientItems := POPCHANDLEARRAY(phClientItems);
Values:=POleVariantArray(pvValues);
Qualities:=PWORDARRAY(pwQualities);
for I:= 0 to dwCount-1 do
begin
if Qualities[I] = OPC_QUALITY_GOOD then
begin
NewValue[i]:= VarToStr(Values[I]);
OutputValue[i]:=format(' %d , value: %s', [ClientItems[i],NewValue[i]]);
//form1.Label1.Caption:=inttostr(ClientItems[0]);
// form1.Label2.Caption:=inttostr(ClientItems[1]);
end
else
begin
ShowMessage('Callback received for item , but quality not good');
end;
end;
end;
这个是数据变化触发的回调函数,里面的dwCount得到的是数据变化的item数量,所以ClientItems[i]我得到的和我实际的item是有出入的