楊 琪 瞿少成 李科林 秦天柱 許文俊
(華中師范大學(xué)物理科學(xué)與技術(shù)學(xué)院 武漢 430079)
近年來,隨著我國基礎(chǔ)設(shè)施建設(shè)的大力發(fā)展,基于超聲波檢測基樁完整性技術(shù)也得到了大力發(fā)展。超聲波成孔質(zhì)量檢測軟件系統(tǒng)是該設(shè)備的重要組成部分,它集成了數(shù)據(jù)采集、數(shù)據(jù)存儲、數(shù)據(jù)建模顯示、檢測設(shè)備狀態(tài)記錄、深度下潛步進(jìn)電機(jī)控制等功能,一套高效的檢測軟件系統(tǒng)尤其重要[1~4]。為進(jìn)一步提高基樁成孔質(zhì)量的檢測,高精度探頭數(shù)據(jù)采集與數(shù)據(jù)高速傳輸已經(jīng)成為必然,然而高精度探頭的采集數(shù)據(jù)往往難以快速、穩(wěn)定地傳輸與處理,阻礙了超聲波成孔質(zhì)量檢測系統(tǒng)的實(shí)際應(yīng)用。
目前國外SoniCaliper 公司研制的超聲波成孔基樁檢測系統(tǒng)比較成熟[5],其超聲波成孔質(zhì)量檢測軟件系統(tǒng)是基于VC++環(huán)境進(jìn)行開發(fā)的,維護(hù)不方便,跨平臺性能不足,實(shí)時性也難以得到保證。文章結(jié)合工程實(shí)踐,通過分析軟件通信中數(shù)據(jù)接收方式與處理方法的利弊,通過采用多線程輪詢機(jī)制與線程安全隊列,實(shí)現(xiàn)了對數(shù)據(jù)的多線程輪詢收集;通過采用UDP 通信協(xié)議以及采樣線程獨(dú)立化,加強(qiáng)了數(shù)據(jù)的傳輸速率,實(shí)現(xiàn)了數(shù)據(jù)的安全傳輸、實(shí)時處理、實(shí)時存貯和實(shí)時顯示等功能;設(shè)計并實(shí)現(xiàn)了一種基于Qt 環(huán)境下數(shù)據(jù)采集軟件系統(tǒng),較好地解決了通信傳輸中的實(shí)時性與穩(wěn)定性,且圖形交互界面操作方便,便于工程實(shí)踐。
超聲波成孔質(zhì)量檢測設(shè)備由三個部分組成,整體結(jié)構(gòu)如圖1 所示。第一部分由超聲波換能器、超聲波換能器驅(qū)動電路以及電機(jī)驅(qū)動電路和通信電路組成,完成對孔洞下環(huán)境的超聲波探測和數(shù)據(jù)采集傳輸功能。第二部分由控制電機(jī)、軸承支架以及多芯電纜構(gòu)成,將封裝好的第一部分進(jìn)行步進(jìn)下潛,并且通過相應(yīng)的PWM電機(jī)控制信號,實(shí)時控制下潛的深度和速度。第三個部分是軟件部分,主要功能是實(shí)時接收上傳的采樣數(shù)據(jù)和下潛的深度數(shù)據(jù),進(jìn)行數(shù)據(jù)處理和顯示,以及實(shí)現(xiàn)人機(jī)交互。整個設(shè)備供電系統(tǒng)實(shí)行所有模塊統(tǒng)一鋰電池供電,所有模塊封裝后統(tǒng)一安裝在小車上,使整個設(shè)備在適應(yīng)地形和環(huán)境方面更加靈活和輕巧。

