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