1 前言
目前國內閘門監控系統設計的方案基本上是PLC+上位機模式,而上位監控軟件大多是購買現成的集成系統和商業組態軟件來實現的。但在缺少資金的情況下要進行小型項目自動化建設或改造,就不得不考慮成本問題,因為組態軟件是按點數賣錢的,定義一個變量就算一個點,價格昂貴。而采用高級語言結合OPC技術開發監控軟件不僅可以節省大量的成本而且可以擺脫對設備驅動程序的依賴,尤其是在對老項目進行自動化改造時,這種優勢更加明顯。
機遇以上考慮,筆者在參與安徽淮河流域某小型閘門自動化改造工程時,采用了Visual Basic 6.0開發環境,應用OPC自動化接口技術開發了OPC客戶端程序(閘門監控系統的監控軟件)。服務器采用凱譜華的 KEPServerEx.V4。她嵌入了工業市場上廣泛范圍(超過80多種支持100種以上設備型號的可下載驅動程序)的驅動程序和組件 ,更重要的是,這個服務器是完全免費的。
2 OPC知識簡介
2.1 OPC基本概念
OPC是OLE for Process Control的縮寫,即把OLE應用于工業控制領域。OPC建立在OLE規范之上,它為工業控制領域提供了一種標準的數據訪問機制。
OPC技術采用COM/DCOM技術的客戶/服務器(Client/Server)模型,使OPC的通用性得到擴展。相應的OPC應用程序的開發就有了OPC客戶端程序部分和OPC服務器程序部分的開發。一般來說,OPC服務器程序由硬件的生產廠商開發;而OPC客戶端程序由用戶開發。
2.2 OPC結構原理
2.2.1 OPC基本體系結構
OPC規范提供了兩套接口方案,即COM接口和自動化。COM接口效率高,通過該接口,客戶能夠發揮OPC服務器的最佳性能,采用C++語言的客戶一般用COM接口方案;自動化接口使用解釋性和宏語言訪問OPC服務器,采用Visaul Basic語言的客戶一般采用自動化接口。典型的OPC體系如下圖所視:
圖1 典型OPC體系機構圖
Figure1 OPC architecture
2.2.2 OPC自動化服務器對象模型
OPC自動化服務器對象的組織是層次結構,其對象模型如圖5-1所示:
圖2 OPC 自動化服務器對象模型
Figure2 Automation Object Hierarchy
服務器對象(Server)擁有服務器的所有信息,同時也是組對象(Group)的容器。OPC組對象(Group)提供了OPC客戶程序用來組織數據的一種方法。在每個組對象中,客戶可以加入多個OPC數據項(Item)。OPC數據項(Item)是服務器端定義的對象,通常指向設備的一個寄存器單元。OPC客戶對設備寄存器的操作都是通過其數據項來完成的,通過OPC數據項(Item),OPC規范盡可能地隱藏了設備的特殊信息,也使OPC服務器的通用性大大增強。OPC數據項(Item)并不提供對外接口,客戶不能直接對之進行操作,所有的操作都是通過組對象進行的。每個OPC數據項(Item)的數據結構包括三個成員變量:即數據值、數據質量和時間戳。數據值是以Variant形式表示的。一個OPC服務器中只能有一個OPC瀏覽器對象,而且它是可選的。OPC瀏覽器對象是為了讓客戶程序可以瀏覽到OPC服務器的配置而設計的,它把OPC服務器上可用的東西顯示給用戶。
2.2.3 OPC技術優勢
一個完整的基于OPC技術的監控系統由OPC客戶端程序和OPC服務器程序組成,實際上實現了用戶和設備供應商開發監控系統的分工。利用OPC技術實際上就等于客戶端程序不用直接從硬件上讀取數據,而是直接從OPC服務器上讀取數據,設計OPC服務器程序的廠商已經完成了OPC服務器程序與硬件設備的數據存取。而且任意的OPC服務器的接口是標準統一的,這使得客戶程序能用一種標準的方法去訪問任意廠商的OPC服務器程序。每個用戶就不必各自開發和硬件的通信程序,就可以直接讀取OPC服務器的數據,提高了代碼的重用性。也就是說OPC客戶端程序一旦開發成功了,就可以應用到任意一個帶有OPC服務器的監控系統中。OPC技術將監控系統的復雜性大大地簡化后,軟件開發的周期也大大縮短了,用戶就可以不需要購買比較昂貴的商業組態軟件而獨立開發OPC客戶端程序。
3 客戶端監控程序開發
3.1引用OPC自動化接口
建立新工程或項目,在“工程”菜單下選擇“引用”,如圖5-3所示。只有引用OPCDAAuoto.DLL后,在程序中才能創建服務器對象,然后進行一系列的操作。
圖3 打開引用對話框
Figure3 Open Reference Dialog
(2)在彈出的引用窗口里單擊“瀏覽(B)…”按鈕,彈出添加引用窗口,選擇OPCDAAuoto.DLL文件。
(3)在引用窗口里的OPC Automation 2.0前面打鉤,按“確定”按鈕。如圖5-4所示:
圖4 選擇引用項目
Figure4 Select Reference Item
3.2程序開發
3.2.1定義全局變量
變量類型應該指定為對象型。這些對象最好在窗體的通用部分聲明加上“Option Explicit”語句,表示模塊里的所有變量都需要顯式聲明。由于OPC自動化接口的數組的索引要求必須從1開始,而系統默認是從0開始,為了避免錯誤最好在代碼的最初加上“Option Base 1”語句。為了使對象可以處理事件,必須將myTestGrp和myServer的聲明中加上“WithEvents”語句,表示聲明的對象可以響應事件。
Option Explicit
Option Base 1
Dim WithEvents myServer As OPCServer
Dim myGroups As OPCGroups
Dim WithEvents myTestGrp As OPCGroup
Dim myItems As OPCItems
3.2.2連接OPC服務器和建立OPC組主要程序
連接子程序:
Sub Connect(strProgID As String, Optional strNode As String)
If myServer Is Nothing Then
' 建立一個OPC服務器對象
Set myServer = New OPCServer
End If
If myServer.ServerState = OPCDisconnected Then
' 連接OPC服務器
myServer.Connect strProgID, strNode
End If
在Visual Basic中,通過執行一個Set操作實現調用其它接口的方法。
If myGroups Is Nothing Then
' 建立一個OPC組集合
Set myGroups = myServer.OPCGroups
End If
If myTestGrp Is Nothing Then
' 添加一個OPC組
Set myTestGrp = myGroups.Add("Group")
End If
End Sub
ServerState屬性一共有OPCRunning、OPCFailed、OPCNoconfig、OPCSuspended、OPCTest和OPCDisconnected六個,分別表示正在運行、失敗、沒有配置、暫停、測試和沒有連接六種OPC服務器當前的狀態。如果OPC服務器沒有連接,我們才執行myServer.Connect strProgID, strNode語句。strProgID就是ProgID,strNode就是用于遠程通信的IP地址。
在窗口登陸時調用連接子程序,便可以連接到你需要的服務器。
Call Connect("KEPware.KEPServerEx.V4")
3.2.3添加OPC標簽
對服務器進行訪問前,必須先在OPC組里添加要訪問的OPC標簽。為了編程方便,在服務器端,將每個閘門的升、降、停止、開度、水位、流量 等監控量組態為TAGI(I=1,2…15)
Sub AddItem()
Dim strItemIDs(15) As String
Dim lClientHandles(15) As Long
Dim lErrors() As Long
Dim I As Integer
myTestGrp.IsSubscribed = True ' 啟動組異步通知。
Set myItems = myTestGrp.OPCItems ' 建立OPC項集合
For I = 1 To 15 ' 生成從TAG1到TAG15的項標識符
strItemIDs(I) = "Server.Group.TAG" & I
lClientHandles(I) = I
Next
Call myItems.AddItems(15, strItemIDs, lClientHandles, lServerHandles, lErrors)
End Sub ' 添加OPC項
3.2.4異步讀取代碼的實現
在定時器事件內進行執行AsyncRead子程序的讀取代碼
Sub AsyncRead()
Dim lErrors() As Long
If myTestGrp Is Nothing Then
Exit Sub
End If
If myTestGrp.OPCItems.Count > 0 Then
' 異步讀取
lTransID_Rd = lTransID_Rd + 1
myTestGrp.AsyncRead 15, lServerHandles, lErrors, lTransID_Rd, lCancelID_Rd
End If
End Sub
AsyncWrite子程序,完成異步寫的操作。
Sub AsyncWrite(nIndex As Integer, ByRef vtItemValues() As Variant, _
ByRef lErrors() As Long)
Dim lHandle(1) As Long
If myTestGrp Is Nothing Then
Exit Sub
End If
If myTestGrp.OPCItems.Count > 0 Then
lHandle(1) = lServerHandles(nIndex)
' 異步寫入
lTransID_Wt = lTransID_Wt + 1
myTestGrp.AsyncWrite 1, lHandle(), vtItemValues, _
lErrors, lTransID_Wt, lCancelID_Wt
End If
End Sub
3.2.5斷開OPC服務器
連接著OPC服務器的OPC客戶應用程序,在退出前必須斷開和OPC服務器的連接。斷開連接前要清除 項和組.
Sub Disconnect()
Dim lErrors() As Long
If Not myItems Is Nothing Then
If myItems.Count > 0 Then
myItems.Remove 15, lServerHandles, lErrors ' 清除OPC項
End If
Set myItems = Nothing
End If
If Not myTestGrp Is Nothing Then
myGroups.Remove "Group"' 清除OPC組
Set myTestGrp = Nothing
End If
If Not myGroups Is Nothing Then
Set myGroups = Nothing
End If
If Not myServer Is Nothing Then
If myServer.ServerState <> OPCDisconnected Then
myServer.Disconnect' 斷開OPC服務器.
End If
Set myServer = Nothing
End If
End Sub
4 結論
OPC技術應用于工業控制領域,大大的突破了傳統設備的概念,通過一個接口標準(規范)方便的將現場任何一個符合OPC規范的設備數據收集與處理,從而擺脫了傳統上的編寫驅動程序的重復勞動,使工程人員在設備選擇上有了更大的自主性。
隨著組態軟件的發展,監控系統開發越來越“傻瓜化”,只需要簡單的連接就可以完成一個工程的基本組態,然而,一旦面臨對組態軟件中沒有的設備時,就無能為力了。在項目改造過程中,這種情況尤為明顯。
在面臨大量諸如小型水利閘門監控系統一樣的各種小型工業監控系統改造的情況下,應用OPC不僅可以大大的節約系統開發的時間,而且也能充分利用現有設備,節省開支。可以說,在小型工控系統改造中,OPC技術結合高級語言開發監控軟件將具有很大的優勢。
【參考文獻】
【1】 OPC Foundation. Data Access Custom Interface Standard Specification 2.0[S],1998.10.14.
【2】 詹根基,郭厚焜.基于OPC的客戶端監控程序的開發.自動化博覽,2005,Vol.22增刊 (9):105-1
【3】 范逸之.Visual Basic 與分布監控系統——RS232/485串行通信,清華大學出版社,2002
【4】 馬國華.監控組態軟件及其應用,清華大學出版社,2002
【5】 潘愛民.COM原理與應用,清華大學出版社,2000