(一)引言

WinCC是目前使用最為廣泛的工業組態軟體之一,被廣泛應用於各種工業控制系統的數據採集及監控應用系統中。它把所有的過程數據保存在其專用的Microsoft SQL Sever 2005資料庫中,用戶可以通過WinCC提供的OnlineTrend Control等控制項對其進行訪問,但不能對這些數據進行直接訪問和處理。對於現場日趨複雜的數據分析統計的報表要求,顯然已經不能滿足。針對此問題,本文提出了通過VBS、WinCC OLE DB方法和SQL相結合的編程方法,實現對數據的重新歸檔及統計分析,以滿足不同場合對報表的需求。

(二)污水處理廠自控系統簡介

該污水處理廠出水量3萬噸/日。全廠使用西門子PLC進行監視、控制和數據採集存儲,自控系統框圖如圖1所示。上位機採用WinCC作為人機交互界面的軟體平台。鑒於當地環保局和污水廠自身的要求,報表系統要具有日報、月報、季報、年報和按時間間隔查詢的自由報表功能。Wincc本身自帶的歷史數據查詢控制項不能夠滿足要求,因此需要通過編程實現報表功能。

圖1:污水廠自控系統框圖

(三)報表生成過程

3.1WinCC歷史資料庫的存儲方式及常規訪問方法

WinCC在運行時,數據歸檔是以一定時間作為基準,形成數據片段。在數據片段下,與數據操作存儲有關的表格主要有三個:

ARCHIVE(用戶歸檔記錄);

TAGPRESSED(TAGUNPRESSED)(壓縮/非壓縮變數歸檔記錄) ; MSARCLONG(報警記錄)

這些表格不允許直接訪問,ARCHIVE和TAGPRESSED(TAGUNPRESSED)也不允許修改,MSARCLONG通過控制項允許插入/修改等。如果僅僅對數據進行簡單的查詢和報警報表的修正,我們可以通過WinCConline Talbe Control 和WinCC Alarm Control 控制項實現,但控制項訪問格式固定,在用戶對報表功能要求較高的時候顯然是不適用的。

3.2 利用WinCC OLE DB方法訪問歷史資料庫

從WINCC6.0開始,SIEMENS就採用SQL3000SP3做為WINCC的後台數據。SQL2000SP3採用了一些獨特的技術,和常規的SQL訪問的方法是有不同的。WINCC的SQL庫操作是不需要表名的,他有自己定義的SQL語句,需要通過其特有的WinCCOLE DB進行訪問。

①定義連接字元串

sPro ="Provider=WinCCOLEDBProvider.1;"

sDsn ="Catalog=資料庫名稱;"

sSer = "DataSource=.WinCC"

其中資料庫名稱為WinCC運行後自動生成的資料庫名稱,其餘為固定格式。

②利用連接字元串連接資料庫

Set conn =CreateObject("ADODB.Connection")

conn.ConnectionString= sCon

conn.Open

③數據查詢

oCom.CommandText="Tag:R,(A1,A2),"+StTime.OutputValue+","+SpTime.OutputValue+""

其中A1、A2為資料庫中Achieve表中歸檔變數的ID。

3.3 RecordSet記錄集中的數據存儲格式

WinCC歷史資料庫中的數據通過WinCC OLE DB方法讀出後存儲在RecordSet記錄集中。如果想要處理這些數據,首先需要知道它的存儲方式,進而通過VBS編程對數據進行處理。圖2為WinCC讀取歷史資料庫數據至RecordSet並在WinCC Listview中顯示。RecordSet每一條存儲記錄包括五列內容:

①ValueID—WinCCARCHIVE表中變數的ValueID

②Timestamp—變數存儲時間

③RealValue—變數值

④Quality—質量數,表示數據的好壞

⑤Flags—標誌位

圖2: WinCC歷史數據—RecordSet顯示

