孫曉陽,蘇新彥,姚金杰,韓 焱
(1. 中北大學 信息與通信工程學院,山西 太原 030051;2. 中北大學 信息探測與處理技術重點實驗室,山西 太原 030051)
使用分布式測試系統,通過在不同位置布設傳感器,可以得到沖擊波所造成的傷害隨距離的變化規律,直觀地反映出地下爆炸目標的毀傷情況,為地下毀傷評估提供數據支持[1]. 近些年,研究人員為了對地下爆炸產生的沖擊波等參數進行測試,開發了很多分布式微震監測系統,如南非的ISS微震監測系統、波蘭的SOS微震檢測系統、潘一山等研制的礦震監測系統和煤科總院中國礦業大學設計的井下爆破震源實時監測與定位系統等[2]. 這些系統的設計絕大多數是針對深層的地下爆炸沖擊波參數測試所設計的,針對大區域的淺層地下爆炸毀傷效能參數獲取所進行的相關研究和系統設計較少,因此本文設計了基于LabWindows/CVI的遠程無線傳感器節點監控系統.
在靶場內進行分布式地下毀傷效能測試的實施現場一般具有較大危險性,不適合工作人員在現場進行指揮控制; 同時使用分布式系統進行參數測試時對傳感器節點的同步性要求比較嚴格,因此需要針對分布式測試系統開發遠程的無線傳感器節點監測軟件. 選擇在測量控制領域常用的軟件LabWindows/CVI,用以保證軟件的靈活性、穩定性和界面友好性.
本文主要在軟件設計實現過程中提出了基于多線程的多傳感器節點同時連接和控制方法; 針對同時接收傳感器節點數據的正確性,采用線程安全隊列機制,完成了控制協議設計,實現了具有數據預處理功能的LabWindows和MATLAB混合編程技術.
分布式傳感器節點監控系統由硬件系統和軟件系統組成. 硬件系統主要包括:傳感器節點、匯聚節點、無線設備和主控站4部分,如圖 1 所示. 本文主要針對安裝在主控站計算機的軟件系統進行研究.

圖 1 分布式節點布設示意圖Fig.1 A schematic diagram of distributed nodes
設計軟件按照從頂至下的原則,在軟件的界面交互性和系統開放性兩方面進行系統的總體設計. 借助LabWindows良好的人機交互性能,在軟件操作過程中給出必要的操作提示和硬件響應信息,使軟件界面更友好; 為了使軟件更加靈活、便于修改,采用模塊化設計,將不同功能劃分為不同的模塊,各模塊通過接口相互組合,保證了軟件的可擴展性、完整性和易維護性,組成結構如圖 2 所示.

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

圖 3 軟件操作流程圖Fig.3 Flow chart of the software
在基于LabWindows/CVI的無線傳感器節點監測軟件的實現過程中,主要包括多線程、線程安全隊列、指令協議、Matlab混合編程等設計.
針對LabWindows/CVI中多線程塊模型相同塊內資源共享、執行速度快等優點[3],軟件中利用LabWindows/CVI提供的線程池實現多線程的創建主要用于同時同多個傳感器節點保持連接,為了應對分布式測試組網數據發送的突發性和同時性,上位機軟件選擇每建立一個TCP連接就創建一個新的線程來與對應的傳感器節點進行通信,多線程實現通信的流程如圖 4 所示.

