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