《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于ActiveX和XML技術(shù)的ATS站場(chǎng)圖設(shè)計(jì)與實(shí)現(xiàn)
基于ActiveX和XML技術(shù)的ATS站場(chǎng)圖設(shè)計(jì)與實(shí)現(xiàn)
來源:微型機(jī)與應(yīng)用2013年第18期
張延龍,, 郭秀清
(同濟(jì)大學(xué) 控制科學(xué)與工程系, 上海201804)
摘要: ActiveX控件和XML數(shù)據(jù)表是整個(gè)軌道交通列車監(jiān)控(ATS)仿真系統(tǒng)的基礎(chǔ)。針對(duì)ATS仿真系統(tǒng)開發(fā)的需求和現(xiàn)狀并結(jié)合上海地鐵5號(hào)線ATS仿真系統(tǒng)的實(shí)際應(yīng)用,,提出并設(shè)計(jì)了利用VC2008平臺(tái)生成ActiveX控件進(jìn)而生成站場(chǎng)圖的方法,。重點(diǎn)介紹了基于XML數(shù)據(jù)表的數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)與實(shí)現(xiàn),。
Abstract:
Key words :

摘   要: ActiveX控件和XML數(shù)據(jù)表是整個(gè)軌道交通列車監(jiān)控(ATS)仿真系統(tǒng)的基礎(chǔ)。針對(duì)ATS仿真系統(tǒng)開發(fā)的需求和現(xiàn)狀并結(jié)合上海地鐵5號(hào)線ATS仿真系統(tǒng)的實(shí)際應(yīng)用,,提出并設(shè)計(jì)了利用VC2008平臺(tái)生成ActiveX控件進(jìn)而生成站場(chǎng)圖的方法,。重點(diǎn)介紹了基于XML數(shù)據(jù)表的數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)與實(shí)現(xiàn)。
關(guān)鍵詞: ActiveX; XML; 站場(chǎng)圖; 數(shù)據(jù)結(jié)構(gòu)

    進(jìn)入21世紀(jì)以來,隨著中國(guó)經(jīng)濟(jì)的飛速發(fā)展和城市化進(jìn)程的加快,,城市軌道交通也進(jìn)入大發(fā)展時(shí)期,。我國(guó)已經(jīng)成為世界最大的城市軌道交通市場(chǎng)。城市軌道交通的快速發(fā)展也帶來了一個(gè)顯著的問題,,就是軌道交通設(shè)施一旦完工立即投入運(yùn)行,,根本沒有時(shí)間允許對(duì)相關(guān)運(yùn)營(yíng)維護(hù)人員進(jìn)行培訓(xùn)。此外,,由于現(xiàn)場(chǎng)列車行車安全和時(shí)間等因素的限制,,已經(jīng)投入使用的列車控制系統(tǒng)等現(xiàn)場(chǎng)設(shè)備不可能用來教學(xué)培訓(xùn)。學(xué)員無法進(jìn)行實(shí)際的練習(xí),。因此,怎樣在保證安全的前提下使每一位學(xué)員系統(tǒng),、快速地掌握相關(guān)技術(shù),就成為迫切需要解決的難題,。鑒于此有必要開發(fā)一套完整的用于教學(xué),、培訓(xùn)的ATS仿真系統(tǒng)。
    ActiveX控件具有可擴(kuò)展,、可重用,、易組合、語言無關(guān)等特點(diǎn),。將其應(yīng)用在ATS仿真系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)中可以大大減少重復(fù)勞動(dòng),縮短開發(fā)周期,。可擴(kuò)展標(biāo)記語言XML(Extensible Markup Language)是用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,,可以用來標(biāo)記數(shù)據(jù),,定義數(shù)據(jù)類型,是一種允許用戶對(duì)自己的標(biāo)記語言進(jìn)行定義的源語言,。XML與其他數(shù)據(jù)表現(xiàn)形式最大的不同是:它極其簡(jiǎn)單,。XML的簡(jiǎn)單使其易于在任何應(yīng)用程序中讀寫數(shù)據(jù),這使XML很快成為數(shù)據(jù)交換的唯一公共語言,。
