八通道探傷設(shè)備實(shí)時(shí)報(bào)警設(shè)計(jì)
八通道超聲波探傷設(shè)備都具備實(shí)時(shí)報(bào)警功能,超聲波探傷波形的實(shí)時(shí)報(bào)警有進(jìn)波報(bào)警和失波報(bào)警兩種方式。報(bào)警閘門分為進(jìn)波閘門(A 門)和失波閘門(B 門)兩種。當(dāng)探傷波形高于進(jìn)波閘門,系統(tǒng)進(jìn)行進(jìn)波報(bào)警。當(dāng)波形低于失波閘門時(shí),系統(tǒng)進(jìn)行失波報(bào)警。
為了提高系統(tǒng)的性能,八通道實(shí)時(shí)報(bào)警功能的算法模塊由 FPGA 實(shí)現(xiàn),控制功能在應(yīng)用軟件中實(shí)現(xiàn)。FPGA 中,一共使用了使用了 16 個(gè) FIFO。其中八個(gè) gate_fifo 存放閘門數(shù)據(jù)用于進(jìn)行實(shí)時(shí)比較,八個(gè) alarm_fifo 用于存儲(chǔ)報(bào)警后的最大波形數(shù)據(jù)幀。FPGA 中還使用了一個(gè)八位狀態(tài)寄存器 reg_state 用于指示八個(gè)通道的報(bào)警狀態(tài),一個(gè)十六位寄存器 alarm_sel 用于存放八通道的報(bào)警方式。當(dāng)開(kāi)啟閘門報(bào)警功能時(shí),F(xiàn)PGA 對(duì)采樣數(shù)據(jù)進(jìn)行非均勻壓縮,生成一幀實(shí)時(shí)波形顯示數(shù)據(jù)。然后將波形顯示數(shù)據(jù)與 gate_fifo 中的閘門數(shù)據(jù)進(jìn)行逐點(diǎn)比較,當(dāng)出現(xiàn)連續(xù)若干幀數(shù)據(jù)超過(guò)報(bào)警閘門數(shù)據(jù)時(shí),F(xiàn)PGA 則驅(qū)動(dòng) LED 顯示燈和蜂鳴器進(jìn)行實(shí)時(shí)聲光報(bào)警,并對(duì)狀態(tài)寄存器 reg_state 的相關(guān)位進(jìn)行設(shè)置。當(dāng)波形數(shù)據(jù)正常后,F(xiàn)PGA 將記錄到的報(bào)警包絡(luò)數(shù)據(jù)存儲(chǔ)到alarm_fifo 中,并向 ARM 子系統(tǒng)發(fā)送報(bào)警中斷,請(qǐng)求讀取存儲(chǔ)的報(bào)警數(shù)據(jù)。
八通道實(shí)時(shí)報(bào)警模塊驅(qū)動(dòng)程序在應(yīng)用程序的系統(tǒng)調(diào)用下,需要完成以下功能:1.軟件同步讀取硬件實(shí)時(shí)報(bào)警的狀態(tài)并進(jìn)行顯示處理。2.FPGA 發(fā)送報(bào)警中斷后,應(yīng)用程序通過(guò)驅(qū)動(dòng)程序從 alarm_fifo 中讀取報(bào)警通道的存儲(chǔ)數(shù)據(jù)并進(jìn)行處理。
應(yīng)用程序通過(guò)輪詢的方式,調(diào)用本驅(qū)動(dòng)程序的 ioctl()方法讀取實(shí)時(shí)報(bào)警狀態(tài)。以重復(fù)頻率50Hz 為例,應(yīng)用程序每隔 20ms 調(diào)用一次本驅(qū)動(dòng)程序的 ioctl()方法,將 reg_state 狀態(tài)寄存器中的數(shù)據(jù)讀取到內(nèi)核空間,再?gòu)?fù)制到相應(yīng)的用戶空間的變量中。通過(guò)判斷 reg_state 相應(yīng)的位是否置位來(lái)確定各通道的報(bào)警情況。
驅(qū)動(dòng)程序中對(duì) FPGA 的報(bào)警中斷進(jìn)行注冊(cè),并且實(shí)現(xiàn)了中斷服務(wù)子程序。當(dāng)操作系統(tǒng)接收到中斷后,將調(diào)用該中斷服務(wù)子程序進(jìn)行中斷處理。在中斷處理程序中,首先讀取 reg_state 確定哪幾個(gè)通道有報(bào)警數(shù)據(jù),然后通過(guò) insw()內(nèi)核調(diào)用,將 alarm_fifo 中的已報(bào)警通道的數(shù)據(jù)讀取到內(nèi)核空間。接著采用與探傷數(shù)據(jù)實(shí)時(shí)傳輸驅(qū)動(dòng)程序相同的異步通信機(jī)制,向應(yīng)用程序進(jìn)程發(fā)送 SIGIO 信號(hào),通知上層應(yīng)用程序報(bào)警已結(jié)束,報(bào)警數(shù)據(jù)已經(jīng)準(zhǔn)備好。由于兩個(gè)驅(qū)動(dòng)中都發(fā)送了相同的 SIGIO 信號(hào),需要通過(guò)一個(gè)內(nèi)核靜態(tài)變量 flag_fpga 進(jìn)行區(qū)分。應(yīng)用程序接收到報(bào)警中斷后,通過(guò)調(diào)用 read() 方法將各通道的報(bào)警數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶空間進(jìn)行處理和存儲(chǔ)。
經(jīng)過(guò)實(shí)機(jī)測(cè)試,八通道超聲波探傷儀在同時(shí)使用八個(gè)通道進(jìn)行探傷時(shí),當(dāng)其中任意通道出現(xiàn)缺陷數(shù)據(jù)時(shí),系統(tǒng)都能夠進(jìn)行實(shí)時(shí)的蜂鳴器報(bào)警,并且反饋到顯示屏上,成功實(shí)現(xiàn)了報(bào)警功能。