鮑玉琦,姜文剛
(江蘇科技大學 江蘇 鎮江 212003)
隨著SMT生產工藝技術的提高,生產車間對環境的溫濕度提出了溫度25±3℃,濕度45%RH~65%RH的要求。為了達到這樣的溫濕度要求,就不僅需要提高溫濕度傳感器的精度,而且要求現場的管理人員能夠實時的查看現場的環境數據,同時要求遠程的上級管理人員能夠查詢和管理各個監測點的溫濕度數據。
為了解決現場溫濕度實時顯示的問題,張晨昊等人在基于485總線的數字化溫濕度測控系統的設計一文中,提出為485溫濕度變送器擴展LCD顯示模塊來實現溫濕度實時顯示的方案[1]。這種獨立實時顯示方案需要為每個監測節點配置LCD模塊,存在成本投入高、不方便實時查看的缺點。文中針對這一缺點,提出了利用QT技術實現現場溫濕度集中實時顯示的方案,這個方案只需一個LCD模塊即可實現各監測點溫濕度實時查看,不僅成本低,而且方便管理。為了解決溫濕度的遠程管理問題,肖鴻威在基于modbus協議的空間分布式溫濕度測控系統設計一文中,提出了采用工控機和SQL server的方案來實現溫濕度的遠程采集和管理,這種方案需要配置高性能的工業PC,成本昂貴[2]。針對這一不足,本文提出了采用嵌入式ARM平臺和SQLITE數據庫方案,這種方案不僅成本低,而且設備小巧,安裝維護靈活方便。
根據SMT車間溫濕度數據采集、監控的要求,本文設計了基于SQLITE數據庫的分布式溫濕度遠程監控系統。本系統充分利用了QT技術和SQLITE數據庫的優點,搭建基于ARM微處理器和Linux操作系統的嵌入式Web服務器,從而實現現場數據的集中實時顯示和遠程管理。
本系統以嵌入式Linux系統為核心,包括硬件平臺和軟件平臺。首先在以S3C2440微處理器為核心的硬件平臺上搭建嵌入式Linux環境,然后在Linux環境下移植Qtopia、SQLITE數據庫和Boa服務器,最后通過Qtopia開發環境完成QT實時顯示界面的設計,利用CGI技術實現Web服務器對SQLITE數據庫的遠程數據查詢。并且通過485總線搭建溫濕度的底層采集網絡。系統的平臺示意圖如圖1所示。

圖1 系統平臺示意圖Fig.1 Schematic diagram of system platform
傳統的以單片機為核心的分散式儀表監控模式,顯然已經不能滿足當前監控系統對遠程訪問和集中管理的要求。采用主機-終端的監控模式,雖然能夠對現場的溫濕度進行實時管理,但是這種監控模式布線相對復雜,傳輸的距離受到限制,很難對不同地點的溫濕度進行監控[2]。
為了對不同地點的溫濕度進行實時的遠程管理,需要搭建一個基于以太網的分布式監控系統。基于以太網的監控系統可以采用PC、PLC或者ARM為核心,采用PLC為核心的以太網監控系統通常需要配備以太網模塊,采用PC為核心的監控系統通常需要配置高性能的工業PC,這樣與以ARM為核心的監控系統相比,價格要昂貴的多。因此,本文采用以ARM為核心的以太網溫濕度遠程監控系統。
本系統的軟件平臺主要包括宿主機和目標機。宿主機是VMware8.0虛擬機下Fedora9.0的Linux操作系統+PC機,目標機為ARM9電路板。其中在宿主機上需要完成Bootloader的編譯,裁剪內核,制作內核映像文件和根文件系統映像文件,然后將其下載到ARM板的Flash,從而完成嵌入式Linux操作系統的搭建。
本系統的軟件設計是建立在已搭建好的嵌入式Linux操作系統的基礎上。要設計QT實時顯示界面需要在宿主機上搭建起QT開發環境,需要在ARM板上通過移植Qtopia-2.2.0搭建起QT運行環境,最后將在宿主機編譯的執行文件下載到ARM板上。要實現采集數據的遠程web查詢,需要在ARM板上移植SQLITE數據庫和Boa服務器,然后通過CGI程序實現對SQLITE數據庫的訪問。
Qtopia是一個基于Qte的類似桌面系統的應用環境,它能夠為基于嵌入式Linux的消費電子產品提供和創建圖形用戶界面,使用Qtopia開發的應用程序界面清晰美觀、操作方便,多用于PDA產品的界面開發中。
QT開發是在宿主機上完成,而QT程序的運行是在ARM板上完成的,因為宿主機是X86體系,而ARM板一般是ARM體系,所以必須在宿主機上既要搭建適合X86的開發環境,又要搭建適合ARM體系的開發環境。本系統通過編譯 X86版本的 Qtopia-2.2.0和 ARM 版本的 Qtopia-2.2.0恰當的實現了QT開發環境的搭建。
QT程序的運行環境是在ARM板上,因此需要將Qtopia移植到ARM板上,即將Qtopia添加到文件系統中,為了讓Qtopia能夠在ARM板上運行起來,需要制作一個Qtopia運行腳本,然后將其權限設置為可執行文件,同時修改文件系統的“etc/init.d/rc.S”文件,在其中添加“qtopia&”的語句。
在QT的程序設計中會用到信號和槽,信號和槽是QT用于對象間通訊的一種機制,它是QT的中心特征,也是QT與其他工具包最不同的部分。而且信號和槽的機制是安全的:一個信號的簽名必須與它的接收槽的簽名相匹配。因此,信號和槽的機制可以保證一旦一個信號和一個槽連接起來,槽會在正確的時間使用信號的參數而被調用。
在本系統的QT程序中,使用主函數調用初始化函數,進行硬件的初始化,并打開傳感器設備;然后調用讀取函數,讀一次底層數據后發送一個信號,在QT程序中該信號連接一個槽,每發送一個信號,就會執行一次數據的顯示[5]。程序流程如圖2所示。

