最近做了個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.
uj5u.com熱心網友回復:
沒人回復嗎uj5u.com熱心網友回復:
你檢查一下delphi編譯類的檔案tlb,我和你同樣的問題,結果發現是編譯的錯誤,procedure TOPCGroup.InvokeEvent(DispID: TDispID; var Params: TVariantArray);在這里,你檢查一下啊uj5u.com熱心網友回復:
if Assigned(FOnDataChange) thenFOnDataChange(Self,
Params[0],
Params[1],
OleVariant(TVarData(Params[2])),
OleVariant(TVarData(Params[3])),
OleVariant(TVarData(Params[4])),
OleVariant(TVarData(Params[5])));
uj5u.com熱心網友回復:
OPC,還是找個穩定的客戶端比較好,自己做比較麻煩uj5u.com熱心網友回復:
遇到相同問題,請問解決了么uj5u.com熱心網友回復:
以前寫過一個例子,可以參考一下http://bbs.csdn.net/topics/330170980
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117375.html
標籤:網絡通信/分布式開發
