国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種分布式無線傳感器節(jié)點監(jiān)控系統(tǒng)設(shè)計

2019-02-22 04:59孫曉陽蘇新彥姚金杰
測試技術(shù)學(xué)報 2019年1期
關(guān)鍵詞:機(jī)軟件調(diào)用線程

孫曉陽,蘇新彥,姚金杰,韓 焱

(1. 中北大學(xué) 信息與通信工程學(xué)院,山西 太原 030051;2. 中北大學(xué) 信息探測與處理技術(shù)重點實驗室,山西 太原 030051)

使用分布式測試系統(tǒng),通過在不同位置布設(shè)傳感器,可以得到?jīng)_擊波所造成的傷害隨距離的變化規(guī)律,直觀地反映出地下爆炸目標(biāo)的毀傷情況,為地下毀傷評估提供數(shù)據(jù)支持[1]. 近些年,研究人員為了對地下爆炸產(chǎn)生的沖擊波等參數(shù)進(jìn)行測試,開發(fā)了很多分布式微震監(jiān)測系統(tǒng),如南非的ISS微震監(jiān)測系統(tǒng)、波蘭的SOS微震檢測系統(tǒng)、潘一山等研制的礦震監(jiān)測系統(tǒng)和煤科總院中國礦業(yè)大學(xué)設(shè)計的井下爆破震源實時監(jiān)測與定位系統(tǒng)等[2]. 這些系統(tǒng)的設(shè)計絕大多數(shù)是針對深層的地下爆炸沖擊波參數(shù)測試所設(shè)計的,針對大區(qū)域的淺層地下爆炸毀傷效能參數(shù)獲取所進(jìn)行的相關(guān)研究和系統(tǒng)設(shè)計較少,因此本文設(shè)計了基于LabWindows/CVI的遠(yuǎn)程無線傳感器節(jié)點監(jiān)控系統(tǒng).

在靶場內(nèi)進(jìn)行分布式地下毀傷效能測試的實施現(xiàn)場一般具有較大危險性,不適合工作人員在現(xiàn)場進(jìn)行指揮控制; 同時使用分布式系統(tǒng)進(jìn)行參數(shù)測試時對傳感器節(jié)點的同步性要求比較嚴(yán)格,因此需要針對分布式測試系統(tǒng)開發(fā)遠(yuǎn)程的無線傳感器節(jié)點監(jiān)測軟件. 選擇在測量控制領(lǐng)域常用的軟件LabWindows/CVI,用以保證軟件的靈活性、穩(wěn)定性和界面友好性.

本文主要在軟件設(shè)計實現(xiàn)過程中提出了基于多線程的多傳感器節(jié)點同時連接和控制方法; 針對同時接收傳感器節(jié)點數(shù)據(jù)的正確性,采用線程安全隊列機(jī)制,完成了控制協(xié)議設(shè)計,實現(xiàn)了具有數(shù)據(jù)預(yù)處理功能的LabWindows和MATLAB混合編程技術(shù).

1 系統(tǒng)總體設(shè)計

分布式傳感器節(jié)點監(jiān)控系統(tǒng)由硬件系統(tǒng)和軟件系統(tǒng)組成. 硬件系統(tǒng)主要包括:傳感器節(jié)點、匯聚節(jié)點、無線設(shè)備和主控站4部分,如圖 1 所示. 本文主要針對安裝在主控站計算機(jī)的軟件系統(tǒng)進(jìn)行研究.

圖 1 分布式節(jié)點布設(shè)示意圖Fig.1 A schematic diagram of distributed nodes

設(shè)計軟件按照從頂至下的原則,在軟件的界面交互性和系統(tǒng)開放性兩方面進(jìn)行系統(tǒng)的總體設(shè)計. 借助LabWindows良好的人機(jī)交互性能,在軟件操作過程中給出必要的操作提示和硬件響應(yīng)信息,使軟件界面更友好; 為了使軟件更加靈活、便于修改,采用模塊化設(shè)計,將不同功能劃分為不同的模塊,各模塊通過接口相互組合,保證了軟件的可擴(kuò)展性、完整性和易維護(hù)性,組成結(jié)構(gòu)如圖 2 所示.

圖 2 軟件結(jié)構(gòu)圖Fig.2 Structure of the software

