铁路信号继电电路的计算机辅助设计及仿真的研究==压字
2012-08-06王跃华杨成建
王跃华,杨成建,杨 扬
( 1.西南交通大学信息科学与技术学院, 成都610031;2.北京通号国铁城市轨道技术有限公司,北京100073 )
随着我国铁路事业的发展和科学技术的进步,逐步形成了今天的现代铁路信号系统。其中的计算机联锁系统应用广泛,但是目前国内投入使用的计算机联锁都是从继电集中联锁过渡发展起来的,其与室外信号设备的接口仍采用继电器电路来完成。因而继电控制电路的设计在信号设计中占有很大的比重,继电电路的设计能力也需要不断提高。
目前,主要是利用AutoCAD软件进行继电电路设计,但这种设计方法有一定的缺陷:(1)通过传统AutoCAD来进行信号设备继电器接口电路设计,电路是否满足需求,需要由设计人员人工检查来完成,缺少对应的辅助分析工具,效率低;(2)当信号设备继电器接口电路发生变更时,涉及到大量的变更设计,以及对变更设计的校验,且都由人工来完成,效率低且容易出错。
因此,本文就是针对继电控制电路计算机辅助设计现存的缺陷,开发出一套满足需求且方便易用的继电电路设计及仿真软件。
1 继电电路计算机辅助仿真系统简介
现今的计算机联锁系统是一种以计算机为主要技术手段、配合继电集中联锁硬件的计算机联锁系统。其底层核心系统仍为继电控制电路,采用继电联锁原理来控制铁路现场设备的正确工作。
目前,设计人员主要是利用AutoCAD软件进行继电电路设计,但存在着前面已经提到的一些缺陷。信号设计人员的设计方式没有根本性变化,仍然停留在人工主导分块设计的模式,效率也没有得到根本性提高。本文所研究的计算机辅助仿真系统,可以有效的解决这些问题。
对继电电路的仿真是利用VC++软件完成对铁路信号继电电路的计算机辅助设计,继电控制电路的绘制和完整显示;继电器、电容、电阻等元器件的属性都包含在显示图中;设计完成后可以对继电电路进行仿真,以达到继电控制电路合理、符合电路逻辑、符合安全可靠性的原则;如果电路中出现元器件不合理或者电路逻辑错误,通过对电路的仿真即能发现问题方便修改继而完成设计,而不用像传统设计那样等到设计完成后再去修改电路,大大节省了工作量。本文主要以调车信号机点灯电路为例来进行说明。
2 利用VC++6.0绘制继电电路
2.1 绘制继电电路框架
通过对电路图的分析,软件绘制继电电路可以分为以下几个步骤进行:
(1)应生成以线跟点为基本框架的线路框图,两条电路之间以线连接,以保证两条线路在仿真的时候是联通的不存在断路。这一步对整个电路框架就有了一个基本的描述。
(2)可以建立一个图形元素库,将电路中的主要元器件图形制成模块的形式存储如图1。
图1 继电电路图元设计模块
要添加图形元器件的时候有两种方法:(1)可以利用创建工具栏图标,然后拖动到线路上的方式添加。但是此种方法对于每个元器件是否在线路上要做一个判断,否则在仿真就遍历整个电路的时候就无法遍历到这个元器件,而整个电路的元器件非常多,所以整个过程很复杂而且不利于实现。(2)本文采用链表的形式,以线路的两端作为链表的头尾节点,直接在这条线路添加右键属性菜单插入元器件,同时将地址与ID保存在线路链表的数组里,为后面的仿真提供了很大的方便。
2.2 图元的编辑
在绘制继电电路图的过程中,也要根据情况编辑设备图元,使之更符合电路的要求。系统中对图元元器件的编辑包括图元的选取、移动、删除和添加属性功能。
对于一个完整的绘图系统来说,用户能够自如的对图元进行交互式操作,首先要实现图形选中功能。对图元的移动、删除等操作都是建立在选取基础上的。本文以最基本的直线选取为例子进行说明如图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);
}
在继电电路中,图元元器件的种类有很多,例如继电器线圈的种类、类型及线圈的接点都要表示清楚,所以在完成对继电电路的绘制之后,利用程序实现双击元器件弹出属性栏,为元器件添加属性。
3 仿真继电电路的实现
生成进站信号机点灯电路图并添加元器件属性后,对电路图进行仿真。仿真主要采用接通径路法(接通公式法)用来描述继电器励磁电流的径路,即由电源正极经继电器接点、线圈及其他器件流向电源负极的回路。先前生成继电电路的时候已经把所有的元器件都作为链表接点存放在创建的链表中,所以仿真的算法采用先根遍历,即以二叉树链表的一的个节点作为树的根节点,存储结构利用“孩子-兄弟表示法”。在这种链表式存储结构中,链表中的一个节点代表在树中的一个节点,除了信息域外,另外还有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 仿真电路效果
4 结束语
本文介绍了继电电路设计在信号设计中的重要性,研究了继电电路仿真在继电电路设计中所起的关键作用,并通过软件设计实现。系统采用VC++6.0编程工具绘制继电电路图,并利用数据结构提供的仿真算法对完成后的电路进行了仿真,为继电电路的设计改造提供了很大的方便。但是也存在一些不足之处,例如,本文是以进站信号机点灯电路为例说明,在所有的继电电路中某些元器件有很多种不同的种类,这就要求软件必须不断的改进,需要进一步研究与改善。
[1] 赵志. 计算机辅助设计在微机联锁中的应用[J] .电气化铁道,1999(4).
[2] 李于剑. Visual C++实践与提高图形图像编程篇[M] . 北京:中国铁道出版社,2001.
[3] 王永信. 车站信号自动控制[M] . 北京.中国铁道出版社. 2009.
[4] 缪淮扣,顾训穰,沈俊. 数据结构:C++实现[M] . 北京:科学出版社,2002.