基于delphi的opc客户端源代码
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OPCAutomation_TLB, OleServer, ComCtrls,ActiveX,
ExtCtrls;
type
TTFrmMain = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
fwq: TComboBox;
Edit1: TEdit;
Button3: TButton;
Button4: TButton;
OPCGroup1: TOPCGroup;
OPCServer1: TOPCServer;
tv: TTreeView;
Label4: TLabel;
Edit2: TEdit;
Button5: TButton;
Button6: TButton;
Timer1: TTimer;
OPCGroups1: TOPCGroups;
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure tvClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
TFrmMain: TTFrmMain;
browser:opcbrowser;
FOPCItems: OPCItems;
FOPCItem: OPCItem;
nownode:ttreenode;
lujing:string;
OVItemID:OleVariant;
OVClientHandles:OleVariant;
OVServerHandles:OleVariant;
NumItems: Integer;
OVErrors: OleVariant;
function Branch(count:integer;node:TTreeNode):string;
implementation
{$R *.dfm}
function Branch(count:integer;node:TTreeNode):string;
var
st:olevariant;
subnode:TTreeNode;
y:integer;
Count2:Integer;
y1:integer;
Count3:Integer;
begin
for y:=1 to count do
begin
st:=Browser.Item(y);
subnode:= https://www.360docs.net/doc/ef8093573.html,.Items.addChild(node,st);
browser.MoveDown(st);
browser.ShowBranches;
Count3:= browser.Count;
if count3>0 then
Branch(count3,subnode)
else
begin
browser.ShowLeafs(st);
Count2:= browser.Count;
if count2>0 then
begin
for y1:=1 to count2 do
begin
st:= browser.Item(y1);
https://www.360docs.net/doc/ef8093573.html,.Items.AddChild(subnode,st);
end;
end;
end;
browser.MoveUp;
browser.ShowBranches;
end;
end;
procedure TTFrmMain.Button4Click(Sender: TObject);
begin
close;
end;
procedure TTFrmMain.Button2Click(Sender: TObject);
var
Count: integer;
rootnode: TTreeNode;
Count1:Integer;
Count2:Integer;
str: olevariant;
X: integer;
z: integer;
st2:String;
begin
OPCServer1.Connect1(fwq.text);
browser := OPCServer1.CreateBrowser;
browser.Movetoroot;
browser.ShowBranches;
Count := browser.Count;
If Count > 0 Then
For X := 1 To Count do
begin
str := browser.Item(X);
rootnode:=tv.Items.add(nil,str);
browser.movedown(str);
browser.showbranches;
Count1 := browser.Count;
If Count1 > 0 Then Branch(Count1, rootnode)
else
begin
browser.ShowLeafs(str);
Count2 := browser.Count;
if count2>0 then
begin
For z := 1 To Count2 do
begin
st
2 := browser.Item(z);
tv.Items.AddChild(rootnode,st2);
end;
end;
end;
browser.MoveUp;
browser.ShowBranches;
end;
Button2.Enabled:=false;
Button1.Enabled:=true;
NumItems := 2;
OPCGroup1.ConnectTo(OPCServer1.OPCGroups.Add('st1'));
FOPCItems:= OPCGroup1.OPCItems;
end;
procedure TTFrmMain.FormCreate(Sender: TObject);
var
servers:string;
str:string;
aobject:tobject;
begin
Button1.enabled:=false;
Button3.Enabled:=false;
Button6.Enabled:=false;
timer1.Enabled:=false;
button3.Enabled:=false;
button5.Enabled:=false;
servers:=opcServer1.GetOPCServers[1];
fwq.AddItem(servers,aobject);
fwq.Text:=servers;
end;
procedure TTFrmMain.Button1Click(Sender: TObject);
begin
timer1.Enabled:=false;
tv.Items.Clear;
Button2.Enabled:=true;
Button1.Enabled:=false;
Button3.Enabled:=false;
Button5.Enabled:=false;
Button6.Enabled:=false;
if Assigned(OPCServer1) then
begin
opcserver1.OPCGroups.RemoveAll;
OPCServer1.Disconnect;
end;
end;
procedure TTFrmMain.Button5Click(Sender: TObject);
var
itemvalue:string;
begin
if OVServerHandles[1]>0 then
begin
FOPCItem := FOPCItems.GetOPCItem(OVServerHandles[1]);
fopcitem.Write(edit2.Text);
Button3.Enabled:=false;
Button6.Enabled:=true;
end
else
begin
showmessage('请选择标签');
end;
end;
procedure TTFrmMain.Timer1Timer(Sender: TObject);
var
source:olevariant;
itemvalue:olevariant;
quality:olevariant;
timestamp:olevariant;
begin
fopcitem.Read(source,itemvalue,quality,timestamp);
edit1.Text:=fopcitem.Value;;
end;
procedure TTFrmMain.Button6Click(Sender: TObject);
begin
timer1.Enabled :=false;
button3.Enabled:=true;
end;
procedure https://www.360docs.net/doc/ef8093573.html,Click(Sender: TObject);
begin
nownode:=tv.Selected;
if nownode<>nil then
begin
Button3.Enabled:=true;
Button5.Enabled:=true;
lujing:=nownode.Text;
button3.Enabled:=true;
while nownode.Parent<>nil do
begin
nownode:=nownode.Parent ;
lujing:=nownode.Text+'.'+lujing;
end;
OVItemID := VarArrayCreate([1, 2], varOleStr);
OVItemID[1]:=lujing;
OVClientHandles := VarArrayCreate([1, 2], varInteger);
OVClientHandles[1] := 1;
OVClientHandles[2] := 2;
OVServerHandles := VarArrayCreate([1, 2], varInteger);
OVServerHandles[1]:=0;
FOPCItems.AddItems(
NumItems,
PSafeArray(TVarData(OVItemID).VOleStr),
PSafeArray(TVarData(OVClientHandles).VInteger),
PSafeArray(TVarData(OVServerHandles).VInteger),
PSafeArray(TVarData(OVErrors).VInteger),
EmptyParam,
EmptyParam
);
end;
end;
procedure TTFrmMain.Button3Click(Sender: TObject);
begin
if OVServerHandles[1]>0 then
begin
FOPCItem := FOPCItems.GetOPCItem(OVServerHandles[1]);
timer1.Enabled:=true;
Button3.Enabled:=false;
Button6.Enabled:=true;
end
else
begin
showmessage('请选择标签');
end;
end;
end.