張睿 董伊龍 張豪福 尚慶松
(河南工業大學電氣工程學院,河南 鄭州 450001)
計算機聯鎖是保證車站作業安全、提高車站通過能力的一種信號系統,隨著軌道交通的不斷建設,車站計算機聯鎖系統得到了空前的發展,對信號專業的學生了解和學習計算聯鎖技術也變得尤為重要[1]。然而傳統單機版計算機聯鎖仿真系統只能模擬站場且站場改建后無法對仿真系統及時修改,影響培訓效果。對于計算機聯鎖教學,需要一種可多人參與培訓,又能對站場進行仿真,同時還能反映現場設備狀態,并需要隨著站場改建的同時可做出相應修改,部署和實施成本較低的仿真系統[2]。
本文采用Web 技術實現計算機聯鎖系統培訓,使學生不再掣肘于空間與時間。可以時時進行計算機聯鎖的仿真學習。降低學習成本,提升學習效率。擺脫了硬件仿真,則教學系統可以幾近于零成本地部署在各處的服務器上,降低了安裝部署的成本。
系統設計內容除滿足計算機聯鎖系統的基本功能:車站圖形渲染、用戶交互、進路操作、車輛模擬等功能的同時,主要考慮教學和培訓需要,進行了車站通用性和聯鎖表自動生成設計。用戶可以自定義車站,車站定義完成后導入系統,系統自動實現計算機聯鎖系統的基本功能和滿足并行多個用戶培訓的能力。系統定義過程簡單易懂,不需要用戶輸入多余的內容。同時采用圖論算法來驅動進路的動態查找。
為提高并發,提升應用性能,系統采用分布式設計,如圖1所示。

圖1 系統架構組織圖
系統采用web 應用層次結構,分為數據訪問層,業務邏輯層,接入層,表現層。數據訪問層采用Rustcrate 作為ORM。業務邏輯層分為Auth、API、Runtime 等數個服務,每個服務都是獨立的應用,可以橫向擴展組成集群。接入層使用Apollo作為網關,向外暴露所有的服務接口。表現層使用Node.js 作為Web 的運行時,使用React 作為GUI 框架。
本系統的元素圍繞實例構成,一個典型的練習和考試實例生命周期由以下幾部分組成:(1)創建車站;(2)用戶創建練習實例;(3)初始化實例;(4)訪問實例;(5)結束實例。
創建好車站后,就可以創建這個車站的實例。實例是用戶與系統交互的直接對象,也是系統的業務核心。一個用戶的一次練習就是一個實例,一個用戶的一次考試也是一個實例。
支持預約開始實例,在開始之前若用戶嘗試在executor 初始化一個實例,就會報錯,當時間到后用戶就可以在創建實例時指定的executor 上初始化實例-executor 從數據庫中讀入實例并運行。實例初始化后用戶就可以在該實例中進行進路車輛的各種操作。最后實例會被結束。
在系統的架構中,runtime 服務的作用是實例運行的容器。其提供了實例運行所需要的環境,一個容器可以同時讓多個實例在其中運行。一個車站可以創造無限個實例,這也是本設計通用性的一大體現。
和練習實例不同之處在于考試是有考題的。同一場考試無論考試有多少,考題都是相同的。通過班級結構,可以在配置考試實例時指定班級,系統自動為班級所有的學生創建配置信息完全相同(即開始時間、結束時間、考題、車站等等)的實例。
正是通過對于考題、車站等配置信息的高效復用以實現通用性的。
API 服務主要負責耦合data 層和view層,上承用戶的請求,下接數據庫,從數據庫讀寫數據并呈遞給前端。在API 服務中,Station 數據是最完備的靜態數據,其直接來源于用戶的輸入。Station 數據直接來源于車站描述文件。API 服務提供車站、實例、考試、用戶和班級四個類型的服務。在此著重介紹車站。
3.1.1 車站屬性。車站屬性從性質上可以分為圖形屬性和邏輯屬性,圖形屬性用于表現層初始化時正確地渲染出車站底平面圖,邏輯屬性用于Runtime 初始化實例時正確地描述車站的拓撲關系和耦合邏輯。只需要輸入可以獨自或和其他屬性一起提供渲染或系統所需信息的車站屬性。也就是一個車站由完整描述車站的最小屬性集合所描述,一個車站是由Signal 和Node構成的,車站屬性從組件上可分為Signal 屬性和Node 屬性。表1 為Node 的屬性,表2 為Signal 的屬性。

表1 Node 屬性

表2 Signal屬性
3.1.2 車站描述文件。車站屬性并非直接存儲于數據庫之中,而是由用戶編寫成車站描述文件,將描述文件存儲在數據庫內。車站描述文件用于描述車站,即使用上述屬性來定義一個車站,車站描述文件作為用戶向的輸入,是用戶唯一定義車站的方式。因此,為兼顧可讀性和文件體積需求,采用JSON作為車站的描述語言。
這里給出一個非典型的車站描述文件作為例子并在注釋中說明上述內容,見圖2。

圖2
運行時是供實例執行的運行時環境,一個運行時可以執行多個實例,所有的實例會被管理在一個HashMap 中。實例在初始化時被插入該HashMap,在結束時移除。
3.2.1 實例。實例是運行時中運行的基本單位,運行時服務的含義就是運行實例的服務。一個實例由某個車站所實例化而來,在運行時中和表現層可以直接與相應的實例進行交互。
3.2.2 狀態對象。狀態對象是狀態機的組件,由Signal(信號機狀態對象),Node(結點狀態對象)組成,狀態對象中保存著相應車站信號設備的實時狀態。
(1)信號狀態。Signal 中的state 屬性表征信號機點燈狀態,其可如表3 所列。

