靳先聚
(華電鄭州機(jī)械設(shè)計(jì)研究院有限公司,河南 鄭州 450015)
在工程測試中,往往需要對測試信號進(jìn)行實(shí)時(shí)采集、處理和存儲,同時(shí)希望在測試結(jié)束后能方便的查看歷史數(shù)據(jù)?,F(xiàn)代的工程測試信號多為多通道、長時(shí)間、不間斷的海量數(shù)據(jù),傳統(tǒng)儀器已經(jīng)無法滿足對這些數(shù)據(jù)的處理和存儲要求。因此,如何快速、準(zhǔn)確、可靠地存儲這些海量數(shù)據(jù)是目前的一個(gè)研究熱點(diǎn)。
虛擬儀器是把計(jì)算機(jī)、模塊化的儀器等硬件與高效靈活的軟件結(jié)合起來,從而提高了系統(tǒng)的靈活性和工作效率[1~2]。在其模塊化的開發(fā)環(huán)境下,用戶只需擁有常規(guī)硬件設(shè)備,就可以根據(jù)自己的實(shí)際需要,自主設(shè)計(jì)各種功能的測試系統(tǒng)。LabVIEW(Laboratory VirtualInstrumentEngineer Workbench)是美國國家儀器(National Instruments,簡稱NI)公司推出一種圖形化的即時(shí)可重構(gòu)虛擬儀器軟件。用戶可以根據(jù)自身的特殊需要,構(gòu)建特定的虛擬儀器,降低了對硬件設(shè)備的依賴[3~4]。 另外,LabVIEW也是這一領(lǐng)域應(yīng)用最廣、發(fā)展最快、功能最強(qiáng)的軟件。筆者探討了在LabVIEW編程環(huán)境下,數(shù)據(jù)存儲系統(tǒng)的軟件設(shè)計(jì)。
該數(shù)據(jù)存儲系統(tǒng)由信號采集、信號處理、數(shù)據(jù)存儲和數(shù)據(jù)查詢4部分組成,其結(jié)構(gòu)如圖1所示。
圖1 軟件結(jié)構(gòu)圖Fig.1 Software structure
LabVIEW環(huán)境支持的可讀寫文件格式主要有文本文件、二進(jìn)制文件和數(shù)據(jù)記錄文件3種[5]。其中,二進(jìn)制文件占用磁盤空間最少,并且文件的存儲格式與數(shù)據(jù)在內(nèi)存中的格式一致,無需轉(zhuǎn)換,致使讀寫文件的速度更快[6]。因此,二進(jìn)制文件是數(shù)據(jù)存儲最為緊湊和快速的格式,特別適合海量數(shù)據(jù)的存儲和讀取。LabVIEW提供的以二進(jìn)制文件進(jìn)行數(shù)據(jù)存儲的文件類型有:Datalog文件、Waveform文件、TDMS文件、TDM文件等。TDMS文件具有讀寫速度快、占用硬盤空間小等優(yōu)點(diǎn)[7~9],更適合多通道、海量振動數(shù)據(jù)的存儲。所以,本系統(tǒng)采用TDMS文件對數(shù)據(jù)進(jìn)行存儲。
程序流程圖是整個(gè)編程過程中的指導(dǎo)性文件,通過它可以了解到其環(huán)節(jié)要實(shí)現(xiàn)什么功能,以及下一個(gè)環(huán)節(jié)程序會轉(zhuǎn)向哪里。本文設(shè)計(jì)的程序流程圖如圖2所示。
由圖2可知,程序總體分為初始化和執(zhí)行兩部分,這兩部分要按順序執(zhí)行。LabVIEW提供的順序循環(huán)結(jié)構(gòu)只需設(shè)立兩步,就可以達(dá)到這一要求。
圖2 存儲系統(tǒng)程序流程圖Fig.2 Storige system program flow
數(shù)據(jù)的存儲模塊是完成對數(shù)據(jù)后續(xù)分析的前提和基礎(chǔ)。因此,必須保證存儲的速度和可靠性。采用TDMS的存儲方式保證了存儲的速度。為了保證存儲的可靠性,必須在數(shù)據(jù)存儲的速度小于數(shù)據(jù)產(chǎn)生的速度時(shí),能緩存數(shù)據(jù)。這就需要選擇合適的編程模式。
LabVIEW為編程者提供的如圖3所示的用于數(shù)據(jù)處理的標(biāo)準(zhǔn)設(shè)計(jì)模式——生產(chǎn)者/消費(fèi)者設(shè)計(jì)模式(數(shù)據(jù))能同時(shí)執(zhí)行數(shù)據(jù)產(chǎn)生和數(shù)據(jù)存儲這兩個(gè)過程,并且保證它們不會相互影響。生產(chǎn)者/消費(fèi)者設(shè)計(jì)模式(數(shù)據(jù))由循環(huán)結(jié)構(gòu)(While循環(huán))和隊(duì)列組成。隊(duì)列是一個(gè)先入先出的緩沖區(qū)域。生產(chǎn)者產(chǎn)生數(shù)據(jù),并將數(shù)據(jù)放入隊(duì)列中;消費(fèi)者依次從隊(duì)列中取出數(shù)據(jù),并進(jìn)行相應(yīng)的處理。當(dāng)生產(chǎn)過剩而消費(fèi)不足時(shí),緩沖區(qū)的剩余空間不斷減少,直至耗盡。反之,當(dāng)消費(fèi)能力大于生產(chǎn)能力時(shí),緩沖區(qū)的數(shù)據(jù)會逐漸減少,直至緩沖區(qū)中再無數(shù)據(jù)可用。此時(shí),消費(fèi)者進(jìn)入等待狀態(tài),直至生產(chǎn)者輸入新數(shù)據(jù)或程序結(jié)束。
為適應(yīng)系統(tǒng)對海量數(shù)據(jù)的存儲要求,將隊(duì)列所能容納的最大數(shù)據(jù)點(diǎn)數(shù)設(shè)置為“無限”(最大)。因系統(tǒng)設(shè)計(jì)為8通道,要建立8個(gè)隊(duì)列,分別存放各個(gè)通道的數(shù)據(jù)。各隊(duì)列分別以各自的通道名命名。
由于各通道所實(shí)現(xiàn)功能完全相同,下面以通道1為例,對系統(tǒng)程序進(jìn)行詳細(xì)介紹。通道1的數(shù)據(jù)存儲程序框圖如圖4所示。將仿真信號放在生產(chǎn)者循環(huán)中。為了方便程序的調(diào)試,利用輸入控件實(shí)現(xiàn)對信號頻率、幅值和相位的即時(shí)輸入。在消費(fèi)者循環(huán)中,從隊(duì)列中取出數(shù)據(jù),并存儲、處理和顯示。由于通道多、數(shù)據(jù)量大,此處只存儲原始數(shù)據(jù)、均方根值和報(bào)警信息(報(bào)警序號、報(bào)警通道名和報(bào)警時(shí)間)。
圖3 生產(chǎn)者/消費(fèi)者設(shè)計(jì)模式(數(shù)據(jù))Fig.3 Producer/consumer design pattern(data)
圖4 通道1的數(shù)據(jù)存儲程序框圖Fig.4 Data storage program of channel 1
程序運(yùn)行過程中,先用“TDMS打開”函數(shù)新建或打開一個(gè)TDMS文件,再用“TDMS設(shè)置屬性”函數(shù)為TDMS文件設(shè)置測試時(shí)間屬性,并記錄測試的開始時(shí)間。然后,以通道名(例如通道1)命名TDMS的“組名”,以“原始數(shù)據(jù)”和“均方根值”命名TDMS的“通道名”。同時(shí),利用“平均直流—均方根”函數(shù)獲得波形數(shù)據(jù)的均方根值,并將其與預(yù)設(shè)報(bào)警值進(jìn)行比較。如果均方根值大于或等于報(bào)警值,將報(bào)警通道的通道名稱和報(bào)警時(shí)間寫入TDMS文件中的報(bào)警組中,并為報(bào)警指示燈賦值為“真”,用于提示用戶該通道已經(jīng)報(bào)警。如果均方根值小于報(bào)警值,不作數(shù)據(jù)存儲處理,并保持指示燈為上一次判定時(shí)的值。這就可以確保指示燈在第一次報(bào)警后仍然能保持報(bào)警狀態(tài)。最后,用“TDMS關(guān)閉”函數(shù)關(guān)閉TDMS文件,用“簡易錯(cuò)誤處理器”函數(shù)處理數(shù)據(jù)存儲過程中出現(xiàn)的錯(cuò)誤,并發(fā)送相關(guān)的錯(cuò)誤信息。
為了減少程序編寫的工作量,簡化程序結(jié)構(gòu),各通道存儲程序均以通道1存儲程序子VI形式存在于主程序中。為了能通過人機(jī)交互的方式控制數(shù)據(jù)存儲的開始和結(jié)束,需要采用事件結(jié)構(gòu)對用戶的操作進(jìn)行響應(yīng)。在數(shù)據(jù)存儲程序中,若使用包含While循環(huán)的生產(chǎn)者/消費(fèi)者設(shè)計(jì)模式(數(shù)據(jù)),將數(shù)據(jù)存儲程序直接放在事件結(jié)構(gòu)內(nèi),將會出現(xiàn)前面板死鎖現(xiàn)象。本系統(tǒng)采用LabVIEW的另一種標(biāo)準(zhǔn)設(shè)計(jì)模式——生產(chǎn)者/消費(fèi)者設(shè)計(jì)模式(事件),其程序結(jié)構(gòu)如圖5所示。
圖5 生產(chǎn)者/消費(fèi)者設(shè)計(jì)模式(事件)Fig.5 Producer/consumer design pattern(event)
在本程序中,將數(shù)據(jù)存儲程序中需要響應(yīng)的事件(開始采集事件和退出程序事件)分別通過生產(chǎn)者循環(huán)中事件結(jié)構(gòu)對應(yīng)的分支放入到隊(duì)列中,通過隊(duì)列傳輸?shù)较M(fèi)者循環(huán)中,再通過條件結(jié)構(gòu)判斷對應(yīng)的事件分支,執(zhí)行對應(yīng)的程序代碼。停止采集則是通過生產(chǎn)者/消費(fèi)者設(shè)計(jì)模式 (數(shù)據(jù))中生產(chǎn)者中的 “停止采集”按鈕以及消費(fèi)者循環(huán)中“停止采集”按鈕的局部變量來實(shí)現(xiàn)。這樣,能同時(shí)停止數(shù)據(jù)的產(chǎn)生和存儲。
系統(tǒng)程序的其他功能模塊的設(shè)計(jì)開發(fā)此處不再做詳細(xì)介紹。穩(wěn)定高效的后臺程序配以人性化的人機(jī)界面(如圖6所示)即成為一完備的測試系統(tǒng)。
在LabVIEW提供的軟件平臺上開發(fā)的多通道海量數(shù)據(jù)存儲系統(tǒng)彌補(bǔ)了工業(yè)生產(chǎn)中傳統(tǒng)測試儀器在技術(shù)和經(jīng)濟(jì)方面的諸多不足。它在大宗數(shù)據(jù)存儲方面,展現(xiàn)出了高效、準(zhǔn)確的存取性能。這說明,虛擬測試系統(tǒng)是未來工程實(shí)際的發(fā)展方向。
圖6 系統(tǒng)主界面Fig.6 System main interface
[1]韓琪.基于虛擬儀器的數(shù)據(jù)采集與分析系統(tǒng)研究與設(shè)計(jì)[D].北京:北京交通大學(xué),2011.
[2]何春鵬.基于LabVIEW的數(shù)據(jù)處理與仿真的研究[D].北京:北京交通大學(xué),2008.
[3]李文濤,曹彥紅,卜旭芳,等.LabVIEW數(shù)據(jù)庫訪問技術(shù)的實(shí)現(xiàn)及應(yīng)用[J].工礦自動化,2012(3):69-71.
[4]劉珊珊.基于LabVIEW的數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)與應(yīng)用[D].太原:中北大學(xué),2012.
[5] 胡仁喜,高海賓.LabVIEW2010從入門到精通[M].北京:機(jī)械工業(yè)出版社,2011:14-38.
[6] Thatlife10.數(shù) 據(jù) 存 取 的 好 幫 手-TDMS[EB /OL].(2013-01-24)[2015-05-18].http://www.docin.com /p-580779352.html.
[7] 陳樹學(xué),劉萱.LabVIEW 寶典[M].北京:電子工業(yè)出版社,2011:81-96.
[8]呂云熙.LabVIEW中表格控件的靈活使用[J].儀表與計(jì)量技術(shù),2011(3):41-42.
[9]阮奇楨.我和LabVIEW[M].北京:航空航天大學(xué)出版社,2009:50-62.