基于Delphi的車(chē)載數(shù)據(jù)顯示界面的設(shè)計(jì)
引言
在自動(dòng)控制、儀表智能化、工業(yè)測(cè)控點(diǎn)實(shí)時(shí)監(jiān)控等領(lǐng)域中,人們經(jīng)常用計(jì)算機(jī)對(duì)生產(chǎn)過(guò)程實(shí)行實(shí)時(shí)監(jiān)控,以對(duì)下位機(jī)采集來(lái)的數(shù)據(jù)進(jìn)行實(shí)時(shí)數(shù)據(jù)處理,同時(shí)產(chǎn)生和傳輸控制信號(hào),在這種特定環(huán)境下,計(jì)算機(jī)要與過(guò)程控制的實(shí)時(shí)信號(hào)相聯(lián)系,為此,使用筆者使用delphi開(kāi)發(fā)了一個(gè)車(chē)載數(shù)據(jù)采集顯示系統(tǒng)的界面,從而在基于windows操作系統(tǒng)中實(shí)現(xiàn)了下位機(jī)與上位機(jī)的數(shù)據(jù)通信。
設(shè)計(jì)思想和軟件架構(gòu)
delphi是一種功能強(qiáng)大的高級(jí)編程語(yǔ)言,它具有可視化,面向?qū)ο蟮奶匦?,特別適于在windows環(huán)境下進(jìn)行圖形界面和用戶(hù)程序的編制[1],該顯示系統(tǒng)的下位機(jī)以dsp為核心,可實(shí)現(xiàn)對(duì)重要參數(shù)的檢測(cè)、控制,并將采集的數(shù)據(jù)以一定的方式向上位機(jī)發(fā)送,從而實(shí)現(xiàn)與上位機(jī)的數(shù)據(jù)通信,在數(shù)據(jù)傳輸?shù)倪^(guò)程中仍然采用串行通信的方式,該軟件的總體設(shè)計(jì)任務(wù)是:
(1)通過(guò)該軟件對(duì)串口參數(shù)進(jìn)行配置,以與下位機(jī)形成統(tǒng)一的通訊協(xié)議。
(2)通過(guò)該軟件實(shí)時(shí)顯示下位機(jī)的數(shù)據(jù)采集值,同時(shí)調(diào)用和察看存盤(pán)的數(shù)據(jù)記錄。
基于以上任務(wù),該界面的軟件架構(gòu)模型如圖1所示,該程序由串口通信模塊、數(shù)據(jù)處理模塊、數(shù)據(jù)顯示模塊和數(shù)據(jù)保存模塊四部分組成。
軟件設(shè)計(jì)
串口通信模塊的設(shè)計(jì)
在delphi環(huán)境下的串口通信實(shí)現(xiàn)方法主要有4種,即使用控件(如mscomm)、使用api函數(shù),使用行間匯編asm或在程序中調(diào)用其他串口通程序[2],利用api函數(shù)或行間匯編編寫(xiě)串口通信程序較為復(fù)雜,但優(yōu)點(diǎn)是可以實(shí)現(xiàn)功能更強(qiáng)大,應(yīng)用更廣泛、更復(fù)雜的低層次通信程序,mscomm通信控件可以用來(lái)提供簡(jiǎn)單的串行端口通訊功能,也可以用來(lái)創(chuàng)建功能完備、事件驅(qū)動(dòng)的高級(jí)通訊工具,該控件提供了一系列標(biāo)準(zhǔn)通訊命令的使用界面,使用它可以建立與串行端口的連接,并通過(guò)串行端口連接到其他通訊設(shè)備(例如調(diào)制解調(diào)器),以發(fā)出命令、交換數(shù)據(jù)和監(jiān)視及響應(yīng)串行連接中發(fā)生的事件和錯(cuò)誤,因?yàn)閙scomm控件的屬性較多,應(yīng)用起來(lái)比較方便,所以用該控件編寫(xiě)串行通信程序相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,下面介紹本文在程序設(shè)計(jì)中用到該控件的幾個(gè)屬性:
comm port:設(shè)置并返回通信口號(hào)。
comm event:返回通信事件或錯(cuò)誤。
input:返回并刪除接收緩沖區(qū)中的數(shù)據(jù),在設(shè)計(jì)時(shí),該功能無(wú)效,而在運(yùn)行時(shí)為只讀。
inputlen:確定被input屬性讀取的字符數(shù)。
inputmode:設(shè)置并返回被input屬性讀取的數(shù)據(jù)類(lèi)型,其中cominputmodetext以文本形式返回,而cominputmodetext以本文形式返回,而cominputmodebinary則以二進(jìn)制形式返回。
output:向輸出緩沖區(qū)中寫(xiě)入數(shù)據(jù),在設(shè)計(jì)時(shí)無(wú)效,運(yùn)行時(shí)為只讀。
portopen:設(shè)置并返回通信端口開(kāi)或關(guān)的狀態(tài),運(yùn)行時(shí)有效。
rthreshold:在mscomm控件中設(shè)置commevent屬性為commevreceive,并在產(chǎn)生oncomm事件之前,設(shè)置并返回要接收的字符數(shù)。
settings:設(shè)置并返回初始化參數(shù),即波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止位。
oncomm事件:當(dāng)commevent屬性的值變化時(shí)產(chǎn)生次事件,以標(biāo)志發(fā)生了一個(gè)通信事件或錯(cuò)誤。
mscomm控件有兩種處理通信的方式,即事件驅(qū)動(dòng)和查詢(xún)方式[3],事件驅(qū)動(dòng)方式是處理端口通信的一種有效方法,它可以利用oncomm事件捕獲并處理通信中發(fā)生的事件或錯(cuò)誤,實(shí)時(shí)性較強(qiáng),而查詢(xún)方式是在程序通過(guò)查詢(xún)commevent屬性的值來(lái)判斷通信的過(guò)程中的事件或錯(cuò)誤,這種方式適合于應(yīng)用程序較小、實(shí)時(shí)性要求不是很高的系統(tǒng)中,本文采取的是事件驅(qū)動(dòng)方式,用戶(hù)可以在oncomm事件中編寫(xiě)程序代碼。串口通信的主要步驟有:
(1)設(shè)置通信對(duì)象、通信端口以及其他屬性;
(2)設(shè)定通信協(xié)議;
(3)打開(kāi)通信端口,進(jìn)行數(shù)據(jù)的傳送;
(4)關(guān)閉通信端口。
下位機(jī)主要用于將采集上來(lái)的數(shù)據(jù)通過(guò)pc機(jī)上的rs-232接口發(fā)送到上位機(jī),其程序流程如圖2所示。
數(shù)據(jù)處理模塊的設(shè)計(jì)
數(shù)據(jù)處理模塊的主要任務(wù)是將從下位機(jī)上接收到的數(shù)據(jù)進(jìn)行分類(lèi),并對(duì)數(shù)據(jù)進(jìn)行分割和轉(zhuǎn)化,以得到需要的數(shù)據(jù),在下位機(jī)和上位機(jī)的通信過(guò)程中數(shù)據(jù)是按照一定的通信協(xié)議進(jìn)行封裝和傳輸?shù)?,下位機(jī)把數(shù)據(jù)以16進(jìn)制的數(shù)組形式向上發(fā)送,其數(shù)據(jù)幀的封裝格式如圖3所示,一幀數(shù)據(jù)包括10個(gè)字節(jié),其中id號(hào)占2個(gè)字節(jié),每個(gè)data占一個(gè)字節(jié),id號(hào)代表了數(shù)據(jù)的類(lèi)型含義,data則代表具體的數(shù)據(jù)值,圖4是具體傳輸?shù)臄?shù)值模式。
因此,在程序設(shè)計(jì)中,必須將id號(hào)和數(shù)據(jù)進(jìn)行分離,以分別讀出它們各自的數(shù)值,然后根據(jù)id的數(shù)值對(duì)相應(yīng)的數(shù)據(jù)進(jìn)行分類(lèi)和轉(zhuǎn)化,以變成所需要的數(shù)據(jù),并附值給相應(yīng)的變量,從而在后面的顯示模塊設(shè)計(jì)中合理地使用這些變量來(lái)達(dá)到正確顯示數(shù)據(jù)的功能,其程序流程圖如圖5所示。
數(shù)據(jù)顯示模塊的設(shè)計(jì)
在數(shù)據(jù)顯示模塊的設(shè)計(jì)當(dāng)中,筆者使用了timer(定時(shí)器)這一控件來(lái)進(jìn)行軟件的開(kāi)發(fā)。因?yàn)樵谲浖O(shè)計(jì)過(guò)程中,定時(shí)器所起到的作用是非常大的。timer控件具有enabled(定時(shí)器使能屬性)、interval(定時(shí)時(shí)間間隔)等屬性。使用timer時(shí),首先要將enable置1,然后設(shè)定時(shí)間間隔,最后在ontimer()事件中添加程序代碼。
由于車(chē)輛狀態(tài)的各種參數(shù)的實(shí)時(shí)性相當(dāng)重要,它是駕駛員作出正確操作的根本依據(jù),因此,數(shù)據(jù)的顯示要求是動(dòng)態(tài)實(shí)時(shí)地反應(yīng)車(chē)輛的行駛狀況,采用定時(shí)器可以每隔一段時(shí)間對(duì)顯示的數(shù)據(jù)進(jìn)行一次刷新,從而很好地滿足這一需要[4]。顯示程序的代碼可以全部寫(xiě)在定時(shí)器里面,數(shù)據(jù)顯示的界面分為歡迎界面、整車(chē)參數(shù)顯示界面、燃料電池參數(shù)顯示界面、鎳氫電池參數(shù)顯示界面和狀態(tài)信息顯示界面,每一個(gè)界面都能實(shí)時(shí)的反應(yīng)正確的參數(shù)信息,并回饋給駕駛員每個(gè)部分的工作狀態(tài),其中整車(chē)參數(shù)顯示界面如圖6所示,燃料電池參數(shù)顯示界面圖如圖7所示。
數(shù)據(jù)保存模塊的設(shè)計(jì)
在該界面的設(shè)計(jì)過(guò)程中,還有一個(gè)數(shù)據(jù)保存模塊。該模塊的功能是將車(chē)上重要的行駛參數(shù)和狀態(tài)參數(shù)保存到計(jì)算機(jī)的硬盤(pán)里,也可以通過(guò)usb接口用移動(dòng)硬盤(pán)將數(shù)據(jù)從計(jì)算機(jī)里讀出,以方便工作人員和研究人員對(duì)數(shù)據(jù)的察看和分析,從而對(duì)汽車(chē)的性能和控制作進(jìn)一步的改善,因?yàn)槠?chē)在行駛過(guò)程中下位機(jī)與上位機(jī)的通信數(shù)據(jù)量非常大,如果每接收到一組數(shù)據(jù),就將數(shù)據(jù)往文件里寫(xiě)一次,那么對(duì)資源的開(kāi)銷(xiāo)太大,而且會(huì)降低軟件的運(yùn)行效率,所以,本文采用定時(shí)方式,即每隔一段時(shí)間存儲(chǔ)一次數(shù)據(jù),即對(duì)數(shù)據(jù)的存儲(chǔ)過(guò)程是在定時(shí)器里完成的,這樣,每次汽車(chē)啟動(dòng)時(shí),就可在系統(tǒng)里建立一個(gè)文本文件,并設(shè)置文件的存儲(chǔ)路徑,然后每隔一段時(shí)間向這個(gè)本文文件里寫(xiě)一次數(shù)據(jù),數(shù)據(jù)的保存格式遵循通信協(xié)議里數(shù)據(jù)幀的格式,在程序的設(shè)計(jì)過(guò)程中,調(diào)用api函數(shù)即可實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ),其程序流程圖如圖8所示。
結(jié)束語(yǔ)
本文給出了基于delphi的車(chē)載數(shù)據(jù)顯示系統(tǒng)界面的設(shè)計(jì)框架和軟件體系結(jié)構(gòu),本系統(tǒng)通過(guò)串行通信技術(shù)來(lái)實(shí)現(xiàn)下位機(jī)和上位機(jī)的實(shí)時(shí)通信,并通過(guò)對(duì)實(shí)時(shí)數(shù)據(jù)的處理,顯示和存儲(chǔ),來(lái)達(dá)到對(duì)汽車(chē)行駛狀態(tài)的監(jiān)控,實(shí)踐證明:用delphi開(kāi)發(fā)該系統(tǒng),其人機(jī)界面友好,便于操作,移植性強(qiáng),并具有很好的擴(kuò)充性??梢韵嘈烹S著工業(yè)信息化和自動(dòng)化的發(fā)展,這項(xiàng)技術(shù)將會(huì)應(yīng)用在更多的領(lǐng)域。
評(píng)論