表3 信號機狀態定義表
(2)節點狀態。與信號的狀態類似,結點狀態枚舉參見表4。

表4 軌道區段狀態定義
3.2.3 實例組成。一個實例基本由FSM、topo、layout 三個獨立的部分構成。在實例初始化時會通過Station 信息同時生成這三個部分。
(1)topo。topo保存一個實例所有的拓撲關系,包括車站圖(包含R 關系和S關系),并置信號機映射,差置信號機映射,以及獨立按鈕映射,topo能表征一個實例的各種組件(信號機、節點和按鈕)在聯鎖邏輯上是如何耦合的。通過topo,運行時可以靜態地從車站的拓撲關系上找到一條可能的進路。再通過后續的判斷,來確定這條可能的進路是不是進路。
(2)狀態機(FSM)。FSM即有限狀態機,保存了一個實例所有的狀態對象,包括上述的信號機、節點和車輛,并且管理整個車站的狀態。
(3)布局(Layout)。實例中的布局對象是車站布局的載荷,即在用戶請求車站布局時向表示層發送的車站布局信息。布局在實例初始化時會和狀態機同時生成,在實例初始化時同步計算布局信息并保存,當用戶請求時直接返回布局信息。
3.2.4 獲取實例信息。用戶能從實例上取得的信息,有布局信息、考題信息和狀態信息三種,布局信息和考題信息是靜態的、一次性的。而狀態信息是實時的,動態的。布局信息用來正確地繪制車站的布局,考題信息用于向用戶下達考試實例的題目,狀態信息用來更新車站上信號設備的狀態。布局信息透過布局對象(layout)來傳遞,考試信息通過考試管理器發送,狀態信息透過狀態幀來傳遞。系統的運行時,無論在哪一層,布局和狀態都是無耦合的。這意味著表現層需要單獨地查詢車站的布局和訂閱實例狀態的更新。
3.2.5 實例初始化與運行。無論用戶是想要進行前文提到的請求車站布局或更新車站狀態,最大的一個前提是實例要處于運行狀態。要想運行實例,用戶需要輸入實例ID。而后運行時會通過數據訪問層在Instance 表中查找相應的實例。如果未找到,則說明訪問的實例ID不合法。如果尋到對應的實例,則會驗證實例的相關信息:如果訪問實例的用戶沒有權限(沒有Guest、Player 或Operator 權限),則返回forbidden 禁止訪問。若用戶有權限。那么還需要驗證開始時間。因為在表現層,未滿足開始時間要求的實例根本不會渲染開始入口(相關按鈕)。當一切驗證完成,運行時便會將系統反序列化成RawStation 對象,用數據庫中查到的實例信息,和RawStation 對象在運行時中新建實例。
3.2.6 結束實例。結束實例分為兩種,自動結束和手動結束。對于考試實例而言,可以自動結束或手動結束。對于練習實例則只能手動結束。對于考試實例而言,結束實例時會將考試管理器的問題成績同步至數據庫系統中。對于練習實例沒有什么額外的操作。
3.2.7 搜索進路。在站場中查找路徑中采用了A*算法,將起點和終點輸入,便可能在有向圖R 中找到一條路徑。但這條路徑不一定是我們要找的進路,為了使路徑滿足進路鏈的定義。還需要保證路徑中的所有結點都互相沒有S 關系,即任意兩結點在S圖中都不存在邊。若滿足這一點,則稱這條路徑為“可能的路”。
顯然可能的路比較多,為解決該問題,引入方向約束,方向約束的含義是:對于一條可能進路的始/終端方向必須和欲建立進路的列車行進始/終端方向相同,故而方向約束由兩個約束構成:始端方向約束和終端方向約束。顯然地,欲建立進路的列車行進始端方向總是始端信號機的朝向的反向(稱為信號機的防護方向),在查找進路時我們把站場圖中尋到的路徑成為可能進路。一條可能進路的始終端方向必須同時滿足始端方向約束和終端方向約束,那么這條可能進路才能成為進路。
web 端以deno 為服務器,使用Apollo提供的上下文包裝器和ReactHook 來進行GraphQL通信。主要包括主頁面、車站列表頁面和車站頁面等。
3.3.1 主頁面。主頁面分上下兩部分,上部分為目前最新的實例信息,下部分為本周的實例統計。本頁面會檢索到數據庫中所有的實例,并以表格的形式、以開始時間排序,顯示在最新實例信息中。
3.3.2 車站列表頁面。本頁面中會查詢所有的車站,并顯示其簡要信息:名稱、作者、創建時間。如果某個車站是草稿(draft)則只有作者和管理員能看到該車站。
3.3.3 車站頁面。本頁面是車站的詳細信息頁面,其中展示了該這站的所有信息。包括車站簡介、創建時間、修改時間、作者、是否為草稿,以及車站描述文件。其中車站描述文件采用了可交互的顯示,為JSON增加了代碼高亮、以及層次展開功能。
用戶需要從本頁面新建實例,點擊本頁面上的新建實例按鈕或新建考試按鈕,彈出對話框在對話框中輸入實例名稱、注釋(介紹),選擇實例的運行時和用戶。如此可以創建新實例(圖3)。

圖3 車站頁面
該系統實現了自定義車站、多人參與培訓等功能,既能對站場進行仿真,同時還能反映現場設備狀態,并需要隨著站場改建的同時可做出相應修改和部署,實施成本較低。
采用純web 技術讓計算機聯鎖系統不再掣肘于空間與時間,學生可以處處進行計算機聯鎖的仿真學習。降低學習成本,提升學習效率。擺脫了硬件仿真,則教學系統可以幾近于零成本地部署在各處的服務器上,降低了安裝部署的成本。因此計算機聯鎖邏輯結合網絡技術的應用,在計算機聯鎖培訓領域內是十分重要的發展方向。