1? 引言
車用燃料電池具有效率高、啟動(dòng)快、環(huán)保性好、響應(yīng)速度快等優(yōu)點(diǎn),是取代汽車內(nèi)燃機(jī)的理想解決方案。燃料電池汽車的最大優(yōu)點(diǎn)是清潔、無污染,在全球環(huán)境保護(hù)問題日益突出的今天,燃料電池汽車作為環(huán)保型汽車越來越受到人們的重視。為提高燃料電池發(fā)動(dòng)機(jī)系統(tǒng)的可靠性,需要對(duì)發(fā)動(dòng)機(jī)的各系統(tǒng)狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)控,記錄試驗(yàn)數(shù)據(jù),分析其運(yùn)行特性,為發(fā)動(dòng)機(jī)控制策略的不斷改進(jìn)提供依據(jù),同時(shí)對(duì)整車性能進(jìn)行評(píng)估。因此,燃料電池發(fā)動(dòng)機(jī)監(jiān)控系統(tǒng)的開發(fā)具有很重要的現(xiàn)實(shí)意義。
???????????
2? 系統(tǒng)概述
2.1 系統(tǒng)結(jié)構(gòu)簡(jiǎn)介
???????????????????
??? 本系統(tǒng)由軟件和硬件兩部分組成,如圖1所示。它以高性能的dsp為核心,開發(fā)出控制燃料電池發(fā)動(dòng)機(jī)的嵌入式控制器。不僅能完成對(duì)燃料電池發(fā)動(dòng)機(jī)的控制,并對(duì)整車較為嚴(yán)重的電磁干擾做了相應(yīng)的處理,增強(qiáng)了控制系統(tǒng)的抗干擾性和穩(wěn)定性;與其配套的上位機(jī)監(jiān)控軟件是一個(gè)擁有良好人機(jī)界面的試驗(yàn)數(shù)據(jù)監(jiān)控和記錄中心。系統(tǒng)中dsp的任務(wù)主要是完成數(shù)據(jù)的采集與處理,算法的實(shí)現(xiàn)與驅(qū)動(dòng),并通過串口與上位機(jī)通信,將采集到的數(shù)據(jù)傳送給上位機(jī),并接收上位機(jī)發(fā)來的控制命令。而系統(tǒng)的上位機(jī)對(duì)燃料電池發(fā)動(dòng)機(jī)工作狀態(tài)實(shí)現(xiàn)實(shí)時(shí)監(jiān)控,完成數(shù)據(jù)的轉(zhuǎn)換、存儲(chǔ)及查詢功能。上位機(jī)軟件是在windows2000/xp操作系統(tǒng)下利用vc++ 6.0開發(fā)完成的,由于篇幅所限,本文重點(diǎn)介紹上位機(jī)監(jiān)控軟件的設(shè)計(jì)與實(shí)現(xiàn)。
?
?
圖1? 燃料電池發(fā)動(dòng)機(jī)控制器結(jié)構(gòu)圖
???????????
2.2 監(jiān)控軟件的總體設(shè)計(jì)
???????????????????
??? 本系統(tǒng)需要監(jiān)控一系列的參數(shù),記錄歷史數(shù)據(jù)及顯示實(shí)時(shí)曲線圖,并實(shí)時(shí)地顯示報(bào)警事件,提供診斷信息,使監(jiān)控人員可以及時(shí)了解異常情況,查詢故障內(nèi)容。控制器的主要控制對(duì)象有氫氣供給、空氣供給、冷卻水循環(huán)、電堆功率等,監(jiān)控軟件對(duì)其中關(guān)鍵參數(shù)進(jìn)行實(shí)時(shí)顯示、報(bào)警顯示及數(shù)據(jù)存儲(chǔ)等。根據(jù)系統(tǒng)分析確定的目標(biāo)和功能,采用模塊化設(shè)計(jì)方法,進(jìn)行了系統(tǒng)的界面結(jié)構(gòu)設(shè)計(jì)。本系統(tǒng)由多個(gè)模塊組成,每一個(gè)模塊完成一項(xiàng)獨(dú)立的功能,模塊與模塊之間通過數(shù)據(jù)相關(guān)聯(lián)。其關(guān)系如圖2所示。
?
?
圖2? 監(jiān)控系統(tǒng)結(jié)構(gòu)圖
???????????
3? 主要功能模塊設(shè)計(jì)
3.1 信息顯示模塊
???????????????????
完成對(duì)系統(tǒng)主要設(shè)備運(yùn)行狀態(tài)的實(shí)時(shí)監(jiān)控,包括用不同的顏色來表示設(shè)備的啟、停狀態(tài),用編輯框?qū)崟r(shí)顯示主要的運(yùn)行參數(shù),如電壓、電流、壓力、溫度等,并設(shè)置報(bào)警信號(hào)。
???????????
同時(shí),由于控件較多,各部分功能不同,引入屬性頁使不同用途控件分頁表示,達(dá)到屏幕美觀且操作方便的效果。燃料電池車載監(jiān)控系統(tǒng)的主控畫面如圖3所示。
?
?
圖3? 燃料電池車載監(jiān)控系統(tǒng)主界面??????????
???????????
3.2 串行通信模塊
???????????????????
??? 完成數(shù)據(jù)通信并對(duì)所收到的數(shù)據(jù)進(jìn)行處理、分析、存盤。把接收到的數(shù)據(jù)進(jìn)行范圍轉(zhuǎn)換后存放到事先定義好的結(jié)構(gòu)體內(nèi),并檢查每個(gè)參數(shù)值是否超限,若超限則置報(bào)警標(biāo)志并報(bào)警;該軟件正常使用時(shí)處于長(zhǎng)期連續(xù)運(yùn)行狀態(tài),通過串口接收數(shù)據(jù)的工作一直進(jìn)行。
???????????????????
(1)通信協(xié)議。在串行通信中,為了實(shí)現(xiàn)特定的用戶功能,必須在軟件中制定通信協(xié)議。在開發(fā)燃料電池串行數(shù)據(jù)通信程序的過程中,通過長(zhǎng)期的調(diào)試和不斷的總結(jié),最終得到一套完整而可靠的通信協(xié)議。該協(xié)議一共分為3層,分別為物理層和數(shù)據(jù)鏈接層。
物理層。規(guī)定了電子電氣方面的特性及原始位流在物理鏈路上的傳輸,提供了原始位流傳輸信道;串行通信口:rs-232串口,硬件接口:dsp輸出的ttl電平經(jīng)專用集成模塊轉(zhuǎn)換成rs-232信號(hào),波特率:19200,字符格式:8位數(shù)據(jù)位,2位停止位。
數(shù)據(jù)鏈接層。用幀作為信息傳輸單元,使用了兩種幀:控制幀與數(shù)據(jù)幀。數(shù)據(jù)幀包括幀頭和負(fù)載數(shù)據(jù),幀頭占6個(gè)字節(jié),如表1所示,其中count表示負(fù)載數(shù)據(jù)長(zhǎng)度,check1表示第二、三字節(jié)的校驗(yàn)和。控制幀只有幀頭,長(zhǎng)為6字節(jié),如表2所示。為保證可靠的傳輸,在傳輸開始前,通過握手建立連接,采用發(fā)送/應(yīng)答/重連/失敗方式。
cmd表示控制信號(hào)。
???????????????????
check2表示第二、三字節(jié)的校驗(yàn)和,當(dāng)cmd=check2=0時(shí),表示傳輸結(jié)束。
???????????????????
(2) 應(yīng)用層。實(shí)現(xiàn)各監(jiān)控參數(shù)的完整性傳輸,包括監(jiān)控?cái)?shù)據(jù)與校驗(yàn)和。
每個(gè)監(jiān)控參數(shù)用兩個(gè)字節(jié)表示,低位先傳。
???????????????????
校驗(yàn)和占兩個(gè)字節(jié),對(duì)監(jiān)控?cái)?shù)據(jù)按位異或校驗(yàn)。
???????????????????
當(dāng)通信失敗或校驗(yàn)錯(cuò)時(shí),往下位機(jī)發(fā)出報(bào)警信息。
(3)通信軟件設(shè)計(jì)。vc中進(jìn)行串口通信通常有三種方法。一是利用microsoft公司提供的activex控件microsoft communications control。這種方法較簡(jiǎn)單,只需要對(duì)串口進(jìn)行簡(jiǎn)單配置,但在數(shù)據(jù)量較大且高速傳遞時(shí)程序易掛起。二是直接采用windows api通信函數(shù),同時(shí)利用多線程技術(shù)來提高程序的效率。這種方法通信過程穩(wěn)定,適用于要求較高的通信環(huán)境,但使用較復(fù)雜。第三種方法是利用第三方提供或自己編寫的通信類,只要理解這種類的幾個(gè)成員函數(shù)就能方便的使用,且通信穩(wěn)定。本程序采用第三種方法,使用了由remon spekreijse提供的多線程串口類cserialport,并在此基礎(chǔ)上進(jìn)行了一些改進(jìn),使之能用于本程序。
???????????????????
由于篇幅所限,本文只列出部分關(guān)鍵代碼。
???????????????????
(1)? 初始化程序段
//初始化com1
??????????????????? // m_serialport是cserialport類的對(duì)象,//在頭文件中定義
???????????????????
??????????? if(m_serialport.initport(this,1,19200,`n`,8,2,ev_rxflag|ev_rxchar,1024))
??????????????????? {
??????????????????? m_serialport.startmonitoring();
??????????????????? //啟動(dòng)串口監(jiān)視線程 m_bserialportopened=true;
??????????????????? // m_bserialportopened為串口打開標(biāo)志
??????????????????? }
???????????????????
(2)? 串口通訊程序段
???????????????????
串口需要對(duì)下位機(jī)進(jìn)行控制以及準(zhǔn)確采集現(xiàn)場(chǎng)上傳的實(shí)時(shí)參數(shù),如溫度、電流、電壓、水位等,以便分析和改進(jìn)整車性能,是通信程序設(shè)計(jì)的重點(diǎn)。其工作流程如圖4所示.
?
圖4? 上位機(jī)收發(fā)數(shù)據(jù)流程圖
???????????????????
由于原類只能發(fā)送字符(ascii文本),不能處理二進(jìn)制發(fā)送,而本系統(tǒng)需要發(fā)送二進(jìn)制數(shù)據(jù),所以需要對(duì)原類進(jìn)行一些改進(jìn),添加一個(gè)發(fā)送函數(shù):
void cserialport::writetoport(byte *bt, int n)
??????????????????? {
??????????????????? assert(m_hcomm != 0);
??????????????????? memset(m_szwritebuffer,0,sizeof(m_szwritebuffer));
??????????????????? memcpy(m_szwritebuffer, bt, n);
??????????????????? //將待發(fā)送數(shù)據(jù)復(fù)制到發(fā)送緩沖區(qū)
??????????????????? m_nwritesize=n;
??????????????????? setevent(m_hwriteevent); //觸發(fā)寫事件
??????????????????? }
??????????????????? 則發(fā)送代碼為:
??????????????????? m_serialport.writetoport(sendon,4);
??????????????????? // sendon為字節(jié)型發(fā)送數(shù)據(jù)
??????????????????? 串口接收簡(jiǎn)單代碼舉例如下:
??????????????????? long c******::oncomm(wparam ch, lparam port)
??????????????????? {
??????????????????? ………
??????????????????? count++;
??????????????????? buf[count]=ch;
??????????????????? checksum=checksum^ch;
??????????????????? if(count==buf1)//全部字節(jié)接受完畢
??????????????????? {
??????????????????? if(checksum)//校驗(yàn)錯(cuò)
??????????????????? {
??????????????????? afxmessagebox("接收校驗(yàn)出錯(cuò)");?
??????????? ::sendmessage(m_hwnd,wm_resend,(wparam)0,(lparam)0);?
??????????????????? // wm_resend為重發(fā)消息
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????? byte dol=*(char*)(buf+2);
??????????????????? //接受處理數(shù)據(jù)????
??????????????????? byte doh=*(char*)(buf+3);
??????????????????? ………
??????????????????? }
??????????????????? connectdb();//連接數(shù)據(jù)庫
??????????????????? ………?????????????
???????????
3.3 數(shù)據(jù)管理模塊
???????????????????
采集來的數(shù)據(jù)主要存放在數(shù)據(jù)庫中,方便用戶查詢各歷史數(shù)據(jù)、顯示數(shù)據(jù)曲線和打印功能。vc語言提供了多種操作數(shù)據(jù)庫的方法,使用odbc(開放數(shù)據(jù)庫連接)訪問數(shù)據(jù)庫就是一種很常用的操作方法。另外,通過dbgrid control(網(wǎng)格控件)和microsoft remotedata control的協(xié)同工作就能提供一個(gè)訪問數(shù)據(jù)庫的界面,用來進(jìn)行數(shù)據(jù)庫數(shù)據(jù)的瀏覽,添加,刪除,修改等操作。整個(gè)過程實(shí)現(xiàn)和操作起來非常簡(jiǎn)單方便。具體連接步驟如下:
???????????????????
(1) 建立access數(shù)據(jù)庫。
???????????????????
(2) 在工程中加入datagrid和remotedata control控件。remote-data控件在數(shù)據(jù)庫和datagrid控件中起著橋梁作用,完成同數(shù)據(jù)庫的綁定。然后對(duì)兩控件屬性進(jìn)行設(shè)置。
??????????????????
(3) 由于odbc數(shù)據(jù)源需要手動(dòng)在控制面板中添加注冊(cè),不方便程序的移植,于是程序通過代碼動(dòng)態(tài)配置數(shù)據(jù)源。
???????????????????
部分程序如下:
char* szdesc;
??????????????????? szdesc=new char[256];
??????????????????? sprintf(szdesc,"dsn=%s? description=toc support sourc
??????????? e?dbq=%s? file=microsoftacces -s? defaultdir=%s?? ","controlh
??????????? -istory",lps***ile,spath);
??????????????????? // controlhistory為數(shù)據(jù)源名稱,//lps***ile為數(shù)據(jù)庫名稱,spath為數(shù)據(jù)庫所//在路徑
??????????????????? if(false==sqlconfigdatasou -rce(null,odbc_add_dsn,"microsoft
??????????? access driver (*.mdb)",(lpcstr)szdesc))
??????????????????? afxmessagebox("sqlconfigda -tasource failed");
??????????????????? (4) 加入數(shù)據(jù)到數(shù)據(jù)庫
??????????????????? while(m_bisconnected && (iii==1)) // m_bisconnected
??????????? 與iii為連接數(shù)據(jù)庫標(biāo)志
??????????????????? {
???????????????????? m_set.open();
???????????????????? m_set.addnew();
???????????????????? ………
??????????????????? if(m_set.canupdate())
??????????????????? m_set.update();
???????????????????? ………
??????????????????? }
4? 結(jié)束語 ? ? ? ? ? ? ? ?
現(xiàn)場(chǎng)調(diào)試表明,該監(jiān)控系統(tǒng)能夠長(zhǎng)時(shí)間穩(wěn)定工作,并且抗干擾能力較強(qiáng),能方便有效地監(jiān)控現(xiàn)場(chǎng)的各種實(shí)驗(yàn)數(shù)據(jù),其數(shù)據(jù)庫管理操作也具有極大的靈活性.
評(píng)論
查看更多