王躍華,楊成建,楊 揚
( 1.西南交通大學(xué)信息科學(xué)與技術(shù)學(xué)院, 成都610031;2.北京通號國鐵城市軌道技術(shù)有限公司,北京100073 )
隨著我國鐵路事業(yè)的發(fā)展和科學(xué)技術(shù)的進(jìn)步,逐步形成了今天的現(xiàn)代鐵路信號系統(tǒng)。其中的計算機聯(lián)鎖系統(tǒng)應(yīng)用廣泛,但是目前國內(nèi)投入使用的計算機聯(lián)鎖都是從繼電集中聯(lián)鎖過渡發(fā)展起來的,其與室外信號設(shè)備的接口仍采用繼電器電路來完成。因而繼電控制電路的設(shè)計在信號設(shè)計中占有很大的比重,繼電電路的設(shè)計能力也需要不斷提高。
目前,主要是利用AutoCAD軟件進(jìn)行繼電電路設(shè)計,但這種設(shè)計方法有一定的缺陷:(1)通過傳統(tǒng)AutoCAD來進(jìn)行信號設(shè)備繼電器接口電路設(shè)計,電路是否滿足需求,需要由設(shè)計人員人工檢查來完成,缺少對應(yīng)的輔助分析工具,效率低;(2)當(dāng)信號設(shè)備繼電器接口電路發(fā)生變更時,涉及到大量的變更設(shè)計,以及對變更設(shè)計的校驗,且都由人工來完成,效率低且容易出錯。
因此,本文就是針對繼電控制電路計算機輔助設(shè)計現(xiàn)存的缺陷,開發(fā)出一套滿足需求且方便易用的繼電電路設(shè)計及仿真軟件。
現(xiàn)今的計算機聯(lián)鎖系統(tǒng)是一種以計算機為主要技術(shù)手段、配合繼電集中聯(lián)鎖硬件的計算機聯(lián)鎖系統(tǒng)。其底層核心系統(tǒng)仍為繼電控制電路,采用繼電聯(lián)鎖原理來控制鐵路現(xiàn)場設(shè)備的正確工作。
目前,設(shè)計人員主要是利用AutoCAD軟件進(jìn)行繼電電路設(shè)計,但存在著前面已經(jīng)提到的一些缺陷。信號設(shè)計人員的設(shè)計方式?jīng)]有根本性變化,仍然停留在人工主導(dǎo)分塊設(shè)計的模式,效率也沒有得到根本性提高。本文所研究的計算機輔助仿真系統(tǒng),可以有效的解決這些問題。
對繼電電路的仿真是利用VC++軟件完成對鐵路信號繼電電路的計算機輔助設(shè)計,繼電控制電路的繪制和完整顯示;繼電器、電容、電阻等元器件的屬性都包含在顯示圖中;設(shè)計完成后可以對繼電電路進(jìn)行仿真,以達(dá)到繼電控制電路合理、符合電路邏輯、符合安全可靠性的原則;如果電路中出現(xiàn)元器件不合理或者電路邏輯錯誤,通過對電路的仿真即能發(fā)現(xiàn)問題方便修改繼而完成設(shè)計,而不用像傳統(tǒng)設(shè)計那樣等到設(shè)計完成后再去修改電路,大大節(jié)省了工作量。本文主要以調(diào)車信號機點燈電路為例來進(jìn)行說明。
通過對電路圖的分析,軟件繪制繼電電路可以分為以下幾個步驟進(jìn)行:
(1)應(yīng)生成以線跟點為基本框架的線路框圖,兩條電路之間以線連接,以保證兩條線路在仿真的時候是聯(lián)通的不存在斷路。這一步對整個電路框架就有了一個基本的描述。
(2)可以建立一個圖形元素庫,將電路中的主要元器件圖形制成模塊的形式存儲如圖1。
圖1 繼電電路圖元設(shè)計模塊
要添加圖形元器件的時候有兩種方法:(1)可以利用創(chuàng)建工具欄圖標(biāo),然后拖動到線路上的方式添加。但是此種方法對于每個元器件是否在線路上要做一個判斷,否則在仿真就遍歷整個電路的時候就無法遍歷到這個元器件,而整個電路的元器件非常多,所以整個過程很復(fù)雜而且不利于實現(xiàn)。(2)本文采用鏈表的形式,以線路的兩端作為鏈表的頭尾節(jié)點,直接在這條線路添加右鍵屬性菜單插入元器件,同時將地址與ID保存在線路鏈表的數(shù)組里,為后面的仿真提供了很大的方便。
在繪制繼電電路圖的過程中,也要根據(jù)情況編輯設(shè)備圖元,使之更符合電路的要求。系統(tǒng)中對圖元元器件的編輯包括圖元的選取、移動、刪除和添加屬性功能。
對于一個完整的繪圖系統(tǒng)來說,用戶能夠自如的對圖元進(jìn)行交互式操作,首先要實現(xiàn)圖形選中功能。對圖元的移動、刪除等操作都是建立在選取基礎(chǔ)上的。本文以最基本的直線選取為例子進(jìn)行說明如圖2。
圖2 選取直線流程圖
在繪圖或者修改過程中需要對某些部件進(jìn)行刪除,當(dāng)圖元選中功能實現(xiàn)了以后,圖元的刪除功能就容易實現(xiàn)了。在繪制的過程中所有圖形的基點、類型、屬性等都被保存在這個圖元的鏈表節(jié)點內(nèi)存中,當(dāng)需要刪除的節(jié)點被選中的時候,就將其儲存在內(nèi)存中的內(nèi)容全部刪除,同時也將這個節(jié)點刪除。
而對圖元的移動不僅要移動其在屏幕上的位置,還要更新在內(nèi)存中的地址,移動某一圖元后,需要將其類型、坐標(biāo)等基本屬性在內(nèi)存中進(jìn)行更新。另外除了對圖元的選取、刪除及移動,還有畫圖所必須的窗口滾動以及重繪功能。在繪制圖形過程中,當(dāng)圖形在窗口中不能完整顯示時,可以通過滾動條來瀏覽整個窗口中的內(nèi)容。增加滾動條要求CView類繼承CScrollView類。在OnInitial-Update()函數(shù)中設(shè)置滾動窗口的大小,用SetScrollSizes函數(shù)完成滾動窗口的設(shè)置。具體代碼如下:
Void CanView::OnInitialUpdate()
{
………
Csize SizeTotal;
SizeTotal.cx=…;
SizeTotal.cy=…;
SetScrollSizes(MM_TEXT,SizeTotal);
}
添加滾動條后,當(dāng)拖動滾動條時,會發(fā)現(xiàn)窗口上繪制的圖形消失了,或者當(dāng)窗口尺寸發(fā)生變化時,圖形也會消失,這就需要通過重繪窗口來更新窗口的信息,MFC提供了3個函數(shù)用于窗口重繪:
InvalidateRect(&Rect)
Invalidate()
UpdateWindow()不管是窗口滾動還是窗口大小發(fā)生改變都要去調(diào)用WM_PAINT消息,在程序中做重繪是在OnDraw函數(shù)中進(jìn)行的,在OnPoint函數(shù)中進(jìn)行的,然后在OnPoint函數(shù)中調(diào)用OnDraw函數(shù),具體實現(xiàn)代碼如下:
Void CanView::OnPoint()
{
………
CDC* Pdc=GetDC();
OnPrepareDC(pDC);
OnDraw(pDC);
}
在繼電電路中,圖元元器件的種類有很多,例如繼電器線圈的種類、類型及線圈的接點都要表示清楚,所以在完成對繼電電路的繪制之后,利用程序?qū)崿F(xiàn)雙擊元器件彈出屬性欄,為元器件添加屬性。
生成進(jìn)站信號機點燈電路圖并添加元器件屬性后,對電路圖進(jìn)行仿真。仿真主要采用接通徑路法(接通公式法)用來描述繼電器勵磁電流的徑路,即由電源正極經(jīng)繼電器接點、線圈及其他器件流向電源負(fù)極的回路。先前生成繼電電路的時候已經(jīng)把所有的元器件都作為鏈表接點存放在創(chuàng)建的鏈表中,所以仿真的算法采用先根遍歷,即以二叉樹鏈表的一的個節(jié)點作為樹的根節(jié)點,存儲結(jié)構(gòu)利用“孩子-兄弟表示法”。在這種鏈表式存儲結(jié)構(gòu)中,鏈表中的一個節(jié)點代表在樹中的一個節(jié)點,除了信息域外,另外還有2個指針域分別指向該節(jié)點的第一個孩子節(jié)點和下一個兄弟節(jié)點。這樣就相當(dāng)于將樹轉(zhuǎn)化為了二叉樹,就可以采用二叉樹的二叉鏈表進(jìn)行遍歷,對我們的工作帶來了很大的便利。
同樣,在電路出現(xiàn)2個以上分支的時候,采用父節(jié)點-子節(jié)點的方法,有幾條分支就有幾個子節(jié)點,然后利用上述方法也轉(zhuǎn)化成二叉樹鏈表。在編寫程序的時候,還需要加一個判斷域,防止重復(fù)遍歷,使得仿真程序更有效率。
圖3 繼電器電路以及對應(yīng)的二叉樹
如圖3,以調(diào)車信號機的電路為例說明,這里為了方便說明,將各個元器件分別編號為A-P。
左邊KZ的電路為一個二叉樹的鏈表,以A為根節(jié)點,采用二叉樹鏈表的前序遍歷,即:先訪問根節(jié)點,再前序遍歷左子樹,前序遍歷右子樹,若二叉樹為空則遍歷結(jié)束。二叉樹的前序序列為A、B、C、D、E、F、J、H、I、J。
右邊的KF的電路作為另一個二叉樹的鏈表,同樣是以N為根節(jié)點,但是由于電路的走向,采用的是二叉樹鏈表的后續(xù)遍歷,即:后序遍歷左子樹,后序遍歷右子樹,最后再訪問根節(jié)點,若二叉樹為空則遍歷結(jié)束。二叉樹的后序序列為P、M、L、K、O、N。
電路仿真效果圖如圖4所示。
在仿真完成之后,就可以根據(jù)電路圖各個元件的工作情況,判斷電路圖的不合理處,以便于后期設(shè)計人員修改。
圖4 仿真電路效果
本文介紹了繼電電路設(shè)計在信號設(shè)計中的重要性,研究了繼電電路仿真在繼電電路設(shè)計中所起的關(guān)鍵作用,并通過軟件設(shè)計實現(xiàn)。系統(tǒng)采用VC++6.0編程工具繪制繼電電路圖,并利用數(shù)據(jù)結(jié)構(gòu)提供的仿真算法對完成后的電路進(jìn)行了仿真,為繼電電路的設(shè)計改造提供了很大的方便。但是也存在一些不足之處,例如,本文是以進(jìn)站信號機點燈電路為例說明,在所有的繼電電路中某些元器件有很多種不同的種類,這就要求軟件必須不斷的改進(jìn),需要進(jìn)一步研究與改善。
[1] 趙志. 計算機輔助設(shè)計在微機聯(lián)鎖中的應(yīng)用[J] .電氣化鐵道,1999(4).
[2] 李于劍. Visual C++實踐與提高圖形圖像編程篇[M] . 北京:中國鐵道出版社,2001.
[3] 王永信. 車站信號自動控制[M] . 北京.中國鐵道出版社. 2009.
[4] 繆淮扣,顧訓(xùn)穰,沈俊. 數(shù)據(jù)結(jié)構(gòu):C++實現(xiàn)[M] . 北京:科學(xué)出版社,2002.