強明輝,張琳琳,馬永煒
(蘭州理工大學電氣工程與信息工程學院,甘肅 蘭州 730050)
SIMATIC WinCC是由西門子公司和微軟公司共同開發(fā)的一款功能強大的HMI/SCADA應用軟件系統(tǒng)[1]。WinCC本身具有自己的歸檔數(shù)據(jù)庫,但其進行歸檔后的數(shù)據(jù)庫為壓縮格式,需要通過WinCC專門集成的工具分析并顯示數(shù)據(jù),這為第三方的訪問帶來了很多不便。由于WinCC集成了OPC技術,所以可以對其進行二次開發(fā)。本文是利用VB編寫OPC客戶端,以WinCC作為OPC的服務器,利用OPC協(xié)議實現(xiàn)VB和OPC之間的動態(tài)數(shù)據(jù)交換,然后通過VB的ADO數(shù)據(jù)接口,把數(shù)據(jù)存儲到數(shù)據(jù)庫中。解決了WinCC實時數(shù)據(jù)轉存到標準數(shù)據(jù)庫的難題,為企業(yè)管理和監(jiān)控系統(tǒng)提供了標準的數(shù)據(jù)源。
OPC是針對于不同供應廠商的設備和應用程序之間的軟件接口標準化,使其間的數(shù)據(jù)交換更加簡單化的目的而提出的。OPC技術將各個設備驅動程序和通訊程序封裝成獨立的OPC服務器,OPC客戶端無需知道系統(tǒng)的性能特點,而只需通過標準的OPC接口訪問OPC服務器[2-5]。
OPC的核心是COM/DCOM技術,COM技術是一種軟件組件間相互數(shù)據(jù)交換的有效方法,COM對象分為客戶端和服務器兩類,客戶端通過COM接口訪問服務器。
OPC數(shù)據(jù)訪問提供從數(shù)據(jù)源讀取和寫入特定數(shù)據(jù)的功能。OPC客戶程序通過接口從服務器讀取數(shù)據(jù)或寫入數(shù)據(jù)。在OPC客戶機訪問服務器時,需要創(chuàng)建一個服務器對象,調用這個服務器對象的接口,服務器對象創(chuàng)建組對象并返回組對象的指針,客戶程序獲得組對象的指針后調用其接口。OPC客戶程序訪問服務器的結構圖如圖1。
2.1.1 WinCC的OPC服務器設置
WinCC的OPC服務器設置需要分幾步完成:
圖1 OPC客戶程序訪問服務器結構圖
1)在安裝WinCC的時候需要安裝OPC Server,具體方法是在安裝選項的Communication組件中,選擇OPC Server項。
2)對 WinCC的 OPC服務器進行DCOM設置。具體方法是單擊“開始”菜單并選擇“運行”,輸入dcomcnfg,打開“組件服務”對話框;在此對話框中,單擊“組件服 務”——“我 的 電 腦 ”——“DCOM配置”——選擇“OPCServer.WinCC”——右鍵“屬性”按鈕,打開“OPCServer.WinCC 屬性”對話框;在此對話框中,單擊“安全”選項中自定義啟動和激活權限,在“標識”標簽中選擇“交互式用戶”選項。
3)在完成上述步驟以后,打開組態(tài)好的WinCC監(jiān)控界面。參數(shù)設置界面如圖2所示。
2.1.2 OPC客戶端的設計及編程
利用Visual Basic開發(fā)OPC客戶程序時,要對DLL進行注冊。具體的方法是從VB菜單中選擇“工程”——“引用”,在可用的引用一覽表中,選擇OPC Automation 2.0后按確定。
圖2 WinCC人機界面顯示
1)VB窗體設計
注冊完DLL以后,就要設計VB的窗體。在窗體上添加兩個Command按鈕,分別命名為連接服務器和退出。根據(jù)項目要求,需同步傳輸23個數(shù)據(jù),在窗體上布局23個Text控件會比較麻煩,本文采用編程的方式,在程序運行時,將23個Text控件同時顯示在窗體上。部分代碼如下:
Load Text1(I)//上載Text控件數(shù)組
Load Label1(I)//上載Label控件數(shù)組
Label1(I).Left=((I-1)10)*(Label1(1).Width+2000)+Label1(1).Left //Label控件的橫坐標
Label1(I).Top=((I-1)Mod 10)*(Label1(1).Height+100)+Label1(1).Top//Label控件的縱坐標
Text1(I).Left=((I-1)10)*(Text1(1).Width+2200)+Text1(1).Left //Text控件的橫坐標
Text1(I).Top=((I-1)Mod 10)*(Text1(1).Height+100)+Text1(1).Top//Text控件的縱坐標
Label1(I).Visible=True
Text1(I).Visible=True
VB窗體如圖3。
圖3 VB窗體設計
2)OPC客戶端編程
VB的OPC客戶端和OPC服務器之間數(shù)據(jù)互相通訊的主要源代碼如下:
變量聲明
Dim WithEvents objServer As OPCServer //OPC服務
Dim WithEvents objGroup As OPCGroup //OPC組
Dim objGroups As OPCGroups
Dim objTestGrp As OPCGroup
Dim objItems As OPCItems
Dim lClientHandles(23)As Long//客戶句柄
Dim ServerHandles()As Long//服務器句柄
Dim lErrors()As Long
Dim ItemIDs(23)As String//OPC的標簽
Dim vtItemValues()As Variant//用于存儲OPC數(shù)據(jù)的地址
Dim a(1 To 23)As Variant
連接服務器
Set objServer=New OPCServer//創(chuàng)建新的OPC服務器
objServer.Connect("OPCServer.WinCC.1")
//連接OPC服務器
If objServer.ServerState=OPCRunning Then
Option1.Value=True//連接服務器成功的標志
添加OPC組和OPC標簽
Set objGroups=objServer.OPCGroups//添加一個OPC組集合
Set objTestGrp=objGroups.Add("TestGrp")
//添加一個OPC組
Set objItems=objTestGrp.OPCItems//建立OPC標簽集合
For I=1 To 23//生成23個項標識符
ItemIDs(I)="bb"&I
lClientHandles(I)=I
objItems.AddItems 23,ItemIDs,lClientHandles,ServerHandles,lErrors//添加OPC標簽
斷開服務器
objItems.Remove 23,ServerHandles,lErrors
//清除OPC的標簽
objGroups.Remove"TestGrp"http://清除 OPC 組
objServer.Disconnect//斷開 OPC 的服務器
Set objItems=Nothing
Set objTestGrp=Nothing
Set objServer=Nothing
本程序是利用Timer1的Timer事件來進行數(shù)據(jù)更新的顯示,如果數(shù)據(jù)有新的更新就要導入到數(shù)據(jù)庫中,有關定時器的代碼將在下面介紹。
當數(shù)據(jù)由WinCC傳輸?shù)絍B以后,由于VB不是一個存儲單元,所以要將數(shù)據(jù)存儲到指定的歸檔數(shù)據(jù)庫中,以備報表查詢。因為該項目的數(shù)據(jù)量不大,選用Access為歸檔數(shù)據(jù)庫。
2.2.1 VB訪問數(shù)據(jù)庫的ADO接口
在VB中,常用的數(shù)據(jù)訪問接口有下列幾種:Active數(shù)據(jù)對象ADO,開放式數(shù)據(jù)庫連接ODBC,遠程數(shù)據(jù)庫對象RDO,數(shù)據(jù)庫訪問對象DAO。其中ADO接口是Microsoft開發(fā)數(shù)據(jù)庫應用程序面向對象的新接口。采用了OLE DB的數(shù)據(jù)訪問模式,是數(shù)據(jù)訪問對象DAO、遠程數(shù)據(jù)對象RDO和開放數(shù)據(jù)庫互聯(lián)ODBC三種方式的擴展,具有更加簡單、靈活的操作性能[6]。
ADO對象模型定義了一個可編程的分層對象集合,主要有三個對象成員Connection、Command和Recordset對象,以及幾個集合對象Errors、Parameters和Fileds等組成。
2.2.2 VB利用ADO接口訪問數(shù)據(jù)庫
在VB使用ADO控件訪問Access前,先要在Access中進行歸檔數(shù)據(jù)庫環(huán)境設置。在Access中建立一個名為溫度的數(shù)據(jù)庫,并在該數(shù)據(jù)庫的子目錄中新建一張表,命名為現(xiàn)場溫度記錄,這張表用于存儲從WinCC服務器中獲得的現(xiàn)場溫度數(shù)據(jù)。接著,在VB的開發(fā)環(huán)境下開發(fā)與數(shù)據(jù)庫連接的程序,本次使用的VB控件主要是Timer和Adodc,相應的程序設計步驟如下。
1)建立VB與歸檔數(shù)據(jù)庫鏈接。在VB中使用Adodc控件前,必須先對其進行設置,具體方法是:
首先,通過“工程”——“部件”菜單命令選擇“Microsoft ADO Data Control 6.0(SP6)(OLEDB)”選項,將ADO數(shù)據(jù)控件添加到工具箱,點擊ADO數(shù)據(jù)控件,將其添加到窗體上。
然后,設置Adodc2的ConnectionString屬性,在Adodc2控件上右鍵“Adodc屬性”——使用連接字符串——單擊“生成”按鈕——選擇 Microsoft Jet 4.0 OLE DB Provider——單擊“下一步”按鈕——選擇或輸入數(shù)據(jù)庫名稱——單擊“測試連接”按鈕——彈出測試連接成功對話框—點擊“確定”按鈕即可。
最后,設置Adodc2的RecordSource屬性,選擇命令類型為2-adCmdTable,在表名項選擇現(xiàn)場溫度記錄。
根據(jù)工藝要求,本項目需要同步傳輸23個數(shù)據(jù),所以需要23個Text控件,這些控件是通過編程來顯現(xiàn)在VB的窗體上的,對于這些控件的ADO屬性設置,我們也需編程實現(xiàn),部分代碼如下:
Set Text1(I).DataSource=Adodc2'將所有 Text控件的 DataSource 屬性設置為Adodc2
設置所有Text控件的DataFiled屬性
For I=1 To 8
Text1(I).DataField="體熱風"& I& "溫度"
Next
For I=9 To 16
Text1(I).DataField="帽熱風"&I-8&"溫度"Next
Text1(17).DataField="體水槽溫度"
Text1(18).DataField="體膠罐溫度"
Text1(19).DataField="體膠液溫度"
Text1(20).DataField="帽水槽溫度"
Text1(21).DataField="帽膠罐溫度"
Text1(22).DataField="帽膠液溫度"
Text1(23).DataField="廠房溫度"
2)實現(xiàn)實時數(shù)據(jù)的存儲。在窗體上插入一個定時器控件,命名為Timer1,將其Interval屬性設置為100,在Timer1_Timer()事件中編程。為了不產生冗余,建了一個數(shù)據(jù)緩沖數(shù)組,把每次提取出來的數(shù)據(jù)同之前的數(shù)據(jù)緩沖組中的值作對比,若不同就插入數(shù)據(jù)庫,同時更新數(shù)據(jù)緩沖數(shù)組中的值。部分代碼如下:
PrivateSub Timer1_Timer()
Dim Update As Boolean
Dim I As Integer
SyncRead OPCCache,vtItemValues,lErrors
//同步讀取WinCC的數(shù)據(jù)
For I=1 To 23
If vtItemValues(I)<>a(I)Then//將OPC標簽數(shù)組中的數(shù)和緩沖數(shù)組中的數(shù)進行對比
Update=True
Exit For
End If
Next
If Update Then
Adodc2.Recordset.AddNew//向 Access數(shù)據(jù)庫中插入數(shù)據(jù)
Adodc2.Recordset.Fields("日期及時間")=Now//向 Access數(shù)據(jù)庫中插入當前的日期和時間
For I=1 To 23
Text1(I).Text=vtItemValues(I)
a(I)=vtItemValues(I)
Next
Adodc2.Recordset.Update//保存插入到數(shù)據(jù)庫中的數(shù)據(jù)
End If
End Sub
部分實時數(shù)據(jù)進入表后如圖4。
圖4 數(shù)據(jù)存入Access數(shù)據(jù)庫
由圖4可知,只要WinCC從下位機采集的這一組數(shù)據(jù)中的任何一個數(shù)據(jù)有變化,那么該組數(shù)據(jù)就會傳入到數(shù)據(jù)庫中。根據(jù)工藝要求可知,每個采集點的溫度均有一定的范圍,超過這個范圍就會對設備或產品產生一定的損害,所以需建立一個查詢,當溫度高于該范圍時,將其篩選出來,插入到該數(shù)據(jù)庫的另外一個表中,供以后的分析。構造的SQL語句通式如下:
Insert into+“表名”+select+“選擇內容”+from+“表名”+where+“條件”
建立查詢的相關步驟如下:
1)在數(shù)據(jù)庫溫度中再建立一張新表,命名為查詢溫度,用來存儲查詢出來的超出范圍的溫度。
2)在VB窗體上再布局一個ADO控件,命名為Adodc1,將其的ConnectionString設置的與Adodc2一樣,RecordSource屬性設置為查詢溫度。然后編寫代碼:Adodc1.RecordSource="SQL語句"即可以進行相關的查詢。
利用VB設計的OPC客戶端數(shù)據(jù)接口,傳輸數(shù)據(jù)穩(wěn)定,實時性好,能同時傳輸大批量數(shù)據(jù)。ADO數(shù)據(jù)庫接口簡單,傳輸穩(wěn)定,實時性好,技術成熟。通過OPC技術和ADO接口有效地完成了WinCC到數(shù)據(jù)庫轉儲功能。為企業(yè)進一步分析數(shù)據(jù),利用數(shù)據(jù),提供了可靠的數(shù)據(jù)源。
[1]甄立東.西門子 WinCC V7基礎與應用[M].北京:機械工業(yè)出版社,2011.
[2]日本OPC協(xié)會.OPC應用程序入門[M].日本:2002.
[3]韋源,于平.Visual Basic程序設計基礎[M].北京:清華大學出版社,2001.
[4]朱翠苗,鄭廣成.VB訪問SQL Server數(shù)據(jù)庫的幾種方案[J].河南科技大學學報,2004,3(25):66-69.
[5]林啟寬.用 VB開發(fā) WinCC的OPC客戶機[J].工業(yè)控制計算機,2006,19(8):80-81.
[6]趙秀梅.基于WinCC工控組態(tài)軟件的關系數(shù)據(jù)庫的研究[J].微型機與應用,2010,29(6):1-2.