圖2 QT程序流程圖Fig.2 Flow chart of QT program
本系統中實現QT界面實時顯示的兩個重要函數:

信號和槽的連接是通過連接語句實現的。下面介紹QT程序中用到的2個connect語句:
connect (ok,SIGNAL ( clicked ()), this, SLOT (wenshidu_ok()
));//當按下ok按鈕時,將執行wenshidu_ok槽,即執行wenshidu_ok()函數。
connect( Slider1,SIGNAL ( valueChanged (int)), this,SLOT
(wenshidu_temperature()));//valueChanged信號發射時,將執行wenshidu_ok槽,即數據顯示。
因此,當按下ok后,界面中將有數據顯示。
在編譯好的ARM版本的Qtopia-2.2.0開發環境下,利用progen工具生成.pro文件,命令行為progen–o xianshi.pro;利用tmake工具生成Makefile文件,命令行為tmake–o Makefile xianshi.pro。然后通過make命令生成可執行文件,并將生成的執行文件xianshi下載到ARM板的/opt/Qtopia/bin/目錄下,將桌面圖標文件xianshi.png下載到ARM板的/opt/Qtopia/pics/目錄下,將桌面啟動器文件xianshi.desktop下載到ARM板的/opt/Qtopia/Apps/Applications/目錄下。最后重啟ARM板,在觸摸屏上點擊xiansh test文件圖標,打開QT界面,再點擊Initialization按鈕和Ok按鈕即可得到相關測試數據。最終的運行結果如圖3所示。

圖3 系統溫濕度實時顯示界面Fig.3 Display interface of real-time temperature and humidity system
該運行結果充分證明了QT程序已成功在ARM板上運行。將QT程序設置為每1秒刷新一次溫濕度數據,讓ARM板長時間運行,QT界面的溫濕度顯示仍然保持流暢,因此,說明該設計滿足實時顯示的要求。
嵌入式系統在數據的采集和處理過程中有大量的動態數據,而對數據的存取主要有兩種方式:一種是基于文件的方式,一種是基于數據庫的方式。對于文件方式,應用程序通常獨占數據文件的讀寫操作,數據共享性差;對于數據庫方式,數據和應用程序相互獨立,通過事務進行調度和并發控制,可有效的實現對數據進行存取、查詢等共享操作,并且運行時需要較少的內存[3]。因此,本系統采用了基于SQLITE數據庫的方式。
嵌入式web服務器對SQLITE數據庫的訪問是通過CGI技術實現的。本系統在宿主機上通過編譯SQLITE數據庫工具包搭建起SQLITE數據庫開發環境,在ARM板上通過移植Boa服務器和SQLITE數據庫搭建起CGI程序運行環境,然后在宿主機環境下編譯CGI程序并將生成的執行文件下載到ARM板相關目錄下,從而實現CGI對SQLITE數據庫的訪問。圖4為嵌入式Web服務器對SQLITE數據庫進行訪問的結構圖。

