最近做了个opc 客户端程序,采用的Delphi7.0,用的是OPCDAauto.dll,导入的delphi,把控件放上之后,连接添加之类的都对了,但在OnDataChange 时,NumItems:返回值为正确的变化个数,但 ClientHandles, ItemValues, Qualities,
TimeStamps的返回值为NULL。不知道是为什么?求高手解答。
unit s;interfaceuses
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.
TimeStamps的返回值为NULL。不知道是为什么?求高手解答。
unit s;interfaceuses
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.
FOnDataChange(Self,
Params[0],
Params[1],
OleVariant(TVarData(Params[2])),
OleVariant(TVarData(Params[3])),
OleVariant(TVarData(Params[4])),
OleVariant(TVarData(Params[5])));
http://bbs.csdn.net/topics/330170980