在軟件操作過程中,首先進(jìn)行軟件的初始化,包括注冊TCP服務(wù)器端口和開放UDP連接端口,然后等待連接; 已開啟的傳感器節(jié)點開始連接到上位機(jī)軟件,上位機(jī)軟件每接收到一個新的傳感器連接請求則開啟一個新的線程來實現(xiàn)64臺傳感器節(jié)點的同時連接和同步控制; 等待連接穩(wěn)定后,由上位機(jī)發(fā)送自檢指令給傳感器節(jié)點,傳感器節(jié)點自檢正常后發(fā)送上行指令給上位機(jī)軟件,上位機(jī)軟件提示可以進(jìn)行下一步操作,由用戶根據(jù)不同需求對傳感器節(jié)點進(jìn)行參數(shù)配置、參數(shù)信息顯示和文件信息顯示等操作; 待到數(shù)據(jù)采集完成后開始進(jìn)行遠(yuǎn)程的數(shù)據(jù)回傳操作,通過與MATLAB混合編程對數(shù)據(jù)進(jìn)行預(yù)處理,最后將處理后的波形保存并顯示在用戶使用界面. 軟件操作流程如圖 3 所示.

圖 3 軟件操作流程圖Fig.3 Flow chart of the software

2 實現(xiàn)方案

在基于LabWindows/CVI的無線傳感器節(jié)點監(jiān)測軟件的實現(xiàn)過程中,主要包括多線程、線程安全隊列、指令協(xié)議、Matlab混合編程等設(shè)計.

2.1 控制流程多線程設(shè)計

針對LabWindows/CVI中多線程塊模型相同塊內(nèi)資源共享、執(zhí)行速度快等優(yōu)點[3],軟件中利用LabWindows/CVI提供的線程池實現(xiàn)多線程的創(chuàng)建主要用于同時同多個傳感器節(jié)點保持連接,為了應(yīng)對分布式測試組網(wǎng)數(shù)據(jù)發(fā)送的突發(fā)性和同時性,上位機(jī)軟件選擇每建立一個TCP連接就創(chuàng)建一個新的線程來與對應(yīng)的傳感器節(jié)點進(jìn)行通信,多線程實現(xiàn)通信的流程如圖 4 所示.

圖 4 線程內(nèi)流程圖Fig.4 Flow chart of the in-thread

上位機(jī)軟件初始化過程中,打開TCP連接之后,每次收到連接請求(TCP_CONNECT),都會使用CmtScheduleThreadPoolFunction函數(shù)來利用默認(rèn)線程池創(chuàng)建一個新的線程,因為新建的線程為輔助線程,而輔助線程的函數(shù)和主線程的調(diào)用是同時執(zhí)行的,因此可以保證主線程能夠一直監(jiān)聽TCP連接內(nèi)的事件并及時做出響應(yīng). 在監(jiān)測到有數(shù)據(jù)請求的事件(TCP_DATAREADY),即傳感器節(jié)點向上位機(jī)發(fā)送數(shù)據(jù)的事件發(fā)生后,會使用PostDeferredCallToThread函數(shù)來調(diào)用指定的線程進(jìn)行數(shù)據(jù)分類接收工作.

創(chuàng)建的每個新線程,在線程不釋放的前提下一直運行ProcessSystemEvents函數(shù),當(dāng)檢測到有使用PostDeferredCallToThread函數(shù)調(diào)用指定線程的事件發(fā)生時,會在發(fā)生調(diào)用事件的線程中調(diào)用指定線程,從而完成多傳感器節(jié)點數(shù)據(jù)同時回傳的操作.

如果發(fā)生了傳感器節(jié)點掉線的情況(TCP_DISCONNECT),在主線程中就會檢測到TCP連接斷開事件,從而結(jié)束斷開的線程,同時清除相關(guān)的內(nèi)存. CmtWaitForThreadPoolFunctionCompletion函數(shù)使得主線程等待線程池函數(shù)結(jié)束后再退出,保證輔助線程使用的庫能夠被正確釋放. 由于新線程的建立是使用CmtScheduleThreadPoolFunction函數(shù),因此在釋放的時候需要調(diào)用CmtReleaseThreadPoolFunctionID函數(shù),在不影響當(dāng)前正在執(zhí)行的進(jìn)程函數(shù)條件下徹底結(jié)束釋放.

