王躍華,楊成建,楊 揚
( 1.西南交通大學信息科學與技術學院, 成都610031;2.北京通號國鐵城市軌道技術有限公司,北京100073 )
隨著我國鐵路事業的發展和科學技術的進步,逐步形成了今天的現代鐵路信號系統。其中的計算機聯鎖系統應用廣泛,但是目前國內投入使用的計算機聯鎖都是從繼電集中聯鎖過渡發展起來的,其與室外信號設備的接口仍采用繼電器電路來完成。因而繼電控制電路的設計在信號設計中占有很大的比重,繼電電路的設計能力也需要不斷提高。
目前,主要是利用AutoCAD軟件進行繼電電路設計,但這種設計方法有一定的缺陷:(1)通過傳統AutoCAD來進行信號設備繼電器接口電路設計,電路是否滿足需求,需要由設計人員人工檢查來完成,缺少對應的輔助分析工具,效率低;(2)當信號設備繼電器接口電路發生變更時,涉及到大量的變更設計,以及對變更設計的校驗,且都由人工來完成,效率低且容易出錯。
因此,本文就是針對繼電控制電路計算機輔助設計現存的缺陷,開發出一套滿足需求且方便易用的繼電電路設計及仿真軟件。
現今的計算機聯鎖系統是一種以計算機為主要技術手段、配合繼電集中聯鎖硬件的計算機聯鎖系統。其底層核心系統仍為繼電控制電路,采用繼電聯鎖原理來控制鐵路現場設備的正確工作。
目前,設計人員主要是利用AutoCAD軟件進行繼電電路設計,但存在著前面已經提到的一些缺陷。信號設計人員的設計方式沒有根本性變化,仍然停留在人工主導分塊設計的模式,效率也沒有得到根本性提高。本文所研究的計算機輔助仿真系統,可以有效的解決這些問題。
對繼電電路的仿真是利用VC++軟件完成對鐵路信號繼電電路的計算機輔助設計,繼電控制電路的繪制和完整顯示;繼電器、電容、電阻等元器件的屬性都包含在顯示圖中;設計完成后可以對繼電電路進行仿真,以達到繼電控制電路合理、符合電路邏輯、符合安全可靠性的原則;如果電路中出現元器件不合理或者電路邏輯錯誤,通過對電路的仿真即能發現問題方便修改繼而完成設計,而不用像傳統設計那樣等到設計完成后再去修改電路,大大節省了工作量。本文主要以調車信號機點燈電路為例來進行說明。
通過對電路圖的分析,軟件繪制繼電電路可以分為以下幾個步驟進行:
(1)應生成以線跟點為基本框架的線路框圖,兩條電路之間以線連接,以保證兩條線路在仿真的時候是聯通的不存在斷路。這一步對整個電路框架就有了一個基本的描述。
(2)可以建立一個圖形元素庫,將電路中的主要元器件圖形制成模塊的形式存儲如圖1。

圖1 繼電電路圖元設計模塊
要添加圖形元器件的時候有兩種方法:(1)可以利用創建工具欄圖標,然后拖動到線路上的方式添加。但是此種方法對于每個元器件是否在線路上要做一個判斷,否則在仿真就遍歷整個電路的時候就無法遍歷到這個元器件,而整個電路的元器件非常多,所以整個過程很復雜而且不利于實現。(2)本文采用鏈表的形式,以線路的兩端作為鏈表的頭尾節點,直接在這條線路添加右鍵屬性菜單插入元器件,同時將地址與ID保存在線路鏈表的數組里,為后面的仿真提供了很大的方便。
在繪制繼電電路圖的過程中,也要根據情況編輯設備圖元,使之更符合電路的要求。系統中對圖元元器件的編輯包括圖元的選取、移動、刪除和添加屬性功能。
對于一個完整的繪圖系統來說,用戶能夠自如的對圖元進行交互式操作,首先要實現圖形選中功能。對圖元的移動、刪除等操作都是建立在選取基礎上的。本文以最基本的直線選取為例子進行說明如圖2。