圖 4 線程內流程圖Fig.4 Flow chart of the in-thread
上位機軟件初始化過程中,打開TCP連接之后,每次收到連接請求(TCP_CONNECT),都會使用CmtScheduleThreadPoolFunction函數來利用默認線程池創建一個新的線程,因為新建的線程為輔助線程,而輔助線程的函數和主線程的調用是同時執行的,因此可以保證主線程能夠一直監聽TCP連接內的事件并及時做出響應. 在監測到有數據請求的事件(TCP_DATAREADY),即傳感器節點向上位機發送數據的事件發生后,會使用PostDeferredCallToThread函數來調用指定的線程進行數據分類接收工作.
創建的每個新線程,在線程不釋放的前提下一直運行ProcessSystemEvents函數,當檢測到有使用PostDeferredCallToThread函數調用指定線程的事件發生時,會在發生調用事件的線程中調用指定線程,從而完成多傳感器節點數據同時回傳的操作.
如果發生了傳感器節點掉線的情況(TCP_DISCONNECT),在主線程中就會檢測到TCP連接斷開事件,從而結束斷開的線程,同時清除相關的內存. CmtWaitForThreadPoolFunctionCompletion函數使得主線程等待線程池函數結束后再退出,保證輔助線程使用的庫能夠被正確釋放. 由于新線程的建立是使用CmtScheduleThreadPoolFunction函數,因此在釋放的時候需要調用CmtReleaseThreadPoolFunctionID函數,在不影響當前正在執行的進程函數條件下徹底結束釋放.
在本上位機軟件設計過程中有大量的線程在同時執行,存在同一個變量同時被多個線程同時訪問的情況,因此需要使用線程鎖對這些變量進行保護,防止出現邏輯的錯誤[4,5]. 使用線程鎖需要在程序初始化的時候調用CmtNewLock函數來創建一個保護數據的線程鎖的集合,利用其返回的句柄調用指定線程鎖. 訪問鎖保護的數據和代碼前,必須調用CmtGetLock函數來獲取線程鎖,訪問結束后,必須調用CmtReleaseLock函數來釋放線程鎖. 需要特別注意的是可以在同一線程中多次調用CmtGetLock函數,但每次調用都需要調用CmtReleaseLock函數來結束調用. 在程序退出時,也必須調用CmtDiscardLock函數來釋放由CmtNewLock函數創建的線程鎖資源.
指令發送的過程是:上位機軟件先將控制指令發送給匯聚節點,然后由匯聚節點將指令轉發給指定傳感器節點,匯聚節點如圖 5 所示. 為了保證上位機軟件與遠程傳感器節點的有效通信,上位機軟件通過具體分析傳感器節點的任務,設計了通信雙方的通信控制指令協議.

圖 5 匯聚節點Fig.5 Aggregation nodes
1) 由上位機軟件給傳感器節點發送控制指令. 根據傳感器節點需要,由上位機軟件發送控制指令,完成上電、自檢、參數配置、參數回傳、文件信息回傳、數據采集和數據回傳等功能,設計下行控制指令數據格式如表 1 所示.

表 1 下行控制指令數據格式
由上位機軟件發送給傳感器節點的指令共 9 B,說明如下:
幀頭:占據2 B.
指令對象:占據1 B,用于指定指令對象是匯聚節點還是分布式傳感器節點. 如果代表匯聚節點,則傳感器節點選擇、指令類型和二級操作碼為無效指令.
傳感器節點選擇:占據1 B,0xff表示發送給所有的傳感器節點,范圍是0x00~0xff,是傳感器節點的編號.
指令類型:占據1 B,表示需要傳感器節點返回的是狀態反饋信息還是數據信息.
操作指令:占據2 B,表示上位機軟件發送給傳感器節點的動作信息.
二級操作碼:占據2 B,表示指令到達匯聚節點后不做任何處理,直接將指令轉發給分布式傳感器節點,主要針對傳感器節點的三軸信息.
例如給傳感器節點發送開始采集命令,控制指令為:0xeb90,0x02,0xff,0x01,0xa900,0xb120.
2) 分布式傳感器節點回傳數據格式. 傳感器回傳數據到上位機必須先把數據發送給匯聚節點,然后由匯聚節點統一將數據發送給上位機軟件. 分布式傳感器數據節點的數據有以下3種:參數配置信息(包括采樣通道數、采樣頻率和采樣長度等,共64 B)、傳感器節點三軸信息([(HMC5883地磁)X+Y+Z]+[(ADXL345加表)X+Y+Z]+結束碼0XFE共31 B)和傳感器采集的數據(每次配置不同,數據量不同). 因此匯聚節點向上位機軟件發送的數據有:匯聚節點工作狀態(包括各開關狀態和命令響應情況)、匯聚節點信息(參數信息和文件信息等)以及轉發傳感器節點數據(傳感器節點姿態信息和采集的數據等).
可以將以上數據分為兩類:信息量大的沖擊波信號模塊和信息量小的沖擊波信號模塊以外的其他模塊.
讀沖擊波信號模塊時的數據格式如表 2 所示.

