摘 要: 結(jié)合高速鐵路國(guó)家實(shí)驗(yàn)室“車廂環(huán)境檢測(cè)”項(xiàng)目,探索如何用VB設(shè)計(jì)一些輔助程序,并將這些程序嵌到WebAccess組態(tài)軟件中,通過(guò)兩者的緊密結(jié)合,解決一些現(xiàn)實(shí)中的棘手問(wèn)題,擴(kuò)展組態(tài)軟件的功能以便更好地滿足用戶需求。
關(guān)鍵詞: VB; WebAccess; I/O點(diǎn); 控件; SQL; Excel
WebAccess組態(tài)軟件是基于瀏覽器開發(fā)的B/S架構(gòu)的組態(tài)軟件,可實(shí)現(xiàn)遠(yuǎn)程監(jiān)控和遠(yuǎn)程在線維護(hù)。項(xiàng)目選用150點(diǎn)WebAccess組態(tài)軟件,其中包括150個(gè)外部點(diǎn)、150個(gè)內(nèi)部點(diǎn)和不受個(gè)數(shù)限制的本地點(diǎn),每個(gè)點(diǎn)相當(dāng)于一個(gè)寄存器。外部點(diǎn)用來(lái)存儲(chǔ)外部設(shè)備通過(guò)通信傳送給計(jì)算機(jī)的數(shù)據(jù),內(nèi)部點(diǎn)是中間變量點(diǎn)(包括計(jì)算點(diǎn)、累算點(diǎn)、常數(shù)點(diǎn)),它們都是全局有效的;本地點(diǎn)相當(dāng)于局部點(diǎn),只在對(duì)應(yīng)的畫面內(nèi)有效。使用以上所有資源,在實(shí)際設(shè)計(jì)過(guò)程中遇到三個(gè)WebAccess不能解決的問(wèn)題:(1)內(nèi)部I/O點(diǎn)不夠用; (2)本身不帶微風(fēng)速采集器的驅(qū)動(dòng)程序;(3)不能按需求將SQL數(shù)據(jù)庫(kù)中表導(dǎo)成Excel表和實(shí)現(xiàn)多表并發(fā)(將多個(gè)Excel表合成一個(gè))。
當(dāng)軟件本身不能實(shí)現(xiàn)某些功能時(shí),就需要考慮一些輔助軟件,這里將VB作為一個(gè)輔助軟件,通過(guò)它設(shè)計(jì)一些輔助程序,并將這些輔助程序與WebAccess巧妙地結(jié)合在一起,就可以很好地解決以上三個(gè)問(wèn)題。
1 VB程序使用SQL數(shù)據(jù)庫(kù)擴(kuò)展組態(tài)I/O點(diǎn)
高鐵車廂環(huán)境檢測(cè)項(xiàng)目中要檢測(cè)的參數(shù)包含60點(diǎn)溫度、60點(diǎn)風(fēng)速、20點(diǎn)壓力、2點(diǎn)濕度,對(duì)應(yīng)每一點(diǎn)都要有一個(gè)修正值和最終值(測(cè)量值+修正值),為了便于Matlab繪制參數(shù)云圖,每個(gè)點(diǎn)還要有一個(gè)標(biāo)志值(表示該點(diǎn)在試驗(yàn)中是否被選用)和X、Y、Z三個(gè)坐標(biāo)值(表示該點(diǎn)在車廂中的位置),以上這些點(diǎn)要求都是全局有效的,對(duì)一個(gè)只有150點(diǎn)的WebAccess是遠(yuǎn)遠(yuǎn)不能滿足的。如果采用I/O點(diǎn)數(shù)多的WebAccess,不僅會(huì)增加成本,而且會(huì)使利用率很低,因?yàn)槊恳粋€(gè)點(diǎn)的三個(gè)坐標(biāo)值、修正值及標(biāo)志值在試驗(yàn)開始前都是設(shè)定好的,實(shí)驗(yàn)過(guò)程中它們的值保持不變。根據(jù)這個(gè)特點(diǎn),在每個(gè)值設(shè)定好后,用VB編寫的輔助程序?qū)⒉煌瑢傩缘脑O(shè)定值存儲(chǔ)到SQL特定數(shù)據(jù)庫(kù)的不同表中,在某個(gè)畫面需要某些值時(shí)再用VB編寫的輔助程序從數(shù)據(jù)庫(kù)中讀出這些值并存儲(chǔ)到本地點(diǎn),在這個(gè)畫面中就可以隨意使用這些儲(chǔ)存著特定值的本地點(diǎn),在畫面退出后,本地點(diǎn)所占的內(nèi)存空間被釋放,這些點(diǎn)就不存在,但它們對(duì)應(yīng)的值卻始終存儲(chǔ)在SQL數(shù)據(jù)庫(kù)中。采用這種方法,不僅節(jié)省大量I/O點(diǎn),而且不會(huì)影響系統(tǒng)的性能。SQL數(shù)據(jù)庫(kù)存方框圖如圖1,相關(guān)VB程序如下:
‘******將溫度點(diǎn)T1的標(biāo)志位FT1及三個(gè)坐標(biāo)XT1、YT1、ZT1通過(guò)VB控件讀到變量ft1、xt1、yt1、zt1中,其他溫度點(diǎn)的標(biāo)志位及坐標(biāo)用同樣的方法讀到相應(yīng)的變量中,然后將這些變量的值存儲(chǔ)到testdata數(shù)據(jù)庫(kù) TXYZTABLE表中******’
ft1 = Bwocxrun1.GetValue("FT1", Me.AP)
xt1 = Bwocxrun1.GetValue("XT1", Me.AP)
yt1 = Bwocxrun1.GetValue("YT1", Me.AP)
zt1 = Bwocxrun1.GetValue("ZT1", Me.AP)
……
s1 = "USE testdata"
Conn.Execute s1
s2 = " INSERT INTO TXYZTABLE VALUES (1,′" & ft1 & "′,′" & xt1 & "′,′" & yt1 & "′,′" & zt1 & "′,……,′" & ft60 & "′,′" & xt60 & "′,′" & yt60 & "′,′" & zt60 & "′)"
Conn.Execute s2
‘******將testdata數(shù)據(jù)庫(kù)TXYZTABLE表中數(shù)據(jù)讀出存儲(chǔ)到變量ft1、xt1、yt1、zt1、……、ft60、xt60、yt60、zt60中,再通過(guò)VB控件將變量這些變量的值賦給相應(yīng)的WebAccess點(diǎn)******
s3 = “DECLARE C1 CURSOR FOR
SELECT
FT1,XT1,YT1,ZT1,FT2,XT2,YT2,ZT2,……,FT60,XT60,YT60,ZT60 FROM TXYZTABLE WHERE Flag=1”
Conn.Execute s3
s4 = “OPEN C1 FETCH NEXT C1 INTO ft1,xt1,yt1,zt1, ft2,xt2,yt2,zt2,……, ft60,xt60,yt60,zt60 CLOSE C1”
Conn.Execute s4
Call Bwocxrun1.SetValue("FT1", ft1, Me.AP)
Call Bwocxrun1.SetValue("XT1", xt1, Me.AP)
Call Bwocxrun1.SetValue("YT1", yt1, Me.AP)
Call Bwocxrun1.SetValue("ZT1", zt1, Me.AP)
……
以上程序是對(duì)溫度標(biāo)志位及溫度坐標(biāo)的存取程序,系統(tǒng)中用到的其他的點(diǎn),只要在系統(tǒng)運(yùn)行過(guò)程中保持其值不變,都可以用同樣的方法實(shí)現(xiàn)存取,從而節(jié)省系統(tǒng)I/O點(diǎn)。
2 風(fēng)速數(shù)據(jù)采集
微風(fēng)速采集器由16塊1504四通道空氣速度測(cè)試接口模塊組成,每個(gè)模塊4個(gè)通道,共64個(gè)通道(實(shí)際只用60個(gè)),每個(gè)通道與一個(gè)熱式傳感器探頭相連接,在風(fēng)速采集器上可以直接得到每個(gè)探頭測(cè)得的風(fēng)速值,并顯示在液晶屏上,也可以通過(guò)串口線將風(fēng)速采集器與電腦相連接,利用上位機(jī)軟件進(jìn)行大規(guī)模的數(shù)據(jù)采集與數(shù)據(jù)處理。但WebAccess本身不帶風(fēng)速采集器的驅(qū)動(dòng)程序,無(wú)法將數(shù)據(jù)讀到WebAccess相應(yīng)的點(diǎn)中。
解決上述問(wèn)題有兩種方法,第一種解決方法是請(qǐng)相關(guān)公司編寫風(fēng)速采集器的驅(qū)動(dòng)程序,但這個(gè)方法有很多不利之處:除需要增加成本之外,還需為技術(shù)人員提供相關(guān)資料以及調(diào)試實(shí)際設(shè)備的機(jī)會(huì),耗時(shí)耗財(cái)。第二種解決方法是利用WebAccess支持在畫面中嵌入由第三方軟件制作的控件的特點(diǎn),用VB編寫一個(gè)串口通信和數(shù)據(jù)處理程序,通信協(xié)議采用與微風(fēng)速采集器一致的協(xié)議,將風(fēng)速采集器測(cè)得數(shù)據(jù)存到VB控件所占的內(nèi)存空間中,對(duì)測(cè)得數(shù)據(jù)進(jìn)行處理后得到風(fēng)速參數(shù),再將風(fēng)速參數(shù)寫到對(duì)應(yīng)的WebAccess點(diǎn)中,就能方便自如地顯示和處理風(fēng)速參數(shù)。通過(guò)VB控件這個(gè)媒介,在沒(méi)有設(shè)備驅(qū)動(dòng)的情況下同樣可以將數(shù)據(jù)傳送到對(duì)應(yīng)的WebAccess點(diǎn)中,在一定程度上可以擺脫WebAccess自身不帶很多設(shè)備驅(qū)動(dòng)的限制,在設(shè)計(jì)系統(tǒng)選擇設(shè)備時(shí)就可以有更多的機(jī)會(huì)。其方框圖如圖2,相關(guān)VB程序如下:
‘******定義程序中所需變量******
Sub ReceiveTextFromCom()
Dim av As Variant //存儲(chǔ)通信得到的數(shù)據(jù)
Dim b(1 To 60)As Single //存儲(chǔ)轉(zhuǎn)化成字節(jié)型的數(shù)據(jù)
Dim ab(0 To 300) As Byte //通信得到的數(shù)據(jù)轉(zhuǎn)化成
字節(jié)存儲(chǔ)
Dim ac(0 To 300) As Byte //通信得到的數(shù)據(jù)轉(zhuǎn)化成
字節(jié)后去除通信信息存儲(chǔ)
Dim j,k,m As Integer //中間變量
‘******讀取串口接收緩沖區(qū)的數(shù)據(jù),將接收到的數(shù)據(jù)轉(zhuǎn)換成字節(jié)型,并計(jì)算風(fēng)速值賦給b(1)~b(60)。數(shù)組ab()中存儲(chǔ)的是風(fēng)速值,每4個(gè)字節(jié)表示一路風(fēng)速值,但ab(128)存儲(chǔ)回車符,便于通信校驗(yàn)用,數(shù)據(jù)處理時(shí)應(yīng)去掉******
j = MSComm1.InBufferCount //串口寄存器中數(shù)據(jù)個(gè)
數(shù)賦值給j
av = MSComm1.Input //串口寄存器中數(shù)據(jù)賦值給av
ac = av //av變量值賦值給ac
For k = 10 To j - 1 Step 1 //去除開頭部分的通信
輔助字節(jié)
ab(m) = ac(k)
m = m + 1
Next k
b(1) = (ab(0) - 48) * 10 + (ab(1) - 48) + (ab(2) -
48) / 10 + (ab(3) - 48) / 100
……
b(32) = (ab(124) - 48) * 10 + (ab(125) - 48) + (ab
(126) - 48) / 10 + (ab(127) - 48) / 100
b(33) = (ab(129) - 48) * 10 + (ab(130) - 48) + (ab
(131) - 48) / 10 + (ab(132) - 48) / 100
……
b(60) = (ab(237) - 48) * 10 + (ab(238) - 48) + (ab
(239) - 48) / 10 + (ab(240) - 48) / 100
‘******將VB控件中的風(fēng)速值b(1)~b(60)寫到WebAccess對(duì)應(yīng)(VV1~VV60)點(diǎn)中******
Call Bwocxrun1.SetValue("VV1", b1, Me.AP)
Call Bwocxrun1.SetValue("VV2", b2, Me.AP)
……
Call Bwocxrun1.SetValue("VV60", b60, Me.AP)
‘************為用戶控件初始化屬性************
Private Sub UserControl_InitProperties()
m_BackColor = m_def_BackColor
m_ForeColor = m_def_ForeColor
m_Enabled = m_def_Enabled
Set m_Font = Ambient.Font
m_BackStyle = m_def_BackStyle
m_BorderStyle = m_def_BorderStyle
m_AP = m_def_AP
End Sub
3 將SQL數(shù)據(jù)庫(kù)表導(dǎo)成Excel表并合并
在實(shí)際應(yīng)用中要將不同編號(hào)、不同車型、不同時(shí)間的試驗(yàn)數(shù)據(jù)(包括溫度值、壓力值、風(fēng)速值、溫度點(diǎn)坐標(biāo)、壓力點(diǎn)坐標(biāo)、風(fēng)速點(diǎn)坐標(biāo)及試驗(yàn)信息)在試驗(yàn)過(guò)程中分別存儲(chǔ)到指定數(shù)據(jù)庫(kù)的7個(gè)表中,在試驗(yàn)結(jié)束后將所有的數(shù)據(jù)導(dǎo)成一個(gè)Excel表(包含7個(gè)Sheet,每個(gè)Sheet對(duì)應(yīng)前面的一項(xiàng)試驗(yàn)數(shù)據(jù))并根據(jù)用戶設(shè)定的路徑保存,最后將SQL數(shù)據(jù)庫(kù)中對(duì)應(yīng)的表清空,這樣做不僅便于用戶查找和轉(zhuǎn)移試驗(yàn)數(shù)據(jù),還便于Matlab讀取數(shù)據(jù)和繪制云圖,同時(shí)可以防止因數(shù)據(jù)庫(kù)數(shù)據(jù)量過(guò)大而導(dǎo)致錯(cuò)誤。實(shí)現(xiàn)上述功能的唯一方法是將SQL數(shù)據(jù)庫(kù)中對(duì)應(yīng)的7個(gè)表導(dǎo)成7個(gè)Excel表,再將這7個(gè)Excel合并成一個(gè)包含7個(gè)Sheet的Excel表,最后將合并好的Excel表存到用戶指定的路徑下。 WebAccess自身所帶的TCL腳本語(yǔ)言不能實(shí)現(xiàn)上述功能,但WebAccess可以調(diào)用其他軟件編寫的應(yīng)用程序(.exe文件),通過(guò)此思路用VB編寫一個(gè)能夠?qū)崿F(xiàn)所需功能的應(yīng)用程序,在試驗(yàn)結(jié)束時(shí),用WebAccess TCL腳本語(yǔ)句調(diào)用該應(yīng)用程序,根據(jù)用戶的實(shí)際需求完成功能后自動(dòng)退出應(yīng)用程序。其方框圖如圖3,相關(guān)VB程序如下:
‘******定義程序中的變量******
Dim xapp,xapp1 As Excel.Application
//定義xapp、xapp1為Excel應(yīng)用對(duì)象
Dim wb,wb1 As Excel.Workbook
//定義wb、wb1為Excel工作薄
Dim ws,ws1 As Excel.Worksheet //定義ws、ws1為
Excel工作表
‘******建立一個(gè)新的Excel工作簿,并在其中添加4個(gè)sheet,再將工作簿中的7個(gè)sheet重新命名后存儲(chǔ)到Pathname指定的路徑下,最后退出創(chuàng)建的xapps對(duì)象******
Set xapps = CreateObject("Excel.Application")
xapps.Workbooks.Add
Set wb = xapps.ActiveWorkbook
sheetcount = wb.Sheets.Count
wb.Sheets.Add
wb.Sheets.Add
wb.Sheets.Add
wb.Sheets.Add
Set ws = wb.Sheets(1)
ws.Name = "TDATATABLE"
//用同樣的方法命名其他6個(gè)sheet
wb.SaveAs pathname
xapps.Quit
‘******將新建的ADODB連接Conn連接到指定服務(wù)器的數(shù)據(jù)庫(kù),并將其打開,為操作數(shù)據(jù)庫(kù)做好準(zhǔn)備******
Dim rs As ADODB.Recordset //定義rs為ADODB
記錄集
Dim Conn As ADODB.Connection
//定義Conn為ADODB連接
Set rs = New ADODB.Recordset
//建立一個(gè)新的ADODB記錄集賦給rs
Set Conn = New ADODB.Connection
//建立一個(gè)新的ADODB連接賦給Conn
Conn.ConnectionString="Driver={sqlserver};server=服務(wù)器名稱;uid=用戶名;pwd=用戶密碼;database=testdata"
Conn.Open
‘******將testdata這個(gè)數(shù)據(jù)庫(kù)中TDATATABLE表,導(dǎo)成名為TDATATABLE Excel表,并存儲(chǔ)到到E盤根目錄下。用同樣的方法將其他表導(dǎo)出相應(yīng)的Excel表******
Dim s1, s2 As String
s1 = "USE master"
Conn.Execute s1
s2 = "DECLARE @myPath varchar(200)SET @myPath= ′bcp testdata.dbo.TDATATABLE out E:\TDATATABLE.xls -c -q -S""服務(wù)器名稱"" -U""用戶名"" -P""用戶密碼""′EXEC master..xp_cmdshell @myPath"
Conn.Execute s2
‘******將TDATATABLE.xls中的數(shù)據(jù)存儲(chǔ)到另一個(gè)Excel表的sheet1中,修改一下程序,便可以將其他的Excel表中數(shù)據(jù)存儲(chǔ)到同一個(gè)Excel表中的不同sheet下,實(shí)現(xiàn)多表合一******
Set xapp = New Excel.Application //新建 Excel應(yīng)用 對(duì)象賦給xapp、xapp1
Set xapp1 = New Excel.Application
xapp.DisplayAlerts = False
xapp1.DisplayAlerts = False //Excel 選擇默認(rèn)應(yīng)答消息,
防止彈出消息對(duì)話框
xapp.Workbooks.Open ("E:\TDATATABLE.xls")
//用對(duì)象xapp打開指定路徑工作簿
Set wb = xapp.ActiveWorkbook //將當(dāng)前工作簿賦值
給wb
xapp.Worksheets(1).Activate //把sheet1置為當(dāng)前工作表
Set ws = xapp.ActiveSheet //將當(dāng)前工作表賦值給ws
ws.UsedRange.Copy //把ws工作表中所使用
范圍的數(shù)據(jù)復(fù)制
xapp1.Workbooks.Open pathname
//用對(duì)象xapp1打pathname開指定路徑工作簿
xapp1.Worksheets(1).Activate //把當(dāng)前工作簿的sheet1
置為當(dāng)前工作表
Set ws1 = xapp1.ActiveSheet //將當(dāng)前工作表賦值給
ws1
ws1.Range("A1", "A1").PasteSpecial xlPasteValues
//從A1行A1列開始將粘貼板中數(shù)據(jù)粘貼到當(dāng)前工作表ws1
xapp.ActiveWorkbook.Save
xapp1.ActiveWorkbook.Save //保存打開的工作簿
VB是一種可視化的、面向?qū)ο蟮暮筒捎檬录?qū)動(dòng)方式的結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,它可以開發(fā) Windows 環(huán)境下的各類應(yīng)用程序,用它來(lái)做組態(tài)軟件的助手,可以更好地滿足實(shí)際需求。除此,VB簡(jiǎn)單易學(xué)、效率高,且功能強(qiáng)大,設(shè)計(jì)人員不必花大量的時(shí)間學(xué)習(xí)就可以寫出滿足要求的程序。在這個(gè)項(xiàng)目中,VB編寫的相關(guān)輔助程序扮演著十分重要的角色,解決了很多實(shí)際問(wèn)題,給設(shè)計(jì)人員帶來(lái)很大幫助。
參考文獻(xiàn)
[1] Advantech WebAccess產(chǎn)品使用手冊(cè)[S].研華(中國(guó))公司工業(yè)自動(dòng)化事業(yè)群,2009.
[2] 陳艷峰,高文姬,邵蘊(yùn)秋,等.Visual Basic 數(shù)據(jù)庫(kù)項(xiàng)目案例導(dǎo)航[M].北京:清華大學(xué)出版社,2004.
[3] 臧玉琴,騰躍.Visual Basic界面、多媒體與操作系統(tǒng)程序設(shè)計(jì)[M].北京:人民郵電出版社,2003.