賀云鵬
(中鐵第四勘察設計院集團有限公司 國際事業部,武漢 430063)
計算機聯鎖利用道岔、信號機、軌道區段等設備之間的相互關聯和相互制約關系,實現對車站作業的計算機集中控制。國內外學者已經對計算機聯鎖軟件進行了大量的研究,謝保鋒對車站計算機聯鎖系統的現狀與發展作出了分析[1];陳志穎等人提出了基于站場型數據結構的進路搜索算法[2];陳曉偉應用分布式控制系統和多Agent系統技術,提出了一種新型的分布式、智能化聯鎖軟件的設計方案[3];Eugenio Roanes-Lozano等人提出一種新的計算機聯鎖決策機制[4];Yildirim等人利用計算機代數工具箱自動生成鐵路聯鎖工作臺[5];楊美娜等人采用二叉樹結構的進路搜索算法設計高速鐵路的計算機聯鎖軟件[6];彭麗維提出了為各類信號設備建立圖元模型的設計思想[7];孫曉光利用 CAD 圖塊方法提供統一的信號圖元,實現了信號平面布置圖標準化處理[8]。
以上對計算機聯鎖軟件的研究,主要針對某一具體過程(如進路搜索、站場數據構造),在設計時均需要先設計聯鎖表,后在軟件中配置大量聯鎖數據來實現,進路搜索以數據配置為基礎,消耗了大量時間。未來,便捷式聯鎖軟件表示層的繪制和聯鎖進路搜索數據結構的自動構建將成為重要發展方向。
本文提出了一種模塊化計算機聯鎖軟件(簡稱:模塊化聯鎖軟件)設計方法,將道岔、信號機、軌道區段等設備設計為不同的程序模塊,用戶利用鼠標拖動不同的程序模塊并輸入各設備的具體參數,繪制聯鎖軟件表示層,繪制完成后,軟件可自動建立二叉樹站場聯鎖數據結構,無需手動配置大量聯鎖數據,并使用遞歸算法完成計算機聯鎖進路搜索。在某車站,分別使用本文提出的設計方法和傳統的設計方法設計聯鎖軟件,對比兩種方法的設計流程和設計用時,驗證了本文所提聯鎖軟件設計方法的優越性。
聯鎖軟件的表示層顯示道岔、信號機、軌道區段的圖形、狀態和位置等信息。為完成聯鎖軟件表示層的設計,需要設計道岔、信號機、軌道區段的程序模塊。本文采用面向對象[9]的思想,使用C#語言編程,WinForm作為用戶界面框架,分別設計道岔模塊、信號機模塊、軌道區段模塊。
建立Equip類(父類),再繼承父類,創建3個設備子類,分別為道岔模塊、信號機模塊和軌道區段模塊。每個設備子類建立各自的屬性參數,其中,道岔模塊包含道岔類別(單動/雙動/交叉渡線/復式交分等)、撇型/捺型、道岔圖號等,信號機模塊包含信號機類型、顯示顏色、信號機方向(向左/向右)等,軌道區段模塊包含長度、類型(一體化、25 Hz、高壓脈沖等)、占用/空閑等。
道岔模塊主要實現道岔的繪制、定反位轉換、拖動及縮放功能。
1.1.1 道岔繪制
在軟件設計中,道岔以定型組合的形式呈現,除了需要繪制道岔,還要繪制一段各岔尖對應的軌道區段,用DrawLine方法繪制出道岔定型組合中的連接每個兩端端點的直線,需要使用畫筆Pen實例化一個道岔對象,定義單色畫筆來繪制道岔輪廓和基本形狀;使用從Brush類派生出的SolidBrush類畫刷對象,實現道岔顏色填充。以單動道岔(撇型)為例,道岔圖像如圖1所示。