在本上位機(jī)軟件設(shè)計過程中有大量的線程在同時執(zhí)行,存在同一個變量同時被多個線程同時訪問的情況,因此需要使用線程鎖對這些變量進(jìn)行保護(hù),防止出現(xiàn)邏輯的錯誤[4,5]. 使用線程鎖需要在程序初始化的時候調(diào)用CmtNewLock函數(shù)來創(chuàng)建一個保護(hù)數(shù)據(jù)的線程鎖的集合,利用其返回的句柄調(diào)用指定線程鎖. 訪問鎖保護(hù)的數(shù)據(jù)和代碼前,必須調(diào)用CmtGetLock函數(shù)來獲取線程鎖,訪問結(jié)束后,必須調(diào)用CmtReleaseLock函數(shù)來釋放線程鎖. 需要特別注意的是可以在同一線程中多次調(diào)用CmtGetLock函數(shù),但每次調(diào)用都需要調(diào)用CmtReleaseLock函數(shù)來結(jié)束調(diào)用. 在程序退出時,也必須調(diào)用CmtDiscardLock函數(shù)來釋放由CmtNewLock函數(shù)創(chuàng)建的線程鎖資源.

2.2 控制協(xié)議設(shè)計

指令發(fā)送的過程是:上位機(jī)軟件先將控制指令發(fā)送給匯聚節(jié)點,然后由匯聚節(jié)點將指令轉(zhuǎn)發(fā)給指定傳感器節(jié)點,匯聚節(jié)點如圖 5 所示. 為了保證上位機(jī)軟件與遠(yuǎn)程傳感器節(jié)點的有效通信,上位機(jī)軟件通過具體分析傳感器節(jié)點的任務(wù),設(shè)計了通信雙方的通信控制指令協(xié)議.

圖 5 匯聚節(jié)點Fig.5 Aggregation nodes

1) 由上位機(jī)軟件給傳感器節(jié)點發(fā)送控制指令. 根據(jù)傳感器節(jié)點需要,由上位機(jī)軟件發(fā)送控制指令,完成上電、自檢、參數(shù)配置、參數(shù)回傳、文件信息回傳、數(shù)據(jù)采集和數(shù)據(jù)回傳等功能,設(shè)計下行控制指令數(shù)據(jù)格式如表 1 所示.

表 1 下行控制指令數(shù)據(jù)格式

由上位機(jī)軟件發(fā)送給傳感器節(jié)點的指令共 9 B,說明如下:

幀頭:占據(jù)2 B.

指令對象:占據(jù)1 B,用于指定指令對象是匯聚節(jié)點還是分布式傳感器節(jié)點. 如果代表匯聚節(jié)點,則傳感器節(jié)點選擇、指令類型和二級操作碼為無效指令.

傳感器節(jié)點選擇:占據(jù)1 B,0xff表示發(fā)送給所有的傳感器節(jié)點,范圍是0x00~0xff,是傳感器節(jié)點的編號.

指令類型:占據(jù)1 B,表示需要傳感器節(jié)點返回的是狀態(tài)反饋信息還是數(shù)據(jù)信息.

操作指令:占據(jù)2 B,表示上位機(jī)軟件發(fā)送給傳感器節(jié)點的動作信息.

二級操作碼:占據(jù)2 B,表示指令到達(dá)匯聚節(jié)點后不做任何處理,直接將指令轉(zhuǎn)發(fā)給分布式傳感器節(jié)點,主要針對傳感器節(jié)點的三軸信息.

例如給傳感器節(jié)點發(fā)送開始采集命令,控制指令為:0xeb90,0x02,0xff,0x01,0xa900,0xb120.

2) 分布式傳感器節(jié)點回傳數(shù)據(jù)格式. 傳感器回傳數(shù)據(jù)到上位機(jī)必須先把數(shù)據(jù)發(fā)送給匯聚節(jié)點,然后由匯聚節(jié)點統(tǒng)一將數(shù)據(jù)發(fā)送給上位機(jī)軟件. 分布式傳感器數(shù)據(jù)節(jié)點的數(shù)據(jù)有以下3種:參數(shù)配置信息(包括采樣通道數(shù)、采樣頻率和采樣長度等,共64 B)、傳感器節(jié)點三軸信息([(HMC5883地磁)X+Y+Z]+[(ADXL345加表)X+Y+Z]+結(jié)束碼0XFE共31 B)和傳感器采集的數(shù)據(jù)(每次配置不同,數(shù)據(jù)量不同). 因此匯聚節(jié)點向上位機(jī)軟件發(fā)送的數(shù)據(jù)有:匯聚節(jié)點工作狀態(tài)(包括各開關(guān)狀態(tài)和命令響應(yīng)情況)、匯聚節(jié)點信息(參數(shù)信息和文件信息等)以及轉(zhuǎn)發(fā)傳感器節(jié)點數(shù)據(jù)(傳感器節(jié)點姿態(tài)信息和采集的數(shù)據(jù)等).