1 ActiveX控件的設(shè)計(jì)與實(shí)現(xiàn)
1.1 控件的設(shè)計(jì)

    站場(chǎng)圖是ATS仿真培訓(xùn)系統(tǒng)的基礎(chǔ),是ATS仿真系統(tǒng)可視控件的一部分,。所有軌道設(shè)備的狀態(tài),、進(jìn)路生成狀態(tài)、信號(hào)設(shè)備狀態(tài)和列車運(yùn)行狀態(tài)都會(huì)在站場(chǎng)圖上直接反應(yīng)出來,。通過對(duì)ATS仿真系統(tǒng)的分析,,站場(chǎng)圖的基本組成控件包括區(qū)段控件、道岔控件,、信號(hào)機(jī)控件,、站臺(tái)控件、車次窗控件以及一些其他控件,如圖1所示,。


    構(gòu)建站場(chǎng)圖控件的首要任務(wù)是設(shè)計(jì)控件的屬性,。站場(chǎng)圖控件的屬性可以分為兩類:靜態(tài)屬性和動(dòng)態(tài)屬性。靜態(tài)屬性指的是在繪制站場(chǎng)圖時(shí)可以修改的一些屬性,,站場(chǎng)圖繪制完成后這些屬性在ATS仿真培訓(xùn)系統(tǒng)運(yùn)行時(shí)是不可改變的,。動(dòng)態(tài)屬性指的是在繪制站場(chǎng)圖時(shí)無需設(shè)置或僅需默認(rèn)設(shè)置,在ATS仿真系統(tǒng)的運(yùn)行過程中不斷變化的屬性[1],。例如,,信號(hào)機(jī)控件的ID、名稱在ATS仿真系統(tǒng)運(yùn)行過程中不會(huì)變化,,這屬于靜態(tài)屬性,;信號(hào)機(jī)的背景顏色在程序運(yùn)行過程中經(jīng)常發(fā)生變化,這屬于動(dòng)態(tài)屬性,。
1.2 控件的實(shí)現(xiàn)
    開發(fā)站場(chǎng)圖控件使用的是VC2008開發(fā)平臺(tái),, 它是開發(fā)ActiveX 控件的常用工具之一。VC2008集成開發(fā)環(huán)境,, 使用了微軟自己的類庫MFC,,MFC 對(duì)開發(fā)ActiveX 控件提供了全面的支持。MFC對(duì)ActiveX控件的支持封裝為COlecontrol類,,站場(chǎng)圖中各個(gè)控件均由此類派生[2],。本文以信號(hào)機(jī)為例說明ActiveX控件的設(shè)計(jì)與實(shí)現(xiàn)過程。信號(hào)機(jī)的靜態(tài)屬性有信號(hào)機(jī)名稱,、信號(hào)機(jī)位置類型和字體顏色,,信號(hào)機(jī)的動(dòng)態(tài)屬性有信號(hào)機(jī)背景顏色、控件可見性和基座顏色,。其主要代碼如下:
     class CSignalCtrl : public COleControl
    {
    … …
    //靜態(tài)屬性
     CString         m_SignalName;                  //信號(hào)機(jī)名稱
    short        m_LocationType;              //信號(hào)機(jī)位置
         COLORREF    m_FontColor;                //字體的顏色
    //動(dòng)態(tài)屬性
    COLORREF    m_SignalBackColor;           //信號(hào)機(jī)背景色
    BOOL        m_Visible;            //控件可見性標(biāo)志
    COLORREF    m_VerticalColor;              //基座顏色
    … …
    }
    在VC++中設(shè)計(jì)ActiveX控件實(shí)際上就是對(duì)OnCreate(),、DoPropExchange()、OnDraw()等函數(shù)的處理,。OnCreate() 函數(shù)完成控件的創(chuàng)建以及控件結(jié)構(gòu),、尺寸和字體等外形的設(shè)置。DoPropExchange() 函數(shù)負(fù)責(zé)的是狀態(tài)永久性機(jī)制, 利用這個(gè)函數(shù)可以把ActiveX 控件的屬性和內(nèi)部信息保存到存儲(chǔ)對(duì)象或者是流對(duì)象中,。這個(gè)函數(shù)通常調(diào)用PX_ family 函數(shù)來完成OLE 控件的用戶自定義屬性操作,。OnSize()函數(shù)用來調(diào)整控件顯示窗口的大小和位置,。OnDraw()函數(shù)利用指定圖像在指定區(qū)域繪制OLE 控件[3]。MFC默認(rèn)的控件邊界形狀是一個(gè)矩形,。這個(gè)矩形可以由鼠標(biāo)拖動(dòng)而改變大小,,所以在設(shè)計(jì)控件時(shí)應(yīng)當(dāng)根據(jù)默認(rèn)矩形的上下左右邊界計(jì)算出控件內(nèi)部各點(diǎn)的相對(duì)坐標(biāo),。這樣在拖拽控件改變大小時(shí)控件內(nèi)部線條按比例放大或縮小,。
    在VC2008編譯環(huán)境中,信號(hào)機(jī)控件如圖2所示。

2 站場(chǎng)圖的生成
2.1 控件注冊(cè)

    所有的ActiveX控件必須在注冊(cè)之后才可以使用,。Regsvr32程序的作用就是注冊(cè)ActiveX控件,。將所有控件放入一個(gè)庫中并在該庫中建立一個(gè)名為reg.dat的MS-DOS批處理文件,在該文件中對(duì)控件進(jìn)行注冊(cè),。例如,對(duì)信號(hào)機(jī)進(jìn)行注冊(cè)的語句為:regsvr32-s./Line5Signal.ocx,。使用控件前運(yùn)行該文件就可以將控件的所有信息(包括所在路徑)都寫入注冊(cè)表中。
2.2 繪制站場(chǎng)圖
    ATS仿真培訓(xùn)系統(tǒng)的站場(chǎng)圖就是由一個(gè)個(gè)控件拼接而成的,。按照軌道交通線路的實(shí)際情況,,從控件庫中選取合適的控件,然后配置控件的功能和數(shù)據(jù),,確定控件間的相互關(guān)系和通信方式,最終就可以生成一個(gè)站場(chǎng)圖,。本文按照上海市地鐵5號(hào)線現(xiàn)場(chǎng)的實(shí)際情況分別繪制出MV1、MV2,、MV3 3張站場(chǎng)圖,。考慮到項(xiàng)目接下來要在主視圖中加載站場(chǎng)圖,, 在為站場(chǎng)圖所在的對(duì)話框添加類時(shí)要設(shè)置其基類為CFormView,。部分站場(chǎng)圖如圖3所示。

 

 

3 數(shù)據(jù)處理模塊的設(shè)計(jì)
3.1 數(shù)據(jù)庫的選擇

    可擴(kuò)展標(biāo)記語言XML是W3C組織于1998年2月發(fā)布的標(biāo)準(zhǔn),,是Internet環(huán)境中跨平臺(tái)的,、依賴于內(nèi)容的技術(shù),是當(dāng)前處理結(jié)構(gòu)化信息的有力工具,。XML文檔結(jié)構(gòu)嚴(yán)謹(jǐn),,層次分明,語義明確,,具有良好的可讀性,、易編寫和易維護(hù)等特性,而且使得多媒體信息在不同的系統(tǒng)之間相互交流成為現(xiàn)實(shí),。
    XML可以充當(dāng)小型數(shù)據(jù)庫的功能,。雖然Access、Oracle和SQL Sever等數(shù)據(jù)庫都提供了強(qiáng)有力的數(shù)據(jù)存儲(chǔ)和分析能力,,例如數(shù)據(jù)索引,、排序和查找等能力,,但與這些數(shù)據(jù)庫不同,XML僅僅是存儲(chǔ)數(shù)據(jù),。事實(shí)上XML與其他數(shù)據(jù)表現(xiàn)形式最大的不同是:它極其簡(jiǎn)單,。這個(gè)優(yōu)點(diǎn)使得XML與眾不同。在ATS仿真系統(tǒng)中,,由于站場(chǎng)元素間關(guān)系的復(fù)雜性和多樣性,,如果使用關(guān)系數(shù)據(jù)庫,依據(jù)數(shù)據(jù)庫設(shè)計(jì)范式而設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)會(huì)因?yàn)閿?shù)據(jù)關(guān)系的復(fù)雜性而急劇膨脹,,不利于存儲(chǔ)一些結(jié)構(gòu)松散和關(guān)系復(fù)雜的站場(chǎng)元素模型信息,。另外,站場(chǎng)元素模型的數(shù)據(jù)量不大,,此時(shí)XML簡(jiǎn)單的優(yōu)點(diǎn)便發(fā)揮了用處,,因此將站場(chǎng)元素模型信息以XML原始格式存儲(chǔ),方便靈活,,沒有版權(quán),,沒有約束,也可以節(jié)約成本[4],。在站場(chǎng)圖模塊中,,用XML描述了進(jìn)路、區(qū)段,、信號(hào)燈,、道岔等站場(chǎng)元素的模型,記錄它們的信息,,在后面各個(gè)功能模塊設(shè)計(jì)中都是基于這些數(shù)據(jù)的,。
3.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
    因?yàn)殪o態(tài)數(shù)據(jù)包括基本信號(hào)點(diǎn)之間的邏輯關(guān)系,所以在靜態(tài)數(shù)據(jù)模塊中,,不僅包含該信號(hào)點(diǎn)的基本信息(如類別,、名稱、長(zhǎng)度等),,還應(yīng)包含其他的信號(hào)點(diǎn)信息(如左邊設(shè)備的名稱,、右邊設(shè)備的名稱)。因此在設(shè)計(jì)信號(hào)點(diǎn)基本數(shù)據(jù)時(shí),每一個(gè)信號(hào)點(diǎn)都應(yīng)包含完整的信息字段,,例如區(qū)段字段,,應(yīng)該包括ID、名稱,、左連接設(shè)備名稱,、右連接設(shè)備名稱、占用標(biāo)志和區(qū)段長(zhǎng)度等。
    XML文件分為Axle,、Cross,、Platform、Signal,、Switch,、 TrainNumWnd、Timetable和Routes這8個(gè)文件,。其中前6個(gè)文件存儲(chǔ)的是控件的位置信息,,Routes文件放置的是站場(chǎng)圖中的進(jìn)路信息,Timetable是列車的時(shí)刻表信息,。
