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