可以將以上數(shù)據(jù)分為兩類:信息量大的沖擊波信號模塊和信息量小的沖擊波信號模塊以外的其他模塊.

讀沖擊波信號模塊時的數(shù)據(jù)格式如表 2 所示.

表 2 沖擊波信號模塊數(shù)據(jù)格式

由于匯聚節(jié)點控制模塊所選用ARM芯片的限制,匯聚節(jié)點每次最多能夠向上位機(jī)發(fā)送 2 014 B 的數(shù)據(jù). 但是由于在實際試驗中,匯聚節(jié)點的數(shù)量較多,網(wǎng)絡(luò)帶寬有限,為了保證不發(fā)生網(wǎng)絡(luò)擁塞[6]而造成數(shù)據(jù)丟失,沖擊波信號模塊每次發(fā)送515 B數(shù)據(jù).

匯聚節(jié)點號用于標(biāo)記沖擊波數(shù)據(jù)來源于眾多匯聚節(jié)點中的哪個匯聚節(jié)點; 因為數(shù)據(jù)量大,無法一次將所有的數(shù)據(jù)發(fā)送給上位機(jī),在分次數(shù)發(fā)送的過程中為了保證上位機(jī)能夠按照順序存儲數(shù)據(jù),需要對數(shù)據(jù)幀進(jìn)行順序的標(biāo)定,由數(shù)據(jù)幀號完成; 最后沖擊波模塊的有效數(shù)據(jù)放在末尾發(fā)送.

2.3 MATLAB混合編程設(shè)計

在小區(qū)域的地下震動波傳播過程中,由于傳輸介質(zhì)自身的復(fù)雜性、不均勻性,震動波的反射和折射等影響[7],使得震動信號中有用信號的能量較弱; 傳感器節(jié)點的不穩(wěn)定性使得信號的信噪比較低. 諸如上述因素的影響,使得震源定位精度降低. 因此,為了保證準(zhǔn)確定位,需要對采集的數(shù)據(jù)進(jìn)行濾波降噪、有效數(shù)據(jù)提取等操作.

基于MATLAB成本較低、計算靈活、使用方便,且比起Active X技術(shù)等,動態(tài)鏈接庫只需要在目標(biāo)主機(jī)安裝運行庫就能使用等優(yōu)點,本文采用基于動態(tài)鏈接庫調(diào)用的LabWIndows/CVI同MATLAB混合編程方法[8-10].

MATLAB版本的選用:上位機(jī)軟件開發(fā)所使用的LabWIndows/CVI版本為32 b 2017版,因此選用的MATLAB為32 b 2012版.

在MATLAB中生成動態(tài)鏈接庫,選擇好要進(jìn)行編譯的m腳本文件,然后選擇編譯器,此處選擇Microsoft Visual C++ 2010 編譯器,通過設(shè)置.mcc命令的選項,最終除了會生成C/C++源代碼、.exe可執(zhí)行文件和mex文件之外還會生成必須添加到LabWIndows/CVI工程文件中的.lib文件和.dll文件[11].

在使用LabWindows/CVI調(diào)用MATLAB動態(tài)鏈接庫時,首先將.lib文件、.dll文件和.h文件添加到工程文件內(nèi),除此之外,還需要將MATLAB庫函數(shù)中的mat.h, matrix.h, mclcr.h, tmwtypes.h, wchar.h和win.等文件同時添加到工程文件內(nèi)進(jìn)行調(diào)用,需要注意的是在MATLAB中用到的函數(shù)不同,需要添加的函數(shù)庫也有所不同.

LabWindows/CVI已ANSIC C為核心,以C語言為基礎(chǔ)編程,同MATLAB所使用的數(shù)據(jù)格式不相同,因此最需要注意的是在LabWindows/CVI同MATLAB之間傳遞數(shù)據(jù)的操作,這里可以使用C語言定義的參量傳遞定義,主要函數(shù)使用如表 3 所示.