從圖2中可以看出,第一列為變數ID,第二列為存儲時間,第三列為變數值,這三列數據是我們所需要的。這些數據經過計算,就可以完成報表的各種功能了,例如計算累計值、平均值、最大最小值等。

3.4 報表功能的實現

利用RecordSet數據集中的數據,通過計算就能夠生成日報、月報、季報和年報了。創建一個用戶資料庫,並建立日報表,月報表等需要的表格,並將計算後的數據存儲在與其相對應的表格中,形成報表。根據用戶查詢的不同報表按鈕連接不同的表格,獲取數據,並生成用戶所需要的報表。下面以月報為例進行介紹。

月報實現每天生成一個平均數,根據月份不同生成30或31個數據。在SQLserver中創建一個用戶資料庫,命名為ReportData,在資料庫中創建一個table,命名為Data-Month。在WinCC中創建一VBS全局腳本,此腳本運行時間間隔為10min,每條記錄的時間格式為年—月—日00:00:00。每次日變數發生變化時,程序產生一條新的記錄插入數據表中,否則程序只更新當前記錄的數據內容。程序流程圖如圖3所示:

圖3:月報表程序流程圖

下面介紹程序中各部分的具體實現。

①打開WinCC歷史資料庫,將數據按時間要求讀出,生成RecordSet對象。具體步驟在2.2中已經說明。圖3為生成數據集之後,如何處理數據的程序流程圖。

圖4:計算功能程序流程圖

②連接資料庫

WinCC中連接用戶資料庫與VB連接資料庫的語法一致,在此不多做陳述,主要程序如下所示:

sCon_1 ="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog=Baobiao_Month;Data Source=.WINCC"

conn_1.Open

③新建數據記錄

新建數據記錄時,Sum1、Sum2、Sum3是由步驟①中計算得到的

strWork1 ="INSERT INTO [ReportData].[dbo].[ Data-Month]"

strWork2 ="(DateTime,temperature,press,height) "

strWork3 ="VALUES("+Date+","&(Sum1)&","&(Sum2)&","&(Sum3)&")"

strWork = strWork1+ strWork2 + strWork3

④更新數據記錄

當日期關鍵字沒有改變時,程序僅更新當前記錄,不會產生新的數據記錄。

strWork6 ="UPDATE [ReportData].[dbo].[ Data-Month] "

strWork7="SET temperature = "&(Sum1)&" ,press ="&(Sum2)&",height = "&(Sum3)&""

strWork8 = "WHERE DateTime = "+Date+""

strWork5 =strWork6 + strWork7 + strWork8

(四)報表查詢過程

經過上述步驟,報表資料庫已經建立。日報表、月報表、季報表和年報表按照不同的時間間隔保存在不同的表中,接下來就可以在WinCC中利用按鈕與DTPicker時間控制項相結合的方法來進行數據查詢了。按鈕的功能是確定選擇哪一張表格作為查詢對象,DTPicker的功能是設置查詢的起始時間和結束時間。

DTPicker是微軟提供的OCX控制項,在WinCC中添加此控制項。當用戶通過該控制項設置時間後,經過VB編程可以獲得控制項中設置的時間參數,之後按照此時間進行資料庫查詢。

(五)運行結果

報表系統已經在實際污水廠自控系統中正常運行使用,記錄包括進水流量、出水流量、進水COD、出水COD、進水氨氮、出水氨氮、溶解氧、進水PH、出水PH、鼓風量以及污泥濃度十一個變數。系統中實現了日報表、月報表、季報表和年報表的查詢以及累計值和平均值的計算。

(六)結論

本報表系統通過WinCCOLE DB方法連接WinCC歷史資料庫讀取數據,並採用VBS和SQL相結合的編程方式,實現了數據的靈活訪問,製作出滿足污水廠要求的報表系統。利用此方法,我們可以製作出滿足各行業要求的複雜報表系統,解決工程中關於報表的實際問題。

推薦閱讀:

相关文章