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