摘 要: 提出了一種基于定時器的模擬列車運行模塊的設計和實現(xiàn)。重點介紹了模擬列車運行模塊的列車狀態(tài)判斷、列車速度調整、列車位置刷新各個組成部分。
關鍵詞: ATS;仿真系統(tǒng);模擬列車運行模塊;列車狀態(tài)判斷;列車速度調整;列車位置刷新
隨著城市軌道交通迅猛發(fā)展,城軌交通ATS仿真系統(tǒng)成為解決軌道交通運營企業(yè)運營人員培養(yǎng)滯后的有效途徑[1]。目前整個ATS仿真系統(tǒng)主要包括終端顯示模塊、模擬列車運行模塊、ATP模塊、ATS操作模塊、故障設置及處理模塊、教學考評模塊、數(shù)據(jù)存儲和管理模塊等,而模擬列車運行模塊在整個系統(tǒng)中占據(jù)核心地位。以往的ATS模擬列車運行模塊大多是基于多線程,而多線程必須處理好數(shù)據(jù)同步的問題,實現(xiàn)起來存在一定的難度,并且占用系統(tǒng)資源較多。定時器具有實現(xiàn)容易、占用資源小的特點,在一定程度上可以替代多線程。因此,本文提出一種基于定時器的ATS模擬列車運行模塊的設計。
1 模擬列車運行模塊設計
該模塊主要包括三個部分:判斷列車運行狀態(tài)以確定列車是否可以繼續(xù)運行、根據(jù)列車具體運行情況改變列車速度、負責每個微小的時間段按軌道上列車運行的方向刷新列車的位置以模擬列車的行駛過程。以往該模塊都置于一個獨立的線程之中,這樣實現(xiàn)數(shù)據(jù)同步存在一定的難度,并且占用較多的系統(tǒng)資源。本文考慮將此模塊移到定時器函數(shù)中,以降低實現(xiàn)難度并節(jié)省系統(tǒng)資源。該設計以定時時間為單位,每次定時時間到,就判斷此刻列車是否可以繼續(xù)行駛。如果不可以,就等待下一次定時時間的到來,并將當前時間增加1 s;如果可以,接下來就開始調整列車的速度,最后根據(jù)最新的速度計算1 s之內列車需要移動的距離,并在界面上刷新列車的位置,同時將當前時間增加1 s。模塊設計流程如圖1所示。
1.1 列車狀態(tài)判斷
列車運行狀態(tài)標志著列車運行過程中的各個階段以及進路選擇情況,在一般情況下可以正常行駛,正常行駛過程中需要判斷列車是準點、早點還是晚點;而在停站中、進路未選好、到站后等情況下,列車則不可以繼續(xù)行駛。列車運行狀態(tài)判斷部分主要用于下一步確定列車運行速度以及通知模擬列車運行模塊是否需要刷新列車的位置。
1.2 列車速度調整
列車速度調整主要包括3個因素:與先行列車的間隔距離;列車運行的進路情況,包括前方進路是否存在彎道及道岔狀態(tài)等;當前列車運行的準點情況[2]。圖2是一條速度命令控制線[3]。當先行列車在0T區(qū)段,1T必須空閑,后續(xù)列車如果在2T,它收到的限速命令應該為0,即后續(xù)列車在2T的出口端必須停車,并有1T閉塞分區(qū)作為保護距離;若1T、2T空閑,后續(xù)列車在3T,則后續(xù)列車收到的是20 km/h的速度命令。同理,當1T、2T、3T、4T、5T、6T、7T都空閑,運行于8T的后續(xù)列車收到的速度命令為80 km/h??梢娨沽熊囘\行于80 km/h,前方必須有7個閉塞分區(qū)。
根據(jù)線路情況、車輛性能、軌道電路特性等,應進行閉塞設計,劃分合理的閉塞分區(qū),從而產(chǎn)生速度命令控制線,作為速度命令選擇的邏輯依據(jù)。
1.3 列車位置刷新
在上述兩部分都完成的基礎上需要對列車的位置進行刷新,根據(jù)列車的當前速度計算出列車運行的實際運行的距離,以便在界面上能夠反映出模擬列車實際運行的效果。列車位移-速度-時間表達式如下[4]:
S=V×Δt+S′
式中,S表示列車當前位移,V表示列車速度,Δt表示刷新時間間隔,S′表示列車上一次刷新時的位移。另外,列車運行一段距離以后車頭可能會進入一條新的進路,而車尾也可能會出清一個軌道進路,因此,列車位置刷新部分需要在適當?shù)臅r候設置列車占用以及清除列車占用。
2 模擬列車運行模塊的實現(xiàn)
模擬列車運行模塊的實現(xiàn)主要包括以下4個部分:(1)定義列車類。除了一些基本列車屬性以外,需要定義3個主要的函數(shù)分別為:TrainCanMove()、ChangeSpeed()以及Move()。(2)分別實現(xiàn)TrainCanMove()、ChangeSpeed()以及Move()。(3)在OnTimer()中實現(xiàn)圖1所示的模擬列車運行模塊流程。(4)模塊功能的測試和擴展。
2.1 列車類的實現(xiàn)
列車類定義代碼如下:
class Train
{
public:
Train();
~Train();
private:
CString m_TrainName; //列車名字
CString m_TrainNumber; //車次號
CString m_HeadOccupied; //車頭占用區(qū)段或道岔
CString m_TailOccupied; //車尾占用區(qū)段或道岔
CString m_CurrentPlatform; //當前站臺
CString m_LastPlatform; //上一個站臺
CString m_NextPlatform; //下一個站臺
bool m_IsRunning; //列車是否運行
double m_TrainLength; //列車長度
double m_TrainSpeed; //列車速度
double m_TrainLimitSpeed; //列車速度限制
short m_Direction; //方向:0-向右,1-向左
public:
bool TrainCanMove();
void Move(bool CanMoveNext);
bool ChangeSpeed();
}
Train類中,成員函數(shù)TrainCanMove()用于判斷當前時刻列車是否可以繼續(xù)運行,ChangeSpeed()用于調整列車速度,Move()用于刷新列車的當前位置。
2.2 OnTimer函數(shù)的實現(xiàn)
OnTimer實現(xiàn)代碼如下:
void CMainFram::OnTimer(UINT_PTR n_IDEvent)
{
switch(n_IDEvent)
{
Case 100:
{
KillTimer(100);
SetTimer(100,1000/allTableList.TimeRate,
NULL);
for(int i=0;i<allTrainMax;i++)
{
if(allTrain[i].TrainCanMove())
allTrain[i].Move(allTrain[i].
ChangeSpeed());
}
allTableList.NowTime=allTableList.NowTime+1;
}
default:
break;
}
CFrameWnd(n_IDEvent);
}
定時器參數(shù)的單位為ms,也就是說OnTimer每1000/allTableList.TimeRate ms被調用一次,相當于現(xiàn)實中的1 s,這樣就可以通過改變allTableList.TimeRate的值來調整仿真的速度。allTableList.TimeRate的值越大仿真的速度越快;反之仿真的速度越慢。當allTableList.TimeRate等于1時,仿真時間和現(xiàn)實中的時間相等。
2.3 開發(fā)實例
該設計具有普遍的適用性,并且成功運用在上海地鐵5號線ATS仿真系統(tǒng)以及上海地鐵8號線ATS仿真系統(tǒng)中。圖3和圖4分別為5號線、8號線ATS仿真系統(tǒng)運行界面。
本文提出了一種基于定時器的模擬列車運行模塊的設計和實現(xiàn),同時將該模塊成功應用于上海地鐵5號線、8號線的ATS仿真系統(tǒng)中。與以往基于多線程的設計相比,本設計實現(xiàn)容易,且占用較少的系統(tǒng)資源。
參考文獻
[1] 趙根苗,陳永生.ATS仿真培訓系統(tǒng)的設計與實現(xiàn)[J].城市軌道交通研究,2004,7(1):55-57.
[2] 姜軍紅,李一凡,黃沙白.輕軌交通調度監(jiān)控系統(tǒng)的仿真[J].計算機仿真,2001,18(6):49-52.
[3] 李曉月.上海地鐵一號線的車載信號系統(tǒng).鐵道運營技術,1998,4(4):172-177.
[4] 惠天舒.分布式交互仿真技術綜述[J].系統(tǒng)仿真學報,1998,10(1):1-7.
[5] 上海地鐵一號線的車載信號系統(tǒng)[J].鐵道運營技術,1998,4(4):172-177.