📄 opccallback.pas
字号:
{*******************************************************}
{ }
{ OPC Data Access 2.0 Custom Interface }
{ }
{ Delphi Sample - Callback Interface }
{*******************************************************}
unit OPCCallback;
interface
uses
Windows, SysUtils, ActiveX, OPCDA;
type
TOnDataRecvEvent = procedure (Sender: TObject; ItemHandle: OPCHANDLE;
ItemValue: Variant; ItemTime: TDateTime) of Object;
// class to receive IConnectionPointContainer data change callbacks
TOPCDataCallback = class(TInterfacedObject, IOPCDataCallback)
private
FOnDataRecvEvent: TOnDataRecvEvent;
public
function OnDataChange(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
phClientItems: POPCHANDLE; pvValues: POleVariant; pwQualities: PWORD;
pftTimeStamps: PFileTime; pErrors: PHResult): HResult; virtual; stdcall;
function OnReadComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
phClientItems: POPCHANDLE; pvValues: POleVariant; pwQualities: PWORD;
pftTimeStamps: PFileTime; pErrors: PHResult): HResult; virtual; stdcall;
function OnWriteComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMastererr: HResult; dwCount: DWORD; pClienthandles: POPCHANDLE;
pErrors: PHResult): HResult; virtual; stdcall;
function OnCancelComplete(dwTransid: DWORD; hGroup: OPCHANDLE):
HResult; virtual; stdcall;
published
property OnDataRecvEvent: TOnDataRecvEvent read FOnDataRecvEvent
write FOnDataRecvEvent;
end;
implementation
// TOPCDataCallback methods
function TOPCDataCallback.OnDataChange(dwTransid: DWORD;
hGroup: OPCHANDLE; hrMasterquality: HResult; hrMastererror: HResult;
dwCount: DWORD; phClientItems: POPCHANDLE; pvValues: POleVariant;
pwQualities: PWORD; pftTimeStamps: PFileTime; pErrors: PHResult): HResult;
var
ClientItems: POPCHANDLEARRAY;
Values: POleVariantArray;
Qualities: PWORDARRAY;
I: Integer;
RecvTime: TDateTime;
begin
Result := S_OK;
RecvTime := Now;
ClientItems := POPCHANDLEARRAY(phClientItems);
Values := POleVariantArray(pvValues);
Qualities := PWORDARRAY(pwQualities);
for I := 0 to dwCount - 1 do
if Qualities[I] = OPC_QUALITY_GOOD then
begin
if Assigned(FOnDataRecvEvent) then
FOnDataRecvEvent(nil, ClientItems[I], Values[I], RecvTime);
end;
end;
function TOPCDataCallback.OnReadComplete(dwTransid: DWORD;
hGroup: OPCHANDLE; hrMasterquality: HResult; hrMastererror: HResult;
dwCount: DWORD; phClientItems: POPCHANDLE; pvValues: POleVariant;
pwQualities: PWORD; pftTimeStamps: PFileTime; pErrors: PHResult): HResult;
begin
Result := OnDataChange(dwTransid, hGroup, hrMasterquality, hrMastererror,
dwCount, phClientItems, pvValues, pwQualities, pftTimeStamps, pErrors);
end;
function TOPCDataCallback.OnWriteComplete(dwTransid: DWORD;
hGroup: OPCHANDLE; hrMastererr: HResult; dwCount: DWORD;
pClienthandles: POPCHANDLE; pErrors: PHResult): HResult;
begin
Result := S_OK;
end;
function TOPCDataCallback.OnCancelComplete(dwTransid: DWORD;
hGroup: OPCHANDLE): HResult;
begin
Result := S_OK;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -