《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > ATS仿真培训系统列车模拟运行的设计与实现
ATS仿真培训系统列车模拟运行的设计与实现
来源:微型机与应用2012年第14期
孙志勇, 陈永生
(同济大学 计算机科学与技术系, 上海200331)
摘要: 通过VC++中ActiveX控件制作方法设计出上海地铁8号线ATS仿真培训系统中列车模型,并通过列车时刻表数据存放列车运行时所需的一些数据信息,此时刻表数据以XML格式存储,在对时刻表数据进行解析时采用目前比较流行的TinyXml。最后还给出此仿真培训系统的列车正常模拟运行的结果。
Abstract:
Key words :

摘  要: 通过VC++中ActiveX控件制作方法设计出上海地铁8号线ATS仿真培训系统中列车模型,并通过列车时刻表数据存放列车运行时所需的一些数据信息,此时刻表数据以XML格式存储,在对时刻表数据进行解析时采用目前比较流行的TinyXml。最后还给出此仿真培训系统的列车正常模拟运行的结果。
关键词: 列车运行仿真; XML; VC++

    中国近年来,基于通信的列车控制系统CBTC(Communication Based Train Control)已逐渐被信号界所认可,成为当今世界范围内铁路信号技术的发展趋势,随着CBTC系统在国内城市轨道交通工程中的广泛应用,使得城市轨道交通运营企业急需大量具备CBTC系统背景的运营管理、通信信号等专业知识和操作技能的综合性运营人才。这些综合性运营专业人员不仅需要熟悉CBTC系统的工作原理,同时还需要具备实际操作能力。考虑到现场行车安全,无法在目前已经投入运营的系统上进行教学培训。所以开发仿真培训系统就成为解决这一问题的途径。
    列车自动运行ATS(Automatic Train Supervision)是CBTC系统中负责监视和控制整个地铁线路中列车的运行状态的一个组成部分[1]。本文中的列车模拟运行就是此ATS仿真培训系统中的一子模块。
1 列车模型
1.1 列车模型的设计

    对于8号线列车控件,它的属性分为:静态属性和动态属性。静态属性是指设计控件时可修改,但当列车控件绘制完成时就不可修改的一类属性;动态属性主要指设计控件时无需设置,在站场图的仿真运行过程中可不断改变的属性[2]。其属性可按如下设置:
    (1) 静态属性:列车长度,列车车厢数,列车重量。
    (2) 动态属性:列车标签,列车行车方向,列车标签的方向,列车车门状态等。
1.2 列车模型的实现
     开发列车控件使用的是VC++,它是开发ActiveX控件的常用工具之一。VC++集成开发环境,使用了微软自己的类库MFC,MFC对开发ActiveX控件提供了全面的支持[3-4]。
    其主要定义代码如下:
    Class Train:public COleControl{…}        //列车控件定义
    其主要属性定义如下:
    //静态属性
    Short TrainDetails;        //列车长度
    Short TrainMass; //列车重量
    Short TrainCarriages;    //列车车厢
    //动态属性
    BSTR TrainLabel;  //列车标签
    Short LabelPosition;  //标签位置
    Short Direction;  //列车行车方向
    Short DoorState;  //车门状态
    …
    在VS2005编译环境中,列车控件显示如图1所示。

2 列车时刻表
2.1 时刻表数据存储

    可扩展标记语言(XML)是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。作为一种数据格式,它具有以下特点:
    (1) 规范性:XML是W3C制定的,XML的标准化工作由W3C的XML工作组负责,它遵循严格的语法要求,便于不同开发人员的理解。
    (2) 简单性:XML文档只是纯文本,这样XML文档就可以自由地在两个不同的系统之间交换数据,因为基本上任何系统都提供了对文本格式的支持。
    (3) 自我描述:XML可以明确地表示数据模型中各个部分的意义,只要查看XML文档就能确定该数据的意义。每个数字的意义是清楚的,且不会错误地与数字本身相联系。当读取文档时,开发人员了解<Arrival>05:00:00</Arrival>中的05:00:00指的是列车到站时间而不是列车离站的时间。
    (4) 结构和内容分离:在XML中数据和显示格式是分离的,XML元数据文件就是纯数据文件,可以作为数据源提供数据。
    (5) 可扩展性:XML允许使用者创建和使用他们自己的标记,而不像HTML那样使用有限的词汇。
    基于以上XML语言的特点,再加上列车时刻表数据比较简单,它包括列车发车站点,列车到达站点时间以及列车离开站点时间。为了使数据结构清晰,便于不同开发人员的理解,所以列车时刻表数据的存储方式则采用XML。
    列车时刻表XML数据主要由4个标签组成:列车运行的线路、列车停靠的站台、列车到达站台的时间和列车离开站台的时间。
    (1) 列车运行线路:规定列车运行的线路。
    (2) 列车停靠站点:站点以名字首字母命名,如SGR1为胜光路,其后1表示停在站点的哪一站台,而每个站点都有两个站台。
    (3) 列车到达/离开站台时间: 此两时间为列车控件出现或离开站台的时间,它们的差为列车停站时间。
    以下就是采用XML方式存储的列车时刻表的一小部分:
    <?xml version="1.0" encoding="UTF-8"?>
    <TimeTableLists>
         <Name>时刻表1</Name>
             <TimeTable>
                   <ID>801</ID>
                   <Record>
                        <Line>1</Line>
                             <Platform>SGR1</Platform>
                             <Arrival>05:02:00</Arrival>
                             <Departure>05:03:00</Departure>
                        </Record>
                         ……
               </TimeTable>
    </TimeTableLists>
    <TimeTableLists>
        <Name>时刻表2</Name>
             <TimeTable>
                   <ID>801</ID>
                   <Record>
                                <Line>1</Line>
                    <Platform>SGR1</Platform>
                <Arrival>05:02:00</Arrival>
                <Departure>05:03:00</Departure>
             </Record>
              ……
       </TimeTable>
    </TimeTableLists>
    XML文件除了可以用记事本编写外,还可以使用多种可视化XML开发工具完成,本文采用XmlSpy2005进行数据编写。