圖1 超聲波檢測設(shè)備整體框架圖
系統(tǒng)主要基于自上而下的設(shè)計模式進(jìn)行設(shè)計,使得各個模塊的功能相互獨(dú)立。其主要模塊包括人機(jī)交互界面控制模塊、通信模塊、數(shù)據(jù)采集存儲模塊、數(shù)據(jù)可視化模塊以及硬件設(shè)備狀態(tài)監(jiān)控模塊五大模塊組成,具體功能模塊框架如圖2所示。
超聲波成孔質(zhì)量檢測軟件系統(tǒng)涉及到與多方的通信任務(wù),有效而且穩(wěn)定的通信功能是保證傳輸數(shù)據(jù)的實(shí)時性以及提升設(shè)備控制精度的重要基礎(chǔ)和前提[6]。軟件系統(tǒng)與設(shè)備終端模塊的通信關(guān)系如圖3所示。

圖2 超聲波成孔檢測軟件系統(tǒng)模塊框架圖

圖3 超聲波成孔質(zhì)量檢測系統(tǒng)與設(shè)備終端通信關(guān)系
在波形數(shù)據(jù)傳輸過程中,主要是以數(shù)據(jù)幀的形式進(jìn)行傳輸,采用UDP 協(xié)議進(jìn)行通信[7~9]。每一個波形數(shù)據(jù)幀包括幀頭信息、波形數(shù)據(jù)編號碼、具體傳輸波形數(shù)據(jù)和校驗(yàn)碼。其中幀頭信息又包括探頭深度信息、角度信息以及實(shí)測環(huán)境溫度信息等。超聲
波數(shù)據(jù)幀格式如圖4所示。

圖4 超聲波數(shù)據(jù)幀格式
在網(wǎng)絡(luò)通信具體實(shí)現(xiàn)過程中,QT 提供的QUdpSocket 類用來發(fā)送和接收UDP 數(shù)據(jù)包。此時,由于軟件系統(tǒng)所需傳輸?shù)臄?shù)據(jù)量較大,而且為了不影響主線程GUI界面的正常運(yùn)行,將UDP通信重新開辟一個線程進(jìn)行處理。通過增加線程來處理UDP 的數(shù)據(jù)接收,可以很好地解決以太網(wǎng)數(shù)據(jù)接收與GUI 界面處理沖突的問題。確保了數(shù)據(jù)傳輸?shù)膶?shí)時性以及可靠性,也使用戶操作GUI界面時不會出現(xiàn)卡頓的現(xiàn)象。
在經(jīng)過UDP 數(shù)據(jù)多線程采集后,要進(jìn)一步地處理數(shù)據(jù)。然而,在一次處理數(shù)據(jù)量很大的情況下,如果直接在數(shù)據(jù)接收槽函數(shù)中一邊進(jìn)行數(shù)據(jù)接收,一邊進(jìn)行數(shù)據(jù)處理,這樣在很大程度上影響了數(shù)據(jù)的接收速度,故在這里采用了多線程輪詢的方法進(jìn)行數(shù)據(jù)的獲取以及處理[10]。
4.2.1 多線程輪詢機(jī)制介紹
多線程輪詢機(jī)制是基于生產(chǎn)者/消費(fèi)者模式變化而來,生產(chǎn)者即數(shù)據(jù)生成的線程,消費(fèi)者即數(shù)據(jù)處理的線程[11]。在這里系統(tǒng)的生產(chǎn)者線程只有一條,而消費(fèi)者線程有多條,就形成了多個消費(fèi)者線程輪詢獲取生產(chǎn)者線程數(shù)據(jù),然后并行處理的情況。生產(chǎn)者/消費(fèi)者模式的結(jié)構(gòu)如圖5所示。

