蔡文齋
(中國(guó)電子科技集團(tuán)公司 第39研究所,陜西 西安 710065)
監(jiān)控系統(tǒng)通常由若干計(jì)算機(jī)及相關(guān)板卡構(gòu)成系統(tǒng)硬件環(huán)境,通常在Win32環(huán)境下編制相關(guān)的監(jiān)控軟件。開發(fā)全套監(jiān)控系統(tǒng)軟件通常是,開發(fā)人員等買到各種相關(guān)板卡后再逐個(gè)調(diào)試各端口,在設(shè)備都聯(lián)在一起時(shí)統(tǒng)一聯(lián)調(diào),費(fèi)時(shí)費(fèi)力,要求各設(shè)備或分機(jī)配合。為了實(shí)現(xiàn)在已知相關(guān)硬件需求和相應(yīng)軟件通訊協(xié)議,而實(shí)驗(yàn)室內(nèi)無(wú)硬件設(shè)備的情況下,開發(fā)全套監(jiān)控系統(tǒng)軟件[1],本文提出一種利用進(jìn)程通訊技術(shù)實(shí)現(xiàn)純軟件仿真調(diào)試的方法[2]。在實(shí)驗(yàn)室內(nèi)無(wú)需連接各板卡,同樣可以仿真這些硬件設(shè)備開發(fā)整個(gè)監(jiān)控軟件,等各種板卡備齊后,再添加這些板卡的設(shè)備初始化及I/O函數(shù)。這樣,整套監(jiān)控軟件在無(wú)硬件環(huán)境下可以編制完成,將節(jié)約大量聯(lián)試時(shí)間。
假定不考慮接入計(jì)算機(jī)的板卡接口形式和具體硬件傳感器的特性,僅從抽象的角度考慮,則可將接入的任一硬件傳感器都視為一流設(shè)備,通過(guò)相關(guān)板卡傳送給計(jì)算機(jī)1組十六進(jìn)制碼字,任一硬件讀入形式都相同。使用定長(zhǎng)的仿真硬件緩沖區(qū)代替硬件設(shè)備,這些硬件緩沖區(qū)每一字節(jié)均可編輯。從而仿真任一接入控制系統(tǒng)硬件傳感器的各種數(shù)據(jù)。
任一接入控制計(jì)算機(jī)的硬件設(shè)備與計(jì)算機(jī)通訊即是定長(zhǎng)的十六進(jìn)制字符碼字的雙向信息交流(有的設(shè)備是單向通訊)。監(jiān)控軟件與這些硬件設(shè)備信息交流即為Read與Write函數(shù)[3],任何硬件接口形式其最終抽象的讀寫參數(shù)都相同:設(shè)備號(hào)、讀寫緩沖區(qū)數(shù)據(jù)內(nèi)容、讀寫長(zhǎng)度、實(shí)際讀入或者寫出的長(zhǎng)度、回送的狀態(tài)碼字。先不考慮具體硬件傳感器的初始化及使用方法,一般相關(guān)板卡均帶有驅(qū)動(dòng)程序,在Win32環(huán)境下通常是通過(guò)驅(qū)動(dòng)程序提供的API函數(shù)訪問(wèn)硬件,雖然各硬件的訪問(wèn)形式有差異,但計(jì)算機(jī)訪問(wèn)的機(jī)制是相同的,同監(jiān)控軟件相關(guān)的部分是讀寫緩沖區(qū)及讀寫長(zhǎng)度。只要使用一種方法使監(jiān)控軟件讀寫另一設(shè)定的緩沖區(qū)內(nèi)容,即可實(shí)現(xiàn)仿真。
無(wú)論監(jiān)控程序使用什么語(yǔ)言編寫,無(wú)論讀入時(shí)序怎樣安排,為了實(shí)現(xiàn)仿真調(diào)試,將監(jiān)控程序稍作調(diào)整,改造如下:設(shè)計(jì)若干讀入完成消息,在每個(gè)硬件傳感器讀入函數(shù)完成后,向前臺(tái)窗口發(fā)送一條用戶制定的消息,告知該設(shè)備讀入已完成;讀入完成消息處理為:對(duì)讀入緩沖區(qū)解碼,將緩沖區(qū)某位置的十六進(jìn)制碼字按照通訊協(xié)議變換為監(jiān)控程序使用的變量,以供監(jiān)控程序使用。
設(shè)監(jiān)控程序?yàn)锳進(jìn)程,仿真硬件程序?yàn)锽進(jìn)程。A進(jìn)程要接收B進(jìn)程數(shù)據(jù),并且B進(jìn)程數(shù)據(jù)變化時(shí)應(yīng)立即通知A進(jìn)程,則問(wèn)題變?yōu)椋和ㄖ?fù)制變化數(shù)據(jù)。A進(jìn)程的調(diào)試方法:假設(shè)要調(diào)試串行端口5,首先假定已編寫com口讀寫線程(注意此時(shí)無(wú)硬件,com5打不開,無(wú)法跟蹤[4]),由于每個(gè)硬件傳感器讀完成都會(huì)發(fā)一讀完后的信息。因此只要在某處發(fā)出該消息,就表明已經(jīng)讀入該硬件數(shù)據(jù)。假定使用剪切板通訊方法,在A進(jìn)程中設(shè)計(jì)一剪切板讀入用戶消息,該消息由B進(jìn)程發(fā)出。在A進(jìn)程的剪切板消息中,將剪切板的內(nèi)容復(fù)制到com5讀入緩沖區(qū)中,再發(fā)一com5讀完成消息給前臺(tái)窗口,則會(huì)誤認(rèn)為是硬件緩沖內(nèi)容變化,已讀到硬件內(nèi)容。任一接入的硬件都可用這種技術(shù)實(shí)現(xiàn)仿真。如果讀入緩沖區(qū)的每一位都可控制輸入,那么在實(shí)驗(yàn)室內(nèi)就能仿真所有實(shí)際的通訊情況,將節(jié)約大量時(shí)間在設(shè)備聯(lián)調(diào)階段。
設(shè)計(jì)一可編輯的十六進(jìn)制緩沖區(qū),使用進(jìn)程通訊方法發(fā)出數(shù)據(jù)。采用Delphi 2009編寫仿真器,界面上設(shè)計(jì)StringGird組件,用于十六進(jìn)制輸入,格子列數(shù)為1 024,行數(shù)為2,設(shè)計(jì)若干按鈕用于實(shí)現(xiàn)各種進(jìn)程通訊方法。使用集合類型檢查輸入的是否為十六進(jìn)制碼字,使用Drawcell方法限制每個(gè)格子的字符數(shù) (每個(gè)格子僅能輸入0A、3E等類型的十六進(jìn)制數(shù)據(jù))[5]。該硬件仿真器的機(jī)理為使用WIN32 API內(nèi)核對(duì)象通訊技術(shù)傳遞緩沖區(qū)內(nèi)容,再用其他技術(shù)傳輸通知信息。其實(shí)現(xiàn)方法為:1)文件映像+事件通知;2)文件映像+用戶自定制消息。若使用文件映像+廣播消息方法,必須在收發(fā)進(jìn)程中注冊(cè)同樣的消息。而使用文件映像+廣播WM_WININICHANGE消息方法,無(wú)需注冊(cè)消息,SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0);3)有名管道技術(shù)+消息通知。 將B進(jìn)程設(shè)計(jì)為有名管道客戶端,將A進(jìn)程設(shè)計(jì)為管道服務(wù)。4)CopyDATA 方法;5)全局原子方法;6)剪切板技術(shù)+用戶消息方法。
其中,CopyDATA方法為:


如果使用DELPHI或者C++BUILDER開發(fā)應(yīng)用軟件,使用CODESITE工具在讀消息中寫入調(diào)試代碼[6],可以動(dòng)態(tài)調(diào)試出任何讀入緩沖區(qū)內(nèi)容。
硬件緩沖區(qū)產(chǎn)生器用不同的進(jìn)程通訊方法產(chǎn)生一組需要的數(shù)據(jù),并使用不同的通知機(jī)制輸出通知消息,因此需相應(yīng)修改接收端,使用剪切板和全局原子方法時(shí)緩沖區(qū)長(zhǎng)度只能為256字節(jié),其他方法可輸出更長(zhǎng)的數(shù)據(jù)。如果使用廣播消息傳輸通知,A進(jìn)程也必須注冊(cè)同樣的消息。注冊(cè)廣播消息:BROADCAST_Message BROADCAST_NUM:=RegisterWindowMessage(‘BROADCAST_comm’);并且A進(jìn)程需重載WndProc函數(shù):procedure WndProc(var Message:TMessage);override;用于讀注冊(cè)的廣播消息,判斷廣播消息是哪一個(gè)。監(jiān)控程序需通過(guò)某種方法接收數(shù)據(jù)即可,所以修改的代碼很少。
使用該方法開發(fā)的綜合調(diào)試器可徹底拋開硬件環(huán)境,對(duì)應(yīng)用軟件稍作調(diào)整即可與純軟件調(diào)試器通訊。在開發(fā)應(yīng)用軟件時(shí),當(dāng)硬件板卡備齊后,只需添加相應(yīng)的讀寫部分,就能夠在試驗(yàn)室內(nèi)仿真現(xiàn)場(chǎng)通信情形,將節(jié)約大量時(shí)間。該方法已應(yīng)用于多個(gè)航天控制項(xiàng)目,并取得良好效果。
[1]張海藩.軟件工程導(dǎo)論[M].北京:清華大學(xué)出版社,2003.
[2]Jeffrey Richter.Window高級(jí)編程指南[M].王書洪,劉光明,譯.北京:清華大學(xué)出版社,1999.
[3]Mickey Williams.Programming microsoft windows 2000 unleashed[M].前導(dǎo)工作室,譯.北京:機(jī)械工業(yè)出版社,1999.
[4]趙蘭濤,蘇彥華.DELPHI串口通信技術(shù)與工程實(shí)踐[M].北京:人民郵電出版社,2004.
[5]吳天準(zhǔn).Delphi 7程序設(shè)計(jì)技巧與實(shí)例[M].北京:中國(guó)鐵道出版社,2003.
[6]譚 燕,趙 磊,李之明.Delphi高級(jí)輔助工具精解[M].北京:中國(guó)鐵道出版社,2003.