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