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