📄 opcdatacallback.~pas
字号:
unit OPCDataCallback;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ComObj,OPCtypes,OPCDA, OPCutils,ActiveX;
type
// 定义接收 IConnectionPointContainer 的数据返回类
TOPCDataCallback = class(TInterfacedObject, IOPCDataCallback)
public
//异步通讯连接后,当连接项的数据发生变化时,服务器自动调用此函数
function OnDataChange(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
pErrors: PResultList): HResult; stdcall;
//异步通讯连接并执行异步读操作后,当服务器接收到读信息时,自动调用此函数返回数据
function OnReadComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
pErrors: PResultList): HResult; stdcall;
//异步通讯连接并执行异步写操作后,当服务器执行完数据写如后,自动调用此函数返回写操作的结果
function OnWriteComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMastererr: HResult; dwCount: DWORD; pClienthandles: POPCHANDLEARRAY;
pErrors: PResultList): HResult; stdcall;
//暂时没有测试此功能
function OnCancelComplete(dwTransid: DWORD; hGroup: OPCHANDLE):
HResult; stdcall;
end;
implementation
// TOPCDataCallback 方法
function TOPCDataCallback.OnDataChange(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
pErrors: PResultList): HResult;
var
ClientItems: POPCHANDLEARRAY;
Values: POleVariantArray;
Qualities: PWORDARRAY;
I: Integer;
NewValue: 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 := VarToStr(Values[I]);
showmessage('新的返回数据从 item '+ inttostr(ClientItems[I])+'接收到,其值为: '+NewValue);
end
else begin
showmessage('新的返回数据从 item '+ inttostr(ClientItems[I])+'接收到,但数据质量有问题');
end;
end;
end;
//此项中具体内容为本人添加,可实现异步读函数的回调,功能考虑不完善(错误判断等)
function TOPCDataCallback.OnReadComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
pErrors: PResultList): HResult;
var
Values: POleVariantArray;
NewValue: string; //保存返回的数据
Qualities: PWORDARRAY;
I: Integer;
begin
Result := S_OK;
Values:= POleVariantArray(pvValues); //异步读返回数据
Qualities:= PWORDARRAY(pwQualities); //异步读返回数据质量
for i:=0 to dwCount - 1 do
begin
NewValue := VarToStr(Values[i]);
if Qualities[i] = OPC_QUALITY_GOOD then
begin
ShowMessage('回调读函数响应,其值为:'+NewValue);
// form1.ASyncreadEdit.Text:=NewValue;
end
else
ShowMessage('回调读函数响应,但没有读到正确数据');
end;
end;
//此项中具体内容为本人添加,可实现异步写函数的回调,功能考虑不完善(错误判断等)
function TOPCDataCallback.OnWriteComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
hrMastererr: HResult; dwCount: DWORD; pClienthandles: POPCHANDLEARRAY;
pErrors: PResultList): HResult;
var
WErrors:PResultList;
begin
WErrors:=PResultList(pErrors);
if WErrors[0] = S_OK then
ShowMessage('写回调函数响应,异步写完成')
else
ShowMessage('写回调函数响应,但异步写数据没有正确写入');
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 + -