为什么 OPC OnDataChange 的返回值为NULL

superzeal 2011-05-29 05:24:52
最近做了个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.
...全文
533 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yct0605 2014-01-26
  • 打赏
  • 举报
回复
以前写过一个例子,可以参考一下 http://bbs.csdn.net/topics/330170980
taokan2014 2014-01-24
  • 打赏
  • 举报
回复
遇到相同问题,请问解决了么
lzd123 2011-12-19
  • 打赏
  • 举报
回复
OPC,还是找个稳定的客户端比较好,自己做比较麻烦
qihanbing 2011-10-31
  • 打赏
  • 举报
回复
if Assigned(FOnDataChange) then
FOnDataChange(Self,
Params[0],
Params[1],
OleVariant(TVarData(Params[2])),
OleVariant(TVarData(Params[3])),
OleVariant(TVarData(Params[4])),
OleVariant(TVarData(Params[5])));
qihanbing 2011-10-31
  • 打赏
  • 举报
回复
你检查一下delphi编译类的文件tlb,我和你同样的问题,结果发现是编译的错误,procedure TOPCGroup.InvokeEvent(DispID: TDispID; var Params: TVariantArray);在这里,你检查一下啊
superzeal 2011-05-29
  • 打赏
  • 举报
回复
没人回复吗

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