圖2 選取直線流程圖
在繪圖或者修改過程中需要對某些部件進行刪除,當圖元選中功能實現了以后,圖元的刪除功能就容易實現了。在繪制的過程中所有圖形的基點、類型、屬性等都被保存在這個圖元的鏈表節點內存中,當需要刪除的節點被選中的時候,就將其儲存在內存中的內容全部刪除,同時也將這個節點刪除。
而對圖元的移動不僅要移動其在屏幕上的位置,還要更新在內存中的地址,移動某一圖元后,需要將其類型、坐標等基本屬性在內存中進行更新。另外除了對圖元的選取、刪除及移動,還有畫圖所必須的窗口滾動以及重繪功能。在繪制圖形過程中,當圖形在窗口中不能完整顯示時,可以通過滾動條來瀏覽整個窗口中的內容。增加滾動條要求CView類繼承CScrollView類。在OnInitial-Update()函數中設置滾動窗口的大小,用SetScrollSizes函數完成滾動窗口的設置。具體代碼如下:
Void CanView::OnInitialUpdate()
{
………
Csize SizeTotal;
SizeTotal.cx=…;
SizeTotal.cy=…;
SetScrollSizes(MM_TEXT,SizeTotal);
}
添加滾動條后,當拖動滾動條時,會發現窗口上繪制的圖形消失了,或者當窗口尺寸發生變化時,圖形也會消失,這就需要通過重繪窗口來更新窗口的信息,MFC提供了3個函數用于窗口重繪:
InvalidateRect(&Rect)
Invalidate()
UpdateWindow()不管是窗口滾動還是窗口大小發生改變都要去調用WM_PAINT消息,在程序中做重繪是在OnDraw函數中進行的,在OnPoint函數中進行的,然后在OnPoint函數中調用OnDraw函數,具體實現代碼如下:
Void CanView::OnPoint()
{
………
CDC* Pdc=GetDC();
OnPrepareDC(pDC);
OnDraw(pDC);
}
在繼電電路中,圖元元器件的種類有很多,例如繼電器線圈的種類、類型及線圈的接點都要表示清楚,所以在完成對繼電電路的繪制之后,利用程序實現雙擊元器件彈出屬性欄,為元器件添加屬性。
生成進站信號機點燈電路圖并添加元器件屬性后,對電路圖進行仿真。仿真主要采用接通徑路法(接通公式法)用來描述繼電器勵磁電流的徑路,即由電源正極經繼電器接點、線圈及其他器件流向電源負極的回路。先前生成繼電電路的時候已經把所有的元器件都作為鏈表接點存放在創建的鏈表中,所以仿真的算法采用先根遍歷,即以二叉樹鏈表的一的個節點作為樹的根節點,存儲結構利用“孩子-兄弟表示法”。在這種鏈表式存儲結構中,鏈表中的一個節點代表在樹中的一個節點,除了信息域外,另外還有2個指針域分別指向該節點的第一個孩子節點和下一個兄弟節點。這樣就相當于將樹轉化為了二叉樹,就可以采用二叉樹的二叉鏈表進行遍歷,對我們的工作帶來了很大的便利。
同樣,在電路出現2個以上分支的時候,采用父節點-子節點的方法,有幾條分支就有幾個子節點,然后利用上述方法也轉化成二叉樹鏈表。在編寫程序的時候,還需要加一個判斷域,防止重復遍歷,使得仿真程序更有效率。

圖3 繼電器電路以及對應的二叉樹
如圖3,以調車信號機的電路為例說明,這里為了方便說明,將各個元器件分別編號為A-P。
左邊KZ的電路為一個二叉樹的鏈表,以A為根節點,采用二叉樹鏈表的前序遍歷,即:先訪問根節點,再前序遍歷左子樹,前序遍歷右子樹,若二叉樹為空則遍歷結束。二叉樹的前序序列為A、B、C、D、E、F、J、H、I、J。
右邊的KF的電路作為另一個二叉樹的鏈表,同樣是以N為根節點,但是由于電路的走向,采用的是二叉樹鏈表的后續遍歷,即:后序遍歷左子樹,后序遍歷右子樹,最后再訪問根節點,若二叉樹為空則遍歷結束。二叉樹的后序序列為P、M、L、K、O、N。
電路仿真效果圖如圖4所示。
在仿真完成之后,就可以根據電路圖各個元件的工作情況,判斷電路圖的不合理處,以便于后期設計人員修改。

圖4 仿真電路效果
本文介紹了繼電電路設計在信號設計中的重要性,研究了繼電電路仿真在繼電電路設計中所起的關鍵作用,并通過軟件設計實現。系統采用VC++6.0編程工具繪制繼電電路圖,并利用數據結構提供的仿真算法對完成后的電路進行了仿真,為繼電電路的設計改造提供了很大的方便。但是也存在一些不足之處,例如,本文是以進站信號機點燈電路為例說明,在所有的繼電電路中某些元器件有很多種不同的種類,這就要求軟件必須不斷的改進,需要進一步研究與改善。
[1] 趙志. 計算機輔助設計在微機聯鎖中的應用[J] .電氣化鐵道,1999(4).
[2] 李于劍. Visual C++實踐與提高圖形圖像編程篇[M] . 北京:中國鐵道出版社,2001.
[3] 王永信. 車站信號自動控制[M] . 北京.中國鐵道出版社. 2009.
[4] 繆淮扣,顧訓穰,沈俊. 數據結構:C++實現[M] . 北京:科學出版社,2002.