【摘 要】本文結合工程實例,采用VB設計上位機的外掛界面和數(shù)據(jù)庫管理平臺;后臺數(shù)據(jù)庫軟件采用ACCESS 2003;上位機與PLC之間采用ROCKWELL的RSLink作為OPC協(xié)議。本設計中將ACCESS 2003與PLC結合起來,用戶可方便地在上位機中存儲、查看和打印下位機(PLC)中的信息,監(jiān)視PLC的工作狀態(tài),并制作生產報表。
【關鍵詞】上位機;ACCESS2003;PLC;報表
1.引言
本系統(tǒng)是一個粉料加料系統(tǒng),分為六個部分:加料區(qū)、一號粉料區(qū)、二號粉料區(qū)、三號粉料區(qū)、混合攪拌區(qū)及下料包裝區(qū)。其加料區(qū)由一個加料罐和一些泵和閥組成;一號粉料區(qū)由四個粉料罐和一個稱量罐及泵和閥組成;二號粉料區(qū)同一號粉料區(qū);三號粉料區(qū)同一號粉料區(qū);混合攪拌區(qū)由混合罐及內部攪拌漿組成。根據(jù)實際情況需要完成下列功能。
功能一:監(jiān)視功能。將現(xiàn)場設備的信息,如閥的位置,變頻器的電流功率,儲罐內的液位,稱重罐的重量等顯示在上位機上,可以實時的監(jiān)視現(xiàn)場的情況,并可以手動控制單個設備,比如開啟一個閥活電機等,并將相應的信息存入數(shù)據(jù)庫,使其能看到歷史曲線及歷史事件與報警的記錄。
功能二:管理功能。在上位機上能儲存不定量配方,可以新建修改配方,也可以刪除不用的配方,根據(jù)生產的需要選擇不同的配方,系統(tǒng)將根據(jù)該配方的要求運行。
功能三:報表功能。由于批次生產的特殊性,一般需查看打印不同的報表,以供生產管理,這里需要日報,月報,按配方查詢,成分統(tǒng)計,配方統(tǒng)計等。
2.系統(tǒng)的硬件設計
該系統(tǒng)的硬件由1臺上位機(電腦),1組PLC通過以太網連接上位機,另通過以太網配有兩個觸摸屏連接PLC,供現(xiàn)場操作。
3.VB設計上位機的外掛界面和數(shù)據(jù)庫管理平臺
3.1 上位機與PLC之間的通信
本設計中,上位機與PLC之間的通信協(xié)議有兩種:一種是用來實現(xiàn)監(jiān)視功能的。用INTOUCH作為上位機軟件,通過ROCKWELL的RSLINX作為OPC通訊連接上位機與PLC,這樣就能把PLC的點與上位機的點一一對應起來,在上位機上就能監(jiān)視控制現(xiàn)場的設備了,這個在這里就不做具體說明。
另一種是用來實現(xiàn)管理的,即把上位機的配方指令下達給PLC,我們選擇一個合適的配方,按下確定鍵后,PLC就會收到該配方的所有信息,并將根據(jù)此配方進行工作。這個功能由于設計很多數(shù)據(jù)的上下載及數(shù)據(jù)庫的應用,用上位機軟件自身的功能很難實現(xiàn),所以采用了一個外掛的VB程序作為實現(xiàn)該功能的中介,這里采用了DDE協(xié)議,使得VB界面中的數(shù)據(jù)下載到PLC中,代碼如下:
start_recipe.Text=1
start_recipe.LinkTopic=\"RSLinx|menniu\"
start_recipe.LinkItem=\"Weigh_Start,L1,C1\"
start_recipe.LinkMode=2
start_recipe.LinkPoke
start_recipe.LinkMode=0
start_recipe.Text=0
start_recipe.LinkTopic=\"RSLinx|menniu\"
start_recipe.LinkItem=\"Weigh_Start,L1,C1\"
start_recipe.LinkMode=2
start_recipe.LinkPoke
start_recipe.LinkMode=0
Text1.Text=Combo1.Text
Text1.LinkTopic=\"RSLinx|menniu\"
Text1.LinkItem=\"Recipe_Name\"
Text1.LinkMode=2
Text1.LinkPoke
Text1.LinkMode=0
3.2 上位機與數(shù)據(jù)庫之間的通信
(1)INTOUCH與數(shù)據(jù)庫間的通信:在一定的條件下,需要從上位機上把特定的數(shù)據(jù)傳到數(shù)據(jù)庫中,作為報表的數(shù)據(jù)源,這時就要建立上位機(INTOUCH)與數(shù)據(jù)庫(ACCESS)之間的通信。本設計中,InTouch通過ODBC和Access進行數(shù)據(jù)交互,通過InTouch SQL訪問管理器將InTouch的數(shù)據(jù)記錄到關系數(shù)據(jù)庫中。具體的步驟如下:首先,創(chuàng)建Microsoft Access數(shù)據(jù)庫并配置ODBC數(shù)據(jù)源。先在ACCESS數(shù)據(jù)庫中建立一個表,將需要記錄的數(shù)據(jù)分別列到每列中,分配好數(shù)據(jù)類型,記住數(shù)據(jù)庫名和表名。然后配置ODBC數(shù)據(jù)源,新建一個數(shù)據(jù)源,選擇剛剛建的數(shù)據(jù)庫,測試成功后就結束了這步。
然后,配置InTouch SQL訪問管理器。首先在InTouch標記名字典創(chuàng)建和Access列名相同的標記名,其類型也要一致;然后編寫連接與斷開數(shù)據(jù)庫腳本;最后,啟動InTouch SQL訪問管理器,建立綁定列表BlindedList,綁定列表把InTouch中的標記名和數(shù)據(jù)庫中表里的列名映射起來。其連接與斷開數(shù)據(jù)庫腳本如下:
連接數(shù)據(jù)庫:ResultCode=SQLConnect(ConnectionId,\"DSN=數(shù)據(jù)源名\");
斷開數(shù)據(jù)庫:ResultCode=SQLDisconnect(ConnectionId);最后,驗證數(shù)據(jù)通信是否正常。
(2)VB與數(shù)據(jù)庫的通信:由于客戶需要增加減少配方,Intouch又不好做這么麻煩的Recipe,所以用VB做一個外掛程序與數(shù)據(jù)庫通訊,專門用來做配方管理。這里使用OLE DB接口連接VB與數(shù)據(jù)庫,首先在VB的界面上加一個Adodc的控件,這個控件就是一個數(shù)據(jù)通訊的接口,在需要采集數(shù)據(jù)的時候,寫下下面的腳本:
Adodc1.ConnectionString=\"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\VBNEW\mengniu.mdb;Persist Security Info=False\"(通過OLEDB連接數(shù)據(jù)庫)
Adodc1.RecordSource=\"select*from product where[product code]='\" Combo1.Text \"'\"(通過select語句在數(shù)據(jù)庫中查找記錄)
這樣,數(shù)據(jù)庫就能和VB連接起來了。
3.3 數(shù)據(jù)操作的實現(xiàn)
此配方管理由六個部分組成,分別為成分配置,罐子配置,配方管理,生產,報表,備料;其中成分配置,罐子配置,配方管理是需要用戶名及密碼才可以進入,具有一定的保密性。生產,報表,備料是一般操作員所要使用的。
點擊主頁上的“配方管理”按鈕,輸入準確的用戶名和密碼,就能進入罐子配置窗口。當一打開該窗口的時候,列表中顯示的是當前所有配方的大概信息,從產品代碼的下拉框中選擇一個配方代碼,該窗口將顯示該配方的詳細信息,包括該配方的成分配比,需要的總重,混合時間等等,VB的實現(xiàn)過程是這樣的:
Adodc1.Visible=False
Adodc1.ConnectionString=\"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\VBNEW\mengniu.mdb;Persist Security Info=False\"
Adodc1.RecordSource=\"select*from product\"
Adodc1.Refresh
Set DataGrid1.DataSource=Adodc1
Dim b(0 To 100)As String
Dim d As Boolean
Adodc1.Recordset.MoveFirst
For i=1 To Adodc1.Recordset.RecordCount
b(i)=Adodc1.Recordset.Fields(\"product code\")
For j=1 To i-1
If b(i)=b(j)Then
d=1
End If
Next j
If d=0 Then
Combo1.AddItem Adodc1.Recordset.Fields(\"product code\")
End If
d=0
Adodc1.Recordset.MoveNext
Next i
3.4 報表功能的實現(xiàn)
在主頁上點擊“報表”,出現(xiàn)如下窗口。
在這里可以查看日報,月報,并可以通過分類查詢各種數(shù)據(jù)。這里使用VB的DataReport做的報表。
首先添加一個Data Environment并打開它,然后鼠標右鍵單擊Connection1,選擇屬性后彈出一數(shù)據(jù)庫連接屬性窗體選擇\"Microsoft Jet 4.0 OLE DB Provider\",單擊\"下一步\",選擇所須要的數(shù)據(jù)庫確定。
然后鼠標右鍵單擊Connection1,選擇\"Add Command\",Data Environment就創(chuàng)建了一個Command1,然后鼠標右鍵單擊Command1,選擇屬性后彈出一Command1屬性窗體,在Database Object屬性中選擇Table,在Object中選擇Employee,然后單擊Command1屬性窗體中的Grouping,然后復選\"Group Command Object\",在Fields in中雙擊\"TitleOfCourtesy\",然后確定(即按TitleOfCourtesy分組)。
添加一報表名為DataReport1,在DataReport1的DataSource屬性中填入\"DataEnvironment1\",在DataMember中填入\"Command1_Grouping\",然后鼠標右鍵單擊報表窗體選擇Retrieve Structure,并確認這樣就定義了一個報表結構。在報表的\"Command1_Grouping_Header\"一欄中擺上一RptTextBox控件,并設置DataField屬性為\"TitleOfCourtesy\",在報表的\"Command1_Detail\"一欄中擺上三個RptTextBox控件,設置DataField屬性分別為\"EmployeeID\",\"LastName\"和\"FirstName\",并將其DataMember屬性設置為\"Command1\"。
雙擊報表,在代碼窗體中輸入以下代碼:
Private Sub DataReport_Initialize()
Dim strShape As String
Dim cnnReport As New ADODB.Connection
Dim rstReport As New ADODB.Recordset
strShape=\"SHAPE{SELECT*FROM`batch_recipe`WHERE[STOP TIME]BETWEEN #\" Form5.Text5 \"# AND #\" Form5.Text6 \"#}AS Command1 COMPUTE sum(Command1.[TARGET QUANTITY])as[TARGET QUANTITY],sum(Command1.[REAL QUANT])as[REAL QUANT],Command1 BY'INGREDIENT'\"
Set cnnReport=New ADODB.Connection
With cnnReport
.Provider=\"MSDataShape.1\"
.Open\"Data Source=G:\VBNEW\mengniu.mdb;Data Provider=Microsoft.Jet.OLEDB.4.0\"
End With
Set rstAgmRpt=New ADODB.Recordset
With rstAgmRpt
Set.ActiveConnection=cnnReport
.CursorLocation=adUseClient
.CursorType=adOpenStatic
.LockType=adLockReadOnly
.Source=strShape
.Open
End With
Set Me.DataSource=rstAgmRpt
End Sub
這樣,就能做出想要的任何格式的報表了。
4.結束語
在本設計中,使用VB與數(shù)據(jù)庫的操作實現(xiàn)更多的單純利用上位機軟件無法實現(xiàn)的功能,特別是利用VB的DataReport功能實現(xiàn)了格式多樣報表。