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