卓盛杰,王博強(天津賽象科技股份有限公司,天津 300384)
FactoryTalk View SE中實現(xiàn)Access數(shù)據(jù)庫記錄與查詢
卓盛杰,王博強
(天津賽象科技股份有限公司,天津 300384)
FactoryTalk View SE是Rockwell Automation公司推出的監(jiān)控組態(tài)軟件,它可以用映射工廠和過程的方式來分配應(yīng)用項目的各個部分,在數(shù)據(jù)監(jiān)控,畫面顯示等方面具有強大的功能,然而在數(shù)據(jù)報表、處理方面卻表現(xiàn)出弱點。利用其內(nèi)嵌的VBA可以擴展軟件功能。本文結(jié)合FactoryTalk View SE內(nèi)嵌的VBA,調(diào)用事先做好的Excel表格,讀取軟件通過ODBC接口記錄到Access中的數(shù)據(jù),然后生成報表。
數(shù)據(jù)庫;報表;Excel;VBA;FactoryTalk View SE;Access
FactoryTalk View Supervisory Edition是Rockwell Automation公司組態(tài)軟件,是與公司自動化產(chǎn)品結(jié)合最佳的可視化軟件產(chǎn)品,提供了強大的數(shù)據(jù)監(jiān)控能力,方便用戶進行上位機的畫面組態(tài)。FactoryTalk View SE內(nèi)嵌VBA,它為自定義及擴展FactoryTalk View SE功能提供了完整的開發(fā)環(huán)境。
現(xiàn)在愈來愈多的輪胎生產(chǎn)企業(yè)為了保證產(chǎn)品的質(zhì)量而要求對擠出生產(chǎn)線的一些重要的數(shù)據(jù)參數(shù)進行保存與查詢而FactoryTalk View SE和其他組態(tài)軟件一樣,本身報表生成、處理能力比較弱。為了實現(xiàn)數(shù)據(jù)記錄與報表查詢功能,本文使用FactoryTalk View SE內(nèi)嵌的VBA,與Access、Excel相結(jié)合,利用Access的數(shù)據(jù)記錄功能與Excel強大制表功能,實現(xiàn)數(shù)據(jù)記錄以及報表查詢功能。
通過日志模型設(shè)置,F(xiàn)actoryTalk View SE從PLC采集實時數(shù)據(jù),通過ODBC接口存儲到Access數(shù)據(jù)庫中,利用FactoryTalk View SE內(nèi)嵌的VBA開發(fā),訪問Access數(shù)據(jù)庫,調(diào)用Excel,將Access數(shù)據(jù)庫中的數(shù)據(jù)讀取到Excel中,在進行處理,形成報表。系統(tǒng)解決方案框圖如圖1所示。
圖1 報表解決方案框圖
Excel對象封裝了Microsoft Excel的全部元素,利用Excel對象提供的屬性、方法和事件,就可以在應(yīng)用程序中生成Excel報表。
Excel對象模型描述了Excel對象之間的結(jié)構(gòu)關(guān)系,如圖2所示。
(1)Application對象
圖2 Excel對象模型
Application對 象 表 示Excel應(yīng) 用 程 序, 在Excel 讀象模型中該對象處于模型的頂端,通過使用Application對象可以訪問模型中其他對象,從而控制Excel應(yīng)用程序的外觀和功能。
(2)Workbook對象
Workbook對象表示Excel中的工作簿,即對應(yīng)一個Excel文件,通過使用Workbook對象就可以實現(xiàn)對Excel工作簿的各種控制。
(3)Worksheet對象
Worksheet對象表示Excel中的工作表,通過使用Worksheet對象就可以實現(xiàn)對Excel工作表中的各種控制。
(4)Range對象
Range對象表示Excel中的區(qū)間,可以表示Excel中的單元格、幾個單元格、行、列或一個選中的區(qū)域,使用Range對象可以實現(xiàn)對Excel單元格或選中區(qū)域的各種操作。
通過讀取標簽中的單條秤重量、連續(xù)秤重量、測寬1、測寬2、一線設(shè)定速度、二線設(shè)定速度、一線實際速度、二線實際速度、收縮比、裁斷長度設(shè)定值,在報表中體現(xiàn)出記錄日期和數(shù)值。下面將具體介紹如何實現(xiàn)報表。
(1)將Excel、Access對象庫加載到當前VBA程序中
為了能夠在程序中調(diào)用Access數(shù)據(jù)庫以及Excel對象,為Access與Excel連接、互相嵌入使用做準備,必須在VBA程序中加載Excel、Access對象庫。在VBA編程環(huán)境下,單擊“Tools”菜單中的“Reference”命令,在彈出的對話框、中選中Microsoft Access 11.0 Object Library和 Microsoft Excel 11.0 Object Library兩項,點擊“確定”后退出,這樣就完成了Excel、Access對象庫在VBA程序中的加載。
(2)創(chuàng)建Access數(shù)據(jù)庫
創(chuàng)建記錄用Access數(shù)據(jù)庫,分別命名好如下字段:編號、日期、時間、單條秤重量、連續(xù)秤重量、測寬1、測寬2、一線設(shè)定速度、二線設(shè)定速度、一線實際速度、二線實際速度、收縮比、裁斷長度設(shè)定值。
(3)讀取數(shù)據(jù)庫實際地址
打開管理工具中的數(shù)據(jù)源(ODBC),在系統(tǒng)DSN選項卡中添加數(shù)據(jù)庫驅(qū)動,鏈接創(chuàng)建好的數(shù)據(jù)庫。
(4)在FactoryTalk View中編寫代碼,將PLC數(shù)據(jù)寫入Access數(shù)據(jù)庫中
為了將我們需要記錄的PLC數(shù)據(jù)寫入數(shù)據(jù)庫中,需要將FactoryTalk View中的標簽與VB代碼中聲明的變量對接,這樣才能將我們想要記錄的PLC數(shù)據(jù)寫入Access數(shù)據(jù)庫中,如圖3所示。
圖3 PLC數(shù)據(jù)寫入Access數(shù)據(jù)庫示意圖
編寫代碼如下:
Private OTag As Tag
Private O1Tag As Tag
Private O2Tag As Tag
Private O3Tag As Tag
Private O4Tag As Tag
Private O5Tag As Tag
Private O6Tag As Tag
Private O7Tag As Tag
Private O8Tag As Tag
Private O9Tag As Tag
Private O10Tag As Tag
Private WithEvents OtagG As TagGroup
Private Conn As New ADODB.Connection
Private Rs As New ADODB.Recordset
Private Sub Display_AnimationStart()
聲明標簽變量
On Error Resume Next
Set OtagG = CreateTagGroup(Me.AreaName)
OtagG.Add ("SampleTime")
OtagG.Add ("Weight1")
OtagG.Add ("Weight2")
OtagG.Add ("Width1")
OtagG.Add ("Width2")
OtagG.Add ("Line1Speed_Preset")
OtagG.Add ("Line2Speed_Preset")
OtagG.Add ("Line1Speed_Actual")
OtagG.Add ("Line2Speed_Actual")
OtagG.Add ("ShrinkRatio")
OtagG.Add ("CutLength_Preset")
將標簽變量與FactoryTalk View中的標簽對接
Set OTag = OtagG.Item(1)
Set O1Tag = OtagG.Item(2)
Set O2Tag = OtagG.Item(3)
Set O3Tag = OtagG.Item(4)
Set O4Tag = OtagG.Item(5)
Set O5Tag = OtagG.Item(6)
Set O6Tag = OtagG.Item(7)
Set O7Tag = OtagG.Item(8)
Set O8Tag = OtagG.Item(9)
Set O9Tag = OtagG.Item(10)
Set O10Tag = OtagG.Item(11)
OtagG.Active = True
Conn.ConnectionString = "DSN=GZTM"
Conn.Open
End Sub
Private Sub Display_BeforeAnimationStop() Conn.Close
Set Conn = Nothing
Set OTag = Nothing
Set O1Tag = Nothing
Set O2Tag = Nothing
Set O3Tag = Nothing
Set O4Tag = Nothing
Set O5Tag = Nothing
Set O6Tag = Nothing
Set O7Tag = Nothing
Set O8Tag = Nothing
Set O9Tag = Nothing
Set O10Tag = Nothing
Set OtagG = Nothing
End Sub
Private Sub OtagG_Change(ByVal TagNames As IGOMStringList)
On Error Resume Next
Conn.Execute "insert into [GZTM] ([日期 ],[時間],[單條秤重量],[連續(xù)秤重量],[測寬1],[測寬2],[一線設(shè)定速度],[二線設(shè)定速度],[一線實際速度],[二線實際速度],[收縮比],[裁斷長度設(shè)定值])values('" & Date & "','" & Time() & "'," & O1Tag.Value & ",'" & O2Tag.Value & "'," & O3Tag.Value & ",'" & O4Tag.Value & "'," & O5Tag.Value & ",'" & O6Tag.Value & "'," & O7Tag.Value & ",'" & O8Tag.Value & "'," & O9Tag.Value & ",'" & O10Tag.Value & "')"
插入數(shù)據(jù)庫字段名,以及對應(yīng)的標簽變量。
End Sub
(5)創(chuàng)建Excel表格
為了使用Excel查詢Access數(shù)據(jù)庫生成報表,必須事先建立Excel表格,新建一個Excel文件用以存儲從Access數(shù)據(jù)庫中讀取的數(shù)據(jù),并使用VB代碼建立查詢模塊將Access數(shù)據(jù)庫中的記錄按照日期查詢條件寫入表格,從而形成我們所需要的報表。下面的VBA程序語句實現(xiàn)了在Excel中導入Access數(shù)據(jù)庫記錄的方法。
Public Sub QueryFun()
聲明模塊
Dim date1 As String, date2 As String
date1 = Worksheets("condition").Cells(2, 1).Value
date2 = Worksheets("condition").Cells(2, 2).Value
讀取日期條件
Worksheets("results").Select
Worksheets("results").Cells.Select
Selection.ClearContents
With Worksheets("results").QueryTables. Add(Connection:=Array(Array( _
"O D B C;D S N=G Z T M;D B Q=C:G Z T M. mdb;DriverId=2" _
), Array("5;FIL=MS Access;MaxBufferSize=204 8;PageTimeout=5;")), Destination:= _
Range("A1"))
.CommandText = Array("SELECT GZTM.編號,GZTM.日期,GZTM.時間,GZTM.單條秤重量,GZTM.連續(xù)秤重量,GZTM.測寬1,GZTM.測寬2,GZTM.一線設(shè)定速度,GZTM.二線設(shè)定速度,GZTM.一線實際速度, GZTM.二線實際速度, GZTM.收縮比,GZTM.裁斷長度設(shè)定值" & Chr(13) & "" & Chr(10) & "FROM GZTM" & _
" where (日期 >= #" & date1 & " 00:00:00# and日期 <= #" & date2 & " 23:59:59#)")
.Name = "查詢來自 SE_Data"
寫入從Access查詢的數(shù)據(jù)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
Worksheets("results").Range("A1").Select
End Sub
寫好代碼后在條件工作表中調(diào)用。
在查詢條件工作簿添加按鈕以及如下代碼:
Private Sub CommandButton1_Click()
Call QueryFun
End Sub
可以使按鈕調(diào)用之前編寫的模塊。
(6)在FactoryTalk View SE項目中查詢報表
為了在FactoryTalk View SE項目中查詢報表,我們需要建立一個查詢報表按鈕,可以使全局按鈕,也可以在任意畫面新建按鈕。然后使用AppStart命令,并在參數(shù)中定義Excel的執(zhí)行程序路徑以及之前建立好的查詢表格路徑。這樣就可以卓盛杰直接打開之前創(chuàng)建好的查詢表格,并通過表格查詢想要的時間段的記錄數(shù)據(jù)了。
與大部分組態(tài)軟件相似,F(xiàn)actoryTalk View SE在數(shù)據(jù)監(jiān)控、畫面組態(tài)功能較強,但在報表生成、處理能力較弱。此方法實現(xiàn)復雜的生產(chǎn)報表,開發(fā)周期短,可操作性強,完全滿足工業(yè)的生產(chǎn)要求,在此基礎(chǔ)上,完全可實現(xiàn)班報、周報、月報、年報等。
Access database records and query implemented in FactoryTalk View SE
TQ330.493
1009-797X(2015)17-0044-04
B DOI:10.13520/j.cnki.rpte.2015.17.012
卓盛杰,自2006年起進入賽象科技股份有限公司工作,在2010年正式開始負責調(diào)試擠出聯(lián)動線,對擠出聯(lián)動線有比較深刻的認識。
2015-04-21