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