表 3 數(shù)據(jù)傳遞函數(shù)

以上函數(shù)基本可以完成上位機(jī)軟件的數(shù)據(jù)傳遞操作,對于最終要傳遞到MATLAB中的數(shù)據(jù),數(shù)據(jù)類型一般定義為mxArray *,同時,為了保證能夠?qū)崿F(xiàn)有效傳遞,一般都會使用void *memcpy(void *dest, const void *src, size_t n)函數(shù)通過內(nèi)存復(fù)制的方式進(jìn)行賦值. 在成功調(diào)用MATLAB動態(tài)鏈接庫后,可以使用mxGetPr函數(shù),通過指針讀取最終的處理結(jié)果.

3 軟件測試

實驗進(jìn)行場所位于靶場內(nèi)80 m×60 m的空曠地區(qū),上位機(jī)控制軟件位于距離實驗場3 km遠(yuǎn)的實驗總部,傳感器節(jié)點布設(shè)現(xiàn)場如圖 6 所示.

實驗?zāi)軌蛲瑫r對16個匯聚節(jié)點進(jìn)行控制,從而實現(xiàn)對64個傳感器節(jié)點的控制和數(shù)據(jù)收發(fā). 在實驗過程中,匯聚節(jié)點和傳感器節(jié)點沒有發(fā)生誤操作的現(xiàn)象. 圖 7 為傳感器節(jié)點姿態(tài)信息回傳的結(jié)果.

圖 6 試驗現(xiàn)場Fig.6 The test site

圖 7 控制部分結(jié)果圖Fig.7 The result of control part

回傳的數(shù)據(jù)可以通過上位機(jī)軟件先進(jìn)行預(yù)處理,處理結(jié)果有效實現(xiàn)去噪,波形較為平滑,如圖 8 所示.

圖 8 回傳數(shù)據(jù)處理結(jié)果Fig.8 Return data processing results

通過對同一節(jié)點的同一段數(shù)據(jù)進(jìn)行比較,如圖 9 所示,經(jīng)過預(yù)處理的波形比較平滑,能夠有效用于地下毀傷效能測試的評估中.

圖 9 處理前后數(shù)據(jù)比較Fig.9 Data comparison before and after processing

4 結(jié) 論

本文設(shè)計的基于LabWIndows/CVI無線傳感器節(jié)點監(jiān)控系統(tǒng),使用多線程技術(shù)實現(xiàn)了對傳感器節(jié)點的同步控制,軟件的數(shù)據(jù)傳輸和存儲能夠滿足要求; 通過對指令數(shù)據(jù)收發(fā)協(xié)議進(jìn)行設(shè)計,實現(xiàn)了對匯聚節(jié)點的有效控制,完成了傳感器節(jié)點的數(shù)據(jù)收發(fā)操作; 通過對MATLAB動態(tài)鏈接庫的調(diào)用,實現(xiàn)了脫離MATLAB龐大的運行環(huán)境與MATLAB的混合編程. 同時上位機(jī)軟件基于模塊化設(shè)計,結(jié)合開發(fā)平臺的開放性和兼容性,使得本軟件具有可擴(kuò)展性和二次開發(fā)性. 本系統(tǒng)可廣泛應(yīng)用于靶場測試、震動監(jiān)測等分布式傳感器網(wǎng)絡(luò)監(jiān)測領(lǐng)域.

猜你喜歡
機(jī)軟件調(diào)用線程
基于C#線程實驗探究
基于國產(chǎn)化環(huán)境的線程池模型研究與實現(xiàn)
核電項目物項調(diào)用管理的應(yīng)用研究
線程池調(diào)度對服務(wù)器性能影響的研究*
系統(tǒng)虛擬化環(huán)境下客戶機(jī)系統(tǒng)調(diào)用信息捕獲與分析①
小水電站計算機(jī)監(jiān)控系統(tǒng)上位機(jī)軟件的開發(fā)
道岔監(jiān)測系統(tǒng)上位機(jī)軟件設(shè)計
小型磁偏轉(zhuǎn)質(zhì)譜計上位機(jī)軟件的設(shè)計與實現(xiàn)
利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
C++語言中函數(shù)參數(shù)傳遞方式剖析