在實(shí)際應(yīng)用中,客戶對(duì)于wincc變量記錄的顯示需求各式各樣,比如在excel或者word中顯示變量記錄,以特定的表格顯示歷史數(shù)據(jù)等等。當(dāng)wincc集成的在線表格控件不能滿足客戶需要時(shí),就需要通過自定義的方式來顯示變量歸檔。主要分為兩部分:
(1)從wincc中讀取歸檔數(shù)據(jù)
(2)將歸檔數(shù)據(jù)以特定的格式顯示出來
本文檔介紹從wincc讀取歸檔數(shù)據(jù)的通用方法,并以listview為例,介紹如何顯示歸檔數(shù)據(jù)。對(duì)于其它控件,客戶也可以參考本文檔的腳本和編程思路。
1.測(cè)試環(huán)境
本文檔基于wincc v7.0 asia,并通過ms windows common controls 6.0 listview 控件來顯示讀取的歸檔數(shù)據(jù)。需要的授權(quán)如下:
授權(quán)名稱
個(gè)數(shù)
備注
wincc rc v7.0
1
wincc連通性軟件包v7.0
1
訂貨號(hào)為:6av6371-1dr07-0ax0,授權(quán)通過wincc ole db訪問過程值歸檔。
表 01
2.實(shí)現(xiàn)方式總體思路介紹
本文檔通過調(diào)用wincc ole db數(shù)據(jù)庫(kù)接口驅(qū)動(dòng)(需要wincc連通性軟件包的授權(quán))來訪問wincc的變量歸檔,并在微軟的listview控件中顯示歸檔數(shù)據(jù)。程序結(jié)構(gòu)如下所示:
圖1
其中,自定義函數(shù)的說明如下表所示:
函數(shù)名稱
功能
winccdatasourceaccess(connobj, psql)
建立到數(shù)據(jù)庫(kù)的連接。參數(shù)connobj為連接對(duì)象(adodb.connection),參數(shù)psql為要執(zhí)行的sql查詢語句
winccdatasourceclose(precordset, connobj)
斷開與數(shù)據(jù)庫(kù)的連接,釋放資源。參數(shù)precordset為adodo.recordset對(duì)象,參數(shù)connobj為連接對(duì)象(adodb.connection)
addlistviewheadercolumn(precordset, plistview)
添加listview的列名。參數(shù)precordset為adodo.recordset對(duì)象,參數(shù)plistview為listview對(duì)象
filllistview (precordset, plistview)
參數(shù)precordset為adodo.recordset對(duì)象,參數(shù)plistview為listview對(duì)象。
表 02
具體代碼見附件。
3.具體實(shí)現(xiàn)方法和代碼
3.1 創(chuàng)建到歸檔數(shù)據(jù)庫(kù)的連接
由于wincc的變量歸檔為壓縮數(shù)據(jù),所以必須通過wincc ole db來讀取歸檔數(shù)據(jù)。對(duì)于已經(jīng)安裝wincc的計(jì)算機(jī),不需要安裝wincc連通性軟件包。對(duì)于未安裝wincc的客戶端,必須安裝wincc連通性軟件包。該軟件包含在wincc v7.0的安裝光盤中。
數(shù)據(jù)庫(kù)連接的腳本如下所示:
'定義數(shù)據(jù)庫(kù)連接變量
dim conn
set conn = createobject(adodb.connection)
'定義數(shù)據(jù)庫(kù)查詢腳本(可以根據(jù)需要自定義修改)
dim ssql
ssql=tag:r,'processvaluearchive\tag1','0000-00-00 00:01:00.000','0000-00-00 00:00:00.000'
'通過調(diào)用自定義的數(shù)據(jù)庫(kù)連接函數(shù),建立與數(shù)據(jù)庫(kù)的連接
dim ors
set ors= winccdatasourceaccess(conn,ssql)
其中,自定義的數(shù)據(jù)庫(kù)連接函數(shù)winccdatasourceaccess(connobj,psql),參數(shù)connobj為連接對(duì)象(adodb.connection),參數(shù)psql為要執(zhí)行的sql查詢語句,具體代碼如下所示:
function winccdatasourceaccess(connobj,psql)
'建立到數(shù)據(jù)庫(kù)的連接
on error resume next
'讀取本地的wincc運(yùn)行數(shù)據(jù)庫(kù)名稱
dim datasourcenamert,dataconnectionname
set datasourcenamert = hmiruntime.tags(@datasourcenamert)
datasourcenamert.read
'定義數(shù)據(jù)庫(kù)連接字符串
dim spro, sdsn,sser
spro = provider=winccoledbprovider.1;
sdsn = catalog= & datasourcenamert.value & ;
sser = data source=.\wincc
dataconnectionname = spro + sdsn + sser
' 定義查詢語句字符串
dim ssql
ssql=psql
'建立連接
dim ors,ocom,conn
set conn = createobject(adodb.connection)
set conn=connobj
conn.connectionstring = dataconnectionname
conn.cursorlocation = 3
conn.open
' 創(chuàng)建查詢的命令文本
set ors = createobject(adodb.recordset)
set ocom = createobject(adodb.command)
ocom.commandtype = 1
set ocom.activeconnection = conn
ocom.commandtext=ssql
'執(zhí)行查詢
set ors = ocom.execute
'返回結(jié)果
set winccdatasourceaccess=ors
if err.number <> 0 then
msgbox error code & err.number & source: & err.source & error description & err.description
err.clear
end if
on error go to 0
end function
自定義函數(shù)的創(chuàng)建過程為:在wincc項(xiàng)目管理器中右鍵點(diǎn)擊全局腳本打開vbs全局腳本編輯器項(xiàng)目函數(shù)新建函數(shù)。具體如下圖所示:
圖2
3.2 注冊(cè)microsoft listview control 6.0控件
打開wincc圖形編輯器。在右側(cè)的對(duì)象選項(xiàng)板中單擊“控件”,選中“activex control”,點(diǎn)擊右鍵,選擇“添加移除”。在彈出菜單中,選擇“microsoft listview control 6.0”,點(diǎn)擊“ok”確認(rèn)。
圖3
之后,將“microsoft listview control 6.0”拖動(dòng)到畫面編輯器中,并將對(duì)象名稱設(shè)置為control1。
注意:在腳本中,當(dāng)定義listview對(duì)象時(shí)用到對(duì)象名稱control1。詳情請(qǐng)參考圖1的步驟2。
3.3 添加listview 控件的列名
在listview中添加列名,步驟如圖1的步驟3。自定義函數(shù)addlistviewheadercolumn(precordset, plistview)的具體代碼如下所示:
function addcolumnheader(precordset, plistview)
'添加listview列名
'用于錯(cuò)誤捕獲和處理
on error resume next
dim ors,columncount
set ors=createobject(adodb.recordset)
set ors=precordset
'獲取數(shù)據(jù)庫(kù)中的列數(shù)
columncount=ors.fields.count
'定義操作的listview對(duì)象
dim listviewt
set listviewt=plistview
'清空listview對(duì)象的列數(shù)
listviewt.columnheaders.clear
'用查詢的數(shù)據(jù)庫(kù)表格列名來為listview添加列名(*2)
dim addcolumnindex
for addcolumnindex=0 to columncount-1
listviewt.columnheaders.add , , cstr(ors.fields(addcolumnindex).name)
next
'發(fā)生錯(cuò)誤,提示消息框
if err.number <> 0 then
msgbox addcolumnheader函數(shù)報(bào)錯(cuò),source: & err.source & vbcr & error description: & err.description
err.clear
end if
on error goto 0
end function
3.4 填充listview 控件
在listview中添加列名,步驟如圖1的步驟4。自定義函數(shù)filllistview (precordset, plistview) 的具體代碼如下所示:
function filllistview(precordset,plistview)
'用數(shù)據(jù)庫(kù)查詢的值填充listview
on error resume next
'獲取查詢記錄條數(shù)
dim recordscount,ors
set ors=createobject(adodb.recordset)
set ors=precordset
recordscount=ors.recordcount
'定位到第一條記錄
if (recordscount > 0) then
ors.movefirst
'定義最大的查詢條目(*3)
dim maxline,n
maxline = 10
n=0
'填充數(shù)據(jù)值列
do while (not ors.eof and n < maxline)
n = n + 1
dim oitem,listviewt
set listviewt=plistview
set oitem = listviewt.listitems.add()
oitem.text = ors.fields(0).value
oitem.subitems(1) = ors.fields(1).value
oitem.subitems(2) = formatnumber(ors.fields(2).value, 4)
oitem.subitems(3) = hex(ors.fields(3).value)
oitem.subitems(4) = hex(ors.fields(4).value)
ors.movenext
loop
3.5 關(guān)閉到歸檔數(shù)據(jù)庫(kù)的連接
關(guān)閉與數(shù)據(jù)庫(kù)的連接并釋放資源,步驟如圖1的步驟5。自定義函數(shù)winccdatasourceclose(precordset, connobj)的具體代碼如下圖所示:
function winccdatasourceclose(precordset,connobj)
'關(guān)閉數(shù)據(jù)庫(kù)連接,釋放資源
'獲取連接和查詢對(duì)象
dim ors,conn
set ors=precordset
set conn=connobj
ors.close
set ors = nothing
conn.close
set conn = nothing
end function
3.6 運(yùn)行結(jié)果
本文檔介紹的腳本,其運(yùn)行結(jié)果如下圖所示:
圖4
3.7 更改代碼以滿足更廣泛的需求
對(duì)于不同客戶的定制化需求,可以通過修改少量代碼實(shí)現(xiàn)。
(1) 不同的查詢需求,修改ssql變量的值。
'修改變量ssql的值
dim ssql
ssql=tag:r,'processvaluearchive\tag1','0000-00-00 00:01:00.000','0000-00-00 00:00:00.000'
比如,如果需要?jiǎng)討B(tài)制定查詢時(shí)間,可以在畫面中輸入查詢?nèi)掌冢缓笸ㄟ^hmiruntime.tags(“變量名”)來獲得查詢條件,再賦值給ssql。
(2) listview需要使用不同的列名。
修改函數(shù)addlistviewheadercolumn中的如下內(nèi)容:
‘用查詢的數(shù)據(jù)庫(kù)表格列名來為listview添加列名 (*2)
dim addcolumnindex
for addcolumnindex=0 to columncount-1
listviewt.columnheaders.add , , cstr(ors.fields(addcolumnindex).name)
next
(3) listview需要填充不一樣的行數(shù)和內(nèi)容。
修改函數(shù)filllistview中的如下內(nèi)容:
dim maxline,n
maxline = 10 '改變此值,可以更改最大顯示的條目數(shù)
n=0
'修改填充內(nèi)容,請(qǐng)修改下面do while循環(huán)中的代碼
do while (not ors.eof and n < maxline)
n = n + 1
dim oitem,listviewt
set listviewt=plistview
set oitem = listviewt.listitems.add()
oitem.text = ors.fields(0).value
oitem.subitems(1) = ors.fields(1).value
oitem.subitems(2) = formatnumber(ors.fields(2).value, 4)
oitem.subitems(3) = hex(ors.fields(3).value)
oitem.subitems(4) = hex(ors.fields(4).value)
ors.movenext
loop
本文檔中提供的腳本盡量通用化,方便客戶修改和復(fù)用。并加入了錯(cuò)誤處理機(jī)制,保證腳本的正確運(yùn)行,并提高了診斷的方便性。
聲明:
本文所述的方法為wincc的高級(jí)用法,提供的代碼程序僅供用戶參考,西門子公司不提供任何調(diào)試和熱線支持。敬請(qǐng)諒解!