吳 煒 周建輝 劉 杰 常興山 劉雅潔
(1.中國艦船研究設(shè)計(jì)中心 湖北武漢 430064;2.武漢理工大學(xué)能源與動(dòng)力工程學(xué)院 湖北武漢 430063)
視情維修在船舶動(dòng)力系統(tǒng)狀態(tài)維護(hù)保障中的應(yīng)用越來越廣泛,油液分析技術(shù)作為一種獲取狀態(tài)特征數(shù)據(jù)的方法也獲得了越來越多的應(yīng)用[1-3]。隨著分析測試任務(wù)和檢驗(yàn)項(xiàng)目數(shù)量猛增,需要處理的數(shù)據(jù)量也快速增加。但目前的油液分析設(shè)備基本都是自帶分析處理裝置的,其數(shù)據(jù)存儲(chǔ)后只能在自帶的軟件中打開,導(dǎo)致數(shù)據(jù)集成不方便,降低了工程人員測試的便利性[4-5]。要擺脫對(duì)原有儀器設(shè)備軟件的依賴,直接操作對(duì)應(yīng)的數(shù)據(jù)文件,就必須了解其文件的相應(yīng)數(shù)據(jù)格式。目前針對(duì)油液分析儀器數(shù)據(jù)格式解析的文獻(xiàn)報(bào)道還不多見,相關(guān)研究大多集中在虛擬儀器的信號(hào)采集[6-7],油液分析的數(shù)據(jù)集成與結(jié)果報(bào)告生成等方面[8]。對(duì)其他類型的儀器格式解析則有一定報(bào)道,如醫(yī)學(xué)類儀器[9-10]、雷達(dá)[11]及遙感類[12]等。對(duì)特定的儀器及文件格式的解析也有一定報(bào)道,如對(duì)LAS格式[13]及PCB ASCII文件格式[14]、礦山激電測深數(shù)據(jù)格式[15]等。但這些研究要么只針對(duì)特定文件或特定儀器,要么只針對(duì)文件格式的文件頭部分,要么有相應(yīng)的前提條件——如已知所需數(shù)據(jù)在文件中的存儲(chǔ)格式和保存位置,并沒有形成一套具有一定的通用性的分析儀器格式的解析方法或工具,因此有必要針對(duì)該問題進(jìn)行研究。
本文作者基于浮點(diǎn)數(shù)與英文字母在儀器數(shù)據(jù)文件中的存儲(chǔ)特征,提出了利用搜索二進(jìn)制數(shù)據(jù)并轉(zhuǎn)換為浮點(diǎn)數(shù),再將轉(zhuǎn)換后的浮點(diǎn)數(shù)與搜索值進(jìn)而確定浮點(diǎn)數(shù)在文件中的位置的方法,并基于API函數(shù)設(shè)計(jì)了全自動(dòng)搜索的輔助工具,為進(jìn)行文件格式解析和信息提取提供了一種新的思路。
油液分析儀器的數(shù)據(jù)基本上由字符類型的標(biāo)識(shí)及浮點(diǎn)數(shù)形式的數(shù)值2種類型組成,且大部分以文件的形式進(jìn)行存儲(chǔ)。在以文件進(jìn)行浮點(diǎn)數(shù)的存儲(chǔ)方面,國際標(biāo)準(zhǔn)組織制訂了一系列的浮點(diǎn)數(shù)存儲(chǔ)相關(guān)標(biāo)準(zhǔn)。自20世紀(jì)80年代以來,IEEE 754標(biāo)準(zhǔn)逐漸成為使用最廣泛的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)規(guī)定了4種用二進(jìn)制形式表示浮點(diǎn)數(shù)值的方式:單精確度、雙精確度、延伸單精確度與延伸雙精確度。其中單精確度二進(jìn)制是使用最為廣泛的形式。單精度二進(jìn)制格式中使用4個(gè)字節(jié)(32個(gè)比特)來進(jìn)行浮點(diǎn)數(shù)的存儲(chǔ)。存儲(chǔ)的具體形式分為3個(gè)部分:數(shù)符(sign)、階碼(exponent)和尾數(shù)(fraction)。其中,數(shù)符占1個(gè)bit,為32個(gè)bit中的最高位,它代表了浮點(diǎn)數(shù)的符號(hào),若數(shù)符為0則表示浮點(diǎn)數(shù)為正數(shù),若數(shù)符為1則代表負(fù)數(shù);階碼占8個(gè)bit,規(guī)定為實(shí)際指數(shù)值加上一個(gè)偏移值,需要作移碼運(yùn)算;尾數(shù)占23個(gè)bit,用于存儲(chǔ)“有效數(shù)字”的小數(shù)部分,使用原碼表示。
雖然知道油液分析中的數(shù)值數(shù)據(jù)部分采用IEEE 754標(biāo)準(zhǔn)保存到文件中,但如果沒有對(duì)應(yīng)廠家的技術(shù)支持,是無法知道在文件的具體位置去獲取到需要的值。如果直接打開相應(yīng)的文件,一般完全無法看懂相應(yīng)的含義。為了進(jìn)行示例,選擇油液分析光譜儀中保存數(shù)據(jù)的后綴為.cfg文件,分別用文本文件格式和二進(jìn)制格式打開該文件,其內(nèi)容顯示分別如圖1和圖2所示。
從圖1和圖2可以看出,以文本文件和二進(jìn)制格式打開文件內(nèi)容都無法讀懂其中代表的含義。但二進(jìn)制格式中,英文字符可以直觀顯示,表明英文字符遵循ACSII編碼規(guī)則。要想實(shí)現(xiàn)直接從相應(yīng)的文件中讀取需要的分析數(shù)據(jù),就必須明白每個(gè)需要的數(shù)值在對(duì)應(yīng)文件中的存儲(chǔ)起始地址,然后再從該地址中讀取需要的二進(jìn)制數(shù)據(jù),再按照IEEE 754標(biāo)準(zhǔn)進(jìn)行轉(zhuǎn)換。因此,問題的關(guān)鍵就在于如何找到一個(gè)需要讀取的浮點(diǎn)數(shù)在該文件中的起始地址。
圖1 文本格式打開cfg文件Fig 1 Opening cfg file in text format
圖2 二進(jìn)制格式打開cfg文件Fig 2 Opening cfg file in binary format
為了進(jìn)行格式解析方法的分析,選擇在油液分析光譜儀自帶的軟件中打開上述對(duì)應(yīng)的.cfg文件,可以在對(duì)應(yīng)的界面上顯示出相應(yīng)的值,界面示意如圖3所示。
從圖3可以看出,在界面上顯示的數(shù)字,在對(duì)應(yīng)的.cfg文件中一定是存在的,如果能搜索到其值所在的位置,根據(jù)該值所在的文本框及其前面的標(biāo)簽,就可以明確知道其代表的含義;又因?yàn)檫@類文件都是等長度保存的,特定含義的數(shù)值在每個(gè)文件中的起始位置都是固定的,相同儀器的數(shù)據(jù)格式只需要研究清楚一個(gè)文件,其他文件就都清楚了。這樣就為通過程序自動(dòng)搜索解析出文件存儲(chǔ)格式提供了可能。為此設(shè)計(jì)了如圖4所示的文件格式解析流程圖。
圖3 光譜分析儀器顯示界面Fig 3 Display interface of spectrum analyzer
圖4 文件格式解析流程Fig 4 Flow of file format analysis
在該算法中,將需要分析的數(shù)據(jù)文件在光譜儀器自帶的軟件中打開,通過其界面的顯示提煉出要搜索的特征值。再創(chuàng)建一個(gè)輔助程序,在該程序界面上輸入要搜索的特征數(shù)值,并以二進(jìn)制方式打開同一個(gè)對(duì)應(yīng)的儀器數(shù)據(jù)文件,并從0字節(jié)開始每次取4個(gè)字節(jié)根據(jù)IEEE 754標(biāo)準(zhǔn)存儲(chǔ)協(xié)議轉(zhuǎn)換成浮點(diǎn)數(shù),再將轉(zhuǎn)換獲得的數(shù)值與搜索特征值進(jìn)行比對(duì),如果一致則將相應(yīng)的字節(jié)起始位置保存記錄下來。不論轉(zhuǎn)換值是否一致,都取下一組字節(jié)重復(fù)上面的步驟,一直到文件結(jié)束為止。
在上述過程中,即使找到了需要搜索的特征值,仍然需要繼續(xù)掃描搜索文件的后續(xù)部分,主要是因?yàn)槲募锌赡艽嬖谠撍阉魈卣鞲↑c(diǎn)數(shù)的重復(fù)值,要將所有可能的位置都搜索出來。但這樣就帶來一個(gè)問題,如果搜索后只在一個(gè)位置上出現(xiàn)過該特征值,則該搜索值的位置就可以唯一確定了。如果在1個(gè)以上位置出現(xiàn),則無法進(jìn)行判斷。為解決這個(gè)問題,有2種思路:(1)通過多個(gè)文件針對(duì)同一個(gè)輸入框中的特征值進(jìn)行搜索,查找其出現(xiàn)位置的唯一交集;(2)在儀器自帶的軟件界面上,將要搜索的文本框中的內(nèi)容修改為一個(gè)很特殊的數(shù)值,然后保存文件后再調(diào)用上面算法進(jìn)行搜索,直到只在一個(gè)位置上出現(xiàn)為止。這2種方法本質(zhì)是一致的,但如果文件本身是可以修改的,則后一種處理更為靈活高效。
在1.2節(jié)中設(shè)計(jì)的解析方案中,搜索的浮點(diǎn)數(shù)需要人工一一輸入,比較費(fèi)時(shí)費(fèi)力,而且后續(xù)如果搜索位置不唯一,還需要重復(fù)這個(gè)過程,方法并不算最合理。因此利用文獻(xiàn)[5]中提到的API函數(shù)進(jìn)行軟件界面元素獲取的方法,對(duì)搜索方法進(jìn)行改進(jìn),以實(shí)現(xiàn)自動(dòng)獲取界面上的搜索特征值及特征值代表的含義,然后傳遞到1.2節(jié)中設(shè)計(jì)的輔助搜索程序,實(shí)現(xiàn)全自動(dòng)的搜索。
設(shè)計(jì)的自動(dòng)獲取搜索特征值的算法流程如圖5所示。
圖5 自動(dòng)獲取搜索值流程Fig 5 Flow of automatically obtaining search value
調(diào)用API函數(shù)獲取對(duì)應(yīng)儀器軟件界面窗體的各個(gè)控件句柄,判斷所取控件的類型是否為需要處理的類型,若是的話調(diào)用函數(shù)獲得其文本,反之則進(jìn)行下一個(gè)控件的判斷,以此方法遍歷窗體所有子控件。值得注意的是,如果只將控件中的具體值作為句柄時(shí),關(guān)閉窗體再打開其句柄可能會(huì)發(fā)生變化,所以在取句柄的時(shí)候,不僅需要獲得控件的具體值,還需要獲得控件相對(duì)于窗體的相對(duì)位置坐標(biāo)(x,y)。遍歷所有子控件之后,將結(jié)果寫入一個(gè)搜索列表,設(shè)計(jì)的表結(jié)構(gòu)如表1所示。
表1 搜索值與坐標(biāo)信息
在獲取表1后,就可以自動(dòng)組合出搜索信息。將圖4中列出算法的搜索結(jié)果寫入表1,再判斷表1中需要搜索的每一行是否只在搜索文件中的一個(gè)位置出現(xiàn)。對(duì)搜索結(jié)果中位置數(shù)大于1個(gè)的,則通過API函數(shù)自動(dòng)修改對(duì)應(yīng)控件中的值,再自動(dòng)保存修改后的文件,并重新搜索保存后的文件,直到該對(duì)應(yīng)控件的搜索位置結(jié)果也只有一個(gè)為止。依次進(jìn)行處理,當(dāng)所有搜索特征值在相應(yīng)文件中都只在一個(gè)起始位置出現(xiàn),則文件格式就解析清楚了。
IEEE 754標(biāo)準(zhǔn)中浮點(diǎn)數(shù)的保存格式為:數(shù)符(1b) 階碼(8b) 尾數(shù)(23b)。數(shù)符部分若為0則代表此數(shù)為正數(shù),若為1則代表此數(shù)為負(fù)數(shù)。將階碼部分的二進(jìn)制轉(zhuǎn)換成十進(jìn)制再減去127,得到的數(shù)如果為正數(shù)則代表其向左移了幾位,反之則代表向右移動(dòng)了幾位,舉一個(gè)例子:階碼為10000010,則E=130,e=E-127=3,即說明其向左移了3位。然后將尾數(shù)部分加上“整數(shù)”部分的1之后得到一個(gè)數(shù)1.xxx(尾數(shù)),根據(jù)階碼進(jìn)行小數(shù)點(diǎn)的移位,最后將得到的結(jié)果轉(zhuǎn)換成十進(jìn)制即完成了字節(jié)組到浮點(diǎn)數(shù)的轉(zhuǎn)換。
為了能夠?qū)崿F(xiàn)分析數(shù)據(jù)的自動(dòng)獲取,需要利用的API函數(shù)如下:
(1)FindWindowEx函數(shù):獲取窗口句柄,該窗口的類名和窗口名與給定的字符串相匹配;
(2)Enumchildwindow函數(shù):將句柄傳遞給每個(gè)子窗口并依次傳遞給應(yīng)用程序,可以枚舉一個(gè)父窗口的所有子窗口;
(3)GetClassName函數(shù):獲得指定窗口所屬的類的類名;
(4)SendMessage函數(shù):將指定的消息發(fā)送到一個(gè)或多個(gè)窗口。
根據(jù)前述算法,開發(fā)了相應(yīng)的輔助格式解析識(shí)別工具,該工具主要獲取對(duì)應(yīng)值在文件中的起始地址,以光譜儀器的數(shù)據(jù)文件進(jìn)行測試,相應(yīng)的運(yùn)行結(jié)果如圖6所示。圖中最后一列即為對(duì)應(yīng)需要提取的值在文件中的起始位置。通過多份文件的對(duì)比,同一屬性字段在多個(gè)文件中的起始位置是相同的,因此可以證明該解析方法可行。
圖6 輔助工具的運(yùn)行效果Fig 6 Operation effect of auxiliary tools
基于浮點(diǎn)數(shù)與英文字母在儀器數(shù)據(jù)文件中的存儲(chǔ)特征,提出了利用搜索二進(jìn)制數(shù)據(jù)并轉(zhuǎn)換為浮點(diǎn)數(shù),再將轉(zhuǎn)換后的浮點(diǎn)數(shù)與搜索值進(jìn)而確定浮點(diǎn)數(shù)在文件中的位置的方法,并基于API函數(shù)設(shè)計(jì)了全自動(dòng)搜索的輔助工具。以油液分析中的光譜儀器數(shù)據(jù)為例進(jìn)行了應(yīng)用驗(yàn)證。結(jié)果表明,該方法能夠自動(dòng)獲取出浮點(diǎn)數(shù)類型儀器數(shù)據(jù)的對(duì)應(yīng)位置,擺脫了對(duì)儀器自帶軟件的依賴,為類似儀器文件的數(shù)據(jù)格式解析提供了一套比較通用的方法,可以用于實(shí)現(xiàn)從儀器數(shù)據(jù)文件中自動(dòng)獲取需要的內(nèi)容以進(jìn)行集中保存的目的。