李艷姣,王建民,張 杰
(河北聯(lián)合大學電氣工程學院,河北唐山 063009)
Visual Basic是一種可視化編程方法,是應用廣泛的編程語言[1]。在用VB進行智能控制算法的軟件設計時,存在WINCC組態(tài)軟件與VB之間的數據交換問題。WINCC組態(tài)軟件支持OPC技術,而且OPC具有高速的數據傳送性能、開發(fā)成本低,具有很強的優(yōu)越性。
選礦廠的磨礦過程具有機理復雜、過程影響因素多,非線性、大滯后和時變性的特性,常規(guī)的PID控制難以取得很好的控制效果[2]。集散控制主要提供了梯形圖、功能塊圖的編程方式,如果要完成智能控制(例如模糊控制),需編制相應的程序模塊。SIMATIC WINCC提供OPC技術,采用VB編寫了相應的智能控制程序,并用OPC技術實現與WINCC的數據交換。
采用S7-300PLC和工控機構成DCS系統(tǒng),其監(jiān)控系統(tǒng)結構圖如圖1所示。
圖1 系統(tǒng)結構圖
(1)生產管理層主要是面向該廠的領導層,通過以太網,董事長、總經理和礦長等在辦公室對現場的情況進行了解。
(2)監(jiān)控操作層主要包括作為服務器的工業(yè)控制計算機和中控室,操作人員在中控室可以監(jiān)控生產現場各個信號的變化并進行相應的操作,服務器負責層與層之間的通訊,同時該層所記錄的數據也為日后的數據分析和系統(tǒng)故障分析帶來了方便。中控室中的集中監(jiān)控站軟件采用WINCC V6.0。SIMATIC WINCC全面支持OPC技術,WINCC中的OPC符合OPC基金會的OPC規(guī)范,因此,將WINCC作為OPC服務器[3]。
(3)過程控制層由2個S7-300PLC和6個ET200遠程分站組成,與中控室進行通訊,還與現場設備相連接。
有些組態(tài)軟件的數據庫是經過加密封裝的,用戶無法從外部直接訪問其中的數據,雖然WINCC軟件的數據庫未加密,但是數據庫中的表名、表的結構等都是保密的,這樣給數據共享帶來的困難。需要從監(jiān)控站上實時獲取相關的生產數據來控制磨機負荷的給定控制。因此,采用運算能力較強的VB編程語言實現,VB程序通過OPC接口實現與WINCC的數據交換。
OPC(OLE for Processing Control,用于過程控制的OLE技術)是為了保證不同軟件產品、硬件設備及現場的數據能進行交換而由OPC基金會制定的。OPC服務器有3種對象:服務器(Server)、組(Group)、數據項(Item)[4]。OPC服務器作為數據源程序,收集現場的數據信息,通過OPC接口傳送給OPC客戶端;OPC客戶端作為數據接收程序[5]。該系統(tǒng)的OPC體系接口如圖2所示。
圖2 OPC的體系結構
WINCC組態(tài)軟件按服務器提供OPC接口,VB中的OPC自動化接口為OPC客戶端模式編寫OPC接口軟件。VB開發(fā)的OPC客戶端能夠實現與OPC服務器之間的連接、斷開和讀取數據的功能。
3.1WINCCOPC服務器的設置
由于WINCC OPC服務器與客戶端程序運行在網絡不同的計算機上,要進行數據交互,則需對OPC服務器進行相應的DCOM的設置。Windows XP下的dcomcnfg.exe是專門對遠程訪問DCOM進行設置的工具。在計算機的“開始”菜單選擇“運行”,并在輸入框中輸入dcomcnfg.exe,打開“分布式DCOM組態(tài)屬性”對話框,選擇“應用程序”標簽,從應用程序的顯示列表中選擇“OPCServer.Wincc”條目。單擊“屬性”按鈕,進行“OPCServer.Wincc”屬性的設置,完成DCOM的組態(tài)[6]。
在WINCC中要建立通過OPC通訊的變量。 值得注意的是,WINCC OPC 服務器必須與客戶機位于相同的網絡上[7]。
3.2OPC客戶應用程序的編寫
服務器與客戶端之間的數據交互主要包括創(chuàng)建與連接服務器對象;添加組、項;進行數據的讀寫[8]。VB開發(fā)的OPC客戶端流程如圖3所示。
圖3 客戶端程序流程圖
VB開發(fā)OPC客戶端的設計步驟為:在VB中新建1個工程,在VB工具欄中利用“工程-引用”將Siemens OPC DAAutomation 2.0控件加入,然后編寫VB客戶端程序。
3.2.1變量聲明
先對OPC對象的變量進行聲明,變量的數據類型應該指定為對象型。這些變量在窗體代碼的通用部分進行聲明。這樣,就可以在窗體的任何位置代碼內引用。在模塊代碼的開始部分,加上“Option Explicit”語句,表示模塊里所有變量需要顯式的聲明。OPC自動化接口數組的索引要求必須從1開始[9]。
Dim WithEvents MyobjServer As OPCServer ‘定義OPC服務器
Dim MyobjGroups As OPCGroups ‘定義OPC標簽組
Dim MyobjGroup As OPCGroup ‘定義OPC組
Dim MyobjItems As OPCItems ‘OPC項對象
Dim lServerHandles() As Long ‘句柄
Dim ClientHandles() As Long
Dim errors() As Long
3.2.2OPC的連接
所有變量定義后,進行OPC連接的編程??紤]到代碼的重復利用,采用子程序的方法進行編程。然后調用該子程序實現和OPC服務器連接。
Sub Connect()
If MyobjServer Is Nothing Then
‘創(chuàng)建1個OPC服務器對象
Set MyobjServer = New OPCServer
End If
If MyobjServer.ServerState = OPCDisconnected Then
‘連接OPC服務器
MyobjServer.Connect strProgID,strNode
End If
If MyobjGroups Is Nothing Then
‘建立1個OPC組集合
Set MyobjGroups = MyobjServer.OPCGroups
End If
If MyobjTestGrp Is Notbing Then
‘添加1個OPC組
Set MyobjtTestGrp = MyobjGroups.Add("TestGrp")
End If
End Sub
3.2.3添加OPC標簽
對OPC服務器訪問前,應先在OPC組里添加要訪問的OPC標簽。添加OPC標簽的子程序為:
Sub AddItem()
Dim strItemIDs(10) As String
Dim lClientHandles(10) As Long
Dim lErrors() As Long
Dim I As Integer
If MyobjTestGrp Is Nothing Then
Exit Sub
End If
If Not MyobjItems Is Nothing Then
If MyobjItems.Count > 0 Then
Exit Sub
End If
End If
‘設置組活動狀態(tài)
MyobjTestGrp.IsActive = True
‘取消組異步通知
Set MyobjItems = MyobjTestGrp.OPCItems
‘生成從TAG1到TAG8的項標識符
For I = 1 To 8
strItemIDs(I) = "TAG" & I
lClientHandles(I) = I
Next
‘添加OPC標簽
Call MyobjItems.AddItems(10,strItemIDs,lClientHandles,lErrors)
End Sub
3.2.4OPC變量的讀寫
在讀取前,為了避免錯誤發(fā)生,對OPC組和OPC標簽數進行檢查。讀寫的子程序為:
Sub SyncRead(nSource As Integer,ByRef vtItemValues() As Variant,ByRef lErrors() As Long)
If MyobjTestGrp Is Nothing Then
Exit Sub
End If
If MyobjTestGrp.OPCItems.Count>0 Then
‘同步讀取
MyobjTestGrp.SyncRead nSource,8,lServerHandles,vtItemValues,lErrors
End If
End Sub
Sub SyncWrite(nIndex As Integer,ByRef vtItemValues() As Variant,ByRef lErrors() As Long)
Dim lHandle(1) As Long
If MyobjTestGrp Is Nothing Then
Exit Sub
End If
If MyobjTestGrp.OPCItems.Count>0 Then
lHandle(1)=lServerHandles(nIndex)
‘同步寫入
MyobjTestGrp.SyncWrite 1,lHandle(),vtItemValues,lErrors
End If
End Sub
3.2.5OPC斷開
連接著OPC服務器的OPC應用程序,在退出前應斷開與OPC服務器的連接。如果不斷開連接,OPC服務器使用的計算機資源將不斷被釋放,如果長期反復發(fā)生,連接運轉的控制系統(tǒng)可能會使計算機的資源慢慢枯竭,從而發(fā)生嚴重的問題[10]。
Sub Disconnect()
Dim lError() As Long
If Not MyobjItems Is Nothing Then
If MyobjItems.Count > 0 Then
‘清除OPC標簽
MyobjItems.Remove8 ,lServerHandles,lErrors
End If
Set MyobjItems = Nothing
End If
If Not MyobjTestGrp Is Nothing Then
‘清除OPC組
MyobjGrounps.Remove "TestGrp"
Set MyobjTestGrp = Nothing
End If
If Not MyobjGroups Is Nothing Then
Set MyobjGroups = Nothing
End If
If Not MyobjServer Is Nothing Then
If MyobjServer.ServerState < > OPCDisconnected Then
‘斷開OPC服務器
MyobjServer.Disconnect
End If
Set MyobjServer = Nothing
End If
End Sub
在某大型選礦廠,為實現磨機負荷的最優(yōu)控制,在外環(huán)功率控制回路中,采用VB編程語言開發(fā)來控制磨機負荷,必須保證WINCC組態(tài)軟件與VB上位機之間的數據交互。采用OPC技術很好地實現了監(jiān)控系統(tǒng)之間的數據交互,滿足了選礦廠的要求,效果良好。圖4為WINCC實時監(jiān)控界面,圖5為VB開發(fā)的磨機負荷控制界面。在實際的應用中,能夠順利地進行數據交換。
圖4 WINCC實時數據界面
文中介紹了磨機負荷控制系統(tǒng)中利用WINCC作為OPC服務器,VB開發(fā)OPC客戶端的方法,重點闡述了VB開發(fā)客戶端程序的設計過程,實現了WINCC與監(jiān)控軟件之間的數據交換操作。在線調試和試運行后,實現了控制系統(tǒng)之間的無縫連接和數據實時共享。
圖5 開發(fā)的磨機負荷控制界面
參考文獻:
[1]趙艷秋,王建民.采用OPC技術實現豎爐燒結DCS系統(tǒng)與VB軟件的接口.計算機與數字工程,2006,34(1):114-117.
[2]鄒金慧,黃宋魏,許江淳.基于PLC的磨礦分級智能控制系統(tǒng).自動化儀表,2007,28(11):43-45.
[3]吳曉蕾,李逸,胡國軍,等.通過OPC實現VB訪問WINCC數據.電氣傳動,2009,39(12):63-66.
[4]尹靜濤,劉利平.OPC技術在高爐生產測控系統(tǒng)中的應用.制造業(yè)自動化,2012,34(1):139-140.
[5]徐思成,李增權,郭國選.基于OPC技術和以太網的異構網絡集成.儀表技術與傳感器,2011(1):109-110.
[6]高德欣,張文武,楊清.利用OPC實現WINCC與監(jiān)控系統(tǒng)的動態(tài)數據交換.中國海洋大學學報,2006,36(4):677-680.
[7]童立均,江智軍,何小斌.OPC技術在水廠生產過程控制系統(tǒng)的應用研究.自動化儀表,2008,29(6):37-41.
[8]匡芬芳.OPC技術在液位控制中的應用.自動化儀表,2011,32(6):46-49.
[9]葉海濤,蘇建元.VB中利用OPC訪問WinCC實現下位機實時報警.測控技術,2005,24(11):50-52.
[10]郭春芬,莊立臣.基于OPC技術的粉塵濃度監(jiān)控系統(tǒng)研究.煤礦機械,2011,32(1):83-85.