黑夜給了我黑色的眼睛,我卻用它尋找光明
一、 前言
??經(jīng)常做上位機(jī)軟件開(kāi)發(fā)的小伙伴應(yīng)該都比較清楚,當(dāng)硬件采集了很多模擬量數(shù)據(jù)的時(shí)候,甲方不僅會(huì)要求將這些采集的模擬量參數(shù)在上位機(jī)上進(jìn)行實(shí)時(shí)顯示,還會(huì)要求將重要的參數(shù)進(jìn)行本地保存,方便后期查詢,甚至還可能要求將數(shù)據(jù)同步到服務(wù)器的數(shù)據(jù)庫(kù)上。這個(gè)時(shí)候就需要在編寫(xiě)程序的時(shí)候把自動(dòng)保存數(shù)據(jù)的功能考慮進(jìn)去。
??LabVIEW可以保存的文件類型很多,諸如常見(jiàn)的txt、ini、excel文件,還有不怎么常見(jiàn)的tdms、dat、xml、json文件等,種類特別多。具體要將數(shù)據(jù)保存成哪種格式的文件,就要看自身的實(shí)際需求。在實(shí)際的工控項(xiàng)目中,硬件的采樣周期都比較短,所以上傳的數(shù)據(jù)量都特別大,如果設(shè)備在連續(xù)運(yùn)行十天半個(gè)月,硬件采集的數(shù)據(jù)量就非常龐大,將這些數(shù)據(jù)全部保存成文件存儲(chǔ)起來(lái),會(huì)占用比較大的存儲(chǔ)空間,這就要求保存的數(shù)據(jù)文件占用的內(nèi)存空間要盡量小一點(diǎn),這么看二進(jìn)制文件tdms、dat就比較適合。
??今天主要講如何將數(shù)據(jù)自動(dòng)保存到TDMS格式文件中,有些不清楚啥是TDMS的萌新可以去看看我之前寫(xiě)過(guò)一篇關(guān)于TDMS讀寫(xiě)的文章【LabVIEW開(kāi)發(fā)】TDMS文件存儲(chǔ)與讀取,里面的介紹還比較詳細(xì),有時(shí)間可以看看。
二、實(shí)戰(zhàn)練習(xí)
??我的開(kāi)發(fā)環(huán)境:Windows10(64bit)、LabVIEW2017
1、編程思路
??要實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)保存,先要搞清楚兩個(gè)問(wèn)題:一是數(shù)據(jù)的保存周期,即多長(zhǎng)時(shí)間保存一次數(shù)據(jù),這個(gè)就看項(xiàng)目的實(shí)際需求以及硬件的最快采樣頻率,我編寫(xiě)的例子是1s保存一次,僅供參考;二是單個(gè)TDMS文件保存多少次數(shù)據(jù),不能讓一個(gè)文件保存所有數(shù)據(jù),文件太大后期讀取數(shù)據(jù)的時(shí)候速度會(huì)很慢,也不方便按時(shí)間進(jìn)行查詢,這就要求單個(gè)文件存了一定數(shù)量的文件后,程序要自動(dòng)新建新的文件來(lái)保存數(shù)據(jù),這樣就可以保證保存數(shù)據(jù)的單個(gè)文件不至于過(guò)大。
??還有,保存數(shù)據(jù)的文件后綴是.tdms,文件名用"年-月-日 時(shí)'分'秒"進(jìn)行命名。因?yàn)樽x取系統(tǒng)時(shí)間很方便,后期對(duì)數(shù)據(jù)文件進(jìn)行查詢也很方便,只要輸入對(duì)應(yīng)的時(shí)間,就可以查到相應(yīng)的文件進(jìn)行數(shù)據(jù)讀取。
2、實(shí)現(xiàn)過(guò)程
??再來(lái)看看具體實(shí)現(xiàn)的程序,如下圖1所示,我們先用函數(shù)“當(dāng)前VI路徑”進(jìn)行拆分,獲得當(dāng)前VI的路徑,然后用系統(tǒng)時(shí)間給tdms文件命名,最后在創(chuàng)建一個(gè)新的路徑。也就是說(shuō),保存數(shù)據(jù)的文件存放在當(dāng)前VI所在路徑目錄下的save_file文件夾中,文件名是當(dāng)前系統(tǒng)時(shí)間,文件格式是.tdms,然后在whlie循環(huán)外創(chuàng)建TDMS文件。
??程序中用到的函數(shù)模塊如下圖所示:
??由于保存一定量的數(shù)據(jù)后,需要自動(dòng)新建新的tdms文件,這讓我立即想到了移位寄存器。在上圖1的whlie循環(huán)中,我把循環(huán)周期設(shè)置成1秒,也就是1秒鐘保存一組數(shù)據(jù),如果把循環(huán)周期設(shè)置成100ms,就是100ms保存一組數(shù)據(jù),這個(gè)主要取決于硬件的采樣頻率和實(shí)際需求。
??用循環(huán)次數(shù)除以60,判斷余數(shù)是否等于0,當(dāng)余數(shù)為0時(shí),說(shuō)明程序循環(huán)了60次,tdms文件保存了60組數(shù)據(jù),然后新建新的tdms文件來(lái)保存數(shù)據(jù),這樣,單個(gè)的tdms文件就不會(huì)過(guò)大。至于單個(gè)文件應(yīng)該保存多少組數(shù)據(jù),可以按實(shí)際需求來(lái)定,還可以在前面板設(shè)置一個(gè)數(shù)值輸入框,動(dòng)態(tài)調(diào)節(jié)單個(gè)文件存儲(chǔ)的數(shù)據(jù)量。實(shí)際上,單個(gè)tdms文件存幾萬(wàn)組數(shù)據(jù)是完全沒(méi)問(wèn)題的,占用的空間也不大。
??我在文件中存儲(chǔ)了2種數(shù)據(jù),一種是隨機(jī)數(shù),一種是固定值。程序每循環(huán)1秒,就往文件中存一組數(shù)據(jù),tdms文件可以存儲(chǔ)的數(shù)據(jù)種類很多,不過(guò)寫(xiě)入之前需要先轉(zhuǎn)換成數(shù)組,至于如何往tdms文件中寫(xiě)入數(shù)據(jù),大家可以看看我之前寫(xiě)的那篇文章。
3、示例結(jié)果
??在程序中,我把保存數(shù)據(jù)的tdms文件存放在當(dāng)前vi同路徑目錄下文件夾save_file中,將程序運(yùn)行一下,看看save_file文件夾下是否有tdms文件
??從上圖4可以看出,save_file文件夾中每1min就生成了一個(gè)tdms文件,對(duì)應(yīng)的還有一個(gè)index文件,這個(gè)不用管它,實(shí)際數(shù)據(jù)都存在.tdms文件中。我們用LabVIEW程序中自帶的TDMS文件查看器模塊查看save_file文件夾中的.tdms文件,結(jié)果如下:
??在TDMS文件查看器頁(yè)面,打開(kāi)的是save_file文件夾中的第一個(gè).tdms文件,可以看到文件中保存了2列共60行數(shù)據(jù),與我們程序設(shè)計(jì)的要求是吻合的,說(shuō)明數(shù)據(jù)成功存入了對(duì)應(yīng)的.tdms文件中。
三、小結(jié)
??1、存儲(chǔ).tdms文件的路徑可以按自己的實(shí)際需求來(lái)設(shè)置,沒(méi)必要和我一樣;文件名也可以隨意設(shè)置;
??2、枚舉常量“create or replace”是通過(guò)在“創(chuàng)建TDMS文件”模塊的輸入端創(chuàng)建常量得來(lái)的,還可以根據(jù)需求選擇枚舉常量中的其他值;
??3、這個(gè)自動(dòng)分段保存數(shù)據(jù)的程序是我自己琢磨出來(lái)的,有什么不妥的地方或者有更好的方法,歡迎交流。
??
??想要源文件的記得私信我,大概一周以內(nèi)看到就會(huì)回復(fù),或者關(guān)注我的VX公號(hào),新寫(xiě)的博文會(huì)同步到該號(hào)上,感興趣可以關(guān)注一下。
??本文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處!!!