圖5 生產(chǎn)者/消費(fèi)者模式結(jié)構(gòu)圖
從圖5 可以看出如果將生產(chǎn)者與消費(fèi)者單個抽象出來,每個生產(chǎn)者與消費(fèi)者之間有一個緩沖區(qū)作為中介。正是因?yàn)檫@個中介,生產(chǎn)者可以把數(shù)據(jù)放入緩沖區(qū),而消費(fèi)者從緩沖區(qū)中取出數(shù)據(jù)。使用此種模型可以很好地解決生產(chǎn)者與消費(fèi)者速度不匹配的問題,同時也能減少生產(chǎn)者與消費(fèi)者之間的相互依賴。在實(shí)際的數(shù)據(jù)傳輸過程中,緩沖區(qū)是用一個線程安全的隊列來充當(dāng)?shù)模捎谏a(chǎn)者產(chǎn)生數(shù)據(jù)速度很快,所以數(shù)據(jù)按順序存入隊列,消費(fèi)者也會按順序取出隊列,這樣可以最大程度上保證數(shù)據(jù)的可靠性。多線程輪詢機(jī)制結(jié)構(gòu)如圖6所示。

圖6 多線程輪詢機(jī)制結(jié)構(gòu)圖
由圖6 可以看出,多線程輪詢機(jī)制是當(dāng)一個消費(fèi)線程處理完數(shù)據(jù)之后,又進(jìn)行排隊取生產(chǎn)者的數(shù)據(jù)進(jìn)行處理,如此循環(huán)往復(fù),并且多個消費(fèi)者線程均可并行執(zhí)行[12~14]。但是如何保證多個消費(fèi)者線程能夠互斥地取出隊列的數(shù)據(jù),則涉及到隊列的線程安全問題,即每次只能有一個消費(fèi)者線程進(jìn)行取數(shù)據(jù)。
4.2.2 線程安全隊列的實(shí)現(xiàn)
上一小節(jié)介紹了多線程輪詢機(jī)制,如何保證其有效的執(zhí)行是一個重要的線程安全問題。而在系統(tǒng)線程安全問題中,如何保證共享區(qū)域原子性,即緩沖區(qū)訪問的線程單一性是解決問題的核心。在C++中有四種同步互斥的控制方法,分別為臨界區(qū)、互斥量、信號量、事件。其中,互斥量是專門為協(xié)調(diào)共同對一個共享資源的單獨(dú)訪問而設(shè)計的[15~17]。故在解決隊列訪問原子性問題上采用的是互斥量進(jìn)行線程同步互斥的。在具體實(shí)現(xiàn)過程中,是將普通線程非安全隊列封裝為線程安全隊列來實(shí)施。下面將給出此封裝隊列的具體實(shí)現(xiàn)方法。
先構(gòu)造一個類DataQueue,然后在其中定義兩個函數(shù):

然后定義兩個操作函數(shù)為

由此類的聲明和定義可以看出,重寫了隊列操作的兩個方法,一個是enqueue()方法用來進(jìn)隊列,一個是dequeue()方法用來出隊列。還有兩個私有變量m_mutex、m_datas,前者是互斥量,用來保證線程安全,后者是用來裝載具體數(shù)據(jù)的隊列變量。在第一個函數(shù)enqueue(QString data)中,先定義了一個QMutexLocker變量,此變量是用來簡化互斥量的鎖定和解鎖操作,當(dāng)QMutexLocker 被創(chuàng)建后,互斥量就鎖定了。可以使用unlock()和relock()來解鎖和再次鎖定互斥量。如果互斥量被鎖定,當(dāng)QMutexLocker銷毀的時候,自動實(shí)現(xiàn)互斥量的解鎖。當(dāng)程序被鎖定后則表示接下來的進(jìn)隊列操作的程序代碼直到函數(shù)執(zhí)行結(jié)束,一直保持單線程操作狀態(tài),則此時保證了進(jìn)隊列的線程安全性。第二個函數(shù)dequeue()與上個函數(shù)一樣先定義QMutexLocker變量,然后再判斷此時隊列是否為空,如果為空則返回NULL,如果不為空則取出當(dāng)前隊列值,這樣既避免了空隊列時的取操作出錯,也保證了取隊列時的線程安全。
通過多線程輪詢機(jī)制以及線程安全隊列可以很好地提高數(shù)據(jù)傳輸與處理的實(shí)時性以及可靠性,同時也為眾多消費(fèi)者線程提供了并發(fā)的保障,大大提升了軟件系統(tǒng)處理大量數(shù)據(jù)的效率,為之后的數(shù)據(jù)存儲以及顯示縮短了時間。
為了能夠滿足項目的需求,需要驗(yàn)證系統(tǒng)的使用性能,配合超聲波硬件系統(tǒng)進(jìn)行了多次聯(lián)調(diào)測試,現(xiàn)取某次測試結(jié)果進(jìn)行說明。在進(jìn)行探測實(shí)驗(yàn)之前,等待硬件設(shè)備就緒,操作超聲波成孔質(zhì)量檢測軟件,開始接受控制終端傳來探頭測試數(shù)據(jù),然后經(jīng)軟件系統(tǒng)讀取數(shù)據(jù),再經(jīng)二維波形和灰度圖顯示,最終完成一次實(shí)時探測。實(shí)時測試的二維波形與灰度圖如圖7所示。