圖4 嵌入式Web服務器訪問SQLITE數據庫的結構框圖Fig.4 Block diagram of embedded Web server accessing SQLITE database
CGI(Common Gateway Interface)是一個 web 服務器與外部應用程序交互的標準接口,它允許將其輸出結果經web服務器傳送給web瀏覽器。web服務器將web瀏覽器發來的消息,傳遞給CGI程序,由CGI程序進行處理,處理完成后把響應的結果再回送給web服務器,web服務器再把消息發送給web瀏覽器[4]。CGI程序可以用多種語言來實現,如Perl、C、Unix shell等,由于C語言有較強的平臺無關性,占用的資源少,效率高,本系統選取C語言來編寫CGI程序。
CGI程序有GET和POST兩種提交數據的方法。其中,GET方式提交數據,是將數據保存在QUERY_STRING環境變量中,通過調用函數 getenv(“QUERY_STRING”)來讀取數據;POST方式提交數據,則程序先從CONTENT-LENGTH環境變量中得到數據的字長,然后從標準輸入中讀取相應長度的字符串[7]。一般,如果只是為取得和顯示數據多采用GET方式提交數據,一旦涉及數據的保存和更新,多采用POST的方式提交數據,本系統采用的是GET方式來提交數據。
CGI是建立在Boa服務器的基礎上的,關于Boa服務器的移植在此不再贅述。
3.2.1 嵌入式SQLITE數據庫簡介
SQLITE是D.Richard Hipp開發的開源性嵌入式數據庫引擎,全部源代碼大約3萬行左右,編譯后的程序大小250 kB,甚至可以縮小至150 kB左右。它具有體積小、數據容量大、處理速度快、占用內存少的特點。并且它用一個小型的C庫來實現嵌入式關系數據庫管理體制,提供了對SQL92的大多數支持[6],包括:多表和索引、事務、視圖、觸發和一系列的用戶驅動及其接口。
3.2.2 SQLITE常用的API函數
1)打 開 數 據 庫 :int sqlite3_open(const char*filename,SQLITE3**db);//*filename是數據庫的文件名,**db是數據庫句柄。
2) 運行函數:int sqlite3_exec (sqlite3*,const char**sql,sqlite3_callback,void*,char**errmsg); callback 是回調函數,用戶可以根據需要自己編寫callback函數獲得操作數據庫的結果。
3)查詢數據:int sqlite3_get_table(sqlite3*,const char*sql,char***result,int*nrow,int*ncolumn,char**errmsg);//參數result以數組的形式存放查詢的數據,參數nrow和ncolumn分別為查詢語句返回的結果集的行數和列數。
4)關閉數據庫:int sqlite3_close(sqlite3*)。
3.2.3 嵌入式SQLITE數據庫在ARM-LINUX上的移植
本系統是將嵌入式SQLITE數據庫應用到S3C2440+Linux環境中,首先需要在宿主機的交叉編譯環境下,編譯生成SQLITE的可執行文件,然后將其下載到ARM板的相關目錄下。移植SQLITE的主要步驟如下:
1)解壓 sqlite-3.5.6.tar.gz工具包,命令為 tar-zxvf sqlite-3.5.6.tar.gz;
2)解壓完成之后進入sqlite-3.5.6目錄下新建一個文件夾build。
3)進入 build文件夾,執行./configure--host=arm-linuxprefix=/opt/sqlite-3.5.6/build,其中host是指定進行編譯的交叉編譯器,prefix是編譯后目標存放的路徑。
4)執行 make和 make install命令,在新建的 build目錄下生成 bin、lib、include、share 4 個文件夾。
5)將build/bin目錄下的文件拷貝到ARM板的/usr/bin中,將build/lib目錄下的文件拷貝到ARM板的lib文件夾下。
6)修改ARM板/usr/bin/sqlite3的權限,命令為chmod 755 sqlite3。
完成上述6步后,可以在ARM板的終端輸入:sqlite3 test.db來驗證SQLITE數據庫是否移植成功。
要實現嵌入式Web服務器對SQLITE數據庫的遠程數據查詢,需要實現數據的查詢和網頁顯示。針對生產車間溫濕度數據的當前值、最大值和最小值,本系統設計了對最近五次的溫濕度和所有溫濕度的最大值、最小值進行查詢的CGI程序。 在 CGI程序中,利用 sqlite3_get_table(db,“select max (temperature)from dht11;”,&result,&nrow,&ncolumn,&errmsg)來實現對溫度數據最大值的查詢,其它數據的查詢類似。要實現溫濕度的網頁顯示需要在CGI程序中指定輸出一 個 文 本 的 html網 頁 , 通 過 printf (“Content-type:text/html ”)程序語句即可實現[7]。
編寫好的CGI程序需要在特定的交叉編譯環境下才能編譯成功。這里使用arm-linux-gcc–I/opt/build/include–L/opt/build/lib–o main.cgi main.c–lsqlite3編譯生成main.cgi(其中-I和-L后面指定的是頭文件和鏈接文件),然后將其下載到ARM板的www目錄下,并將該文件設置為可執行文件權限。最后在客戶端的IE瀏覽器上輸入http://192.168.58.230/main.html即可進入溫濕度實時查詢界面,其中下圖5顯示的是溫濕度的歷史數據頁面。

