基于VC++的機(jī)車數(shù)據(jù)監(jiān)控系統(tǒng)
摘 要:機(jī)車數(shù)據(jù)監(jiān)控系統(tǒng)運(yùn)用VC++實(shí)現(xiàn)了對一內(nèi)燃機(jī)車運(yùn)行數(shù)據(jù)的實(shí)時監(jiān)控。通過計算機(jī)的串口傳輸內(nèi)燃機(jī)車數(shù)據(jù)儀中采集到的各種數(shù)據(jù),如機(jī)車型號、機(jī)車類型、累計運(yùn)行時間等等,監(jiān)控機(jī)車的運(yùn)行狀態(tài)以實(shí)現(xiàn)對機(jī)車的控制。設(shè)計的重點(diǎn)在于系統(tǒng)管理的軟件方面,具體來說是系統(tǒng)上位機(jī)的設(shè)計。以MFC (Microsoft Foundation Class Library)思路用類來實(shí)現(xiàn)串行通信和多線程編程, 并輔助以開放式數(shù)據(jù)接口(ODBC)在應(yīng)用程序中實(shí)現(xiàn)數(shù)據(jù)庫功能。
1 引言
隨著鐵路信息化數(shù)字化的發(fā)展,提出了機(jī)車的在線實(shí)時監(jiān)控,要求對車載設(shè)備的相關(guān)數(shù)據(jù)進(jìn)行實(shí)時采集和存儲。這對為技術(shù)人員提供及時準(zhǔn)確的機(jī)車信息,保證列車運(yùn)行的安全有著重要的意義。
本文介紹一種基于VC++的機(jī)車實(shí)時監(jiān)控系統(tǒng),是由后臺控制監(jiān)控系統(tǒng)和前臺采集系統(tǒng)所組成的一個分布式集成網(wǎng)絡(luò)。當(dāng)控制監(jiān)控系統(tǒng)與內(nèi)燃機(jī)車進(jìn)行通訊,則后臺控制監(jiān)控系統(tǒng)顯示計算機(jī)顯示的就是機(jī)車數(shù)據(jù)記錄儀采集到的各種機(jī)車數(shù)據(jù)。
2 功能分析
2.1 上位機(jī)的軟件功能主要有以下幾點(diǎn):
1)與下位機(jī)(機(jī)車數(shù)據(jù)儀)進(jìn)行通信,完成對下位機(jī)的讀寫;
2)能夠?qū)?shù)據(jù)進(jìn)行有效的識別,提取數(shù)據(jù)中的有用信息(如機(jī)車型號,機(jī)車編號,機(jī)車標(biāo)稱功率等);
3)對有效數(shù)據(jù)進(jìn)行處理,能夠以曲線或圖表形式顯示車輛運(yùn)行狀況;
4)為數(shù)據(jù)的查找與定位提供方便的手段,便于局部數(shù)據(jù)分析;
5)具有存檔、打印功能。
2.2 上位機(jī)主控程序功能劃分:
3 軟件實(shí)現(xiàn)
3.1 通訊協(xié)議
所謂通訊協(xié)議就是通訊雙方為了達(dá)到正確傳送和接收數(shù)據(jù)而達(dá)成的一組通訊規(guī)定。它包括發(fā)送/接收數(shù)據(jù)的格式、數(shù)據(jù)編寫與解讀方法以及通訊參數(shù)的設(shè)定。在通訊協(xié)議中,通訊參數(shù)的設(shè)定是通訊的前提,包括串口的選取,波特率設(shè)定,有無奇偶校驗(yàn),數(shù)據(jù)位的位數(shù),以及停止位的位數(shù)。下面介紹一下數(shù)據(jù)的格式和數(shù)據(jù)傳送。
數(shù)據(jù)格式: 定位數(shù)據(jù)從0開始。第0-第3字節(jié)=0x57, 0x77, 0x44, 0x4C為當(dāng)量里程記錄儀轉(zhuǎn)儲數(shù)據(jù)文件類型標(biāo)識頭;累計數(shù)據(jù)共176字節(jié),占數(shù)據(jù)文件中的第24字節(jié)到第199字節(jié);瞬時數(shù)據(jù)從第256字節(jié)開始,一直到結(jié)束,數(shù)據(jù)長度=瞬時數(shù)據(jù)的數(shù)據(jù)幀數(shù)×數(shù)據(jù)幀長;瞬時數(shù)據(jù)幀長包含幀校驗(yàn)碼。文件尾占3字節(jié)=0x45, 0x4e, 0x44。
數(shù)據(jù)傳送:累積數(shù)據(jù)每176個字節(jié)數(shù)據(jù)為一個數(shù)據(jù)塊;瞬時數(shù)據(jù)的數(shù)據(jù)長度=瞬時數(shù)據(jù)的數(shù)據(jù)幀數(shù)×數(shù)據(jù)幀長;瞬時數(shù)據(jù)幀長包含幀校驗(yàn)碼。
下位機(jī)每發(fā)送一個數(shù)據(jù)塊,隨即就發(fā)該數(shù)據(jù)塊的校驗(yàn)和,如果檢驗(yàn)和有誤,就重發(fā)該數(shù)據(jù)塊;如果數(shù)據(jù)未讀完,重復(fù)本操作,直到數(shù)據(jù)讀完。 命令中的校驗(yàn)占一個字節(jié),[校驗(yàn)]=([命令]+[目標(biāo)代碼]+[數(shù)據(jù)].字節(jié)1+…+[數(shù)據(jù)].字節(jié)n)mod 0x100。執(zhí)行結(jié)果返回值中的校驗(yàn)也占一個字節(jié),[校驗(yàn)]=([執(zhí)行結(jié)果代碼]+[數(shù)據(jù)].字節(jié)1+…+[數(shù)據(jù)].字節(jié)n)mod 0x100。
3.2 通訊流程
監(jiān)控系統(tǒng)與下位機(jī)(機(jī)車數(shù)據(jù)記錄儀)的通訊只需用到以下幾條命令:查詢下位機(jī)硬件工作狀態(tài)、查詢下位機(jī)數(shù)據(jù)紀(jì)錄狀態(tài)、讀累計數(shù)據(jù)、讀瞬時數(shù)據(jù)、寫數(shù)據(jù)。在上位機(jī)發(fā)出命令之前,下位機(jī)處于等待狀態(tài);當(dāng)命令發(fā)出之后,下位機(jī)探測所發(fā)出的命令并判斷該命令是否對自己操作。如果是,則按命令要求返回所要求的數(shù)據(jù);如果不是,則不回應(yīng);下位機(jī)收到采集系統(tǒng)送過來的數(shù)據(jù)以后,對它進(jìn)行分析和數(shù)據(jù)轉(zhuǎn)換,然后進(jìn)行顯示和保存。
將上位機(jī)的各種命令獨(dú)立地建立一個類MasterCommand,就用來處理上位機(jī)向下位機(jī)發(fā)送的命令。以下是對這個類的定義。
//命令碼,命令碼長度,命令顯示字串,獲取的數(shù)據(jù)長度/最大長度,數(shù)據(jù)放置起始位置,數(shù)據(jù)標(biāo)識定義位置
MasterCommand(char *comCode, const int &comCodeLen, CString comDispStr, const int &getDataLen, const int &dataPos, const int &dataSignPos)
{
init(comCode, comCodeLen, comDispStr, getDataLen, dataPos, dataSignPos);
}
3.2.1 查詢
A. 查詢下位機(jī)硬件工作狀態(tài)
用戶通過串口發(fā)送命令,如果命令正確執(zhí)行,則返回硬件的工作狀態(tài),根據(jù)數(shù)據(jù)交換
命令集可以判斷硬件工作得是否正常。程序?qū)⒂布ぷ鳡顟B(tài)顯示在用戶界面上,讓用戶可以很方便地了解硬件的工作狀態(tài),如果發(fā)現(xiàn)硬件有工作不正常的狀態(tài),就可以對硬件進(jìn)行相應(yīng)的處理。
B. 查詢下位機(jī)數(shù)據(jù)紀(jì)錄狀態(tài)
用戶通過串口發(fā)送命令,如果命令正確執(zhí)行,則返回下位機(jī)數(shù)
據(jù)記錄狀態(tài),根據(jù)數(shù)據(jù)交換命令集可以判斷數(shù)據(jù)記錄是否正常。如果數(shù)據(jù)記錄不正常,用戶也可以在界面上看到是哪方面出了問題,可以進(jìn)行相應(yīng)的處理。
3.2.2 讀數(shù)據(jù)
A. 讀累計數(shù)據(jù)
用戶在上位機(jī)發(fā)送讀累計數(shù)據(jù)的命令,下位機(jī)收到命令后向上位機(jī)返回執(zhí)行結(jié)果。執(zhí)行結(jié)果返回值:[執(zhí)行結(jié)果代碼] [數(shù)據(jù)] [校驗(yàn)]。
其中: [執(zhí)行結(jié)果代碼] 和 [校驗(yàn)] 均占一個字節(jié)。當(dāng)命令校驗(yàn)失敗或執(zhí)行失敗時,下位機(jī)只返回 [執(zhí)行結(jié)果代碼] 和 [校驗(yàn)] 碼。累計數(shù)據(jù)一共占176個字節(jié),在當(dāng)量儀數(shù)據(jù)存儲格式中對每一個字節(jié)都有詳細(xì)的定義。在程序中按照格式將數(shù)據(jù)取出來,并在用戶界面顯示出來。在所有數(shù)據(jù)正確接收后用戶可以選擇保存數(shù)據(jù),以供以后進(jìn)一步地查看,對數(shù)據(jù)進(jìn)行分析。
B. 讀瞬時數(shù)據(jù)
瞬時數(shù)據(jù)從第256字節(jié)開始,數(shù)據(jù)長度=瞬時數(shù)據(jù)的數(shù)據(jù)幀數(shù)×數(shù)據(jù)幀長;瞬時數(shù)據(jù)幀長包含幀校驗(yàn)碼。
3.2.3 寫數(shù)據(jù)
主機(jī)下送數(shù)據(jù)到從機(jī),寫當(dāng)量記錄儀中的所有累計數(shù)據(jù)。執(zhí)行正確時返回上位機(jī)要求寫入的數(shù)據(jù)(二進(jìn)制表示)。便于上位機(jī)校驗(yàn)。
4. 界面設(shè)計
控制系統(tǒng)的界面共有四個,它們是主界面、累計數(shù)據(jù)顯示界面、選擇寫入下位機(jī)數(shù)據(jù)界面。
⑴ 主界面
主界面是系統(tǒng)運(yùn)行的主要界面,它的作用向下位機(jī)是發(fā)送各種命令和對串口通訊的參數(shù)進(jìn)行設(shè)置,通過各種命令才會實(shí)現(xiàn)系統(tǒng)采集實(shí)時數(shù)據(jù)和進(jìn)行監(jiān)控的功能。也只有在發(fā)送各種命令時才會調(diào)用和顯示其他功能界面(如累計數(shù)據(jù)顯示界面等),也就是說主界面是其他功能界面的聯(lián)系紐帶。
在主界面的設(shè)計中采用了組合框、樹形視圖、列表框等控件,在界面下方的列表框中可以顯示運(yùn)行的程序、出錯報告及系統(tǒng)的狀態(tài)等。
(2)累計數(shù)據(jù)顯示界面
此界面的作用是當(dāng)上位機(jī)完成了采集下位機(jī)的累計數(shù)據(jù)時,可以由用戶選擇是否顯示采集的累計數(shù)據(jù)。用戶檢查了機(jī)車的累計數(shù)據(jù)后,可以在界面對累計數(shù)據(jù)進(jìn)行更改,然后就將數(shù)據(jù)進(jìn)行保存,以便將來對數(shù)據(jù)進(jìn)行管理。
(3) 選擇寫入下位機(jī)數(shù)據(jù)界面
上位機(jī)采集到的數(shù)據(jù)都可以保存,若下位機(jī)此時的數(shù)據(jù)有必要進(jìn)行更改,可以從以前采集到的數(shù)據(jù)中選擇一份寫入下位機(jī),也就實(shí)現(xiàn)了系統(tǒng)的控制功能。
5. 小結(jié)
本系統(tǒng)在實(shí)際應(yīng)用中運(yùn)行良好,數(shù)據(jù)的完整性、實(shí)時性和程序的可靠性高。它操作簡便,具有很強(qiáng)的易用性。
來源:過往煙云0次