魏玉晶,劉銳銳
(長安大學(xué) 信息工程學(xué)院,陜西 西安 710064)
載貨汽車是中國汽車產(chǎn)品中的傳統(tǒng)主力產(chǎn)品,它被用于城市與城市之間貨物的運(yùn)輸。在當(dāng)今時(shí)代的背景下,由于汽油燃料的價(jià)格飛速的上漲,導(dǎo)致運(yùn)輸成本增加。在貨車司機(jī)之中,存在因私利偷油的行為更加加重了運(yùn)輸?shù)某杀荆瑸榱朔乐惯@一行為的發(fā)生,設(shè)計(jì)了貨車油量監(jiān)控系統(tǒng)。在國外,并沒有此類系統(tǒng)的相關(guān)設(shè)計(jì),在國內(nèi),此類系統(tǒng)是一種新型設(shè)計(jì),參考信息有限。
貨車運(yùn)輸油量實(shí)時(shí)監(jiān)控系統(tǒng)主要由三大部分組成,主要包括下位機(jī)、中位機(jī)、上位機(jī)。如圖1所示。系統(tǒng)主要流程為:下位機(jī)用于信號(hào)采集,主要包括的物理器件有GPS信號(hào)接收器、流量傳感器和液位傳感器,完成對信號(hào)的采集功能,它將采集到的信息交于中位機(jī),中位機(jī)是用于信號(hào)傳輸部分,主要包括的物理器件有ZigBee模塊和GSM短信模塊,完成信號(hào)的傳輸功能,它確保信息可靠地傳輸?shù)缴衔粰C(jī),上位機(jī)是用于信息的處理與綜合顯示,主要包括的物理器件有監(jiān)控設(shè)備和手機(jī),完成信息的綜合處理、判斷油量正常使用與否和異常情況下及時(shí)報(bào)警的功能,上位機(jī)是ARM 6410嵌入式開發(fā)平臺(tái),它提供了觸摸屏、7笗寬屏彩色液晶面板、移動(dòng)終端的電源、USB:2PORT、UART:4Ports、以太網(wǎng)接口:CS8900、SD/MMC:1 PORT、HDD:1 PORT、VIDEO (TV-OUT):1PORT、VGA:1PORT。
嵌入式操作系統(tǒng)的選?。?/p>
1)Windows CE
圖1 貨車運(yùn)輸油量實(shí)時(shí)監(jiān)控的三大組成部分Fig.1 The three components of Trucking oil real-time monitoring
Windows CE[1]是Windows的嵌入式系統(tǒng)版本,具有類似Windows風(fēng)格的用戶界面以與Windows環(huán)境下的軟件很方便地接口。但是,它的代碼是不開放的。
2)Linux
Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是一個(gè)基于Posix和Unix的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運(yùn)行主要的Unix工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計(jì)思想,是一個(gè)性能穩(wěn)定的多用戶網(wǎng)絡(luò)操作系統(tǒng)。
3)μC Linux
μC Linux是一個(gè)縮減的Linux系統(tǒng),特別適合于用在不需要內(nèi)存管理的高級(jí)單片嵌入式系統(tǒng)上。
4)eCOS
eCOS是一個(gè)代碼開放的嵌入式操作系統(tǒng),具有良好的系統(tǒng)功能和應(yīng)用支持,可以在許多高級(jí)單片上運(yùn)行,eCOS最大的特點(diǎn)是內(nèi)核可配置。
5)VxWorks
VxWorks是一個(gè)功能完善的嵌入式操作系統(tǒng),但是它的代碼也是不開放的,大多數(shù)用于軍工方面。
6)RTX51
RTX51是專門針對8051設(shè)計(jì)的操作系統(tǒng),代碼緊湊,體積小巧。已經(jīng)在很多應(yīng)用中證明這是一個(gè)成功的8位單片機(jī)的操作系統(tǒng),代碼完全開放。
7)μC/OS
μC/OS是一個(gè)特別風(fēng)格的嵌入式操作系統(tǒng),它有多種版本,可以適應(yīng)從x86到8051的各種不同類型不同規(guī)模的嵌入式系統(tǒng),代碼開放。但是,它的一些改進(jìn)版本,開始放棄代碼開放的原則。
文中選擇了Windows CE操作系統(tǒng),因?yàn)樗哂蓄愃芖indows風(fēng)格的友好用戶界面以及擁有與其相配的EVC編程軟件,更好的符合貨車油量監(jiān)控系統(tǒng)的設(shè)計(jì)要求。
為了完成在貨車運(yùn)輸過程中對油量的實(shí)時(shí)監(jiān)控,該系統(tǒng)需要具有方便攜帶、快捷監(jiān)督等優(yōu)勢,所以決定上位機(jī)選擇RAM6410開發(fā)平臺(tái);與此同時(shí)為了直觀的顯示數(shù)據(jù)和油量的變化,選擇運(yùn)用EVC編程軟件來編寫友好界面;最后為了實(shí)現(xiàn)報(bào)警機(jī)制,選擇短信報(bào)警與音頻報(bào)警兩種方式。
上位機(jī)主要完成了4個(gè)功能模塊,功能模塊框圖如圖2所示。
圖2 功能模塊框圖Fig.2 Black diagram of function module
第一個(gè)模塊:顯示實(shí)時(shí)數(shù)據(jù)模塊。這個(gè)模塊完成實(shí)時(shí)觀察液位值和流量值。
第二個(gè)模塊:記錄本次數(shù)據(jù)模塊。模塊記錄實(shí)時(shí)的數(shù)據(jù),當(dāng)出現(xiàn)報(bào)警情況時(shí),有數(shù)據(jù)可依來進(jìn)行分析。
第三個(gè)模塊:實(shí)時(shí)報(bào)警模塊。當(dāng)液位變化與流量值之差超出閾值時(shí),說明有偷油的現(xiàn)象產(chǎn)生,提醒相關(guān)人員進(jìn)行處理。
第四個(gè)模塊:繪制曲線圖模塊。便于觀察液位值和流量值的變化情況。
在完成上位機(jī)的設(shè)計(jì)中,軟件流程如圖3所示。
圖3 軟件流程圖Fig.3 Flowchart of software
1)歡迎界面
當(dāng)運(yùn)行程序時(shí),首先會(huì)調(diào)出主界面,主界面是貨車油量監(jiān)控系統(tǒng)的歡迎界面。
2)基本信息界面
當(dāng)點(diǎn)擊主界面的進(jìn)入按鈕時(shí),會(huì)調(diào)用Void CSysDlg:OnButtonl()函數(shù):
void CSysDlg::OnButton1()
{
Cbase base1;
base1.DoModal();
}
然后進(jìn)入基本信息界面,可以看到司機(jī)的基本信息、貨車的基本信息、路線。
3)數(shù)據(jù)顯示分析界面
當(dāng)點(diǎn)擊基本信息界面的顯示分析按鈕時(shí),會(huì)調(diào)用void cbase::OnButtonl()函數(shù):void Cbase::OnButton1(){
Cshow show1;
show1.DoModal();
}
然后進(jìn)入數(shù)據(jù)顯示分析界面,在初始化界面的同時(shí),對串口初始化,設(shè)置串口和波特率并打開串口。在軟件設(shè)計(jì)中與Windows下MFC中的設(shè)計(jì)不同的是,在MFC中有串口通信MSComm這個(gè)控件,但是在EVC中并沒有這個(gè)控件,所以我們要用CSerial類[2]方法,用這種方法來打開串口,進(jìn)行串口數(shù)據(jù)的接收,代碼如下:
bool CSerial::OpenPort (CString lpszPortName, HWND hWnd, UINT m_strCom1)
{
m_hWnd=hWnd;//將調(diào)用對話框的窗口句柄賦給m_hWnd,以備在ReadPortThread中使用
DWORD dwError, dwThreadID;
if(hPort)//如果 hport為 0 說明串口沒有打開
{
MessageBox (NULL, TEXT ("repeat!"),TEXT("Error!"), MB_OK);
return FALSE;
}
}//打開串口
打開串口后,當(dāng)有數(shù)據(jù)時(shí),會(huì)調(diào)用ShowReceiveStr(WPARAM wParam)函數(shù)對傳來的數(shù)據(jù)進(jìn)行顯示和處理。
顯示實(shí)時(shí)數(shù)據(jù)界面,分為三部分,一部分是貨車運(yùn)行地圖,它主要是根據(jù)接收到的北緯和東經(jīng)進(jìn)行比例計(jì)算,在圖中相應(yīng)的點(diǎn)上繪制紅色的圓圈,以表示貨車現(xiàn)在所在的位置;第二部分是曲線圖,紅色代表液位的變化,綠色代表消耗的流量,把接收到的液位和流量根據(jù)坐標(biāo)在界面上的位置,按照比例換算,在坐標(biāo)中畫出曲線,運(yùn)用了函數(shù)line1()和line2(),兩個(gè)函數(shù)調(diào)用了 pDC->MoveTo()和 pDC->LineTo()方法[3]繪圖實(shí)現(xiàn);第三部分是有6個(gè)編輯框和6個(gè)文本框組成的,它完成將接收到的值分別填寫在相應(yīng)的編輯框里顯示出來。最下面添加了兩個(gè)按鈕,歷史數(shù)據(jù)按鈕可以進(jìn)入記錄數(shù)據(jù)模塊,如圖4所示。
圖4 接收正常數(shù)據(jù)界面Fig.4 Receive normal data interface
4)歷史數(shù)據(jù)顯示
當(dāng)點(diǎn)擊歷史數(shù)據(jù)按鈕時(shí),會(huì)調(diào)用Void Cshow:OnButton3()函數(shù):
void Cshow::OnButton3()
{
m_ListTotal.ShowWindow(SW_SHOWNORMAL);
}
進(jìn)入歷史數(shù)據(jù)顯示,調(diào)用OnPaint()函數(shù),添加一個(gè)表格圖,表格圖是9行6列,可以記錄歷史數(shù)據(jù),根據(jù)左右,上下的位置添加相應(yīng)的數(shù)據(jù),界面如圖5所示。
圖5 歷史數(shù)據(jù)界面Fig.5 Historical data interface
5)實(shí)時(shí)報(bào)警
在調(diào)用 ShowReceiveStr(WPARAM wParam)函數(shù)[4]進(jìn)行處理時(shí),首先將上一次的液位記錄與后一次的液位記錄進(jìn)行減法計(jì)算:
r6[h-1]=r3[h-1]-r3[h-2];
然后與本次的耗油量相比較,在這里設(shè)置了閾值:
if(r6[h-1]-r2[v-1]<-800)
{OnButton2(); }
if(r6[h-1]-r2[v-1]>800)
{OnButton2(); }
如果實(shí)際的油量與消耗的油量不相符時(shí),就會(huì)調(diào)用void Cshow::OnButton2()函數(shù):
void Cshow::OnButton2()
{
Cwarm warm1;
warm1.DoModal();
}
進(jìn)入報(bào)警界面,在界面進(jìn)行初始化時(shí),會(huì)調(diào)用計(jì)時(shí)器函數(shù):void Cwarm::OnTimer(UINT nIDEvent)
{
u++;
if(nIDEvent==1)
{
if(u==1)
{
PlaySound (MAKEINTRESOURCE (IDR_WAVE1),AfxGetResourceHandle (),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT);
CDC*pDC=GetDC();
CDC mDC5;
CBitmap bitmap5;
mDC5.CreateCompatibleDC(pDC);
bitmap5.LoadBitmap(IDB_TB1);
CBitmap *pOldBit5=mDC5.SelectObject(&bitmap5);
pDC->BitBlt(310,100,300,300,&mDC5,1,1,SRCCOPY);
mDC5.SelectObject(pOldBit5);
mDC5.DeleteDC();
bitmap5.DeleteObject();
ReleaseDC(&mDC5);
ReleaseDC(pDC);
}
else if(u==2)
{
CDC*pDC=GetDC();
CDC mDC5;
CBitmap bitmap5;
mDC5.CreateCompatibleDC(pDC);
bitmap5.LoadBitmap(IDB_TB2);
CBitmap *pOldBit5=mDC5.SelectObject(&bitmap5);
pDC ->BitBlt (310,100,300,300,&mDC5,1,1,SRCCOPY);
mDC5.SelectObject(pOldBit5);
mDC5.DeleteDC();
bitmap5.DeleteObject();
ReleaseDC(&mDC5);
ReleaseDC(pDC);
u=0;
}
}
//TODO:Add your message handler code here and/or call default
CDialog::OnTimer(nIDEvent);
}
函數(shù)中運(yùn)用了:
PlaySound (MAKEINTRESOURCE (IDR_WAVE1),AfxGetResourceHandle (),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT)[5];來進(jìn)行聲音的報(bào)警并且根據(jù)兩張圖的替換加載,來讓偷油的老鼠閃爍起來。另外一種報(bào)警方式是短信報(bào)警,這是在界面初始化時(shí),調(diào)用 ab->WritePort(tp,11)函數(shù)[6],進(jìn)行短信的發(fā)送,短信會(huì)發(fā)送車牌號(hào)到管理人員。
報(bào)警界面如圖6所示。
圖6 報(bào)警界面Fig.6 Alarm interface
選擇在6410平臺(tái)上運(yùn)行上述設(shè)計(jì)程序,從上位機(jī)界面中可以看到所接收的實(shí)時(shí)數(shù)據(jù)顯示。在曲線圖中可觀測液位值和消耗的油量值,兩者的變化趨勢。當(dāng)超出閾值時(shí),會(huì)啟動(dòng)報(bào)警模塊。在上述的圖例中已經(jīng)有所展示。
文中基于RAM的Windows CE系統(tǒng)和EVC編程環(huán)境,設(shè)計(jì)并實(shí)現(xiàn)了貨車油量監(jiān)控系統(tǒng)的上位機(jī),設(shè)計(jì)過程中充分考慮了功能的全面性、實(shí)用性和直觀性。實(shí)現(xiàn)了實(shí)時(shí)對數(shù)據(jù)進(jìn)行顯示與處理,以得出油量的變化達(dá)到監(jiān)控的目的,該系統(tǒng)安全、穩(wěn)定、簡單并且價(jià)格低廉,對貨車運(yùn)輸管理部門來說是一個(gè)很好的解決方案。
[1]何宗鍵.Windows CE嵌入式系統(tǒng)[M].北京:北京航空航天大學(xué)出版社,2006.
[2]李大為.Windows CE工程實(shí)踐完全解析[M].北京:北京航空航天大學(xué)出版社,2008.
[3]王浩,林意春.Windows CE嵌入式高級(jí)編程及實(shí)例詳解[M].北京:中國電力出版社,2010.
[4]華清遠(yuǎn)見嵌入式培訓(xùn)中心.Windows CE嵌入式開發(fā)高級(jí)教程[M].北京:人民郵電出版社,2010.
[5]張冬松.Windows CE6.0嵌入式高級(jí)編程[M].北京:清華大學(xué)出版社,2009.
[6]王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)[M].北京:清華大學(xué)出版社,2003.