郭肖靜,苗積臣,吳志芳
(清華大學(xué) 核能與新能源技術(shù)研究院,北京 100084)
在凸度儀系統(tǒng)中,檢測(cè)鋼板過程中會(huì)產(chǎn)生海量數(shù)據(jù)。對(duì)這些歷史數(shù)據(jù),系統(tǒng)需進(jìn)行存儲(chǔ)、查詢、檢索、顯示等功能。為此,必須使用數(shù)據(jù)庫管理軟件來完成以上功能。目前,市場(chǎng)上主要的數(shù)據(jù)庫管理軟件包括SQL Server、MySQL、DB2、Oracle等,其中,DB2和 Oracle均為大型商用數(shù)據(jù)庫,需支付高額的授權(quán)費(fèi)用才可使用,且需專門的配置維護(hù),開發(fā)上有諸多不便。SQL Server是微軟公司提供的數(shù)據(jù)庫軟件,只能在 Windows操作系統(tǒng)中使用,不具有跨平臺(tái)的能力。MySQL是當(dāng)前最流行的開放源碼SQL數(shù)據(jù)庫管理系統(tǒng),它由MySQL AB公司開發(fā)、發(fā)布并支持,具有多平臺(tái)支持、靈活架構(gòu)、免費(fèi)使用等特點(diǎn)。且當(dāng)前很多網(wǎng)站均采用MySQL作為其后臺(tái)數(shù)據(jù)庫支撐,其穩(wěn)定性和可靠性得到了充分驗(yàn)證。因此,在凸度儀系統(tǒng)中,擬使用MySQL對(duì)檢測(cè)的鋼板數(shù)據(jù)進(jìn)行管理,完成系統(tǒng)的功能。
MySQL是當(dāng)前應(yīng)用最為廣泛的數(shù)據(jù)庫管理系統(tǒng)之一,具有強(qiáng)大的跨平臺(tái)能力(可運(yùn)行于Windows、Linux、Unix等操作系統(tǒng)上)和豐富的開發(fā)接口(可與PHP、VC、VB、Delphi等語言實(shí)現(xiàn)接口,便于嵌入到多種應(yīng)用中)。MySQL具有快速、可靠和易于使用的特點(diǎn),當(dāng)前使用Linux+PHP+Apache+MySQL已成為中小型網(wǎng)站提供Web服務(wù)的主流模式。此外,MySQL還是一種開放源代碼的軟件,非常便于研究和開發(fā)[1]。
MySQL采用客戶端/服務(wù)器模式,由支持不同后端的1個(gè)多線程SQL服務(wù)器、數(shù)種不同的客戶端程序和庫、眾多管理工具和廣泛的應(yīng)用編程接口API組成。此外,MySQL還支持多種數(shù)據(jù)類型,包括帶符號(hào)/無符號(hào)整數(shù),1、2、3、4、8 字 節(jié) 長(zhǎng),F(xiàn)LOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、TIMESTAMP、YEAR、SET、ENUM等,便于各種數(shù)據(jù)高效率存儲(chǔ)[2]。
綜合以上特點(diǎn),在凸度儀系統(tǒng)中,選擇MySQL作為數(shù)據(jù)庫管理系統(tǒng),與凸度儀其他模塊配合,實(shí)現(xiàn)完整的數(shù)據(jù)存儲(chǔ)、檢索、排序、顯示等功能,完成設(shè)計(jì)要求。
凸度儀系統(tǒng)的結(jié)構(gòu)如圖1所示。
圖1 凸度儀系統(tǒng)結(jié)構(gòu)Fig.1 Structure of instantaneous profile gauge system
在圖1中,采集模塊采集到原始的檢測(cè)數(shù)據(jù),交給運(yùn)算模塊進(jìn)行處理;運(yùn)算模塊通過差值、補(bǔ)償?shù)确椒?,?jì)算鋼板橫斷面上每個(gè)采樣點(diǎn)的厚度、溫度等信息,并將這些數(shù)據(jù)發(fā)送到顯示模塊;顯示模塊將這些數(shù)據(jù)進(jìn)行實(shí)時(shí)顯示,并進(jìn)一步計(jì)算凸度、楔度等相關(guān)數(shù)據(jù),同時(shí)還將這些數(shù)據(jù)按一定格式存儲(chǔ)到數(shù)據(jù)庫中,且能按用戶要求,對(duì)這些歷史數(shù)據(jù)進(jìn)行檢索、排序和顯示。
由于數(shù)據(jù)庫只與顯示模塊存在接口,因此,只需分析顯示模塊對(duì)數(shù)據(jù)庫的功能需求。
1)數(shù)據(jù)存儲(chǔ)
當(dāng)顯示模塊收到運(yùn)算模塊發(fā)送的鋼板數(shù)據(jù)后,應(yīng)實(shí)時(shí)地將這些數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫中。在鋼板掃描過程中,對(duì)數(shù)據(jù)庫只有存儲(chǔ)操作,沒有檢索和讀取操作。
2)數(shù)據(jù)檢索
在實(shí)際的應(yīng)用環(huán)境中,將檢測(cè)大量鋼板,得到海量數(shù)據(jù),如何快速檢索到所需的鋼板數(shù)據(jù)成為一重要問題。在本系統(tǒng)中,使用一些標(biāo)記性參數(shù)作為檢索條件,如檢測(cè)時(shí)間、鋼板類型、編號(hào)、鋼板厚度、鋼板凸度等指標(biāo),且這些檢索條件可進(jìn)一步進(jìn)行邏輯組合,如與、或等操作。數(shù)據(jù)庫應(yīng)將滿足檢索條件的所有鋼板編號(hào)返回給顯示模塊,用戶在其中選定某個(gè)鋼板后,數(shù)據(jù)庫再將該鋼板的完整數(shù)據(jù)傳送給顯示模塊。
3)數(shù)據(jù)讀取和顯示
當(dāng)用戶選定某個(gè)鋼板后,數(shù)據(jù)庫應(yīng)將該鋼板相關(guān)的所有數(shù)據(jù)都發(fā)送到顯示模塊中,顯示模塊應(yīng)根據(jù)需要,對(duì)整個(gè)鋼板信息或局部信息進(jìn)行顯示。在顯示過程中,不再與數(shù)據(jù)庫發(fā)生數(shù)據(jù)交換。
根據(jù)上面的需求,將存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù)分為3類。1)實(shí)際檢測(cè)數(shù)據(jù),包括鋼板的厚度、寬度、溫度、傾角等實(shí)際檢測(cè)到的數(shù)據(jù)。這些數(shù)據(jù)的數(shù)據(jù)量極大,代表鋼板的原始情況,一般只用于顯示,而不用于檢索。2)后處理數(shù)據(jù),包括凸度、楔度等數(shù)據(jù),是由實(shí)際檢測(cè)數(shù)據(jù)經(jīng)某些運(yùn)算后得到的指標(biāo),用來表示鋼板的檢測(cè)結(jié)果。這些數(shù)據(jù)直觀反映了被檢鋼板是否合格,既用于顯示,也用于檢索。3)鋼板特征數(shù)據(jù),包括檢測(cè)時(shí)間、鋼板編號(hào)、金屬類型、標(biāo)稱值等。這些數(shù)據(jù)表示1塊鋼板的整體屬性,既用于顯示,也用于索引。
數(shù)據(jù)庫設(shè)計(jì)的核心是表的設(shè)計(jì)。數(shù)據(jù)庫由若干個(gè)表組成,表中每1行代表1組記錄,每1列代表1類數(shù)據(jù)。數(shù)據(jù)庫的表和表之間可有相同的列,不同表的數(shù)據(jù)通過這相同的列來實(shí)現(xiàn)關(guān)聯(lián),從而獲得對(duì)數(shù)據(jù)的完整訪問[3]。
在本系統(tǒng)中,構(gòu)造了2個(gè)表:1個(gè)用于存儲(chǔ)實(shí)際檢測(cè)數(shù)據(jù),命名為PlateData;1個(gè)存儲(chǔ)鋼板特征數(shù)據(jù)和后處理數(shù)據(jù),命名為PlateKey。兩個(gè)表的具體構(gòu)造列于表1、2。
表1 PlateData表的構(gòu)造Table 1 Structure of PlateData table
表2 PlateKey表的構(gòu)造Table 2 Structure of PlateKey table
在表1中,每個(gè)鋼板有若干個(gè)橫斷面,每個(gè)橫斷面有N個(gè)探測(cè)點(diǎn)(本程序中N為256)。表中每1行表示1個(gè)橫斷面上的所有數(shù)據(jù),具有相同鋼板編號(hào)的所有行表示1個(gè)鋼板的完整數(shù)據(jù)。該表只用于數(shù)據(jù)的存儲(chǔ)和讀取,不用于檢索。
在表2中,每1行代表1個(gè)鋼板的信息,其中前6項(xiàng)是鋼板的特征數(shù)據(jù),后2項(xiàng)是鋼板的實(shí)測(cè)數(shù)據(jù)。該表主要用于數(shù)據(jù)的檢索和排序。
表1和表2中共有的列項(xiàng)目是鋼板編號(hào),這也是本系統(tǒng)使用的數(shù)據(jù)庫的主鍵。通過該項(xiàng)目即可實(shí)現(xiàn)所有數(shù)據(jù)的關(guān)聯(lián)。
1)數(shù)據(jù)庫連接與初始化
當(dāng)凸度儀系統(tǒng)啟動(dòng)后,應(yīng)連接到數(shù)據(jù)庫管理系統(tǒng),并選擇所需使用的數(shù)據(jù)庫。
2)數(shù)據(jù)的存儲(chǔ)
當(dāng)鋼板開始檢測(cè)時(shí),運(yùn)算模塊先傳送1幀起始幀,表明開始1個(gè)新鋼板的檢測(cè),該幀中應(yīng)包含鋼板編號(hào)、合金類型、標(biāo)稱厚度、標(biāo)稱凸度等鋼板特征數(shù)據(jù)。顯示模塊將這些數(shù)據(jù)保存,但暫不寫入數(shù)據(jù)庫中。而后,運(yùn)算模塊將每個(gè)橫斷面的數(shù)據(jù)打包成1幀發(fā)送過來,顯示模塊根據(jù)這些數(shù)據(jù)計(jì)算凸度、楔度等指標(biāo),并按表1的格式,將數(shù)據(jù)寫入數(shù)據(jù)庫中。當(dāng)鋼板檢測(cè)結(jié)束后,運(yùn)算模塊會(huì)發(fā)送1個(gè)結(jié)束幀,此時(shí)顯示模塊將前面收到的鋼板特征數(shù)據(jù)和計(jì)算得到的凸度、楔度等數(shù)據(jù)按表2的格式寫入數(shù)據(jù)庫中。
3)數(shù)據(jù)的檢索
數(shù)據(jù)的檢索在PlateKey表中進(jìn)行,根據(jù)用戶給出的檢索條件,找到表中滿足條件的若干行。
4)數(shù)據(jù)的讀取
當(dāng)用戶具體選擇了某1行記錄后,獲取該行的PlateNum值,并從PlateData表中提取數(shù)據(jù)。
在本凸度儀系統(tǒng)中,使用Visual C++作為編程語言。因此要和數(shù)據(jù)庫實(shí)現(xiàn)通信,必須使用MySQL提供的C++編程接口。在MySQL中,提供了 mysql.h、libmysql.lib和libmysql.dll。在C或C++文件中,只要包含“mysql.h”頭文件,即可使用libmysql.lib和libmysql.dll中的函數(shù)[4]。在本系統(tǒng)的實(shí)現(xiàn)中,主要使用了如下5個(gè)函數(shù)。
1)MYSQL *mysql_init(MYSQL *mysql)
該函數(shù)用于初始化mysql結(jié)構(gòu),為后面的函數(shù)操作提供指針。
2)MYSQL * mysql_real_connect(MYSQL*mysql,const char*host,const char*user,const char*passwd,const char*db,unsigned int port,const char*unix_socket,unsigned long client_flag)
該函數(shù)用于應(yīng)用程序與數(shù)據(jù)庫管理系統(tǒng)的連接以及數(shù)據(jù)庫的選擇。在本系統(tǒng)中,當(dāng)系統(tǒng)啟動(dòng)時(shí),調(diào)用該函數(shù)。
3)int mysql_real_query(MYSQL *mysql,const char*stmt_str,unsigned long length)
該函數(shù)用于向數(shù)據(jù)庫發(fā)送1條SQL指令。系統(tǒng)中,數(shù)據(jù)的存儲(chǔ)、查詢、讀取等指令均通過該函數(shù)傳遞到數(shù)據(jù)庫管理系統(tǒng)中。
4)MYSQL_RES *mysql_use_result(MYSQL*mysql)
該函數(shù)把數(shù)據(jù)庫相應(yīng)SQL指令的輸出返回到應(yīng)用程序中。通過該指令,即可得到數(shù)據(jù)庫查詢和讀取的結(jié)果。
5)void mysql_close(MYSQL*mysql)
該函數(shù)用于關(guān)閉數(shù)據(jù)庫。在本系統(tǒng)中,退出時(shí)要調(diào)用該函數(shù)。
根據(jù)上述分析,利用MySQL的C API,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。使用 Microsoft Visual C++進(jìn)行開發(fā),并為數(shù)據(jù)庫檢索和讀取單獨(dú)設(shè)計(jì)了1個(gè)對(duì)話框,如圖2所示。在圖2左上方,列出了若干檢索條件,可進(jìn)行與、或等檢索;下方是數(shù)據(jù)庫中滿足條件的所有記錄。當(dāng)選定其中某1個(gè)鋼板時(shí),在右側(cè)即顯示鋼板整體的厚度分布,以及橫縱兩個(gè)方向的厚度分布。從圖中可看出,數(shù)據(jù)庫的存儲(chǔ)、檢索和讀取功能均已實(shí)現(xiàn),滿足系統(tǒng)設(shè)計(jì)的要求。
圖2 數(shù)據(jù)庫系統(tǒng)測(cè)試圖Fig.2 Dialog of database test
本文介紹了凸度儀系統(tǒng)中數(shù)據(jù)庫管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。選擇MySQL數(shù)據(jù)庫,分析了凸度儀系統(tǒng)對(duì)數(shù)據(jù)庫應(yīng)用的需求,從而提取了操作數(shù)據(jù)并設(shè)計(jì)了合理的表,保證了數(shù)據(jù)存儲(chǔ)的完整性和檢索的高效性。此外,分析了應(yīng)用中所需的SQL指令及MySQL提供的C API中相關(guān)的函數(shù),從而在使用Visual C++編程的凸度儀系統(tǒng)中,成功地嵌入了MySQL數(shù)據(jù)庫,實(shí)現(xiàn)了數(shù)據(jù)的存儲(chǔ)、檢索和讀取等功能。通過實(shí)際測(cè)試,達(dá)到了系統(tǒng)設(shè)計(jì)的要求。
[1]袁淵,曾文火.MySQL數(shù)據(jù)庫接口的VC實(shí)現(xiàn)與應(yīng)用[J].華東船舶工業(yè)學(xué)院學(xué)報(bào):自然科學(xué)版,2002,16(5):41-45.YUAN Yuan,ZENG Wenhuo.Realization and application of MySQL database interfaces based on Visual C++[J].Journal of East China Shipbuilding Institute: Natural Science Edition,2002,16(5):41-45(in Chinese).
[2]薛軍超.MySQL網(wǎng)絡(luò)數(shù)據(jù)庫開發(fā)[M].北京:人民郵電出版社,2001.
[3]蘭旭輝,熊家軍,鄧剛.基于MySQL的應(yīng)用程序設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2004,25(3):442-443,468.LAN Xuhui,XIONG Jiajun,DENG Gang.Development of application program based on MySQL[J].Computer Engineering and Design,2004,25(3):442-443,468(in Chinese).
[4]Oracle.MySQL 5.1reference manual[S/OL].Redwood City,California:Oracle USA,2003[2011-2-25].http:∥dev.mysql.com/doc/refman/5.1/en/.