作者:吳江,郭秀清 來源:微型機與應用2012年第17期 摘 要: 進路自動排列(ARS)能夠大大減輕操作員的工作量,提高列車運行效率。以上海地鐵5號線列車自動監控仿真系統(ATS)為例,通過對其自動進路排列設計進行分析,結合標準模板庫STL給出了一種進路搜索算法,并在這種算法的基礎上提出了一種自動排列進路的方法,較好地實現了進路的自動排列功能。 近年來,軌道交通快速進入高速期,成為帶動經濟增長的重要因素。列車自動監控系統(ATS)是一種智能化自動監控系統,對ATS系統能否進行正確的操作,將影響到列車能否安全運行。這對軌道交通運營管理人員的后勤培訓提出了很高要求,因此ATS仿真系統應運而生。 若ATS仿真系統采用人工排列進路,對操作員的業務素質將會提出很高要求,而且操作量大、效率低。而自動進路排列功能的實現將大大降低操作員的工作量,減小失誤率,提高ATS系統的效率。 1 自動進路排列的設計 自動進路排列的工作原理為:當一列車步進到一個特別配置的軌道區段時,即觸發排列下一條進路的指令。這些特別配置的軌道區段被稱為“運營觸發點”,運營觸發點接近于即將被排列的進路。列車的位置可由列車追蹤功能獲取,因為事先已經把進路的信息保存在文件中,下一條進路即可以從文件中獲取;然后將進行進路一致性檢查。如果檢查表明,沒有理由不排列該進路,就向系統聯鎖模塊發出一個指令,鎖定進路中元素;最后進行進路排列檢驗,若沒有問題,則開放始端信號燈。進路自動排列ARS(Automatic Route Setting)請求處理步驟如圖1所示。 ![]() 1.1 運營觸發點處理 在運營觸發點的處理上,選擇一條進路的最后一條區段為下一條進路的運營觸發點,如圖2中進路X905~X1006,下一條進路的運營觸發點就是這條進路的最后一條區段G1175。當判斷列車到達G1175后,則發送要求排列下一條進路的指令。 運營觸發點需要擁有一定的信息(如觸發點觸發的有效方向),本文把這部分信息采用XML純文本存儲。XML是一種簡單的數據存儲語言,使用一系列簡單的標記描述數據,層次結構清晰,易于讀寫與共享。 下面是運營觸發點的數據結構,采用XML純文本保存。 其中,標記 1.2 進路的選定 在運營觸發之后,ARS功能將為這一列車選定擬排列的進路。從圖2中可以看出,若從X905排列一條上行進路,這條進路是存在并且是唯一的,依次經過G1151區段,G1175區段到X1006。但若從X1002出發排列一條進路,進路雖然存在但卻不是唯一的,分別為經過1002道岔反位,然后接1004道岔反位,經G1281區段到達信號燈X1003和經過1002道岔定位,再通過G1278區段到達信號燈X1007,因此僅一個始端信號燈還不足以構成選定一條進路的條件。為此,需要從列車追蹤功能傳輸出來的車次號中獲取列車的目的地代碼,從而獲取列車運行方向。 在確定了始端信號燈(觸發后可獲取,見圖6中各表關系)和列車運行方向后,為了能夠讓進路搜索程序搜索到符合條件的進路,可以建立一個適合搜索的并且能夠真實形象地反映現實路線結構的數據結構。可以構建一棵二叉樹來表示信號機與它的直接鄰居之間的連通關系。每個信號機均構建一棵二叉樹,然后把整個站場的所有信號機構建的二叉樹組織起來。若把上例中信號燈X905和X1002的二叉樹建立起來,其結果如圖3所示。 ![]() 圖中橢圓表示信號燈,矩形表示軌道或道岔,圖3(a)表示道岔,圖3(b)表示軌道。在圖2中,假設進路從X1002出發,終點站為B,則進路的選定存在以下幾種情況: (1)若全部軌道正常,那么從X1002結合方向搜索,會建立到X1007的進路。 (2)若存在以下的特殊情況,從X1002→X1007的進路不能正常建立,則ARS將改變進路的選定。 ①若進路中存在長期障礙,阻止了正常進路的自動排列。如圖2中1002道岔被鎖定在反位狀態,正常的進路X1002→X1007將不能建立,此時進路自動排列功能將會去變更進路,并將訪問圖3(a)子樹,選定從X1002經1002道岔反位,接1004道岔反位,通過G1281區段到達信號燈X1003這條進路,然后經1003道岔反位到終點B。 ②若進路中存在短期障礙,比如此時G1278上正好被占用(如停著一輛車),正常的進路排列被阻止,那么自動排列功能將試圖排列越行進路,同樣會去訪問圖3(a)子樹,選定從X1002經1002道岔反位,接1004道岔反位,通過G1281區段到達X1003這條進路。 (3)若道岔1002出現了故障,進路將不能排列。 若把圖3中進路的路徑抽取出來,則很容易就得到優化二叉樹,如圖4所示。 ![]() 由圖4提取信息,可以建立每條進路的數據存儲結構。本設計采用XML來存儲每條進路的結構信息,下面是X1002→X1007的進路用XML保存的數據結構。 其中, 1.3 進路一致性檢查 在進路選定后,接下來即進行進路的一致性檢查。進路一致性檢查的目的是要防止不能被執行的指令被傳送至聯鎖。進路一致性檢查包括如下步驟: (1)檢查請求是否已被執行 如果擬排進路的始端信號機已處于開放狀態,說明操作員已經為列車人工排列了進路,ARS功能會中止此ARS請求,并記錄該操作。如圖2中,若已經在步驟2中選定了進路X1002→X1007,那么此時就應該檢查一下此進路有沒有已經被排列。若之前已經被操作員手動排列了進路,則此時這條進路就不需再自動排列了。 (2)檢查指令輸出是否存在短期障礙 為此,需調查擬排進路的始端與終端要素之間的所有軌道要素以判斷是否其中某個元素存在障礙。 1.4 發送聯鎖指令 在進路可用性檢查成功后,即可輸出聯鎖指令。發送聯鎖指令將鎖定進路中的道岔、區段和交叉,以防再被其他進路征用。 首先,系統檢查該列車是否仍在擬排定進路的接近區段。如果列車已不在擬排定進路的接近區段,ARS將中止此ARS請求;如果列車仍在擬排進路的接近區段,則排列該進路的指令將送至相應的聯鎖。ARS功能只把下一個進路排列指令傳送到該聯鎖,只要它已經接收到對此進路排列請求的肯定確認。 1.5 排列檢查 指令輸出之后,自排進路功能等待來自計算機聯鎖控制系統的肯定確認。作為肯定確認,對每條進路來說就是開放始端信號機。只要信號機一開放,該ARS請求立即終止。 經過以上5步后,進路的自動排列已經基本完成。圖5為進路自動排列流程圖。 ![]() 2 自動進路排列的軟件實現 將信號燈、區段、道岔的信息用類似XML數據結構存儲,每類軌道元素都分別存放在各自的XML表中,這樣就存在5份XML表,在本設計中,本質上XML就充當了一個小型數據庫的角色。表1為各個軌道元素在XML中的存儲信息。 在開發過程中,需要讀取保存在XML中的軌道元素的信息,因此設計中對應XML中軌道元素的信息為每個軌道元素都建立了一個封裝類,如Switch封裝類結構如下: class Route { public: Route(CString ID,CString Name,CString StartSignal,CString ZDXH,RouteQDArray RouteBlocks,RouteDCInfoArray DCInfo); ~Route(); CString m_ID; CString m_Name; //進路名 CString m_StartSignal; //始端信號燈名 CString m_ EndSignal; //終端信號燈名 RouteQDArray m_RouteBlocks; //因為一個進路中 //可能有很多區段,所以保存在數組 RouteDCInfoArray m_DCInfo; //道岔,同樣保存在數組中 Bool m_faultflag; //故障標志 …… }; 把保存在XML表中的軌道元素信息用XML解析類CMarkUp解析后,用解析出來的各軌道元素存儲信息去構造一個對應的類。因為線路圖中存在很多信號燈、區段等軌道元素,而每一個都對應著自己的一組信息,也就是每一個元素都可以構造一個類,很好地實現了XML數據與對應類的綁定。為了方便查詢和使用,把相同軌道元素的類保存在STL的Vector數組中,這樣就分別有運營觸發點、進路、道岔、區段、信號燈5個Vector數組。每一類軌道元素都是相互聯系的,因此,在程序中需要通過一類元素獲取到另一類的信息(如需要查詢始端信號燈StartSignal獲取到一條進路Route)。圖6所示為5個軌道元素的XML表聯系圖。 ![]() 圖中,矩形表示各個XML表,橢圓形表示XML表的某個軌道元素的其中某個存儲信息。兩個XML的聯系就是通過尋找某個有相同的某個存儲信息來實現的。如Owner和JJAxle,因為每個Trigger都對應著一個擁有區段,因此可以用此區段去對比Signal表中的JJAxle信息。若找到此信息相同,即可找到下一條進路的始端信號燈。根據以上的軌道元素數據結構和XML表聯系圖,給出選定進路的偽碼算法如下: Function SearchNextRoute(……) { Then OwnerAxle=GetOwnerQD() //當符合觸發條件 //后,從列車跟蹤模塊獲取列車所在的區段, //即觸發點擁有區段OwnerAxle XHIterator=FindSignal(OwnerAxle) //利用獲取的 //OwnerAxle作為JJAxle去查找Signal數組Vector中 //查找到相應的關聯類,返回這個類的迭代器 If(XHIterator=SignalVector.end)then ruturn; //如果未找到,則返回 RouteIterator=FindRoute(*(XHIterator)->SignalName) //利用上面查找到的信號燈類獲取此信號燈的名字 //然后以此為關鍵字查找進路,返回進路的迭代器 If(RouteIterator =RouteVector.end)then ruturn; //如果未找到進路,則返回 AxleIterator=FindAxle(*(RouteIterator)->Axle) SwitchIterator=FindSwitch(*(RouteIterator)-> Switch) //利用查找到的進路類獲取此進路中的道岔、區段、 //獲取到它們相應的類。這兩個類的獲取主要用于 //后面的進路一致性檢查和區段,道岔的鎖定 } 在以上偽碼中,最重要的就是查找算法。本文很好地利用了STL的非變異算法find_if來查找進路元素。 因為要每隔一定時間就去判斷列車運行距離來判斷列出是否到運營觸發點,所以在定時 器響應函數來判斷是否去開放下一條進路,這樣通過定時器的方法也就達到了進路自動開放的效果。自動排列進路源碼如下: Function OnTime(……) { If(Direct&&Location) //判斷方向和列車位置有沒有到觸發點 linRet=SearchNextRoute() //如果到達觸發點,則查找下一條進路 if(linRet) linRet1=CheckValid() //若查找到進路,則進行一致性檢查 if(linRet1) linRet2=LockGDElement()//一致性檢查沒問題, //則發送聯鎖指令,鎖定軌道元素 if(linRet2) linRet=OpenSignal()//都沒問題后,則開放信號燈 } 通過以上方法,順利地實現了列車進路自動排列,在所截取上海地鐵5號線的部分線路圖上實現結果如圖7所示。 ![]() 由圖中可以看出,當列車開進區段G1278,并未人工開放進路,下一條進路就被正確地開放了,證明了本文所提出的方法的有效性。 本文提出了一個ATS仿真系統的自動進路排列的方案,闡述了自動進路排列的大體過程。在這個過程中,進路的選定尤為重要,應用自動進路排列,可減輕操作員的勞動量和減少出錯率,提高系統的運行效率,從而可以有效地提高培訓效率。 參考文獻 [1] 潘國梅,梅登華.廣州地鐵微機聯鎖仿真培訓系統進路排列、聯鎖和進路解鎖算法及實現[J].裝備制造技術,2007(8):82-84. [2] 王野,郭秀清.基于組件技術的列車自動監控仿真系統開發平臺[J].計算機應用,2007,27(S2):286-288. [3] 趙根苗,陳永生.基于三層分布式架構的列車自動監控仿真培訓系統的分析與設計[J].微型電腦應用,2003,19(12):35-37. |