賀云鵬
(中鐵第四勘察設(shè)計院集團有限公司 國際事業(yè)部,武漢 430063)
計算機聯(lián)鎖利用道岔、信號機、軌道區(qū)段等設(shè)備之間的相互關(guān)聯(lián)和相互制約關(guān)系,實現(xiàn)對車站作業(yè)的計算機集中控制。國內(nèi)外學(xué)者已經(jīng)對計算機聯(lián)鎖軟件進(jìn)行了大量的研究,謝保鋒對車站計算機聯(lián)鎖系統(tǒng)的現(xiàn)狀與發(fā)展作出了分析[1];陳志穎等人提出了基于站場型數(shù)據(jù)結(jié)構(gòu)的進(jìn)路搜索算法[2];陳曉偉應(yīng)用分布式控制系統(tǒng)和多Agent系統(tǒng)技術(shù),提出了一種新型的分布式、智能化聯(lián)鎖軟件的設(shè)計方案[3];Eugenio Roanes-Lozano等人提出一種新的計算機聯(lián)鎖決策機制[4];Yildirim等人利用計算機代數(shù)工具箱自動生成鐵路聯(lián)鎖工作臺[5];楊美娜等人采用二叉樹結(jié)構(gòu)的進(jìn)路搜索算法設(shè)計高速鐵路的計算機聯(lián)鎖軟件[6];彭麗維提出了為各類信號設(shè)備建立圖元模型的設(shè)計思想[7];孫曉光利用 CAD 圖塊方法提供統(tǒng)一的信號圖元,實現(xiàn)了信號平面布置圖標(biāo)準(zhǔn)化處理[8]。
以上對計算機聯(lián)鎖軟件的研究,主要針對某一具體過程(如進(jìn)路搜索、站場數(shù)據(jù)構(gòu)造),在設(shè)計時均需要先設(shè)計聯(lián)鎖表,后在軟件中配置大量聯(lián)鎖數(shù)據(jù)來實現(xiàn),進(jìn)路搜索以數(shù)據(jù)配置為基礎(chǔ),消耗了大量時間。未來,便捷式聯(lián)鎖軟件表示層的繪制和聯(lián)鎖進(jìn)路搜索數(shù)據(jù)結(jié)構(gòu)的自動構(gòu)建將成為重要發(fā)展方向。
本文提出了一種模塊化計算機聯(lián)鎖軟件(簡稱:模塊化聯(lián)鎖軟件)設(shè)計方法,將道岔、信號機、軌道區(qū)段等設(shè)備設(shè)計為不同的程序模塊,用戶利用鼠標(biāo)拖動不同的程序模塊并輸入各設(shè)備的具體參數(shù),繪制聯(lián)鎖軟件表示層,繪制完成后,軟件可自動建立二叉樹站場聯(lián)鎖數(shù)據(jù)結(jié)構(gòu),無需手動配置大量聯(lián)鎖數(shù)據(jù),并使用遞歸算法完成計算機聯(lián)鎖進(jìn)路搜索。在某車站,分別使用本文提出的設(shè)計方法和傳統(tǒng)的設(shè)計方法設(shè)計聯(lián)鎖軟件,對比兩種方法的設(shè)計流程和設(shè)計用時,驗證了本文所提聯(lián)鎖軟件設(shè)計方法的優(yōu)越性。
聯(lián)鎖軟件的表示層顯示道岔、信號機、軌道區(qū)段的圖形、狀態(tài)和位置等信息。為完成聯(lián)鎖軟件表示層的設(shè)計,需要設(shè)計道岔、信號機、軌道區(qū)段的程序模塊。本文采用面向?qū)ο骩9]的思想,使用C#語言編程,WinForm作為用戶界面框架,分別設(shè)計道岔模塊、信號機模塊、軌道區(qū)段模塊。
建立Equip類(父類),再繼承父類,創(chuàng)建3個設(shè)備子類,分別為道岔模塊、信號機模塊和軌道區(qū)段模塊。每個設(shè)備子類建立各自的屬性參數(shù),其中,道岔模塊包含道岔類別(單動/雙動/交叉渡線/復(fù)式交分等)、撇型/捺型、道岔圖號等,信號機模塊包含信號機類型、顯示顏色、信號機方向(向左/向右)等,軌道區(qū)段模塊包含長度、類型(一體化、25 Hz、高壓脈沖等)、占用/空閑等。
道岔模塊主要實現(xiàn)道岔的繪制、定反位轉(zhuǎn)換、拖動及縮放功能。
1.1.1 道岔繪制
在軟件設(shè)計中,道岔以定型組合的形式呈現(xiàn),除了需要繪制道岔,還要繪制一段各岔尖對應(yīng)的軌道區(qū)段,用DrawLine方法繪制出道岔定型組合中的連接每個兩端端點的直線,需要使用畫筆Pen實例化一個道岔對象,定義單色畫筆來繪制道岔輪廓和基本形狀;使用從Brush類派生出的SolidBrush類畫刷對象,實現(xiàn)道岔顏色填充。以單動道岔(撇型)為例,道岔圖像如圖1所示。
圖1 單動道岔(撇型)圖像示意
由于整個設(shè)備在一張畫布上,需要實現(xiàn)道岔與畫布背景分離,且由于畫出的不是一個線性圖形,而是多條直線組成的復(fù)雜形狀,因此,利用GraphicsPath類記錄下繪圖的過程后將所有直線一起畫出。
1.1.2 道岔定反位轉(zhuǎn)換
由于道岔定反位顯示中只有岔尖部分的畫法與道岔的不同,其他均一致,因此,可用鼠標(biāo)點擊岔尖具體范圍的位置后,再用道岔直股或者彎股的畫法實現(xiàn)。根據(jù)上述單動道岔子類中所設(shè)置的鼠標(biāo)點擊事件,以及代碼中對單動道岔畫法及摳圖的不同,利用判斷語句實現(xiàn)道岔定反位轉(zhuǎn)換的表示。
1.1.3 道岔拖動及縮放
通過多態(tài)性實現(xiàn)道岔拖動及縮放功能。在實現(xiàn)道岔的縮放功能時,要求在鼠標(biāo)按下時記錄原始的鼠標(biāo)位置,鼠標(biāo)移動時要計算差值,鼠標(biāo)抬起時要記錄位置,這些是父類具備的功能。子類的鼠標(biāo)抬起的時候,刷新原來的基準(zhǔn)值,而子類的刷新基準(zhǔn)不相同,此時,將該事件對應(yīng)的功能函數(shù)設(shè)為多態(tài),即同一操作作用于不同的對象可產(chǎn)生不同的執(zhí)行結(jié)果,符合功能實現(xiàn)的要求。此外,由于需要能夠同時實現(xiàn)道岔的拖動及縮放功能,在鼠標(biāo)按下和移動時需要判斷是實現(xiàn)哪一種功能,兩者可用不同區(qū)域、不同鼠標(biāo)樣式進(jìn)行區(qū)分。
信號機模塊在道岔模塊的基礎(chǔ)上完成,由于信號機不存在摳圖、轉(zhuǎn)換及縮放的要求,在信號機模塊設(shè)計時只需完成信號機的繪制、拖動及標(biāo)簽按鈕的配置,其中,拖動功能可參考道岔進(jìn)行設(shè)計。
1.2.1 信號機繪制
使用Graphics類DrawEllipse方法繪制信號機。由左上角坐標(biāo)、指定高度和寬度的正方形邊框定義信號機圓形燈位形狀;采用DrawLine方法,繪制兩端端點坐標(biāo)確定的信號機直線型基柱形狀;采用FillEllipse方法,填充由左上角坐標(biāo)、高度和寬度指定的正方形邊框所定義的信號機燈位的顯示顏色。
根據(jù)此畫法,將信號機整體外形畫出并填充好信號機的燈位顏色,以矮柱單燈位信號機為例,信號機圖像如圖2所示。
圖2 矮柱單燈位信號機圖像示意
1.2.2 信號機標(biāo)簽按鈕配置
如圖2所示,藍(lán)色燈位左側(cè)為信號機標(biāo)簽位置,上方為其按鈕位置,標(biāo)簽及按鈕為標(biāo)準(zhǔn)控件,其尺寸、位置及字體等的設(shè)計通過構(gòu)造函數(shù)實現(xiàn)。
軌道區(qū)段模塊的設(shè)計內(nèi)容主要包括圖形繪制、標(biāo)簽設(shè)計和縮放,由于軌道區(qū)段在繪制時是一條直線,且不需摳圖,縮放只是對軌道區(qū)段進(jìn)行伸縮,因此,可參照道岔模塊的設(shè)計方法,軌道區(qū)段圖像如圖3所示。
圖3 軌道區(qū)段圖像示意
繪制界面包括兩部分:(1)左側(cè)為繪制站場按鈕工具欄;(2)右側(cè)為當(dāng)前站場繪制的界面。在使用時,用鼠標(biāo)點擊不同類型設(shè)備(信號機,道岔,軌道區(qū)段)按鈕并輸入其具體參數(shù)值,輸入完成后可對其進(jìn)行拖動以調(diào)整到正確位置,完成對該設(shè)備的繪制。對所有設(shè)備進(jìn)行繪制,完成聯(lián)鎖軟件表示層設(shè)計,為聯(lián)鎖數(shù)據(jù)結(jié)構(gòu)的生成和進(jìn)路搜索的實現(xiàn)建立基礎(chǔ)。本文聯(lián)鎖軟件的繪制界面如圖4所示。
二叉樹[10]由一個根節(jié)點和兩個互不相交的被稱為左子樹和右子樹的節(jié)點組成,其中,左子樹或右子樹可以為空,二叉樹的單鏈表鏈接如圖5所示。
圖5 二叉樹的單鏈表鏈接
利用站場形狀和二叉樹形狀的相似性[11],站場中各設(shè)備分別作為道岔、信號機、軌道區(qū)段這3個子類的對象,依據(jù)二叉樹的單鏈表結(jié)構(gòu)進(jìn)行連接,將每個設(shè)備對象的指針存放在容器PointVector中,將PointVector設(shè)計為存放父類指針的容器。以某車站為例,站場部分?jǐn)?shù)據(jù)結(jié)構(gòu)如圖6所示。
圖6 站場部分?jǐn)?shù)據(jù)結(jié)構(gòu)示意
將道岔、信號機、軌道區(qū)段等模塊映射為二叉樹中的基本節(jié)點單元,繪制完成的設(shè)備自動進(jìn)行連接,并添加模塊化聯(lián)鎖軟件操作按鈕和操作表示燈,生成模塊化聯(lián)鎖軟件人機交互界面。仍以上述某車站為例,在圖4所示繪制界面中,將聯(lián)鎖軟件表示層繪制完成后,自動生成模塊化聯(lián)鎖軟件的人機交互界面,如圖7所示。
圖4 模塊化聯(lián)鎖軟件繪制界面
圖7 模塊化聯(lián)鎖軟件人機交互界面
進(jìn)路是車站內(nèi)列車或調(diào)車車列在兩個地點之間運行的路線,由若干控制列車運行的設(shè)備(如道岔、信號機、軌道區(qū)段)組成。進(jìn)路搜索根據(jù)進(jìn)路的始端、終端(或始端、終端和變更按鈕),將組成進(jìn)路的所有設(shè)備對應(yīng)的節(jié)點搜索出來。
將道岔、信號機、軌道區(qū)段這3個模塊中每個對象的指針統(tǒng)一存放在PointVector容器中時,由于PointVector被設(shè)計為存放父類指針的容器,子類對象的指針將被隱式轉(zhuǎn)換為父類指針(子類對象可轉(zhuǎn)換成父類對象),可能導(dǎo)致進(jìn)路在搜索完成后,搜索出的各設(shè)備的指針不能調(diào)用其所屬類中的自身的操作(即子類對象不能轉(zhuǎn)換為父類對象)。因此,本文利用面向?qū)ο蟮某绦蛟O(shè)計中的多態(tài)思想,用父類指針指向各設(shè)備對象,再將每個設(shè)備對應(yīng)的父類指針存儲到PointVector容器中。
采用遞歸算法實現(xiàn)進(jìn)路搜索[12],根據(jù)遞歸算法的實現(xiàn)條件,進(jìn)路搜索函數(shù)SearchPoint可分為搜索保存部分和遞歸出口條件部分。
2.2.1 搜索保存部分
搜索保存部分指在保證節(jié)點不為空且未找到目標(biāo)節(jié)點指針的情況下,按根節(jié)點、右子樹和左子樹(或根節(jié)點、左子樹和右子樹)的順序依次進(jìn)行搜索并保存節(jié)點指針至父類指針容器PointVector中。在搜索左子樹之前,從父類指針容器尾部開始刪除各模塊中設(shè)備節(jié)點指針至根節(jié)點(不包括根節(jié)點),剔除進(jìn)路外的無關(guān)節(jié)點指針。
2.2.2 遞歸出口條件部分
遞歸出口條件分以下兩種情況。
(1)當(dāng)進(jìn)路中無變更按鈕時,進(jìn)路的始、終端對應(yīng)的設(shè)備節(jié)點指針將作為進(jìn)路搜索函數(shù)的參數(shù)進(jìn)行搜索。在搜索到尾節(jié)點仍未搜索到目標(biāo)節(jié)點時,保存該尾節(jié)點指針至PointVector,并讓搜索函數(shù)返回;搜索到目標(biāo)節(jié)點時,將搜索標(biāo)識FindPoint置為true,保證搜索函數(shù)在返回過程中不會繼續(xù)保存或刪除容器PointVector中已存在的節(jié)點指針,再將搜索函數(shù)返回。
(2)當(dāng)進(jìn)路中有變更按鈕時,可將始端、變更按鈕和變更按鈕、終端兩組設(shè)備節(jié)點指針依次作為進(jìn)路搜索函數(shù)的參數(shù),逐次進(jìn)行搜索。
以圖7中舉例站D1—IIG調(diào)車進(jìn)路的進(jìn)路搜索過程為例,采用遞歸算法進(jìn)行進(jìn)路搜索的軌跡如圖8所示,PointVector中節(jié)點指針變化如表1所示。在本次搜索中,共進(jìn)行了7次遞歸調(diào)用。
圖8 舉例站D1—IIG調(diào)車進(jìn)路搜索軌跡
表1 PointVector中節(jié)點指針變化
傳統(tǒng)聯(lián)鎖軟件設(shè)計方法要求先設(shè)計聯(lián)鎖表,并對大量聯(lián)鎖數(shù)據(jù)進(jìn)行手動配置,聯(lián)鎖表由設(shè)計單位設(shè)計,聯(lián)鎖數(shù)據(jù)由設(shè)備廠家配置,兩項內(nèi)容的設(shè)計和交接消耗了大量時間和人力。本文所提聯(lián)鎖軟件設(shè)計方法將設(shè)備進(jìn)行模塊化處理,使用拖動方式完成聯(lián)鎖軟件表示層繪制,軟件即可自動生成二叉樹數(shù)據(jù),建立數(shù)據(jù)連接,完成進(jìn)路搜索,得到最終的模塊化聯(lián)鎖軟件,省去了大量時間。
以圖7中舉例站為例,使用本文所提方法和傳統(tǒng)方法設(shè)計聯(lián)鎖軟件,所需時間如表2所示。
由表2可知,本文所提設(shè)計方法在聯(lián)鎖表設(shè)計及聯(lián)鎖數(shù)據(jù)配置與生成兩項上節(jié)省了大量時間,總時間節(jié)省了約30%。
表2 聯(lián)鎖軟件設(shè)計所需時間對比
本文設(shè)計了一種基于遞歸算法的模塊化計算機聯(lián)鎖軟件,將不同的設(shè)備設(shè)計為不同的程序模塊,實現(xiàn)在軟件里拖動相關(guān)模塊完成聯(lián)鎖軟件表示層的繪制,并利用二叉樹和遞歸算法完成數(shù)據(jù)結(jié)構(gòu)的建立、進(jìn)路搜索。該模塊化計算機聯(lián)鎖軟件設(shè)計方法擺脫了傳統(tǒng)聯(lián)鎖軟件需要手動配置大量聯(lián)鎖數(shù)據(jù)和設(shè)計聯(lián)鎖表的困擾,節(jié)省了大量時間,提高了設(shè)計效率。