OPC是OLE for Process Control的縮寫,即把OLE應用於工業控制領域,OPC是建立在OLE規範之上,它爲工業控制領域提供了一種標準的數據訪問機制。OPC服務器由三類對象組成:服務器(Server)、組(Group)、數據項(Item)。服務器對象(Server)擁有服務器的所有信息,同時也是組對象(Group)的容器。組對象(Group)擁有本組的所有信息,同時包容並邏輯組織OPC數據項(Item)。在這裏數據項(Item)就是指所有的PLC信號的輸入與輸出。OPC組對象(Group)提供了客戶組織數據的一種方法。客戶可對之進行讀寫,還可以設置客戶端的數據更新速率。當服務器緩衝區內的數據發生改變時,OPC將向客戶發出通知,客戶得到通知後再進行必要的處理。而無須浪費大量的時間進行查詢。OPC規範定義了兩種組對象:公共組和局部組(私有組)。公共組由多個客戶共有,局部組只隸屬於一個OPC客戶。一般來說,客戶和服務器的一對連接只需要定義一個組對象。在每個組對象中,客戶可以加入多個OPC數據項(Item)。OPC數據項(Item)是服務器端定義的對象,通常指向設備的一個寄存器單元。OPC客戶對設備寄存器的操作都是通過其數據項來完成的,通過OPC數據項(Item),OPC規範儘可能地隱藏了設備的特殊信息,也使OPC服務器的通用性大大增強。OPC數據項(Item)並不提供對外接口,客戶不能直接對之進行操作,所有的操作都是通過組對象進行的。每個OPC數據項(Item)的數據結構包括三個成員變量:即數據值、數據質量和時間戳。數據值是以Variant形式表示的。
Delphi7.0加載Siemens動態庫:
1.打開Delphi7.0,點擊Project->Import Type Library
2.在Import Type Library裏面找到Siemens OPC DAAutomation 2.0 (Version 1.0),在Class Nams裏面可以看三個類方法(TOPCGroups,TOPCGroup,TOPCServer),默認的Palette Page爲ActiveX,單擊Install…
Delphi7.0中編寫客戶端程序:
1.連接OPC服務器
在Form上面添加三個OPC控件:
OPCGroup1: TOPCGroup;
OPCGroups1: TOPCGroups;
OPCServer1: TOPCServer;
1
2
3
4
5
6
7
8
9
10
11
|
var Group:OPCGroup; testItem:OPCItem; OPCItems: string ; OPCItemsValues: string ; OPCServer1 . Connect1( 'OPC服務名稱(Intellution.OPCiFIX.1)' , '結點名稱(OPC主機名稱)' ); //連接OPC服務器 OPCServer1 . OPCGroups . DefaultGroupUpdateRate:= 500 ; //設置更新頻率 Group:=OPCServer1 . OPCGroups . Add( 'MyGroup' ); //添加Group testItem:=Group . OPCItems . AddItem( 'SCADA.YPA1_SILO_CHARGEWEIGHTACT.F_CV' , 1 ); //添加OPC數據項 |
2.讀取OPC數據項
1
2
3
4
|
var myvalue,myquality,mytimestamp:OleVariant; testItem . Read(OPCDevice,myvalue,myquality,mytimestamp); Edit1 . Text:=myvalue; |
3.寫OPC數據項
1
2
3
|
var myvalue:OleVariant; testItem . Write (myvalue); |
4.斷開OPC
1
2
|
OPCServer1 . OPCGroups . RemoveAll; OPCServer1 . Disconnect; |
完整代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OPCSiemensDAAutomation_TLB, OleServer; type TForm1 = class (TForm) OPCGroup1: TOPCGroup; OPCGroups1: TOPCGroups; OPCServer1: TOPCServer; Button1: TButton; Edit1: TEdit; Button2: TButton; Button3: TButton; ListBox1: TListBox; ListBox2: TListBox; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end ; var Form1: TForm1; Group:OPCGroup; testItem:OPCItem; OPCItems: string ; OPCItemsValues: string ; implementation { $R *.dfm} procedure TForm1 . Button1Click(Sender: TObject); begin //連接OPC OPCServer1 . Connect1( 'Intellution.OPCiFIX.1' , 'OPSServer01' ); OPCServer1 . OPCGroups . DefaultGroupUpdateRate:= 500 ; Group:=OPCServer1 . OPCGroups . Add( 'MyGroup' ); testItem:=Group . OPCItems . AddItem( 'SCADA.YPA1_SILO_CHARGEWEIGHTACT.F_CV' , 1 ); end ; procedure TForm1 . Button3Click(Sender: TObject); begin //斷開OPC OPCServer1 . OPCGroups . RemoveAll; OPCServer1 . Disconnect; end ; procedure TForm1 . Button2Click(Sender: TObject); var myvalue,myquality,mytimestamp:OleVariant; begin //讀OPC數據項 testItem . Read(OPCDevice,myvalue,myquality,mytimestamp); Edit1 . Text:=myvalue; end ; procedure TForm1 . Button4Click(Sender: TObject); var myvalue:OleVariant; begin //寫OPC數據項 testItem . Write (myvalue); end ; end . |
具體操作圖文說明請到網盤下載
注:具體設備的OPC驅動雖然不一致,但是都有統一的標準,本文只是針對Siemens設備,如果有錯誤歡迎批評指教!