1 引言
現(xiàn)代工業(yè)控制系統(tǒng)通常以pc機為上位機,通過與現(xiàn)場工控設備如plc的數(shù)據(jù)交換與處理,實現(xiàn)對生產(chǎn)過程的自動控制。對于小型控制系統(tǒng),采用專門的組態(tài)軟件成本太高,用vb設計監(jiān)控系統(tǒng)則可以降低成本,但首先要解決上位機與plc之間通信問題。以往使用較多的進程間通信方式是dde(動態(tài)數(shù)據(jù)交換)方式,隨著opc技術的發(fā)展和普及,它已成為工業(yè)過程控制的通信標準。opc服務器有兩類接口,其中自動化接口主要用于vb、delphi等開發(fā)工具。本文利用羅克韋爾公司提供的opc接口,用vb編寫了客戶端應用程序,實現(xiàn)了上位機與ab可編程控制器之間的數(shù)據(jù)交換。
2 opc技術簡介
opc(ole for process control—用于過程控制的對象連接與嵌入)是一套以微軟對象連接與嵌入ole、組件對象模型com、分布式組件對象模型dcom(distributed com)技術為基礎,基于windows操作平臺,為工業(yè)應用程序之間提供高效的信息集成和交互功能的組件對象模型接口標準。opc實際上是提供了一種機制,通過這種機制,系統(tǒng)能夠以服務器/客戶端標準方式從服務器獲取數(shù)據(jù)并將其傳遞給任何客戶應用程序。這樣,只要生產(chǎn)商開發(fā)一套遵循opc規(guī)范的服務器與數(shù)據(jù)進行通信,其他任何客戶應用程序便能通過服務器訪問設備。
opc服務器有兩類接口:定制接口和自動化接口。定制接口為c++程序服務,自動化接口為vb這一類可使用自動化對象的程序服務。定制接口是服務商必須提供的,而自動化接口則是可選的,不過opc基金會提供了一個叫做“自動化包裝器”的動態(tài)連接庫,用于在兩者間轉(zhuǎn)換。
opc數(shù)據(jù)存取規(guī)范規(guī)定的基本對象有三類:服務器(server)、組(group)和數(shù)據(jù)項(item)。服務器對象包含服務器的所有信息,也是組對象的容器,一個服務器對應于一個opc server,即一種設備的驅(qū)動程序。組對象除了包含它自身信息外,還負責管理數(shù)據(jù)項。每一個數(shù)據(jù)項代表到數(shù)據(jù)源的一個連接,但它沒有提供外部接口,客戶端程序無法對數(shù)據(jù)項直接進行操作,應用程序必須依靠數(shù)據(jù)項的容器組對象來對它進行操作。
3 通信實現(xiàn)
3.1 rslinx的配置
rslinx是ab可編程控制器在windows環(huán)境下建立工廠所用通信方案的工具,它不僅提供了多種網(wǎng)絡驅(qū)動程序,而且提供了最快速的opc、dde和custom c/c++接口。本設計中上位機與logix5550控制器采用rs-232串口方式連接,在rslinx中要對df1網(wǎng)絡驅(qū)動程序組態(tài),設置串口特性:com1、波特率19200bps、一個停止位、無奇偶校驗、全雙工、bcc校驗碼。此外要使用rslinx的opc接口作為服務器,還要在rslinx中對opc進行配置。
3.2 安裝opc自動化接口服務
若要用vb開發(fā)opc應用程序,必須安裝opc自動化接口服務,保證計算機系統(tǒng)目錄下有opcdaauto.dll。opc基金會提供了一個叫做“自動化包裝器”的動態(tài)連接庫,從opc基金會的網(wǎng)站(www.opcfoundation.org)可下載。在vb環(huán)境中,按“工程”的子菜單“引用…”后,彈出對話框,選擇其中的“rslinx opc automation 2.0”項,這樣才能使用自動化接口。
3.3 程序設計
用vb編寫了opc客戶端應用程序,實現(xiàn)了上位機與logix5550控制器之間的通信。主要程序代碼如下:
(1) 連接opc服務器
dim withevents myopcserver as opcserver ‘定義服務器對象變量myopcserver
dim withevents myopcgroup as opcgroup ‘定義opc組對象變量myopcgroup
set myopcserver = new opcserver
myopcserver.connect "rslinx opc server" ‘連接rslinx 的opc服務器
(2) 添加opc組對象
set myopcgroup=myopcserver.opcgroups.add("group1")
‘添加opc組對象myopcgroup.issubscribed= true
‘設置該組數(shù)據(jù)為后臺刷新
myopcgroup.isactive = true
‘設置該組為激活狀態(tài)
myopcgroup.updaterate=1000
‘設置數(shù)據(jù)刷新時間為1000
(3) 添加數(shù)據(jù)項
dim abitemids() as string
‘項標識符
dim abclienthandles() as long
‘客戶端句柄
dim abserverhandles() as long
‘服務器端句柄
dim aberrors() as long
dim i as long
itemcount=5
dim oopcitem as rslinxopcautomation.opcitem
for i = 1 to 5
abitemids(i) = "[" & txttopic & "]" & txtitem(i) ‘將topic名和標簽名賦給項標識符
abclienthandles(i) = i
‘給客戶端句柄賦值
next i
myopcgroup.opcitems.additems itemcount, abitemids, abclienthandles, abserverhandles, aberrors
‘添加數(shù)據(jù)項操作
(4) 同步數(shù)據(jù)讀寫
opc數(shù)據(jù)存取有同步方式和異步方式兩種。異步讀寫數(shù)據(jù)復雜,需要與事件結合使用,與同步相比速度慢但準確性高。同步讀寫數(shù)據(jù)簡單,直接使用opcitem的方法即可。
dim one as opcitem
dim index as long
‘index為標簽順序號
dim oneread as string
dim xie as string
set one = myopcgroup.opcitems(index)
one.read opccache
oneread = one.value
‘讀數(shù)據(jù)
one.write (xie)
‘寫數(shù)據(jù)
若只讀取數(shù)據(jù),可以使用datachange事件,當控制器中所要訪問的數(shù)據(jù)一旦發(fā)生改變時將會觸發(fā)該事件,并將該數(shù)據(jù)自動讀到txtvalue文本框。
private sub myopcgroup_datachange(byval transactionid as long, byval numitems as long, clienthandles() as long, itemvalues() as variant, qualities() as long, timestamps() as date)
‘自動刷新數(shù)據(jù)
dim i as long
for i = 1 to numitems
txtvalue(clienthandles(i)) = itemvalues(i)
‘獲取項的值
txttime(clienthandles(i)) = timestamps(i)
‘獲取項的時間戳
txtquantity(clienthandles(i))=getqualitystring(qualities(i))
‘獲取項的品質(zhì)
next i
end sub
(5) 斷開opc服務器
myopcserver.opcgroups.removeall
‘移除所有opc group,空出資源
set myopcgroup = nothing
myopcserver.disconnect
‘斷開連接
4 結束語
利用本文介紹的方法,在實驗室實現(xiàn)了上位機和plc之間的通信,圖1是opc客戶端設置界面。此外我們還設計了城市供水監(jiān)控系統(tǒng),鑒于篇幅,監(jiān)控界面不再一一列出。