孫曉陽,蘇新彥,姚金杰,韓 焱
(1. 中北大學 信息與通信工程學院,山西 太原 030051;2. 中北大學 信息探測與處理技術重點實驗室,山西 太原 030051)
使用分布式測試系統(tǒng),通過在不同位置布設傳感器,可以得到沖擊波所造成的傷害隨距離的變化規(guī)律,直觀地反映出地下爆炸目標的毀傷情況,為地下毀傷評估提供數據支持[1]. 近些年,研究人員為了對地下爆炸產生的沖擊波等參數進行測試,開發(fā)了很多分布式微震監(jiān)測系統(tǒng),如南非的ISS微震監(jiān)測系統(tǒng)、波蘭的SOS微震檢測系統(tǒng)、潘一山等研制的礦震監(jiān)測系統(tǒng)和煤科總院中國礦業(yè)大學設計的井下爆破震源實時監(jiān)測與定位系統(tǒng)等[2]. 這些系統(tǒng)的設計絕大多數是針對深層的地下爆炸沖擊波參數測試所設計的,針對大區(qū)域的淺層地下爆炸毀傷效能參數獲取所進行的相關研究和系統(tǒng)設計較少,因此本文設計了基于LabWindows/CVI的遠程無線傳感器節(jié)點監(jiān)控系統(tǒng).
在靶場內進行分布式地下毀傷效能測試的實施現(xiàn)場一般具有較大危險性,不適合工作人員在現(xiàn)場進行指揮控制; 同時使用分布式系統(tǒng)進行參數測試時對傳感器節(jié)點的同步性要求比較嚴格,因此需要針對分布式測試系統(tǒng)開發(fā)遠程的無線傳感器節(jié)點監(jiān)測軟件. 選擇在測量控制領域常用的軟件LabWindows/CVI,用以保證軟件的靈活性、穩(wěn)定性和界面友好性.
本文主要在軟件設計實現(xiàn)過程中提出了基于多線程的多傳感器節(jié)點同時連接和控制方法; 針對同時接收傳感器節(jié)點數據的正確性,采用線程安全隊列機制,完成了控制協(xié)議設計,實現(xiàn)了具有數據預處理功能的LabWindows和MATLAB混合編程技術.
分布式傳感器節(jié)點監(jiān)控系統(tǒng)由硬件系統(tǒng)和軟件系統(tǒng)組成. 硬件系統(tǒng)主要包括:傳感器節(jié)點、匯聚節(jié)點、無線設備和主控站4部分,如圖 1 所示. 本文主要針對安裝在主控站計算機的軟件系統(tǒng)進行研究.
圖 1 分布式節(jié)點布設示意圖Fig.1 A schematic diagram of distributed nodes
設計軟件按照從頂至下的原則,在軟件的界面交互性和系統(tǒng)開放性兩方面進行系統(tǒng)的總體設計. 借助LabWindows良好的人機交互性能,在軟件操作過程中給出必要的操作提示和硬件響應信息,使軟件界面更友好; 為了使軟件更加靈活、便于修改,采用模塊化設計,將不同功能劃分為不同的模塊,各模塊通過接口相互組合,保證了軟件的可擴展性、完整性和易維護性,組成結構如圖 2 所示.
圖 2 軟件結構圖Fig.2 Structure of the software
在軟件操作過程中,首先進行軟件的初始化,包括注冊TCP服務器端口和開放UDP連接端口,然后等待連接; 已開啟的傳感器節(jié)點開始連接到上位機軟件,上位機軟件每接收到一個新的傳感器連接請求則開啟一個新的線程來實現(xiàn)64臺傳感器節(jié)點的同時連接和同步控制; 等待連接穩(wěn)定后,由上位機發(fā)送自檢指令給傳感器節(jié)點,傳感器節(jié)點自檢正常后發(fā)送上行指令給上位機軟件,上位機軟件提示可以進行下一步操作,由用戶根據不同需求對傳感器節(jié)點進行參數配置、參數信息顯示和文件信息顯示等操作; 待到數據采集完成后開始進行遠程的數據回傳操作,通過與MATLAB混合編程對數據進行預處理,最后將處理后的波形保存并顯示在用戶使用界面. 軟件操作流程如圖 3 所示.
圖 3 軟件操作流程圖Fig.3 Flow chart of the software
在基于LabWindows/CVI的無線傳感器節(jié)點監(jiān)測軟件的實現(xiàn)過程中,主要包括多線程、線程安全隊列、指令協(xié)議、Matlab混合編程等設計.
針對LabWindows/CVI中多線程塊模型相同塊內資源共享、執(zhí)行速度快等優(yōu)點[3],軟件中利用LabWindows/CVI提供的線程池實現(xiàn)多線程的創(chuàng)建主要用于同時同多個傳感器節(jié)點保持連接,為了應對分布式測試組網數據發(fā)送的突發(fā)性和同時性,上位機軟件選擇每建立一個TCP連接就創(chuàng)建一個新的線程來與對應的傳感器節(jié)點進行通信,多線程實現(xiàn)通信的流程如圖 4 所示.
圖 4 線程內流程圖Fig.4 Flow chart of the in-thread
上位機軟件初始化過程中,打開TCP連接之后,每次收到連接請求(TCP_CONNECT),都會使用CmtScheduleThreadPoolFunction函數來利用默認線程池創(chuàng)建一個新的線程,因為新建的線程為輔助線程,而輔助線程的函數和主線程的調用是同時執(zhí)行的,因此可以保證主線程能夠一直監(jiān)聽TCP連接內的事件并及時做出響應. 在監(jiān)測到有數據請求的事件(TCP_DATAREADY),即傳感器節(jié)點向上位機發(fā)送數據的事件發(fā)生后,會使用PostDeferredCallToThread函數來調用指定的線程進行數據分類接收工作.
創(chuàng)建的每個新線程,在線程不釋放的前提下一直運行ProcessSystemEvents函數,當檢測到有使用PostDeferredCallToThread函數調用指定線程的事件發(fā)生時,會在發(fā)生調用事件的線程中調用指定線程,從而完成多傳感器節(jié)點數據同時回傳的操作.
如果發(fā)生了傳感器節(jié)點掉線的情況(TCP_DISCONNECT),在主線程中就會檢測到TCP連接斷開事件,從而結束斷開的線程,同時清除相關的內存. CmtWaitForThreadPoolFunctionCompletion函數使得主線程等待線程池函數結束后再退出,保證輔助線程使用的庫能夠被正確釋放. 由于新線程的建立是使用CmtScheduleThreadPoolFunction函數,因此在釋放的時候需要調用CmtReleaseThreadPoolFunctionID函數,在不影響當前正在執(zhí)行的進程函數條件下徹底結束釋放.
在本上位機軟件設計過程中有大量的線程在同時執(zhí)行,存在同一個變量同時被多個線程同時訪問的情況,因此需要使用線程鎖對這些變量進行保護,防止出現(xiàn)邏輯的錯誤[4,5]. 使用線程鎖需要在程序初始化的時候調用CmtNewLock函數來創(chuàng)建一個保護數據的線程鎖的集合,利用其返回的句柄調用指定線程鎖. 訪問鎖保護的數據和代碼前,必須調用CmtGetLock函數來獲取線程鎖,訪問結束后,必須調用CmtReleaseLock函數來釋放線程鎖. 需要特別注意的是可以在同一線程中多次調用CmtGetLock函數,但每次調用都需要調用CmtReleaseLock函數來結束調用. 在程序退出時,也必須調用CmtDiscardLock函數來釋放由CmtNewLock函數創(chuàng)建的線程鎖資源.
指令發(fā)送的過程是:上位機軟件先將控制指令發(fā)送給匯聚節(jié)點,然后由匯聚節(jié)點將指令轉發(fā)給指定傳感器節(jié)點,匯聚節(jié)點如圖 5 所示. 為了保證上位機軟件與遠程傳感器節(jié)點的有效通信,上位機軟件通過具體分析傳感器節(jié)點的任務,設計了通信雙方的通信控制指令協(xié)議.
圖 5 匯聚節(jié)點Fig.5 Aggregation nodes
1) 由上位機軟件給傳感器節(jié)點發(fā)送控制指令. 根據傳感器節(jié)點需要,由上位機軟件發(fā)送控制指令,完成上電、自檢、參數配置、參數回傳、文件信息回傳、數據采集和數據回傳等功能,設計下行控制指令數據格式如表 1 所示.
表 1 下行控制指令數據格式
由上位機軟件發(fā)送給傳感器節(jié)點的指令共 9 B,說明如下:
幀頭:占據2 B.
指令對象:占據1 B,用于指定指令對象是匯聚節(jié)點還是分布式傳感器節(jié)點. 如果代表匯聚節(jié)點,則傳感器節(jié)點選擇、指令類型和二級操作碼為無效指令.
傳感器節(jié)點選擇:占據1 B,0xff表示發(fā)送給所有的傳感器節(jié)點,范圍是0x00~0xff,是傳感器節(jié)點的編號.
指令類型:占據1 B,表示需要傳感器節(jié)點返回的是狀態(tài)反饋信息還是數據信息.
操作指令:占據2 B,表示上位機軟件發(fā)送給傳感器節(jié)點的動作信息.
二級操作碼:占據2 B,表示指令到達匯聚節(jié)點后不做任何處理,直接將指令轉發(fā)給分布式傳感器節(jié)點,主要針對傳感器節(jié)點的三軸信息.
例如給傳感器節(jié)點發(fā)送開始采集命令,控制指令為:0xeb90,0x02,0xff,0x01,0xa900,0xb120.
2) 分布式傳感器節(jié)點回傳數據格式. 傳感器回傳數據到上位機必須先把數據發(fā)送給匯聚節(jié)點,然后由匯聚節(jié)點統(tǒng)一將數據發(fā)送給上位機軟件. 分布式傳感器數據節(jié)點的數據有以下3種:參數配置信息(包括采樣通道數、采樣頻率和采樣長度等,共64 B)、傳感器節(jié)點三軸信息([(HMC5883地磁)X+Y+Z]+[(ADXL345加表)X+Y+Z]+結束碼0XFE共31 B)和傳感器采集的數據(每次配置不同,數據量不同). 因此匯聚節(jié)點向上位機軟件發(fā)送的數據有:匯聚節(jié)點工作狀態(tài)(包括各開關狀態(tài)和命令響應情況)、匯聚節(jié)點信息(參數信息和文件信息等)以及轉發(fā)傳感器節(jié)點數據(傳感器節(jié)點姿態(tài)信息和采集的數據等).
可以將以上數據分為兩類:信息量大的沖擊波信號模塊和信息量小的沖擊波信號模塊以外的其他模塊.
讀沖擊波信號模塊時的數據格式如表 2 所示.
表 2 沖擊波信號模塊數據格式
由于匯聚節(jié)點控制模塊所選用ARM芯片的限制,匯聚節(jié)點每次最多能夠向上位機發(fā)送 2 014 B 的數據. 但是由于在實際試驗中,匯聚節(jié)點的數量較多,網絡帶寬有限,為了保證不發(fā)生網絡擁塞[6]而造成數據丟失,沖擊波信號模塊每次發(fā)送515 B數據.
匯聚節(jié)點號用于標記沖擊波數據來源于眾多匯聚節(jié)點中的哪個匯聚節(jié)點; 因為數據量大,無法一次將所有的數據發(fā)送給上位機,在分次數發(fā)送的過程中為了保證上位機能夠按照順序存儲數據,需要對數據幀進行順序的標定,由數據幀號完成; 最后沖擊波模塊的有效數據放在末尾發(fā)送.
在小區(qū)域的地下震動波傳播過程中,由于傳輸介質自身的復雜性、不均勻性,震動波的反射和折射等影響[7],使得震動信號中有用信號的能量較弱; 傳感器節(jié)點的不穩(wěn)定性使得信號的信噪比較低. 諸如上述因素的影響,使得震源定位精度降低. 因此,為了保證準確定位,需要對采集的數據進行濾波降噪、有效數據提取等操作.
基于MATLAB成本較低、計算靈活、使用方便,且比起Active X技術等,動態(tài)鏈接庫只需要在目標主機安裝運行庫就能使用等優(yōu)點,本文采用基于動態(tài)鏈接庫調用的LabWIndows/CVI同MATLAB混合編程方法[8-10].
MATLAB版本的選用:上位機軟件開發(fā)所使用的LabWIndows/CVI版本為32 b 2017版,因此選用的MATLAB為32 b 2012版.
在MATLAB中生成動態(tài)鏈接庫,選擇好要進行編譯的m腳本文件,然后選擇編譯器,此處選擇Microsoft Visual C++ 2010 編譯器,通過設置.mcc命令的選項,最終除了會生成C/C++源代碼、.exe可執(zhí)行文件和mex文件之外還會生成必須添加到LabWIndows/CVI工程文件中的.lib文件和.dll文件[11].
在使用LabWindows/CVI調用MATLAB動態(tài)鏈接庫時,首先將.lib文件、.dll文件和.h文件添加到工程文件內,除此之外,還需要將MATLAB庫函數中的mat.h, matrix.h, mclcr.h, tmwtypes.h, wchar.h和win.等文件同時添加到工程文件內進行調用,需要注意的是在MATLAB中用到的函數不同,需要添加的函數庫也有所不同.
LabWindows/CVI已ANSIC C為核心,以C語言為基礎編程,同MATLAB所使用的數據格式不相同,因此最需要注意的是在LabWindows/CVI同MATLAB之間傳遞數據的操作,這里可以使用C語言定義的參量傳遞定義,主要函數使用如表 3 所示.
表 3 數據傳遞函數
以上函數基本可以完成上位機軟件的數據傳遞操作,對于最終要傳遞到MATLAB中的數據,數據類型一般定義為mxArray *,同時,為了保證能夠實現(xiàn)有效傳遞,一般都會使用void *memcpy(void *dest, const void *src, size_t n)函數通過內存復制的方式進行賦值. 在成功調用MATLAB動態(tài)鏈接庫后,可以使用mxGetPr函數,通過指針讀取最終的處理結果.
實驗進行場所位于靶場內80 m×60 m的空曠地區(qū),上位機控制軟件位于距離實驗場3 km遠的實驗總部,傳感器節(jié)點布設現(xiàn)場如圖 6 所示.
實驗能夠同時對16個匯聚節(jié)點進行控制,從而實現(xiàn)對64個傳感器節(jié)點的控制和數據收發(fā). 在實驗過程中,匯聚節(jié)點和傳感器節(jié)點沒有發(fā)生誤操作的現(xiàn)象. 圖 7 為傳感器節(jié)點姿態(tài)信息回傳的結果.
圖 6 試驗現(xiàn)場Fig.6 The test site
圖 7 控制部分結果圖Fig.7 The result of control part
回傳的數據可以通過上位機軟件先進行預處理,處理結果有效實現(xiàn)去噪,波形較為平滑,如圖 8 所示.
圖 8 回傳數據處理結果Fig.8 Return data processing results
通過對同一節(jié)點的同一段數據進行比較,如圖 9 所示,經過預處理的波形比較平滑,能夠有效用于地下毀傷效能測試的評估中.
圖 9 處理前后數據比較Fig.9 Data comparison before and after processing
本文設計的基于LabWIndows/CVI無線傳感器節(jié)點監(jiān)控系統(tǒng),使用多線程技術實現(xiàn)了對傳感器節(jié)點的同步控制,軟件的數據傳輸和存儲能夠滿足要求; 通過對指令數據收發(fā)協(xié)議進行設計,實現(xiàn)了對匯聚節(jié)點的有效控制,完成了傳感器節(jié)點的數據收發(fā)操作; 通過對MATLAB動態(tài)鏈接庫的調用,實現(xiàn)了脫離MATLAB龐大的運行環(huán)境與MATLAB的混合編程. 同時上位機軟件基于模塊化設計,結合開發(fā)平臺的開放性和兼容性,使得本軟件具有可擴展性和二次開發(fā)性. 本系統(tǒng)可廣泛應用于靶場測試、震動監(jiān)測等分布式傳感器網絡監(jiān)測領域.