为什么 OPC OnDataChange 的返回值为NULL
最近做了个opc 客户端程序,采用的Delphi7.0,用的是OPCDAauto.dll,导入的delphi,把控件放上之后,连接添加之类的都对了,但在OnDataChange 时,NumItems:返回值为正确的变化个数,但 ClientHandles, ItemValues, Qualities,
TimeStamps的返回值为NULL。不知道是为什么?
求高手解答。
unit s;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, OPCAutomation_TLB, OleServer,ActiveX;
type
TForm1 = class(TForm)
btn1: TBitBtn;
OPCServer1: TOPCServer;
OPCGroup1: TOPCGroup;
opcgrps1: TOPCGroups;
procedure btn1Click(Sender: TObject);
procedure OPCGroup1DataChange(ASender: TObject; TransactionID,
NumItems: Integer; var ClientHandles, ItemValues, Qualities,
TimeStamps: OleVariant);
private
{ Private declarations }
public
{ Public declarations }
FOPCItems: OPCItems; // interface
FOPCItem: OPCItem; // interface
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
NumItems: Integer;
OVItemID: OleVariant;
OVClientHandles: OleVariant;
OVServerHandles: OleVariant;
OVErrors: OleVariant;
OleErr: string;
begin
OPCServer1.Connect1('MMTSET OPC Server');
OPCGroup1.ConnectTo(OPCServer1.OPCGroups.Add('test'));
OPCGroup1.UpdateRate :=1000;
OPCGroup1.IsActive := True;
OPCGroup1.IsSubscribed := True; // 事件支持
FOPCItems := OPCGroup1.OPCItems;
NumItems := 1;
OVItemID := VarArrayCreate([1, 1], varOleStr);
OVItemID[1] := 'a';
OVClientHandles := VarArrayCreate([1, 1], varInteger);
OVClientHandles[1] := 1;
OVServerHandles := VarArrayCreate([1, 1], varInteger);
OVServerHandles[1] := 0; // 初始化
OVErrors := VarArrayCreate([1, 1], varOleStr);
OVErrors := EmptyParam; // 初始化
FOPCItems.AddItems(
NumItems,
PSafeArray(TVarData(OVItemID).VOleStr),
PSafeArray(TVarData(OVClientHandles).VInteger),
PSafeArray(TVarData(OVServerHandles).VInteger),
PSafeArray(TVarData(OVErrors).VInteger),
EmptyParam,
EmptyParam
);
if OVServerHandles[1] >0 then
FOPCItem := FOPCItems.GetOPCItem(OVServerHandles[1])
else
begin
//raise EOleError.Create('失败: 连接' +cnItemName + #13#10 + OleErr);
Caption := 'error';
end
end;
procedure TForm1.OPCGroup1DataChange(ASender: TObject; TransactionID,
NumItems: Integer; var ClientHandles, ItemValues, Qualities,
TimeStamps: OleVariant);
var nSize : Integer;
p : Pointer;
s :string;
begin
if ClientHandles = null then
Exit;
nSize := VarArrayHighBound(ClientHandles,1) - VarArrayLowBound(ClientHandles,1 ) + 1;
SetLength(s,nSize);
p := VarArrayLock(ClientHandles);
try
Move(p^,PChar(s)^,nSize);
finally
VarArrayUnlock(ClientHandles);
end;
Caption := s;
end;
end.