郭肖靜,苗積臣,吳志芳
(清華大學(xué) 核能與新能源技術(shù)研究院,北京 100084)
在凸度儀系統(tǒng)中,檢測鋼板過程中會產(chǎn)生海量數(shù)據(jù)。對這些歷史數(shù)據(jù),系統(tǒng)需進(jìn)行存儲、查詢、檢索、顯示等功能。為此,必須使用數(shù)據(jù)庫管理軟件來完成以上功能。目前,市場上主要的數(shù)據(jù)庫管理軟件包括SQL Server、MySQL、DB2、Oracle等,其中,DB2和 Oracle均為大型商用數(shù)據(jù)庫,需支付高額的授權(quán)費(fèi)用才可使用,且需專門的配置維護(hù),開發(fā)上有諸多不便。SQL Server是微軟公司提供的數(shù)據(jù)庫軟件,只能在 Windows操作系統(tǒng)中使用,不具有跨平臺的能力。MySQL是當(dāng)前最流行的開放源碼SQL數(shù)據(jù)庫管理系統(tǒng),它由MySQL AB公司開發(fā)、發(fā)布并支持,具有多平臺支持、靈活架構(gòu)、免費(fèi)使用等特點(diǎn)。且當(dāng)前很多網(wǎng)站均采用MySQL作為其后臺數(shù)據(jù)庫支撐,其穩(wěn)定性和可靠性得到了充分驗(yàn)證。因此,在凸度儀系統(tǒng)中,擬使用MySQL對檢測的鋼板數(shù)據(jù)進(jìn)行管理,完成系統(tǒng)的功能。
MySQL是當(dāng)前應(yīng)用最為廣泛的數(shù)據(jù)庫管理系統(tǒng)之一,具有強(qiáng)大的跨平臺能力(可運(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個多線程SQL服務(wù)器、數(shù)種不同的客戶端程序和庫、眾多管理工具和廣泛的應(yīng)用編程接口API組成。此外,MySQL還支持多種數(shù)據(jù)類型,包括帶符號/無符號整數(shù),1、2、3、4、8 字 節(jié) 長,F(xiàn)LOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、TIMESTAMP、YEAR、SET、ENUM等,便于各種數(shù)據(jù)高效率存儲[2]。
綜合以上特點(diǎn),在凸度儀系統(tǒng)中,選擇MySQL作為數(shù)據(jù)庫管理系統(tǒng),與凸度儀其他模塊配合,實(shí)現(xiàn)完整的數(shù)據(jù)存儲、檢索、排序、顯示等功能,完成設(shè)計(jì)要求。
凸度儀系統(tǒng)的結(jié)構(gòu)如圖1所示。
圖1 凸度儀系統(tǒng)結(jié)構(gòu)Fig.1 Structure of instantaneous profile gauge system
在圖1中,采集模塊采集到原始的檢測數(shù)據(jù),交給運(yùn)算模塊進(jìn)行處理;運(yùn)算模塊通過差值、補(bǔ)償?shù)确椒?,?jì)算鋼板橫斷面上每個采樣點(diǎn)的厚度、溫度等信息,并將這些數(shù)據(jù)發(fā)送到顯示模塊;顯示模塊將這些數(shù)據(jù)進(jìn)行實(shí)時顯示,并進(jìn)一步計(jì)算凸度、楔度等相關(guān)數(shù)據(jù),同時還將這些數(shù)據(jù)按一定格式存儲到數(shù)據(jù)庫中,且能按用戶要求,對這些歷史數(shù)據(jù)進(jìn)行檢索、排序和顯示。
由于數(shù)據(jù)庫只與顯示模塊存在接口,因此,只需分析顯示模塊對數(shù)據(jù)庫的功能需求。
1)數(shù)據(jù)存儲
當(dāng)顯示模塊收到運(yùn)算模塊發(fā)送的鋼板數(shù)據(jù)后,應(yīng)實(shí)時地將這些數(shù)據(jù)存儲到數(shù)據(jù)庫中。在鋼板掃描過程中,對數(shù)據(jù)庫只有存儲操作,沒有檢索和讀取操作。
2)數(shù)據(jù)檢索
在實(shí)際的應(yīng)用環(huán)境中,將檢測大量鋼板,得到海量數(shù)據(jù),如何快速檢索到所需的鋼板數(shù)據(jù)成為一重要問題。在本系統(tǒng)中,使用一些標(biāo)記性參數(shù)作為檢索條件,如檢測時間、鋼板類型、編號、鋼板厚度、鋼板凸度等指標(biāo),且這些檢索條件可進(jìn)一步進(jìn)行邏輯組合,如與、或等操作。數(shù)據(jù)庫應(yīng)將滿足檢索條件的所有鋼板編號返回給顯示模塊,用戶在其中選定某個鋼板后,數(shù)據(jù)庫再將該鋼板的完整數(shù)據(jù)傳送給顯示模塊。
3)數(shù)據(jù)讀取和顯示
當(dāng)用戶選定某個鋼板后,數(shù)據(jù)庫應(yīng)將該鋼板相關(guān)的所有數(shù)據(jù)都發(fā)送到顯示模塊中,顯示模塊應(yīng)根據(jù)需要,對整個鋼板信息或局部信息進(jìn)行顯示。在顯示過程中,不再與數(shù)據(jù)庫發(fā)生數(shù)據(jù)交換。
根據(jù)上面的需求,將存儲在數(shù)據(jù)庫中的數(shù)據(jù)分為3類。1)實(shí)際檢測數(shù)據(jù),包括鋼板的厚度、寬度、溫度、傾角等實(shí)際檢測到的數(shù)據(jù)。這些數(shù)據(jù)的數(shù)據(jù)量極大,代表鋼板的原始情況,一般只用于顯示,而不用于檢索。2)后處理數(shù)據(jù),包括凸度、楔度等數(shù)據(jù),是由實(shí)際檢測數(shù)據(jù)經(jīng)某些運(yùn)算后得到的指標(biāo),用來表示鋼板的檢測結(jié)果。這些數(shù)據(jù)直觀反映了被檢鋼板是否合格,既用于顯示,也用于檢索。3)鋼板特征數(shù)據(jù),包括檢測時間、鋼板編號、金屬類型、標(biāo)稱值等。這些數(shù)據(jù)表示1塊鋼板的整體屬性,既用于顯示,也用于索引。
數(shù)據(jù)庫設(shè)計(jì)的核心是表的設(shè)計(jì)。數(shù)據(jù)庫由若干個表組成,表中每1行代表1組記錄,每1列代表1類數(shù)據(jù)。數(shù)據(jù)庫的表和表之間可有相同的列,不同表的數(shù)據(jù)通過這相同的列來實(shí)現(xiàn)關(guān)聯(lián),從而獲得對數(shù)據(jù)的完整訪問[3]。
在本系統(tǒng)中,構(gòu)造了2個表:1個用于存儲實(shí)際檢測數(shù)據(jù),命名為PlateData;1個存儲鋼板特征數(shù)據(jù)和后處理數(shù)據(jù),命名為PlateKey。兩個表的具體構(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中,每個鋼板有若干個橫斷面,每個橫斷面有N個探測點(diǎn)(本程序中N為256)。表中每1行表示1個橫斷面上的所有數(shù)據(jù),具有相同鋼板編號的所有行表示1個鋼板的完整數(shù)據(jù)。該表只用于數(shù)據(jù)的存儲和讀取,不用于檢索。
在表2中,每1行代表1個鋼板的信息,其中前6項(xiàng)是鋼板的特征數(shù)據(jù),后2項(xiàng)是鋼板的實(shí)測數(shù)據(jù)。該表主要用于數(shù)據(jù)的檢索和排序。
表1和表2中共有的列項(xiàng)目是鋼板編號,這也是本系統(tǒng)使用的數(shù)據(jù)庫的主鍵。通過該項(xiàng)目即可實(shí)現(xiàn)所有數(shù)據(jù)的關(guān)聯(lián)。
1)數(shù)據(jù)庫連接與初始化
當(dāng)凸度儀系統(tǒng)啟動后,應(yīng)連接到數(shù)據(jù)庫管理系統(tǒng),并選擇所需使用的數(shù)據(jù)庫。
2)數(shù)據(jù)的存儲
當(dāng)鋼板開始檢測時,運(yùn)算模塊先傳送1幀起始幀,表明開始1個新鋼板的檢測,該幀中應(yīng)包含鋼板編號、合金類型、標(biāo)稱厚度、標(biāo)稱凸度等鋼板特征數(shù)據(jù)。顯示模塊將這些數(shù)據(jù)保存,但暫不寫入數(shù)據(jù)庫中。而后,運(yùn)算模塊將每個橫斷面的數(shù)據(jù)打包成1幀發(fā)送過來,顯示模塊根據(jù)這些數(shù)據(jù)計(jì)算凸度、楔度等指標(biāo),并按表1的格式,將數(shù)據(jù)寫入數(shù)據(jù)庫中。當(dāng)鋼板檢測結(jié)束后,運(yùn)算模塊會發(fā)送1個結(jié)束幀,此時顯示模塊將前面收到的鋼板特征數(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個函數(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)啟動時,調(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ù)的存儲、查詢、讀取等指令均通過該函數(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)中,退出時要調(diào)用該函數(shù)。
根據(jù)上述分析,利用MySQL的C API,實(shí)現(xiàn)對數(shù)據(jù)庫的訪問。使用 Microsoft Visual C++進(jìn)行開發(fā),并為數(shù)據(jù)庫檢索和讀取單獨(dú)設(shè)計(jì)了1個對話框,如圖2所示。在圖2左上方,列出了若干檢索條件,可進(jìn)行與、或等檢索;下方是數(shù)據(jù)庫中滿足條件的所有記錄。當(dāng)選定其中某1個鋼板時,在右側(cè)即顯示鋼板整體的厚度分布,以及橫縱兩個方向的厚度分布。從圖中可看出,數(shù)據(jù)庫的存儲、檢索和讀取功能均已實(shí)現(xiàn),滿足系統(tǒng)設(shè)計(jì)的要求。
圖2 數(shù)據(jù)庫系統(tǒng)測試圖Fig.2 Dialog of database test
本文介紹了凸度儀系統(tǒng)中數(shù)據(jù)庫管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。選擇MySQL數(shù)據(jù)庫,分析了凸度儀系統(tǒng)對數(shù)據(jù)庫應(yīng)用的需求,從而提取了操作數(shù)據(jù)并設(shè)計(jì)了合理的表,保證了數(shù)據(jù)存儲的完整性和檢索的高效性。此外,分析了應(yīng)用中所需的SQL指令及MySQL提供的C API中相關(guān)的函數(shù),從而在使用Visual C++編程的凸度儀系統(tǒng)中,成功地嵌入了MySQL數(shù)據(jù)庫,實(shí)現(xiàn)了數(shù)據(jù)的存儲、檢索和讀取等功能。通過實(shí)際測試,達(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/.