2.2 时刻表数据解析

 


    XML文档的解析方法有很多种,如Libxml++、微软的MSXML等。本文所采用的是TinyXml,它是目前非常流行的一款基于DOM模型的开源XML解析器,使用起来很方便且容易上手,能够用于C++,并能在Windows或Linux中编译。这个解析库的模型通过解析XML文件,在内存中生成DOM模型,从而很方便地遍历整棵XML树。
    TinyXml中的类与XML文件的对应关系如图2所示。TiXmlBase是所有类的基类,TiXmlAttribute为XML中元素的属性TiXmlNode为DOM结构中的节点,如<Record>;TiXmlComment为XML文件中的注释;TiXmlDeclaration 为XML文件中的声明,如<?xml version="1.0" encoding="UTF-8"?>;TiXmlDocument为XML文件的整个文档;TiXmlElement为XML文件中的元素,如<Line>、<Platform>;TiXmlText为XML文件中的元素的文本,如<Line></Line>之间的值1;TiXmlUnknown为XML中的未知部分。

    如果XML文档元素属性值是中文,用TinyXml解析出来的值会出现乱码。乱码是由于GB2312与UTF8之间转换不当造成的,通过MultiByteToWideChar函数可以进行转换,解决乱码问题。
    解析的主要代码如下:
       TiXmlDocument* myDocument=new TiXmlDocument();
       const TiXmlElement* rootElement=myDocument->RootEle-
        ment();
       for(const TiXmlElement* timelablelist=rootElement->
        FirstChildElement();timelablelist;
           timelablelist=timelablelist->NextSiblingElement())
                                 //循环遍历两套时刻表
     {   
             const TiXmlElement* name=timelabellist->FirstChild
            Element();
             ……
            for(const TiXmlElement*Timetable=name->NextSibling
            Element();Timetable;
             Timetable=Timetable-> NextSiblingElement())
                             //循环遍历TimeTable节点
              {  
                  const TiXmlElement* Id=Timetable->First Child
                Element();
               
                   ……
                    for(const TiXmlElement* Record=Id->NextSibling
                Element();Record;
          Record=Record->NextSiblingElement())
                                 //循环遍历Record节点
            {
                ……
            }
          }
     }
3 列车模拟运行
    列车的模拟运行主要是根据时刻表发车,选择运行的线路,根据移动闭塞原理计算列车的行驶速度,按照一定的信号逻辑动态地改变线路上的控件状态。
    时刻表中存有列车的线路信息,线路信息表中则有列车的运行方向以及轨道数据,通过轨道数据可以查询所需的站场数据,包括:信号机、区段、道岔以及站台,它们按照一定关系连接形成站场图,列车在当前的区段或者通过某个信号机时可以推算出下次要经过的区段或信号机。
    列车模拟运行在8号线ATS仿真系统上,此系统采用VC2005开发,在Win7系统上列车运行的结果如图3所示。

    本文针对上海地铁8号线ATS培训系统中的列车模拟运行进行设计,构建了列车模型控件,并使用XML格式对列车时刻表数据进行存储并通过TinyXml对其解析,达到以列车正常运行的目的。随着国内城市轨道交通的迅猛发展,人才培训的需求也势必增加,同时本文对于以后设计其他线路仿真系统有铺垫的作用。
参考文献
[1] 曾小清, 王长林, 张树京. 基于通信的轨道交通运行控制[M]. 上海:同济大学出版社,2007.
[2] 王野,郭秀清.基于组件技术的列车自动监控仿真系统开发平台[J]. 计算机应用, 2007,27(z2):285-288.
[3] 鲁也传,陈永生,郭玉臣. 基于通信的列车自动监控系统平台设计与实现[J]. 计算机应用, 2009,29(S2):152-154.
[4] 宇鹏,王晓峰,李云飞.Visual C++实践与提高——ActiveX 篇[M]. 北京:中国铁道出版社,2001:161-211.

此内容为AET网站原创,未经授权禁止转载。