圖7 實(shí)測二維波形圖與灰度圖顯示
圖7 中,上方波形即為實(shí)時超聲波采樣波形,下方灰度圖即為超聲波探頭距離井壁的距離軌跡,可以通過灰度圖清晰地看出隨著探頭距離井壁的距離變化,其灰度圖軌跡也會實(shí)時地發(fā)生變化。測試表明,此軟件的主要功能達(dá)到預(yù)期效果。
在開始試驗(yàn)之前,先準(zhǔn)備好了1000 組,每組8000 個字節(jié)的數(shù)據(jù)通過UDP 傳輸給軟件系統(tǒng)。然后軟件系統(tǒng)再根據(jù)不同的數(shù)據(jù)處理方案,當(dāng)軟件系統(tǒng)運(yùn)用單線程方式進(jìn)行處理時,發(fā)現(xiàn)處理一組數(shù)據(jù)要很長時間,屏幕刷新速度也十分緩慢,而使用多線程輪詢機(jī)制進(jìn)行并發(fā)處理時,執(zhí)行時間大大縮短。多線程數(shù)據(jù)處理比較如表1所示。

表1 多線程數(shù)據(jù)處理比較結(jié)果
由表1 可知隨著線程個數(shù)的變化,實(shí)際數(shù)據(jù)處理時間也隨之變化,當(dāng)選擇線程數(shù)為5 時,能夠得到最好的處理速度。實(shí)驗(yàn)結(jié)果表明,經(jīng)過此種方法改造過的軟件系統(tǒng)接收數(shù)據(jù)的速度快、數(shù)據(jù)丟失率低,可以滿足后期數(shù)據(jù)處理的要求。同時經(jīng)過多線程并發(fā)處理后,數(shù)據(jù)處理速度已經(jīng)達(dá)到實(shí)時顯示與存儲的要求,能夠?qū)K端設(shè)備進(jìn)行更加精確地控制,達(dá)到了預(yù)期的目標(biāo)。
針對團(tuán)隊自主研發(fā)的超聲波成孔檢測設(shè)備,結(jié)合實(shí)際工程需要,在QT 環(huán)境下開發(fā)了超聲波成孔質(zhì)量檢測軟件。通過改變通信數(shù)據(jù)處理方式,把單線程數(shù)據(jù)處理成了多線程輪詢并發(fā)處理方式,使數(shù)據(jù)處理能力大大提高。設(shè)備聯(lián)調(diào)與測量實(shí)驗(yàn)結(jié)果表明,系統(tǒng)運(yùn)行穩(wěn)定可靠,具有很強(qiáng)的實(shí)時性,其通信數(shù)據(jù)處理方式起到了核心作用。在后續(xù)工作中,考慮到平臺的小型化等實(shí)際需求,將進(jìn)一步對軟件進(jìn)行優(yōu)化,提高系統(tǒng)的穩(wěn)定性和通信數(shù)據(jù)處理的實(shí)時性。