蔡文齋
(中國電子科技集團公司 第39研究所,陜西 西安 710065)
監(jiān)控系統(tǒng)通常由若干計算機及相關(guān)板卡構(gòu)成系統(tǒng)硬件環(huán)境,通常在Win32環(huán)境下編制相關(guān)的監(jiān)控軟件。開發(fā)全套監(jiān)控系統(tǒng)軟件通常是,開發(fā)人員等買到各種相關(guān)板卡后再逐個調(diào)試各端口,在設備都聯(lián)在一起時統(tǒng)一聯(lián)調(diào),費時費力,要求各設備或分機配合。為了實現(xiàn)在已知相關(guān)硬件需求和相應軟件通訊協(xié)議,而實驗室內(nèi)無硬件設備的情況下,開發(fā)全套監(jiān)控系統(tǒng)軟件[1],本文提出一種利用進程通訊技術(shù)實現(xiàn)純軟件仿真調(diào)試的方法[2]。在實驗室內(nèi)無需連接各板卡,同樣可以仿真這些硬件設備開發(fā)整個監(jiān)控軟件,等各種板卡備齊后,再添加這些板卡的設備初始化及I/O函數(shù)。這樣,整套監(jiān)控軟件在無硬件環(huán)境下可以編制完成,將節(jié)約大量聯(lián)試時間。
假定不考慮接入計算機的板卡接口形式和具體硬件傳感器的特性,僅從抽象的角度考慮,則可將接入的任一硬件傳感器都視為一流設備,通過相關(guān)板卡傳送給計算機1組十六進制碼字,任一硬件讀入形式都相同。使用定長的仿真硬件緩沖區(qū)代替硬件設備,這些硬件緩沖區(qū)每一字節(jié)均可編輯。從而仿真任一接入控制系統(tǒng)硬件傳感器的各種數(shù)據(jù)。
任一接入控制計算機的硬件設備與計算機通訊即是定長的十六進制字符碼字的雙向信息交流(有的設備是單向通訊)。監(jiān)控軟件與這些硬件設備信息交流即為Read與Write函數(shù)[3],任何硬件接口形式其最終抽象的讀寫參數(shù)都相同:設備號、讀寫緩沖區(qū)數(shù)據(jù)內(nèi)容、讀寫長度、實際讀入或者寫出的長度、回送的狀態(tài)碼字。先不考慮具體硬件傳感器的初始化及使用方法,一般相關(guān)板卡均帶有驅(qū)動程序,在Win32環(huán)境下通常是通過驅(qū)動程序提供的API函數(shù)訪問硬件,雖然各硬件的訪問形式有差異,但計算機訪問的機制是相同的,同監(jiān)控軟件相關(guān)的部分是讀寫緩沖區(qū)及讀寫長度。只要使用一種方法使監(jiān)控軟件讀寫另一設定的緩沖區(qū)內(nèi)容,即可實現(xiàn)仿真。
無論監(jiān)控程序使用什么語言編寫,無論讀入時序怎樣安排,為了實現(xiàn)仿真調(diào)試,將監(jiān)控程序稍作調(diào)整,改造如下:設計若干讀入完成消息,在每個硬件傳感器讀入函數(shù)完成后,向前臺窗口發(fā)送一條用戶制定的消息,告知該設備讀入已完成;讀入完成消息處理為:對讀入緩沖區(qū)解碼,將緩沖區(qū)某位置的十六進制碼字按照通訊協(xié)議變換為監(jiān)控程序使用的變量,以供監(jiān)控程序使用。
設監(jiān)控程序為A進程,仿真硬件程序為B進程。A進程要接收B進程數(shù)據(jù),并且B進程數(shù)據(jù)變化時應立即通知A進程,則問題變?yōu)椋和ㄖ?、復制變化?shù)據(jù)。A進程的調(diào)試方法:假設要調(diào)試串行端口5,首先假定已編寫com口讀寫線程(注意此時無硬件,com5打不開,無法跟蹤[4]),由于每個硬件傳感器讀完成都會發(fā)一讀完后的信息。因此只要在某處發(fā)出該消息,就表明已經(jīng)讀入該硬件數(shù)據(jù)。假定使用剪切板通訊方法,在A進程中設計一剪切板讀入用戶消息,該消息由B進程發(fā)出。在A進程的剪切板消息中,將剪切板的內(nèi)容復制到com5讀入緩沖區(qū)中,再發(fā)一com5讀完成消息給前臺窗口,則會誤認為是硬件緩沖內(nèi)容變化,已讀到硬件內(nèi)容。任一接入的硬件都可用這種技術(shù)實現(xiàn)仿真。如果讀入緩沖區(qū)的每一位都可控制輸入,那么在實驗室內(nèi)就能仿真所有實際的通訊情況,將節(jié)約大量時間在設備聯(lián)調(diào)階段。
設計一可編輯的十六進制緩沖區(qū),使用進程通訊方法發(fā)出數(shù)據(jù)。采用Delphi 2009編寫仿真器,界面上設計StringGird組件,用于十六進制輸入,格子列數(shù)為1 024,行數(shù)為2,設計若干按鈕用于實現(xiàn)各種進程通訊方法。使用集合類型檢查輸入的是否為十六進制碼字,使用Drawcell方法限制每個格子的字符數(shù) (每個格子僅能輸入0A、3E等類型的十六進制數(shù)據(jù))[5]。該硬件仿真器的機理為使用WIN32 API內(nèi)核對象通訊技術(shù)傳遞緩沖區(qū)內(nèi)容,再用其他技術(shù)傳輸通知信息。其實現(xiàn)方法為:1)文件映像+事件通知;2)文件映像+用戶自定制消息。若使用文件映像+廣播消息方法,必須在收發(fā)進程中注冊同樣的消息。而使用文件映像+廣播WM_WININICHANGE消息方法,無需注冊消息,SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0);3)有名管道技術(shù)+消息通知。 將B進程設計為有名管道客戶端,將A進程設計為管道服務。4)CopyDATA 方法;5)全局原子方法;6)剪切板技術(shù)+用戶消息方法。
其中,CopyDATA方法為:
如果使用DELPHI或者C++BUILDER開發(fā)應用軟件,使用CODESITE工具在讀消息中寫入調(diào)試代碼[6],可以動態(tài)調(diào)試出任何讀入緩沖區(qū)內(nèi)容。
硬件緩沖區(qū)產(chǎn)生器用不同的進程通訊方法產(chǎn)生一組需要的數(shù)據(jù),并使用不同的通知機制輸出通知消息,因此需相應修改接收端,使用剪切板和全局原子方法時緩沖區(qū)長度只能為256字節(jié),其他方法可輸出更長的數(shù)據(jù)。如果使用廣播消息傳輸通知,A進程也必須注冊同樣的消息。注冊廣播消息:BROADCAST_Message BROADCAST_NUM:=RegisterWindowMessage(‘BROADCAST_comm’);并且A進程需重載WndProc函數(shù):procedure WndProc(var Message:TMessage);override;用于讀注冊的廣播消息,判斷廣播消息是哪一個。監(jiān)控程序需通過某種方法接收數(shù)據(jù)即可,所以修改的代碼很少。
使用該方法開發(fā)的綜合調(diào)試器可徹底拋開硬件環(huán)境,對應用軟件稍作調(diào)整即可與純軟件調(diào)試器通訊。在開發(fā)應用軟件時,當硬件板卡備齊后,只需添加相應的讀寫部分,就能夠在試驗室內(nèi)仿真現(xiàn)場通信情形,將節(jié)約大量時間。該方法已應用于多個航天控制項目,并取得良好效果。
[1]張海藩.軟件工程導論[M].北京:清華大學出版社,2003.
[2]Jeffrey Richter.Window高級編程指南[M].王書洪,劉光明,譯.北京:清華大學出版社,1999.
[3]Mickey Williams.Programming microsoft windows 2000 unleashed[M].前導工作室,譯.北京:機械工業(yè)出版社,1999.
[4]趙蘭濤,蘇彥華.DELPHI串口通信技術(shù)與工程實踐[M].北京:人民郵電出版社,2004.
[5]吳天準.Delphi 7程序設計技巧與實例[M].北京:中國鐵道出版社,2003.
[6]譚 燕,趙 磊,李之明.Delphi高級輔助工具精解[M].北京:中國鐵道出版社,2003.