3.2.1 信號(hào)機(jī)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
    以信號(hào)機(jī)為例,,信號(hào)機(jī)主要包含5個(gè)字段:信號(hào)機(jī)ID,、信號(hào)機(jī)名稱,、接近區(qū)段名稱、第一區(qū)段名稱和所屬集中站,,其XML文件的結(jié)構(gòu)如下:
    <Signal>
        <ID>S1</ID>                           //信號(hào)機(jī)控件ID
        <Name>X108</Name>              //信號(hào)機(jī)控件名稱
        <JJQD>G0003</JJQD>      //信號(hào)機(jī)控件的接近區(qū)段
        <FirstQD>108</FirstQD> //信號(hào)機(jī)控件的第一區(qū)段
        <JZZID>1</JZZID>      //信號(hào)機(jī)控件所屬集中站
    </Signal>
    XML數(shù)據(jù)庫中每種類型的數(shù)據(jù)讀進(jìn)內(nèi)存以后必須有相應(yīng)的數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ),。同時(shí)該結(jié)構(gòu)還要與界面上的具體控件相關(guān)聯(lián)。為此以各個(gè)控件的原始類為基礎(chǔ)添加上相應(yīng)的位置和狀態(tài)屬性設(shè)計(jì)了控件的封裝類,。在VC程序中可以利用CMarkup類對(duì)XML文件進(jìn)行解析,,用解析出來的各個(gè)控件的信息構(gòu)造相應(yīng)的封裝類,控件原始類在封裝類中作為一個(gè)具有public屬性的成員變量,。在程序中數(shù)據(jù)的存儲(chǔ)是以C++ STL中vector容器的形式存儲(chǔ),。使用vector容器存儲(chǔ)數(shù)據(jù)不但可以減少內(nèi)存泄漏的危險(xiǎn)而且可以借助于vector自身具有的屬性方便地查找和設(shè)置元素。信號(hào)機(jī)控件的封裝類如下:
class Signal
{
……
public:
    CLine5Signal *m_pSignalCtrl;       //綁定一個(gè)信號(hào)燈變量
public:
    CString m_ID;
    CString m_Name;
    CString m_JJQD;
    CString m_FirstQD;
    CString m_JzzID;
    BOOL m_SignalLock;                          //鎖閉標(biāo)志
    BOOL m_SignalARSFlag;         //單個(gè)信號(hào)的ARS功能
                                開關(guān)標(biāo)志
    BOOL m_SignalOpen;          //信號(hào)燈開放與否標(biāo)志
    BOOL m_GuideFlag;          //信號(hào)燈引導(dǎo)標(biāo)志
    BOOL m_DefaultMode;      //信號(hào)燈默認(rèn)模式
    ……
public:                      //故障標(biāo)志
    BOOL m_fault1;              //紅燈主燈絲故障
    BOOL m_fault2;              //紅燈主副燈絲故障
    BOOL m_fault3;              //紅燈狀態(tài)良好
    BOOL m_fault4;              //綠燈主燈絲故障
    BOOL m_fault5;              //綠燈主副燈絲故障
    BOOL m_fault6;              //綠燈狀態(tài)良好
    BOOL m_fault7;              //無有效狀態(tài)數(shù)據(jù)
    ……
    ……
}
     信號(hào)機(jī)實(shí)體對(duì)象與界面控件的綁定是通過DDX_Control()宏完成的,。例如信號(hào)機(jī)控件IDC_S1與信號(hào)機(jī)實(shí)體對(duì)象的綁定通過DDX_Control(pDX,IDC_S1,*pDoc->m_SignalPtrArray[0])完成,。DDX_Control()是MFC中的宏,主要負(fù)責(zé)邏輯變量與界面控件的綁定操作,。pDX是指向CdataExchange對(duì)象的指針,,IDC_S1是控件ID,*pDoc->m_SignalPtrArray[0]是內(nèi)存中的信號(hào)機(jī)對(duì)象,。
3.2.2 時(shí)刻表數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
    時(shí)刻表實(shí)現(xiàn)了行車組織的工作計(jì)劃編排,。時(shí)刻表中包含一個(gè)運(yùn)營(yíng)日中列車運(yùn)行的所有信息。時(shí)刻表是后續(xù)列車運(yùn)行調(diào)整模塊的核心,,在生成站場(chǎng)圖的部分只需知道它的基本數(shù)據(jù)結(jié)構(gòu)即可,,其數(shù)據(jù)結(jié)構(gòu)包括:車次號(hào)、站臺(tái)號(hào),、到達(dá)時(shí)間,、出發(fā)時(shí)間,其XML文件結(jié)構(gòu)如下所示:
     <TimeTableLists>
         <Name>時(shí)刻表1</Name>
          <TimeTable>
              <ID>10330Z</ID>                 //車次號(hào)
                <Record>
                  <Platform>DCL2</Platform>          //站臺(tái)號(hào)
                  <Arrival>05:33:50</Arrival>       //到達(dá)時(shí)間
                  <Departure>05:34:25</Departure>
                                           //出發(fā)時(shí)間
              </Record>
               ……               
          </TimeTable>
     </TimeTableLists>
