摘 要:機(jī)車數(shù)據(jù)監(jiān)控系統(tǒng)運(yùn)用VC++實(shí)現(xiàn)了對(duì)一內(nèi)燃機(jī)車運(yùn)行數(shù)據(jù)的實(shí)時(shí)監(jiān)控。通過計(jì)算機(jī)的串口傳輸內(nèi)燃機(jī)車數(shù)據(jù)儀中采集到的各種數(shù)據(jù),如機(jī)車型號(hào)、機(jī)車類型、累計(jì)運(yùn)行時(shí)間等等,監(jiān)控機(jī)車的運(yùn)行狀態(tài)以實(shí)現(xiàn)對(duì)機(jī)車的控制。設(shè)計(jì)的重點(diǎn)在于系統(tǒng)管理的軟件方面,具體來說是系統(tǒng)上位機(jī)的設(shè)計(jì)。以MFC (Microsoft Foundation Class Library)思路用類來實(shí)現(xiàn)串行通信和多線程編程, 并輔助以開放式數(shù)據(jù)接口(ODBC)在應(yīng)用程序中實(shí)現(xiàn)數(shù)據(jù)庫功能。
關(guān)鍵詞:監(jiān)控系統(tǒng);串行通信;多線程;ODBC; MFC
Abstract: The Diesel Monitor System effects the real-time monitoring on the diesel with vc++6.0, which regulates data flow by correspondencing between two serial ports. All kinds of data acquired by data graphic instrument e.g. locomotive ID, locomotive type and cumulative run-time etc. is transmitted for monitoring and control the diesel. The important point in this design is developing upper machine. Using the conception of Class in MFC (Microsoft Foundation Class Library) to effect multi-thread and serial communication, and with auxiliary to ODBC (Open Database Connectivity) the application program can have database.
Key Words: Monitor system; Serial Communication; Multi-thread; ODBC; MFC
1 引言
隨著鐵路信息化數(shù)字化的發(fā)展,提出了機(jī)車的在線實(shí)時(shí)監(jiān)控,要求對(duì)車載設(shè)備的相關(guān)數(shù)據(jù)進(jìn)行實(shí)時(shí)采集和存儲(chǔ)。這對(duì)為技術(shù)人員提供及時(shí)準(zhǔn)確的機(jī)車信息,保證列車運(yùn)行的安全有著重要的意義。
本文介紹一種基于VC++的機(jī)車實(shí)時(shí)監(jiān)控系統(tǒng),是由后臺(tái)控制監(jiān)控系統(tǒng)和前臺(tái)采集系統(tǒng)所組成的一個(gè)分布式集成網(wǎng)絡(luò)。當(dāng)控制監(jiān)控系統(tǒng)與內(nèi)燃機(jī)車進(jìn)行通訊,則后臺(tái)控制監(jiān)控系統(tǒng)顯示計(jì)算機(jī)顯示的就是機(jī)車數(shù)據(jù)記錄儀采集到的各種機(jī)車數(shù)據(jù)。
2 功能分析
2.1 上位機(jī)的軟件功能主要有以下幾點(diǎn):
1)與下位機(jī)(機(jī)車數(shù)據(jù)儀)進(jìn)行通信,完成對(duì)下位機(jī)的讀寫;
2)能夠?qū)?shù)據(jù)進(jìn)行有效的識(shí)別,提取數(shù)據(jù)中的有用信息(如機(jī)車型號(hào),機(jī)車編號(hào),機(jī)車標(biāo)稱功率等);
3)對(duì)有效數(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)儲(chǔ)數(shù)據(jù)文件類型標(biāo)識(shí)頭;累計(jì)數(shù)據(jù)共176字節(jié),占數(shù)據(jù)文件中的第24字節(jié)到第199字節(jié);瞬時(shí)數(shù)據(jù)從第256字節(jié)開始,一直到結(jié)束,數(shù)據(jù)長(zhǎng)度=瞬時(shí)數(shù)據(jù)的數(shù)據(jù)幀數(shù)×數(shù)據(jù)幀長(zhǎng);瞬時(shí)數(shù)據(jù)幀長(zhǎng)包含幀校驗(yàn)碼。文件尾占3字節(jié)=0x45, 0x4e, 0x44。
數(shù)據(jù)傳送:累積數(shù)據(jù)每176個(gè)字節(jié)數(shù)據(jù)為一個(gè)數(shù)據(jù)塊;瞬時(shí)數(shù)據(jù)的數(shù)據(jù)長(zhǎng)度=瞬時(shí)數(shù)據(jù)的數(shù)據(jù)幀數(shù)×數(shù)據(jù)幀長(zhǎng);瞬時(shí)數(shù)據(jù)幀長(zhǎng)包含幀校驗(yàn)碼。
下位機(jī)每發(fā)送一個(gè)數(shù)據(jù)塊,隨即就發(fā)該數(shù)據(jù)塊的校驗(yàn)和,如果檢驗(yàn)和有誤,就重發(fā)該數(shù)據(jù)塊;如果數(shù)據(jù)未讀完,重復(fù)本操作,直到數(shù)據(jù)讀完。 命令中的校驗(yàn)占一個(gè)字節(jié),[校驗(yàn)]=([命令]+[目標(biāo)代碼]+[數(shù)據(jù)].字節(jié)1+…+[數(shù)據(jù)].字節(jié)n)mod 0x100。執(zhí)行結(jié)果返回值中的校驗(yàn)也占一個(gè)字節(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)、讀累計(jì)數(shù)據(jù)、讀瞬時(shí)數(shù)據(jù)、寫數(shù)據(jù)。在上位機(jī)發(fā)出命令之前,下位機(jī)處于等待狀態(tài);當(dāng)命令發(fā)出之后,下位機(jī)探測(cè)所發(fā)出的命令并判斷該命令是否對(duì)自己操作。如果是,則按命令要求返回所要求的數(shù)據(jù);如果不是,則不回應(yīng);下位機(jī)收到采集系統(tǒng)送過來的數(shù)據(jù)以后,對(duì)它進(jìn)行分析和數(shù)據(jù)轉(zhuǎn)換,然后進(jìn)行顯示和保存。
將上位機(jī)的各種命令獨(dú)立地建立一個(gè)類MasterCommand,就用來處理上位機(jī)向下位機(jī)發(fā)送的命令。以下是對(duì)這個(gè)類的定義。
//命令碼,命令碼長(zhǎng)度,命令顯示字串,獲取的數(shù)據(jù)長(zhǎng)度/最大長(zhǎng)度,數(shù)據(jù)放置起始位置,數(shù)據(jù)標(biāo)識(shí)定義位置
MasterCommand(ch ar *comCode, const int &comCodeLen, CString comDispStr, const int &getDataLen, const int &dataPos, const int &dataSignPos)
{
init(comCode, comCodeLen, comDispStr, getDataLen, dataPos, dataSignPos);
?。?/p>
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),就可以對(duì)硬件進(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. 讀累計(jì)數(shù)據(jù)
用戶在上位機(jī)發(fā)送讀累計(jì)數(shù)據(jù)的命令,下位機(jī)收到命令后向上位機(jī)返回執(zhí)行結(jié)果。執(zhí)行結(jié)果返回值:[執(zhí)行結(jié)果代碼] [數(shù)據(jù)] [校驗(yàn)]。
其中: [執(zhí)行結(jié)果代碼] 和 [校驗(yàn)] 均占一個(gè)字節(jié)。當(dāng)命令校驗(yàn)失敗或執(zhí)行失敗時(shí),下位機(jī)只返回 [執(zhí)行結(jié)果代碼] 和 [校驗(yàn)] 碼。累計(jì)數(shù)據(jù)一共占176個(gè)字節(jié),在當(dāng)量?jī)x數(shù)據(jù)存儲(chǔ)格式中對(duì)每一個(gè)字節(jié)都有詳細(xì)的定義。在程序中按照格式將數(shù)據(jù)取出來,并在用戶界面顯示出來。在所有數(shù)據(jù)正確接收后用戶可以選擇保存數(shù)據(jù),以供以后進(jìn)一步地查看,對(duì)數(shù)據(jù)進(jìn)行分析。
B. 讀瞬時(shí)數(shù)據(jù)
瞬時(shí)數(shù)據(jù)從第256字節(jié)開始,數(shù)據(jù)長(zhǎng)度=瞬時(shí)數(shù)據(jù)的數(shù)據(jù)幀數(shù)×數(shù)據(jù)幀長(zhǎng);瞬時(shí)數(shù)據(jù)幀長(zhǎng)包含幀校驗(yàn)碼。
3.2.3 寫數(shù)據(jù)
主機(jī)下送數(shù)據(jù)到從機(jī),寫當(dāng)量記錄儀中的所有累計(jì)數(shù)據(jù)。執(zhí)行正確時(shí)返回上位機(jī)要求寫入的數(shù)據(jù)(二進(jìn)制表示)。便于上位機(jī)校驗(yàn)。
4. 界面設(shè)計(jì)
控制系統(tǒng)的界面共有四個(gè),它們是主界面、累計(jì)數(shù)據(jù)顯示界面、選擇寫入下位機(jī)數(shù)據(jù)界面。
?、?主界面
主界面是系統(tǒng)運(yùn)行的主要界面,它的作用向下位機(jī)是發(fā)送各種命令和對(duì)串口通訊的參數(shù)進(jìn)行設(shè)置,通過各種命令才會(huì)實(shí)現(xiàn)系統(tǒng)采集實(shí)時(shí)數(shù)據(jù)和進(jìn)行監(jiān)控的功能。也只有在發(fā)送各種命令時(shí)才會(huì)調(diào)用和顯示其他功能界面(如累計(jì)數(shù)據(jù)顯示界面等),也就是說主界面是其他功能界面的聯(lián)系紐帶。
在主界面的設(shè)計(jì)中采用了組合框、樹形視圖、列表框等控件,在界面下方的列表框中可以顯示運(yùn)行的程序、出錯(cuò)報(bào)告及系統(tǒng)的狀態(tài)等。
?。?)累計(jì)數(shù)據(jù)顯示界面
此界面的作用是當(dāng)上位機(jī)完成了采集下位機(jī)的累計(jì)數(shù)據(jù)時(shí),可以由用戶選擇是否顯示采集的累計(jì)數(shù)據(jù)。用戶檢查了機(jī)車的累計(jì)數(shù)據(jù)后,可以在界面對(duì)累計(jì)數(shù)據(jù)進(jìn)行更改,然后就將數(shù)據(jù)進(jìn)行保存,以便將來對(duì)數(shù)據(jù)進(jìn)行管理。
?。?) 選擇寫入下位機(jī)數(shù)據(jù)界面