圖1 單動道岔(撇型)圖像示意
由于整個設備在一張畫布上,需要實現道岔與畫布背景分離,且由于畫出的不是一個線性圖形,而是多條直線組成的復雜形狀,因此,利用GraphicsPath類記錄下繪圖的過程后將所有直線一起畫出。
1.1.2 道岔定反位轉換
由于道岔定反位顯示中只有岔尖部分的畫法與道岔的不同,其他均一致,因此,可用鼠標點擊岔尖具體范圍的位置后,再用道岔直股或者彎股的畫法實現。根據上述單動道岔子類中所設置的鼠標點擊事件,以及代碼中對單動道岔畫法及摳圖的不同,利用判斷語句實現道岔定反位轉換的表示。
1.1.3 道岔拖動及縮放
通過多態性實現道岔拖動及縮放功能。在實現道岔的縮放功能時,要求在鼠標按下時記錄原始的鼠標位置,鼠標移動時要計算差值,鼠標抬起時要記錄位置,這些是父類具備的功能。子類的鼠標抬起的時候,刷新原來的基準值,而子類的刷新基準不相同,此時,將該事件對應的功能函數設為多態,即同一操作作用于不同的對象可產生不同的執行結果,符合功能實現的要求。此外,由于需要能夠同時實現道岔的拖動及縮放功能,在鼠標按下和移動時需要判斷是實現哪一種功能,兩者可用不同區域、不同鼠標樣式進行區分。
信號機模塊在道岔模塊的基礎上完成,由于信號機不存在摳圖、轉換及縮放的要求,在信號機模塊設計時只需完成信號機的繪制、拖動及標簽按鈕的配置,其中,拖動功能可參考道岔進行設計。
1.2.1 信號機繪制
使用Graphics類DrawEllipse方法繪制信號機。由左上角坐標、指定高度和寬度的正方形邊框定義信號機圓形燈位形狀;采用DrawLine方法,繪制兩端端點坐標確定的信號機直線型基柱形狀;采用FillEllipse方法,填充由左上角坐標、高度和寬度指定的正方形邊框所定義的信號機燈位的顯示顏色。
根據此畫法,將信號機整體外形畫出并填充好信號機的燈位顏色,以矮柱單燈位信號機為例,信號機圖像如圖2所示。

圖2 矮柱單燈位信號機圖像示意
1.2.2 信號機標簽按鈕配置
如圖2所示,藍色燈位左側為信號機標簽位置,上方為其按鈕位置,標簽及按鈕為標準控件,其尺寸、位置及字體等的設計通過構造函數實現。
軌道區段模塊的設計內容主要包括圖形繪制、標簽設計和縮放,由于軌道區段在繪制時是一條直線,且不需摳圖,縮放只是對軌道區段進行伸縮,因此,可參照道岔模塊的設計方法,軌道區段圖像如圖3所示。

圖3 軌道區段圖像示意
繪制界面包括兩部分:(1)左側為繪制站場按鈕工具欄;(2)右側為當前站場繪制的界面。在使用時,用鼠標點擊不同類型設備(信號機,道岔,軌道區段)按鈕并輸入其具體參數值,輸入完成后可對其進行拖動以調整到正確位置,完成對該設備的繪制。對所有設備進行繪制,完成聯鎖軟件表示層設計,為聯鎖數據結構的生成和進路搜索的實現建立基礎。本文聯鎖軟件的繪制界面如圖4所示。
二叉樹[10]由一個根節點和兩個互不相交的被稱為左子樹和右子樹的節點組成,其中,左子樹或右子樹可以為空,二叉樹的單鏈表鏈接如圖5所示。

圖5 二叉樹的單鏈表鏈接
利用站場形狀和二叉樹形狀的相似性[11],站場中各設備分別作為道岔、信號機、軌道區段這3個子類的對象,依據二叉樹的單鏈表結構進行連接,將每個設備對象的指針存放在容器PointVector中,將PointVector設計為存放父類指針的容器。以某車站為例,站場部分數據結構如圖6所示。

圖6 站場部分數據結構示意
將道岔、信號機、軌道區段等模塊映射為二叉樹中的基本節點單元,繪制完成的設備自動進行連接,并添加模塊化聯鎖軟件操作按鈕和操作表示燈,生成模塊化聯鎖軟件人機交互界面。仍以上述某車站為例,在圖4所示繪制界面中,將聯鎖軟件表示層繪制完成后,自動生成模塊化聯鎖軟件的人機交互界面,如圖7所示。

