張弘志 尹德勝 李 鐵
*中國鐵道科學(xué)研究院通信信號研究所 助理研究員,100081北京
STP-yh型無線調(diào)車機(jī)車信號和監(jiān)控系統(tǒng) (簡稱調(diào)車監(jiān)控系統(tǒng)),通過地面設(shè)備和車載設(shè)備進(jìn)行無線通信聯(lián)控,實(shí)現(xiàn)調(diào)車機(jī)車在集中區(qū)車場安全作業(yè)。為了在產(chǎn)品出廠前最大限度地完成測試,及在實(shí)驗(yàn)室對現(xiàn)場問題進(jìn)行模擬再現(xiàn),研制完成了調(diào)車監(jiān)控系統(tǒng)模擬測試平臺。聯(lián)鎖模擬模塊作為模擬測試平臺的基礎(chǔ)模塊,使用了Visual C++6.0語言,運(yùn)用面向?qū)ο蠹夹g(shù)和多線程技術(shù)等,并引入了“設(shè)計(jì)模式”作為分析和解決問題的工具。
聯(lián)鎖模擬模塊替換掉了真實(shí)系統(tǒng)中的外部聯(lián)鎖通信機(jī),將聯(lián)鎖碼位 (站場聯(lián)鎖設(shè)備狀態(tài))模擬信息發(fā)送給地面設(shè)備。由于實(shí)驗(yàn)室環(huán)境和現(xiàn)場實(shí)際通信環(huán)境均需要模塊適應(yīng)各種通信方式,如RS-232、RS-485串行,TCP、UDP網(wǎng)絡(luò)通信,甚至是CAN通信來發(fā)送聯(lián)鎖數(shù)據(jù),因此專門設(shè)計(jì)了通用的底層通信接口。
不同的通信接口對應(yīng)著不同的驅(qū)動程序類,且包含著不同的接口函數(shù)。如串口RS-232、RS-485對應(yīng)驅(qū)動程序類 CSerial;網(wǎng)口TCP、UDP對應(yīng)驅(qū)動程序類 CTCPSocket或是CUdpSocket;CAN口對應(yīng)類CCAN。因此可應(yīng)用設(shè)計(jì)模式中的適配器模式Adapter來統(tǒng)一不同通信方式的通信接口。具體步驟如下。
1.構(gòu)建通用接口類基類CCommProduct,制定標(biāo)準(zhǔn)的接口函數(shù),如Open、Close、Read、Write均為虛函數(shù)且可被繼承。
2.創(chuàng)建CCommProduct的派生類,諸如包裝處理串口的 CCommProductSerial,將底層的驅(qū)動類(對于串口類,就是CSerial)封裝進(jìn)去,并保持與基類 (通用接口類的)一致的接口,如 Open、Close、Read、Write等。同理,針對網(wǎng)口,用類CCommpProductUDP封裝CUdpSocket;針對CAN口,用CCommProductCAN封裝CCAN,通信接口UML簡化類圖如圖1所示。
圖1 通信接口UML簡化類圖
3.創(chuàng)建一個(gè)類CCommFactory實(shí)例對象pFactory,通過判別導(dǎo)入通信方的通信方式配置信息,創(chuàng)建對應(yīng)各種通信產(chǎn)品CCommProduct的實(shí)例。
4.使用時(shí),先用pFactory導(dǎo)出一個(gè)需要的通信產(chǎn)品實(shí)例pProductComm,以后就可直接利用該實(shí)例來完成通信。而這個(gè)實(shí)例pProductComm具體是使用什么通信機(jī)制(如串口、網(wǎng)絡(luò))都已封裝隱藏,不需要使用者關(guān)心。
現(xiàn)實(shí)要求在模擬聯(lián)鎖模塊中實(shí)現(xiàn)各種類型的聯(lián)鎖碼位發(fā)送。而各種碼位的格式不統(tǒng)一,就需要編寫不同的碼位文件加載方式和碼位提取填充方式,由此就引出了使用設(shè)計(jì)模式中的Template Method模板方法,應(yīng)用該方法進(jìn)行多種碼位的處理UML簡化類圖如圖2所示。
圖2 應(yīng)用模板方法進(jìn)行多種碼位的處理UML簡化類圖
首先設(shè)計(jì)一個(gè)基類碼位分析器,其具有各種碼位均需參與的處理功能:碼位表創(chuàng)建Create和碼位表刷新Update。在創(chuàng)建Create碼位表時(shí),要使用Import()作為碼位文件加載函數(shù);在碼位刷新Update時(shí),使用Export()作為提取聯(lián)鎖設(shè)備狀態(tài)函數(shù),并填充碼位信息。在基類碼位分析器中,將這2個(gè)函數(shù)設(shè)置為虛函數(shù)且可被繼承,然后通過繼承基類碼位分析器來構(gòu)建不同類型的碼位,并重寫Import()函數(shù)和Export()函數(shù),這樣在最終使用時(shí),模塊就會自動調(diào)用派生類的處理子函數(shù)。
聯(lián)鎖設(shè)備的公共屬性配置信息會在操作過程中根據(jù)需要進(jìn)行修改,如進(jìn)路排出、車列走行通過時(shí),信號機(jī)關(guān)閉延遲時(shí)間,區(qū)段的解鎖延遲時(shí)間等;又如區(qū)段分路不良模擬延長時(shí)間的設(shè)定等。為了達(dá)到各種參數(shù)下的模擬仿真,使用了設(shè)計(jì)模式中的單例singleton模式來實(shí)現(xiàn)。
一般方法是使用全局變量來記錄配置信息,但這樣一來會破壞模塊封裝,不易于復(fù)用。而根據(jù)單例模式的特點(diǎn),其標(biāo)準(zhǔn)簡化圖如圖3所示,將各種公共配置信息singletonData均填入一個(gè)單例類singleton中,因?yàn)閱卫愔挥?個(gè)實(shí)例 uniqueInstance,且是自己創(chuàng)建自己的惟一實(shí)例,提供一個(gè)全局訪問點(diǎn)Instance()。使用者在獲取這個(gè)實(shí)例后,使用類中提供訪問公共配置信息的函數(shù)GetS-ingletonData(),即可訪問到所需要的信息。這樣既消除了全局變量,封裝了變化,又實(shí)現(xiàn)了參數(shù)訪問。
圖3 singleton模式的標(biāo)準(zhǔn)簡化圖
針對站場每個(gè)設(shè)備,設(shè)置了不同層次數(shù)據(jù)信息,如圖4所示,即對應(yīng)每一個(gè)站場設(shè)備可對應(yīng)多個(gè)屬性頁。站場圖中,如道岔、信號機(jī)、股道、無岔區(qū)段、應(yīng)答器等,每一個(gè)設(shè)備均可作為1個(gè)設(shè)備實(shí)體,每個(gè)設(shè)備實(shí)體可具備多個(gè)設(shè)備屬性頁(如顯示層、模擬層、控制層等),設(shè)備屬性頁也能獲知自己是屬于哪個(gè)設(shè)備實(shí)體的。各屬性頁(即各個(gè)層)以基類“設(shè)備屬性頁”為父類,各個(gè)層次間彼此獨(dú)立,但可以通過設(shè)備實(shí)體進(jìn)行溝通,其好處是可以把描述設(shè)備的不同屬性獨(dú)立開單獨(dú)進(jìn)行考慮,便于各自屬性的獨(dú)自擴(kuò)展。
圖4 站場設(shè)備實(shí)現(xiàn)對應(yīng)的UML簡化類圖
典型的各層信息如下:①顯示層,主要完成各個(gè)設(shè)備在站場圖中的顯示特性,儲存設(shè)備相關(guān)坐標(biāo)、點(diǎn)、線的顏色等,并顯示出設(shè)備,組成站場信號平面示意圖;②命令層,聯(lián)鎖設(shè)備操作命令的發(fā)布,可針對道岔、區(qū)段或信號機(jī)等;③鏈路層,主要實(shí)現(xiàn)設(shè)備串聯(lián)功能,表示設(shè)備的相互間連接關(guān)系,用于搜索進(jìn)路等;④控制層,記錄與聯(lián)鎖邏輯相關(guān)的設(shè)備狀態(tài),并進(jìn)行聯(lián)鎖邏輯判定;⑤模擬層,記錄設(shè)備的模擬狀態(tài)。
1.設(shè)備的命令流程。以道岔操作為例,如道岔扳動命令的執(zhí)行,當(dāng)執(zhí)行道岔相關(guān)菜單中道岔由定位轉(zhuǎn)到反位的命令時(shí),道岔顯示層提供接口,點(diǎn)擊菜單道岔反位命令項(xiàng),通過實(shí)體層通知命令層將命令發(fā)布給控制層,控制層根據(jù)當(dāng)前站場聯(lián)鎖邏輯判斷是否可行,若可行,告知模擬層進(jìn)行模擬,而后控制層再通過設(shè)備實(shí)體獲取模擬層狀態(tài),并告知顯示層顯示成新的道岔狀態(tài)。
2.設(shè)備狀態(tài)模擬流程。以無岔區(qū)段操作為例,如模擬區(qū)段占用流程。首先通過鼠標(biāo)點(diǎn)觸區(qū)段或有模擬車列壓上區(qū)段,則通過人機(jī)接口觸發(fā)區(qū)段模擬層,將區(qū)段的模擬層屬性置為占用,而后控制層通過即時(shí)獲取模擬層信息后,通知GUI顯示層將占用狀態(tài)顯示出來。
3.設(shè)備狀態(tài)顯示流程。為方便展示站場各個(gè)設(shè)備具體的聯(lián)鎖運(yùn)作狀態(tài),可把鼠標(biāo)移動到站場設(shè)備之上,模塊會自動以文字氣球框的形式展示相應(yīng)設(shè)備的各種屬性,如聯(lián)鎖控制狀態(tài)屬性、鏈路屬性、模擬屬性 (當(dāng)前是否有車列占用)等。實(shí)現(xiàn)方式是:當(dāng)鼠標(biāo)移動到相應(yīng)的設(shè)備,首先獲取相應(yīng)的設(shè)備實(shí)體,通過設(shè)備實(shí)體可以遍歷自身的多個(gè)屬性頁,訪問到對應(yīng)此實(shí)體的顯示層、命令層、鏈路層、控制層及模擬層等各層設(shè)備信息。
1.點(diǎn)擊始端、終端信號機(jī),此時(shí)系統(tǒng)會根據(jù)所按的信號機(jī)按鈕,自動搜索其間的進(jìn)路,將所有當(dāng)前可開進(jìn)路羅列于進(jìn)路搜索結(jié)果中,由用戶自己選擇所要的進(jìn)路。進(jìn)路信息中包含途經(jīng)的信號機(jī)、道岔、無岔區(qū)段、股道和所要排列的進(jìn)路類型,模塊會將選擇的進(jìn)路放入待排進(jìn)路集合中。當(dāng)然若是能夠直接確定進(jìn)路線路和類型,模塊會直接將進(jìn)路信息放入待排進(jìn)路集合中準(zhǔn)備排放進(jìn)路。
2.從待排進(jìn)路集合中取出待排進(jìn)路,發(fā)送待排進(jìn)路中必要的道岔扳動命令,等待道岔扳動到位。
3.待所有道岔到位后,發(fā)送區(qū)段鎖閉命令。
4.待區(qū)段鎖閉后,向進(jìn)路中途徑的阻擋信號機(jī)發(fā)送開放命令。
5.待信號機(jī)由遠(yuǎn)及近開放后,進(jìn)路開通完成。
6.將已開通的進(jìn)路存入已排進(jìn)路集合,并從待排進(jìn)路集合中刪除。
7.若待排進(jìn)路排列超出規(guī)定時(shí)間,則從待排進(jìn)路集合中刪除該待排進(jìn)路。
1.將鼠標(biāo)移至進(jìn)路始端信號機(jī)處,右彈菜單,即有取消進(jìn)路選項(xiàng),點(diǎn)中。
2.從已排進(jìn)路集合中查找到對應(yīng)的進(jìn)路,置進(jìn)路準(zhǔn)備取消標(biāo)志。
3.發(fā)送進(jìn)路中的關(guān)閉信號機(jī)命令。
4.待信號機(jī)關(guān)閉,發(fā)送進(jìn)路中區(qū)段解鎖命令。
5.待區(qū)段解鎖后,進(jìn)路取消完成。
6.將已取消的進(jìn)路從已排進(jìn)路集合中刪除。
7.若取消進(jìn)路操作超出規(guī)定時(shí)間,則在已排進(jìn)路集合中將進(jìn)路準(zhǔn)備取消標(biāo)志清除。
當(dāng)然,上述進(jìn)路開通和進(jìn)路取消所有等待操作均使用異步完成的方法來實(shí)現(xiàn),即使用一個(gè)定時(shí)器,定時(shí)對排進(jìn)路集合中進(jìn)路的取消進(jìn)行狀態(tài)監(jiān)控,在不同的狀態(tài)條件下,根據(jù)上述流程進(jìn)行對應(yīng)處理。
進(jìn)路開通后,通過人工依次點(diǎn)觸進(jìn)路區(qū)段或通過后續(xù)的車列模擬模塊中“走行自動模擬”,來模擬區(qū)段的占用或出清過程,隨之進(jìn)路會正常解鎖。處理步驟如下。
1.關(guān)閉信號機(jī)。對于調(diào)車進(jìn)路,車列全部進(jìn)入信號機(jī)內(nèi)方 (接近區(qū)段不留車),信號機(jī)方能關(guān)閉;或者出清信號機(jī)內(nèi)方第一區(qū)段后 (接近區(qū)段留有車輛),信號機(jī)方能關(guān)閉。對于列車進(jìn)路,只要車列一進(jìn)入防護(hù)信號機(jī)內(nèi)方,信號機(jī)就立即關(guān)閉。
2.進(jìn)路自動解鎖。針對每一軌道區(qū)段進(jìn)行三點(diǎn)邏輯檢查,即接近區(qū)段已經(jīng)解鎖,本區(qū)段曾占用過后又出清,它的離去區(qū)段被占用。條件滿足后,發(fā)布并執(zhí)行區(qū)段解鎖命令。
當(dāng)判明進(jìn)路區(qū)段被使用過,但進(jìn)路中區(qū)段不正常解鎖時(shí),在點(diǎn)擊進(jìn)路中未解鎖區(qū)段的故障解鎖菜單項(xiàng)后,就會發(fā)布并執(zhí)行區(qū)段解鎖命令,以去除區(qū)段上未正常解鎖的白光帶。
聯(lián)鎖模擬模塊經(jīng)過測試,能正確反映聯(lián)鎖設(shè)備的基本狀態(tài)變化。作為調(diào)車監(jiān)控系統(tǒng)模擬測試平臺中的一部分,聯(lián)鎖模擬模塊在項(xiàng)目準(zhǔn)備期,可作為控制系統(tǒng)出廠的測試工具;在項(xiàng)目中期,可作為控制系統(tǒng)在實(shí)驗(yàn)室再現(xiàn)現(xiàn)場發(fā)生現(xiàn)象的手段。到目前,經(jīng)平臺測試出廠的系統(tǒng)產(chǎn)品近百套,應(yīng)用于全國各鐵路局的集中區(qū)調(diào)車場中。
聯(lián)鎖模擬模塊豐富的外接接口,也可以方便地移植到其他任何以聯(lián)鎖系統(tǒng)為外接系統(tǒng)作為調(diào)試接口進(jìn)行使用。
[1] 高繼祥.鐵路信號運(yùn)營基礎(chǔ)[M] .北京:中國鐵道出版社,1998,2.
[2] 徐建國,張福祥.車站計(jì)算機(jī)聯(lián)鎖[M] .北京:中國鐵道出版社,2005,6.
[3] Erich Gamma Richard Helm Ralph Johnson John Vlissides(著).李英軍,馬曉星,蔡敏,劉建中(譯).設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M] .北京:機(jī)械工業(yè)出版社,2000,7.
[4] DavidJ.Kruglinski(著).潘愛民,王國印(譯).Visual C++技術(shù)內(nèi)幕[M] .第4版.北京:清華大學(xué)出版社,2001,4.