3.2.3 進(jìn)路搜索原理
    進(jìn)路的生成主要是通過搜索信號(hào)機(jī)來完成的,。具體過程如下:從這個(gè)信號(hào)機(jī)關(guān)聯(lián)的軌道出發(fā),,沿著信號(hào)機(jī)的方向搜索軌道鏈,,若遇到與斜股同向的道岔,則將該道岔放入一個(gè)搜索棧中,然后沿著直線方向繼續(xù)搜索,,直至找到反向的敵對(duì)信號(hào)機(jī)或下一車站的同向信號(hào)機(jī),;若此時(shí)搜索棧中仍有道岔,則取出道岔從斜股的方向按上面的描述搜索另一條進(jìn)路,,直到搜索棧中沒有道岔對(duì)象,。在搜索的同時(shí)即記錄下相關(guān)控件對(duì)象信息。以圖2中的信號(hào)機(jī)X108為例,,一共有兩條進(jìn)路,一條進(jìn)路是X108-X106, 另一條是X108-X110,。這兩條進(jìn)路在XML中按照如圖4所示的數(shù)據(jù)結(jié)構(gòu)表示。

    程序開始運(yùn)行時(shí)先把保存在XML表中的控件封裝類信息讀到內(nèi)存中,,并以合理的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)起來,,這樣就不用頻繁地讀取數(shù)據(jù)庫,能大大減少因讀取數(shù)據(jù)庫而占用的時(shí)間,。程序從XML中讀入控件的位置和連接信息,,利用構(gòu)造函數(shù)設(shè)置其狀態(tài)信息。程序運(yùn)行時(shí)也可以通過訪問封裝類的public成員變量設(shè)置其狀態(tài)信息,。結(jié)合時(shí)刻表和進(jìn)路信息就可以使列車運(yùn)行起來,。
    本文針對(duì)上海市地鐵5號(hào)線ATS培訓(xùn)系統(tǒng)中的站場(chǎng)圖進(jìn)行設(shè)計(jì),構(gòu)建了用于拼接站場(chǎng)圖的道岔和信號(hào)機(jī)等控件,,并使用XML文件對(duì)控件位置和拼接信息進(jìn)行存儲(chǔ),。控件的劃分與應(yīng)用將站場(chǎng)圖的繪制過程簡(jiǎn)化為簡(jiǎn)單的拼圖操作, 大大縮短了整個(gè)ATS仿真系統(tǒng)的開發(fā)周期,。合理的數(shù)據(jù)結(jié)構(gòu)極大地保證了程序的快速平穩(wěn)運(yùn)行,。本文對(duì)于ATS仿真系統(tǒng)的后續(xù)研究有著鋪墊作用。
參考文獻(xiàn)
[1] 王野, 郭秀清.基于組件技術(shù)的列車自動(dòng)監(jiān)控仿真系統(tǒng)開發(fā)平臺(tái)[J].計(jì)算機(jī)應(yīng)用,,2007,,2(z2):286-288.
[2] 莊傳平,陳永生. 可復(fù)用的列車自動(dòng)監(jiān)控仿真系統(tǒng)組件的設(shè)計(jì)與實(shí)現(xiàn)[J].城市軌道交通研究, 2007(7):31-33.
[3] 郭永瑞,孫明德.ActiveX控件的編寫和使用[J].計(jì)算機(jī)與信息技術(shù), 2007(22):48-49.
[4] 李根,,李彥明,,劉成良.基于可擴(kuò)展標(biāo)記語言的故障模型表述[J]. 機(jī)械制造與自動(dòng)化,2012,41(04):115-117.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。