圖4 模塊化聯鎖軟件繪制界面

圖7 模塊化聯鎖軟件人機交互界面
進路是車站內列車或調車車列在兩個地點之間運行的路線,由若干控制列車運行的設備(如道岔、信號機、軌道區段)組成。進路搜索根據進路的始端、終端(或始端、終端和變更按鈕),將組成進路的所有設備對應的節點搜索出來。
將道岔、信號機、軌道區段這3個模塊中每個對象的指針統一存放在PointVector容器中時,由于PointVector被設計為存放父類指針的容器,子類對象的指針將被隱式轉換為父類指針(子類對象可轉換成父類對象),可能導致進路在搜索完成后,搜索出的各設備的指針不能調用其所屬類中的自身的操作(即子類對象不能轉換為父類對象)。因此,本文利用面向對象的程序設計中的多態思想,用父類指針指向各設備對象,再將每個設備對應的父類指針存儲到PointVector容器中。
采用遞歸算法實現進路搜索[12],根據遞歸算法的實現條件,進路搜索函數SearchPoint可分為搜索保存部分和遞歸出口條件部分。
2.2.1 搜索保存部分
搜索保存部分指在保證節點不為空且未找到目標節點指針的情況下,按根節點、右子樹和左子樹(或根節點、左子樹和右子樹)的順序依次進行搜索并保存節點指針至父類指針容器PointVector中。在搜索左子樹之前,從父類指針容器尾部開始刪除各模塊中設備節點指針至根節點(不包括根節點),剔除進路外的無關節點指針。
2.2.2 遞歸出口條件部分
遞歸出口條件分以下兩種情況。
(1)當進路中無變更按鈕時,進路的始、終端對應的設備節點指針將作為進路搜索函數的參數進行搜索。在搜索到尾節點仍未搜索到目標節點時,保存該尾節點指針至PointVector,并讓搜索函數返回;搜索到目標節點時,將搜索標識FindPoint置為true,保證搜索函數在返回過程中不會繼續保存或刪除容器PointVector中已存在的節點指針,再將搜索函數返回。
(2)當進路中有變更按鈕時,可將始端、變更按鈕和變更按鈕、終端兩組設備節點指針依次作為進路搜索函數的參數,逐次進行搜索。
以圖7中舉例站D1—IIG調車進路的進路搜索過程為例,采用遞歸算法進行進路搜索的軌跡如圖8所示,PointVector中節點指針變化如表1所示。在本次搜索中,共進行了7次遞歸調用。

圖8 舉例站D1—IIG調車進路搜索軌跡

表1 PointVector中節點指針變化
傳統聯鎖軟件設計方法要求先設計聯鎖表,并對大量聯鎖數據進行手動配置,聯鎖表由設計單位設計,聯鎖數據由設備廠家配置,兩項內容的設計和交接消耗了大量時間和人力。本文所提聯鎖軟件設計方法將設備進行模塊化處理,使用拖動方式完成聯鎖軟件表示層繪制,軟件即可自動生成二叉樹數據,建立數據連接,完成進路搜索,得到最終的模塊化聯鎖軟件,省去了大量時間。
以圖7中舉例站為例,使用本文所提方法和傳統方法設計聯鎖軟件,所需時間如表2所示。
由表2可知,本文所提設計方法在聯鎖表設計及聯鎖數據配置與生成兩項上節省了大量時間,總時間節省了約30%。

表2 聯鎖軟件設計所需時間對比
本文設計了一種基于遞歸算法的模塊化計算機聯鎖軟件,將不同的設備設計為不同的程序模塊,實現在軟件里拖動相關模塊完成聯鎖軟件表示層的繪制,并利用二叉樹和遞歸算法完成數據結構的建立、進路搜索。該模塊化計算機聯鎖軟件設計方法擺脫了傳統聯鎖軟件需要手動配置大量聯鎖數據和設計聯鎖表的困擾,節省了大量時間,提高了設計效率。