陳懷民,馬更生,吳佳楠
(西北工業(yè)大學(xué) 無人機(jī)特種技術(shù)重點(diǎn)實(shí)驗(yàn)室,陜西 西安 710065)
在半物理仿真實(shí)驗(yàn)中,我們經(jīng)常需要對保存的實(shí)驗(yàn)數(shù)據(jù)進(jìn)行回放研究。像串口調(diào)試助手、網(wǎng)絡(luò)調(diào)試助手等軟件雖然可以對數(shù)據(jù)文件進(jìn)行讀取和發(fā)送,然而它們僅僅是對整個(gè)文件內(nèi)的數(shù)據(jù)進(jìn)行整體發(fā)送,而無法按我們的需求進(jìn)行一幀一幀的發(fā)送。通常我們自己開發(fā)的用于數(shù)據(jù)研究的軟件也只是針對某一特定的數(shù)據(jù)文件進(jìn)行讀取,數(shù)據(jù)文件內(nèi)變量個(gè)數(shù)以及類型的改變,都要導(dǎo)致對軟件的源程序進(jìn)行修改,這樣就很繁瑣,并且對其他人員的使用、修改造成了一定的困難。
為了解決這一問題,利用LabWindows/CVI開發(fā)環(huán)境設(shè)計(jì)了數(shù)據(jù)播放器,可以按照實(shí)驗(yàn)時(shí)的真實(shí)采樣過程,將實(shí)驗(yàn)數(shù)據(jù)發(fā)送出去,再現(xiàn)實(shí)驗(yàn)過程,可反復(fù)對實(shí)驗(yàn)數(shù)據(jù)進(jìn)行研究。通過使用ini配置文件的方式做到了通用,只需對ini文件進(jìn)行簡單的相應(yīng)修改,就可以播放不同格式不同數(shù)據(jù)量的文件,而無需對源程序進(jìn)行修改。同時(shí)由于LabWindows/CVI可以生成MSI格式的發(fā)布(安裝)文件,可以將編制好的應(yīng)用程序轉(zhuǎn)化為發(fā)布文件,這樣可以脫離LabWindows/CVI的開發(fā)環(huán)境,將發(fā)布程序安裝到任何一臺計(jì)算機(jī)上[1]。
結(jié)合所需功能,在LabWindows/CVI下搭建數(shù)據(jù)播放器界面如圖1所示。
圖1 數(shù)據(jù)播放器界面圖Fig.1 Interface chart of the data player
采用配置文件即ini文件的形式對UDP通信和數(shù)據(jù)文件的信息進(jìn)行讀取。為了便于對ini文件的修改,設(shè)置了“打開配置文件”按鈕,可以方便的打開ini文件對其進(jìn)行修改,然后將其載入。選擇相應(yīng)的數(shù)據(jù)文件,即可進(jìn)行播放,數(shù)據(jù)可以按真實(shí)實(shí)驗(yàn)時(shí)的傳輸過程,將數(shù)據(jù)按采樣間隔發(fā)送出去。為了便于對數(shù)據(jù)播放位置的調(diào)整,設(shè)置了進(jìn)度條即CVI中的滾動(dòng)條控件,不僅可以顯示數(shù)據(jù)的播放進(jìn)度,而且可以通過對滾動(dòng)條的拖動(dòng)改變數(shù)據(jù)的播放位置。
ini文件是Initialization file的縮寫,即初始化文件,不僅一般的應(yīng)用程序可以使用ini文件,其實(shí)windows操作系統(tǒng)也有自己的ini文件:win.ini,保存在Windows目錄下,Windows通過該文件對當(dāng)前操作系統(tǒng)進(jìn)行配置[2]。
ini文件將各種數(shù)據(jù)分成很多以“[]”組成的節(jié),而在每一節(jié)中又包含了很多項(xiàng)目,項(xiàng)后面緊跟著一個(gè)等號,等號后面則是該項(xiàng)的值。實(shí)際上,ini文件中數(shù)據(jù)的存取是采用預(yù)先約定好的“項(xiàng)目=值”存儲結(jié)i構(gòu),各種數(shù)據(jù)被分門別類的存儲。ini文件的通用格式可以總結(jié)為:
在設(shè)計(jì)中將UDP通信的信息以及數(shù)據(jù)的相關(guān)信息寫入ini文件,使用中只需對ini文件進(jìn)行簡單的相應(yīng)改動(dòng)就可以讀取不同的數(shù)據(jù)文件。ini文件的設(shè)置如下:
其中在NetworkConfig中設(shè)置UDP通信的相關(guān)信息,如本地IP、本地端口號、對方IP、對方端口號。在DataConfig中按照數(shù)據(jù)文件的具體信息,在Key中填寫數(shù)據(jù)名稱,如“variable1”。 KeyValue 中 填 寫 變 量 的 格 式 , 如 “double”、“float”、“int”。各變量的排列順序完全按照數(shù)據(jù)文件內(nèi)變量的排列順序。在OtherConfig中設(shè)置幀間隔(即數(shù)據(jù)的采樣間隔)和數(shù)據(jù)的存放格式。由于數(shù)據(jù)的相關(guān)信息都是已知的,所以對ini文件的修改非常容易。
對NetworkConfig和OtherConfig中的信息進(jìn)行載入相對簡單,不再贅述。對數(shù)據(jù)變量及數(shù)據(jù)類型的載入,定義結(jié)構(gòu)體:
在載入ini文件的過程中,根據(jù)[DataConfig]中變量的多少建立數(shù)據(jù)變量的動(dòng)態(tài)鏈表[3],建立過程中對每個(gè)節(jié)點(diǎn)的成員進(jìn)行相應(yīng)賦值,datan用于區(qū)別變量在數(shù)據(jù)中的排列位置;dataname為變量的名稱;datatype為變量的數(shù)據(jù)類型;datalength為變量所占字節(jié)數(shù);同時(shí)我們還可以得到一幀數(shù)據(jù)總的字節(jié)數(shù)length。這些和真實(shí)數(shù)據(jù)的存儲都是相同的,這樣就保證了數(shù)據(jù)的播放和采樣接收時(shí)的情況完全相同。由于建立鏈表的程序較多,這里不再贅述。動(dòng)態(tài)鏈表的建立極大方便了數(shù)據(jù)的讀取和發(fā)送,對于數(shù)據(jù)變量的信息,只需按需要對鏈表進(jìn)行遍歷即可得到,而且有利于以后對軟件進(jìn)一步的升級。
以ASCII格式的數(shù)據(jù)文件為例說明數(shù)據(jù)的讀取。對動(dòng)態(tài)鏈表進(jìn)行遍歷,判斷每個(gè)變量的數(shù)據(jù)類型,根據(jù)不同類型,分配不同的字節(jié)數(shù),將文件內(nèi)的數(shù)據(jù)按順序?qū)懭雰?nèi)存。程序流程圖如圖2所示。
圖2 數(shù)據(jù)文件讀取流程圖Fig.2 Flow chart of loading the data file
與ASCII格式的數(shù)據(jù)文件不同,二進(jìn)制數(shù)據(jù)文件的數(shù)據(jù)無需單個(gè)讀取,只需對鏈表進(jìn)行一次遍歷,分配適當(dāng)大小的內(nèi)存后一次性將文件內(nèi)數(shù)據(jù)全部寫入內(nèi)存。
為了使得不同任務(wù)之間的協(xié)調(diào)操作與運(yùn)行、數(shù)據(jù)的交互等問題更加易于解決,程序中使用了異步定時(shí)器。不需要特殊的數(shù)據(jù)傳送機(jī)制,不需要建立共享存儲區(qū)或共享文件,這對于數(shù)據(jù)的讀取和發(fā)送增加了很多方便,同時(shí)增強(qiáng)了程序的靈活性。
異步定時(shí)器的創(chuàng)建:
timerid=NewAsyncTimer(playspeed, -1, 0, asynCB, 0);
timerid:控件句柄
playspeed:兩次事件的時(shí)間間隔,單位為秒
asynCB:自定義回調(diào)函數(shù),產(chǎn)生相當(dāng)于普通Timer控件的回調(diào)函數(shù)事件。
在回調(diào)函數(shù)asynCB中,要將數(shù)據(jù)中的一幀數(shù)據(jù)完整的經(jīng)過UDP傳輸:
data=malloc(length);
memcpy (data, &wave[scrollbarposition*length], length);
UDPWrite(writerChannel, targetport, targetip, data, length);
異步定時(shí)器的時(shí)間間隔設(shè)定為數(shù)據(jù)文件的采樣間隔,這樣對于數(shù)據(jù)接收方來說,接收數(shù)據(jù)播放器的數(shù)據(jù)就如同接收實(shí)時(shí)采集的數(shù)據(jù)一樣,完全可以模擬之前實(shí)驗(yàn)時(shí)的數(shù)據(jù)采集情況。
為了方便的顯示和調(diào)整文件的播放進(jìn)度,使用了CVI中的滾動(dòng)條控件,CVI中滾動(dòng)條可以通過兩種方式得到:一種是利用函數(shù)ScrollBar_Create[4][5]創(chuàng)建,另一種方式是利用函數(shù)ScrollBar_ConvertFromGraph將繪圖控件轉(zhuǎn)化為滾動(dòng)條。本設(shè)計(jì)選用的是第二種方式:
ScrollBar_ConvertFromGraph (panelHandle,PANEL_GRAPH_HORIZONTAL,scrollbarCB , NULL);
其中scrollbarCB是滾動(dòng)條的回調(diào)函數(shù),可以實(shí)時(shí)響應(yīng)播放進(jìn)度的變化并改變滾動(dòng)條的位置。
滾動(dòng)條有兩種顯示方式,分別為水平滾動(dòng)條和垂直滾動(dòng)條。本設(shè)計(jì)選用水平滾動(dòng)條。
通過函數(shù)ScrollBar_GetAttribute和ScrollBar_SetAttribute分別獲得和設(shè)置滾動(dòng)條的屬性值,包括滾動(dòng)條的最小值、最大值、滾動(dòng)條一次滾動(dòng)的大小、滾動(dòng)條是否與拖動(dòng)的數(shù)值成比例進(jìn)行設(shè)置,這些設(shè)置相對比較簡單。
滾動(dòng)條的函數(shù)面板在菜單的Library中并不存在,因此首先需要注意的是應(yīng)該裝載儀器驅(qū)動(dòng)[6],然后將所需的函數(shù)面板文件scroll.fp添加到當(dāng)前工程中。和滾動(dòng)條一樣,ini文件和異步定時(shí)器的函數(shù)面板文件inifile.fp、asynctmr.fp也要添加到當(dāng)前工程中。如圖3所示。
圖3 添加函數(shù)面板文件Fig.3 Chart of loading the.fp file
為了使不同的數(shù)據(jù)文件可以有更好的播放效果,設(shè)計(jì)了兩種播放方式。一種是改變播放間隔,采用這種方式可以使數(shù)據(jù)以自定義的速度發(fā)送出去,而且沒有數(shù)據(jù)的丟失,適用于采樣間隔較大、數(shù)據(jù)較少的數(shù)據(jù)文件;另一種是類似視頻播放器的方式,對數(shù)據(jù)的播放可以進(jìn)行“快進(jìn)”和“慢放”,快進(jìn)是對數(shù)據(jù)進(jìn)行抽點(diǎn)播放,慢放則是對數(shù)據(jù)進(jìn)行重復(fù)播放。
采用ASCII格式的文件testdata.dat,其中包含3個(gè)變量,變量一是幅值為4,周期1 s的正弦變量;變量二是幅值為3,周期2 s的余弦變量;變量三是幅值為1,周期為1 s的三角波變量,采樣周期為20 ms。
播放器運(yùn)行界面如圖4所示。
圖4 播放器運(yùn)行界面圖Fig.4 Interface chart of data player run
數(shù)據(jù)接收界面采用CVI設(shè)計(jì)的虛擬示波器。示波器接收界面如圖5所示。
圖5 數(shù)據(jù)接收界面圖Fig.5 Interface chart of the data receive
由圖4的運(yùn)行界面可以看到數(shù)據(jù)文件的相關(guān)信息,可以很清楚的知道播放進(jìn)度。由圖5中3個(gè)變量的波形可以得出,接收到的收據(jù)和數(shù)據(jù)文件內(nèi)的數(shù)據(jù)完全相同,說明數(shù)據(jù)播放器的設(shè)計(jì)是可用的。
以上基于LabWindows/CVI的數(shù)據(jù)播放器的設(shè)計(jì)與實(shí)現(xiàn),詳細(xì)介紹了ini文件的配置和載入,數(shù)據(jù)文件的讀取和發(fā)送,簡要介紹了異步定時(shí)器和滾動(dòng)條控件的使用。本設(shè)計(jì)的核心是ini文件的靈活配置以及對數(shù)據(jù)文件內(nèi)的變量進(jìn)行的動(dòng)態(tài)鏈表的建立。在讀取不同的數(shù)據(jù)文件時(shí),無需關(guān)注程序本身的修改,只需根據(jù)數(shù)據(jù)文件的具體信息對ini文件進(jìn)行簡單的配置即可,從而節(jié)省了很多繁瑣的修改程序的過程。
[1]宋宇峰.LabWindows/CVI逐步深入與開發(fā)實(shí)例[M].北京:機(jī)械工業(yè)出版社,2003.
[2]王建新,楊世鳳,隋美麗.LabWindows/CVI測試技術(shù)及工程應(yīng)用[M].北京:化學(xué)工業(yè)出版社,2006.
[3]譚浩強(qiáng).C程序設(shè)計(jì)[M].3版.北京:清華大學(xué)出版社,2006.
[4]Nation Instruments Corportation.LabWindows/CVI Help[S].2006.
[5]劉君華.基于LabWindows/CVI的虛擬儀器設(shè)計(jì)[M].北京:電子工業(yè)出版社,2003.
[6]孫曉云,郭立煒,孫會琴.基于LabWindows/CVI的虛擬儀器設(shè)計(jì)與應(yīng)用[M].北京:電子工業(yè)出版社,2005.