張 帆,劉蔭忠,楊東升,尹震宇
(1.中國科學院 研究生院,北京 100049;2.中國科學院 沈陽計算技術研究所,沈陽 110168)
隨著信息技術和計算機網(wǎng)絡技術的迅猛發(fā)展和應用,制造業(yè)的生產(chǎn)方式發(fā)生了深刻的變革,極大地拓展了企業(yè)信息化的深度和廣度,促進了制造業(yè)快速地向網(wǎng)絡化方向發(fā)展,產(chǎn)生了以互聯(lián)網(wǎng)絡為背景的數(shù)控系統(tǒng),就是網(wǎng)絡化數(shù)控系統(tǒng)[1-3]。
Extensible Markup Language(XML)數(shù)據(jù)是以純文本格式存儲的,這使得XML 提供了一種與軟件和硬件無關的共享數(shù)據(jù)方法。通過XML 可以在不兼容的系統(tǒng)之間輕松地交換數(shù)據(jù),即使升級操作系統(tǒng)、升級服務器、升級應用程序、更新瀏覽器也不會受到兼容性的影響,所以可以用XML 來格式化數(shù)控系統(tǒng)的狀態(tài)、控制、工藝等信息[4-6]。
狀態(tài)監(jiān)視系統(tǒng)就是網(wǎng)絡化數(shù)控系統(tǒng)中的網(wǎng)絡節(jié)點,為了使狀態(tài)監(jiān)視系統(tǒng)得到的數(shù)據(jù)格式化,我們采用XML 技術來存儲數(shù)控系統(tǒng)的狀態(tài)信息。數(shù)控系統(tǒng)自帶的RCS 庫的生成XML 文件的xmlMsgSaveAs(NMLmsg* nml_msg,const char * filename)函數(shù)[7-8]是有缺陷的:①生成的每個XML 文件僅僅是一種NMLmsg 的信息且包含該類型消息的全部信息,這樣當需要有關n 種狀態(tài)消息的信息時就會生成n 個不同的XML 文件,會不利于文件的傳輸;②當再次利用xmlMsgSaveAs(NMLmsg* nml_msg,const char *filename)函數(shù)生成XML 文件時,上次為了生成XML文件而生成的xmlNode 已經(jīng)釋放,不會被再次利用,需要重新生成新的xmlNode。
本文提出根據(jù)相應的conf 配置文件并利用libxml2 程序庫生成XML 文件的方法。如果該方法生成的XML 文件含有的NMLmsg 消息的個數(shù)為n,那么該XML 文件的長度不會大于由數(shù)控系統(tǒng)自帶的函數(shù)xmlMsgSaveAs(NMLmsg* nml_msg,const char * filename)生成的相應n 個XMLmsg 消息的XML 文件長度之和,并且比利用數(shù)控系統(tǒng)自帶的能生成XML 文件的RCS 庫函數(shù)的時間性能更佳。
結(jié)合數(shù)控系統(tǒng)、RTAI(the Real Time Application Interface for Linux)及實時以太網(wǎng)RTnet 技術設計數(shù)控系統(tǒng)與狀態(tài)監(jiān)視器的實時通信,本篇論文重點解決利用XML 即可擴展的標記語言格式化數(shù)據(jù)信息,便于遠程監(jiān)控、數(shù)據(jù)存儲與分析等。
如圖1 所示,利用XML 即可擴展的標記語言來格式化數(shù)據(jù)信息。數(shù)控系統(tǒng)的一些信息,如軸數(shù)、軸速、增益等,都需要發(fā)給狀態(tài)監(jiān)視器。狀態(tài)監(jiān)視器可以將這些數(shù)控信息存放在一個單獨的數(shù)據(jù)庫中,也可以對其信息進行分析來了解數(shù)控系統(tǒng)的運轉(zhuǎn)情況。為了使狀態(tài)監(jiān)視器得到的數(shù)據(jù)格式化,我們采用XML 技術存儲數(shù)控信息[9-10],然后發(fā)給狀態(tài)監(jiān)視器。
圖1 數(shù)控系統(tǒng)網(wǎng)絡架構圖
Libxml2 是一個C 語言版的XML 解析器,本來是為Gnome 項目開發(fā)的工具,是一個基于MITLicense 的免費開源軟件。它除了支持C 語言版以外,還支持C++、PHP、Pascal、Ruby、Tcl 等語言的綁定,能在Windows、Linux、Solaris、MacOsX 等平臺上運行[5]。Libxml2 支持DOM 和SAX 兩種解析方式。Libxm2 特有的一些數(shù)據(jù)類型,它們用來隱藏那些除非有特別需要否則就不用去理會的復雜細節(jié),這些數(shù)據(jù)類型總是會一次一次的遇到。
xmlChar:對char 的基本代替,是一個UTF-8 編碼字符串中的一個字節(jié)。如果用戶數(shù)據(jù)使用了其他編碼,在使用libxml2 函數(shù)前就必須轉(zhuǎn)換為UTF-8。
xmlDoc 和xmlDocPtr:是一個包含了從解析文檔后創(chuàng)建出的樹的結(jié)構,xmlDocPtr 是指向該結(jié)構的指針。
xmlNode 和xmlNodePtr:包含單個節(jié)點的結(jié)構,xml-NodePtr 是指向該結(jié)構的指針,它用來遍歷文檔樹。
RCS(Real-time Control System)是美國NIST(National Institute of Standards and Technology)的ISD(Intelligent Systems Division)一套完整的實時控制系統(tǒng)的設計思想、方法及相關支撐工具[6]。它從模塊化、層次化的角度來構建一個復雜的控制系統(tǒng),并提供了具有跨平臺、跨網(wǎng)絡通信能力的信息傳送通道機制-NML,同時NML 能很好的支持可擴展標記語言XML。
通信規(guī)則由配置文件“. nml”定義,其中保存應用程序的進程參數(shù)和緩沖區(qū)參數(shù)。RCS 通信原理如圖2 所示。計算機1 上的進程P1、P2、P3 可以直接訪問本地共享內(nèi)存緩沖區(qū)1、2,計算機2、3 上的進程P4,P5,P6 遠程訪問緩沖區(qū)。計算機1 上設置NML服務器進程1、2,代表遠程進程對緩沖區(qū)中的消息進行編碼與解碼。所有進程均需根據(jù)配置文件“.nml”的規(guī)定執(zhí)行通信動作。
圖2 RCS 網(wǎng)絡通信結(jié)構圖
針對數(shù)控系統(tǒng)的狀態(tài)信息,設計一種能利用相應的conf 配置文件生成XML 文件的方法。根據(jù)數(shù)控系統(tǒng)狀態(tài)信息設計conf 配置文件;檢測conf 配置文件的更新時間;如果時間沒有改變,則通過NML 通道讀內(nèi)存獲取數(shù)據(jù),利用libxml2 程序庫函數(shù)更新XML 文件數(shù)據(jù);如果時間已經(jīng)改變,則根據(jù)conf 配置文件生成數(shù)據(jù)結(jié)構,通過NML 通道讀內(nèi)存獲取數(shù)據(jù),利用libxml2 程序庫生成XML 文件,同時保存libxml2 程序庫函數(shù)生成的XML 文件的結(jié)構。如圖3 所示。
2.2.1 設計方法
(1)數(shù)據(jù)結(jié)構
①首先定義多叉樹節(jié)點的類:該類包括的成員變量有節(jié)點名字name(name 的類型是string),指向父節(jié)點的指針,指向孩子節(jié)點的指針構成的vector。
②定義多叉樹的類:多叉樹類的成員變量包括指向根節(jié)點的指針root,以及類iterator??梢岳弥赶驑涔?jié)點的指針來初始化iterator。例如,假設樹節(jié)點為node_type 多叉樹為tree_type 則
node_type * one=new node_type(“one”);
tree_type::iterator iter(one);
多叉樹類有一個成員函數(shù)為
iterator insert(iterator &position,const T &x);
在這里T 為string,該函數(shù)將以x 為name 的樹節(jié)點作為position 對應節(jié)點的孩子,并返回以x 為name的樹節(jié)點對應的iterator。
③定義一個map,map 的元素為
pair <int,tree_type::iterator >
int 類型的數(shù)據(jù)表示conf 配置文件中的數(shù)據(jù)層級level。
圖3 方法設計流程圖
(2)初始化
聲明所有狀態(tài)消息類型的指針;初始化各種狀態(tài)消息類型名對應的字符串;定義一個大小為256 的字符數(shù)組;定義類型為<int,tree_type::iterator >的map。
(3)函數(shù)體
①獲取配置文件“. conf”的最后一次改寫的時間,并與最新讀取的conf 配置文件的改寫時間比較。如果改變了則記下最新時間轉(zhuǎn)入步驟(2),否則轉(zhuǎn)入步驟⑩。
②獲取配置文件“.conf”的第一行(該行是沒有實際意義的一行,只是為生成一個根節(jié)點,并設定該行的數(shù)據(jù)名為”time”)并存入char line[256],獲取level,獲取數(shù)據(jù)名,生成以該數(shù)據(jù)名為多叉樹節(jié)點名字的節(jié)點,并生成相應的iterator。如果該節(jié)點是葉子節(jié)點轉(zhuǎn)入步驟④。否則轉(zhuǎn)入步驟③。
③將相應的元素<int,tree_type::iterator >插入map。
④生成以該節(jié)點為根的樹。
⑤讀配置文件的下一行并存入char line[256]。如果該行為空,說明到了文件尾,則轉(zhuǎn)入步驟⑧,否則轉(zhuǎn)入步驟⑥。
⑥獲取該行的level,獲取該行的數(shù)據(jù)名,生成以該數(shù)據(jù)名為多叉樹節(jié)點名字的節(jié)點,并生成相應的iterator,放入到父節(jié)點的vector 中(父節(jié)點是map 中鍵level-1 對應的節(jié)點)。如果該節(jié)點是葉子節(jié)點轉(zhuǎn)入步驟⑤。否則轉(zhuǎn)入步驟⑦。
⑦通過函數(shù)map.count(level)判斷map 中鍵level 是否存在。如果存在則直接將該iterator 賦值給mp[level],否則利用函數(shù)map. insert()插入到map中。轉(zhuǎn)入步驟⑤。
⑧通過通道的read()函數(shù)來判斷通道中是否有消息存在。如果沒有消息存在則循環(huán)執(zhí)行read()函數(shù),直到通道中有消息存在。
⑨通過nml 通道獲取獲取葉子結(jié)點的值,利用生成的多叉樹結(jié)構以及l(fā)ibxml2 程序庫的函數(shù)xml-NewDoc 創(chuàng)建文檔并在內(nèi)存中保存文檔,通過xml-SaveFile 將xml 文檔存入文件,結(jié)束。
⑩通過nml 通道獲取獲取葉子結(jié)點的值,利用libxml2 的函數(shù)修改保存的xml 文檔,通過xmlSave-File 將xml 文檔存入文件,結(jié)束。
2.2.2 例子
配置文件的例子:數(shù)據(jù)層級,數(shù)據(jù)名:數(shù)據(jù)類型
讀該conf 配置文件會生成一棵多叉樹如圖4 所示。
圖4 根據(jù)配置文件生成的多叉樹
生成XML 文件,見圖5。
圖5 生成的XML 文件
本文的實驗是在具有800MHz CPU、512MB 內(nèi)存的裝有數(shù)控系統(tǒng)及Red Hat Linux 9.0 操作系統(tǒng)的Pentinum3 上實施操作的。
在用戶空間使用數(shù)控系統(tǒng)提供的etime()函數(shù)記錄時間戳,返回微秒級的時間計數(shù)。因為執(zhí)行一遍程序的時間太短,所以采取while 循環(huán)執(zhí)行一次main()函數(shù)就是執(zhí)行原來的程序1000 遍。針對配置文件不同的n(0 <n <2000)執(zhí)行三次main()函數(shù),得到表1、表2、圖6 的時間。
實驗方案一:在原有的數(shù)控系統(tǒng)上進行實驗,僅僅利用數(shù)控系統(tǒng)自帶的RCS 庫的函數(shù)生成XML 文件。
實驗方案二:利用本文提出的方法生成XML 文件。
下面是實驗結(jié)果:
表1 conf 配置文件沒有改變時兩個方案的時間表
表2 conf 配置文件改變時兩個方案的時間表
在本實驗中選取conf 配置文件時,配置文件包含了數(shù)控系統(tǒng)所有的狀態(tài)消息類型。從表一可以看出當配置文件包含數(shù)控系統(tǒng)所有的狀態(tài)消息類型時,n 越小方案二的時間性能越佳,但是無論n 如何取值,方案二在時間性能上總是優(yōu)于方案一。從表二可以看出當conf 配置文件改變時,方案二的時間性能還是優(yōu)于方案一,只是比conf 配置文件沒有改變時的時間性能略有降低。
函數(shù)readfile_maketree()包括設計方法步驟的(2)-(7),函數(shù)readtree_makexml()包括設計方法的步驟(8)-(9)。由圖6 可以看出利用conf 配置文件生成XML 文件時,讀配置文件花費的時間占用整個方法時間的比例很小,這樣就會突顯出方案二的優(yōu)勢:①利用conf 配置文件僅僅會生成包含配置文件中對應的n 個節(jié)點的XML 文件,而方案一會生成不小于n 個節(jié)點的若干個XML 文件,這樣方案二在生成XML 文檔節(jié)點的時間上優(yōu)于方案一。②在conf配置文件沒有改變的情況下,方案二會利用上次保存在內(nèi)存中的XML 文檔,而方案二必須重新生成所有的XML 文檔的節(jié)點,從這方面看方案二在生成XML 文檔節(jié)點的時間上優(yōu)于方案一。
圖6 函數(shù)執(zhí)行時間坐標圖
采用根據(jù)conf 配置文件讀取數(shù)控系統(tǒng)的狀態(tài)信息并利用libxml2 程序庫生成XML 文件的方法會比利用數(shù)控系統(tǒng)自帶的RCS 庫的函數(shù)生成XML 文件更有針對性,同時比利用數(shù)控系統(tǒng)自帶的能生成XML 文件的RCS 庫函數(shù)的時間性能更佳。采用根據(jù)conf 配置文件讀取數(shù)控系統(tǒng)的狀態(tài)信息并利用libxml2 程序庫生成XML 文件的方法,可以更好的避免數(shù)控系統(tǒng)升級導致整個網(wǎng)絡化監(jiān)控平臺信息失效,保證車間級對網(wǎng)絡級的信息透明。
[1]畢留剛,王隆太. 網(wǎng)絡化數(shù)控系統(tǒng)的研究和開發(fā)[J]. 智能控制技術,2006,35(1):57-61.
[2]宋桃桃. 基于實時網(wǎng)絡數(shù)控系統(tǒng)通信平臺的設計與實現(xiàn)[D]. 沈陽:中國科學院沈陽計算技術研究所,2008.
[3]張柏軍,杜鵬. 網(wǎng)絡化數(shù)控系統(tǒng)的研究與開發(fā)[J]. 數(shù)字技術與應用,2010(3):41-42.
[4]T. Bray,J. Paoli,C. M. Sperberg-McQueen,E. Maler,F(xiàn). Yergeau,“Extensible Markup Language (XML)1.0(Fifth Edition),” W3CRecommendation 26 November 2008,http://www.w3.org/TR/xml/.
[5]陳紅梅,陳靜. XML 文檔解析技術[J]. 信息技術,2009(10):174-177.
[6]Zefu Dai,Nick Ni,Jianwen Zhu.A 1 Cycle-Per-Byte XML Parsing Accelerator.FPGA,2010(10):199-208.
[7]V. Gazi,M. L. Moore,K. M. Passino,et al. The RCS Handbook:Tools for Real Time Control Systems Software Development.John Wiley and Sons,NY,2001.
[8]吳孜越,仲志丹,張洛平. XML 在數(shù)控機床遠程監(jiān)控與故障診斷系統(tǒng)中的應用[J]. 機械設計與制造,2008(8):131-133.
[9]于東,李筱颿,黃艷,等. 基于XML 的STEP-NC 程序解釋器的設計與實現(xiàn)[J]. 小型微型計算機系統(tǒng),2009(10):38-41.
[10]劉文遠,章偉剛,王亞東,等. XML 環(huán)的定義、分類、判定和消除[J]. 小型微型計算機系統(tǒng),2008(3):91-94.