表 2 沖擊波信號模塊數據格式
由于匯聚節點控制模塊所選用ARM芯片的限制,匯聚節點每次最多能夠向上位機發送 2 014 B 的數據. 但是由于在實際試驗中,匯聚節點的數量較多,網絡帶寬有限,為了保證不發生網絡擁塞[6]而造成數據丟失,沖擊波信號模塊每次發送515 B數據.
匯聚節點號用于標記沖擊波數據來源于眾多匯聚節點中的哪個匯聚節點; 因為數據量大,無法一次將所有的數據發送給上位機,在分次數發送的過程中為了保證上位機能夠按照順序存儲數據,需要對數據幀進行順序的標定,由數據幀號完成; 最后沖擊波模塊的有效數據放在末尾發送.
在小區域的地下震動波傳播過程中,由于傳輸介質自身的復雜性、不均勻性,震動波的反射和折射等影響[7],使得震動信號中有用信號的能量較弱; 傳感器節點的不穩定性使得信號的信噪比較低. 諸如上述因素的影響,使得震源定位精度降低. 因此,為了保證準確定位,需要對采集的數據進行濾波降噪、有效數據提取等操作.
基于MATLAB成本較低、計算靈活、使用方便,且比起Active X技術等,動態鏈接庫只需要在目標主機安裝運行庫就能使用等優點,本文采用基于動態鏈接庫調用的LabWIndows/CVI同MATLAB混合編程方法[8-10].
MATLAB版本的選用:上位機軟件開發所使用的LabWIndows/CVI版本為32 b 2017版,因此選用的MATLAB為32 b 2012版.
在MATLAB中生成動態鏈接庫,選擇好要進行編譯的m腳本文件,然后選擇編譯器,此處選擇Microsoft Visual C++ 2010 編譯器,通過設置.mcc命令的選項,最終除了會生成C/C++源代碼、.exe可執行文件和mex文件之外還會生成必須添加到LabWIndows/CVI工程文件中的.lib文件和.dll文件[11].
在使用LabWindows/CVI調用MATLAB動態鏈接庫時,首先將.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 *,同時,為了保證能夠實現有效傳遞,一般都會使用void *memcpy(void *dest, const void *src, size_t n)函數通過內存復制的方式進行賦值. 在成功調用MATLAB動態鏈接庫后,可以使用mxGetPr函數,通過指針讀取最終的處理結果.
實驗進行場所位于靶場內80 m×60 m的空曠地區,上位機控制軟件位于距離實驗場3 km遠的實驗總部,傳感器節點布設現場如圖 6 所示.
實驗能夠同時對16個匯聚節點進行控制,從而實現對64個傳感器節點的控制和數據收發. 在實驗過程中,匯聚節點和傳感器節點沒有發生誤操作的現象. 圖 7 為傳感器節點姿態信息回傳的結果.

圖 6 試驗現場Fig.6 The test site

圖 7 控制部分結果圖Fig.7 The result of control part
回傳的數據可以通過上位機軟件先進行預處理,處理結果有效實現去噪,波形較為平滑,如圖 8 所示.

圖 8 回傳數據處理結果Fig.8 Return data processing results
通過對同一節點的同一段數據進行比較,如圖 9 所示,經過預處理的波形比較平滑,能夠有效用于地下毀傷效能測試的評估中.

圖 9 處理前后數據比較Fig.9 Data comparison before and after processing
本文設計的基于LabWIndows/CVI無線傳感器節點監控系統,使用多線程技術實現了對傳感器節點的同步控制,軟件的數據傳輸和存儲能夠滿足要求; 通過對指令數據收發協議進行設計,實現了對匯聚節點的有效控制,完成了傳感器節點的數據收發操作; 通過對MATLAB動態鏈接庫的調用,實現了脫離MATLAB龐大的運行環境與MATLAB的混合編程. 同時上位機軟件基于模塊化設計,結合開發平臺的開放性和兼容性,使得本軟件具有可擴展性和二次開發性. 本系統可廣泛應用于靶場測試、震動監測等分布式傳感器網絡監測領域.