最近做了个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.

解决方案 »

  1.   

    你检查一下delphi编译类的文件tlb,我和你同样的问题,结果发现是编译的错误,procedure TOPCGroup.InvokeEvent(DispID: TDispID; var Params: TVariantArray);在这里,你检查一下啊
      

  2.   

    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])));
      

  3.   

    OPC,还是找个稳定的客户端比较好,自己做比较麻烦
      

  4.   

    以前写过一个例子,可以参考一下
    http://bbs.csdn.net/topics/330170980