圖5 系統溫濕度的歷史數據頁面Fig.5 Page of historical data for temperature and humidity system
該運行結果說明Boa服務器和SQLITE數據庫已成功移植到了設計的ARM電路板上,并且編寫的CGI程序完成了對SQLITE數據庫的遠程訪問功能。經多次實驗運行,本系統的嵌入式web服務器工作穩定,執行速度快并且安全、可靠。
文中設計了基于SQLITE數據庫的嵌入式Web服務器,引入QT技術來設計溫濕度實時顯示界面,利用SQLITE數據庫和Boa服務器實現溫濕度的遠程管理。本系統是嵌入式技術在溫濕度監控系統方面的成功運用,并且該系統經多次實驗測試穩定可靠,可應用到其他相關領域,為實現現場數據的集中實時顯示和遠程數據訪問提供了一種切實可行的方案。
[1]張晨昊,吳桂清,戴喻興.基于485總線的數字化溫濕度測控系統的設計[J].科學技術與工程,2007,7(11):2656-2658.ZHANG Chen-hao,WU Gui-qing,DAI Yu-xing.Design of digitized temperature and humidity measurement and control system based on 485 bus[J].Science Technology and Engineering,2007,7(11):2656-2658.
[2]肖鴻威.基于modbus協議的空間分布式溫濕度測控系統設計[J].電子元器件應用,2009,11(9):40~41.XIAO Hong-wei.Design of spatially distributed temperature and humidity monitoring and control system based on the modbus protocol[J].Application of Electronic Components,2009,11(9):40-41.
[3]孟旭霞,譚少華,唐漢雄,等.嵌入式Web Server中SQLITE訪問技術的研究[J].微計算機信息:管控一體化,2008,24(8):95-97.MENG Xu-xia,TAN Shao-hua,TANG Han-xiong,etal.Research of SQLITE access technology of embedded Web server[J].The Microcomputer:Managementand Control Integration,2008,24(8):95-97.
[4]楊建華,黃宇東,陳安,等.基于ARM/Linux的燃料電池溫度監控系統GUI設計[J].信息化縱橫,2009,28(9):13-15.YANG Jian-hua,HUANG Yu-dong,CHEN An,et al.Design of fuel cell temperature monitoring system GUI based on ARM/Linux[J].Aspect of Information Technology,2009,28(9):13-15.
[5]劉偉明,韓斌,李征.基于Linux的數據采集及在QT界面的顯示[J].微計算機信息:測控自動化,2008,24(8):97-99.LIU Wei-ming,HAN Bin,LI Zheng.Data acquisition and QT interfacediaplaybasedonLinux[J].MicrocomputerInformation:Automatic Measurement and Control,2008,24(8):97-99.
[6]李桂香,常赟杰.SQLITE在嵌入式Web Server中的應用研究[J].計算機時代,2010,3(5):23-24.LIGui-xiang,CHANG Yun-jie.Application research of embedded Web server for SQLITE[J].The Computer Age,2010,3(5):23-24.
[7]廖臨光.基于嵌入式web服務器遠程溫度監測系統設計與實現[D].蘭州:西北民族大學,2010.