⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opcdatacallback.~pas

📁 OPC 源程序示例
💻 ~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 + -