譚立志,李二喜,張利民,吳桂清
(1.株洲職業技術學院,湖南 株洲 412001;2.湖南大學 電氣與信息工程學院,湖南 長沙 410082)
高速鐵路客運專線工程的大規模建設推動著我國國民經濟高速發展,專線的建設工程規模大、技術標準高,要保證全線運行的安全可靠,路基的高質量建設是其重要保障,路基沉降值的大小對于高速列車的安全運行、線路養護維修工作量及車輛軌道結構設施的使用壽命等有著重要影響[1]。因此,在高速鐵路整個施工建設和運行周期中必須加強對全線路基、橋梁、隧道實施全面的、連續的、可靠的、準確的、長期的沉降位移監測。
隨著Internet技術的逐漸普及,它對當今社會的作用和影響也越來越大,從某種意義上來講,它提升了世界的可接入性。但是在工業控制領域,還有許多傳統的串口儀器被廣泛使用,這些儀器都面臨著數據集中、接入、控制和二次開發的新課題。儀器網絡化是解決此問題的唯一途徑,可這需要非常大的軟硬件投資,甚至會超過原設備的開發投資,代價實在太高。
本文中,將以高速鐵路路基沉降遠程監測為例,提供了一種基于AT91SAM9261的數據集中器設計方案,較好地解決了上文提出的問題,具有很好的推廣價值。
高速鐵路路基沉降遠程監測系統由各類現場儀器、數字模塊、數據采集器以及監控主機等組成。系統采用分布式組網方式,現場儀器負責采集能夠體現路基沉降變化水平的電流、電壓信號,系統通過處理后將之轉化為可以識別和計算的數字量。數據采集器支持與現場儀器的多種連接方式:可以通過電纜與儀器直接相連;也可以先連接數字模塊,數字模塊再以總線的形式連接多臺儀器。二者之間采用帶有屏蔽層的RS-485同軸電纜進行連接,考慮現場儀器的野外露天運行條件,系統提供了太陽能供電裝置確保現場儀器在極端環境下的正常工作。在系統的最上層,監控主機與數據集中器共同接入Internet,用戶可以通過遠程訪問的形式對數據集中器進行動態在線監測。系統的拓撲結構如圖1所示。

圖1 系統拓撲結構Fig.1 System topology
數據集中器在整個高速鐵路路基監測遠程監測系統中起著承上啟下的作用,能夠自動化采集分布在鐵路沿線的各類監測儀器數據,并為監控主機提供統一的數據接口。因此,數據集中器是整個監測系統的自動監測、數據存儲及傳輸中心。
系統的硬件設計框圖如圖2所示。

圖2 硬件設計框圖Fig.2 Hardware design diagram
本系統芯片采用的是以ARM926EJ-S為核心的嵌入式微處理器AT91SAM9261,它是目前應用最廣的工業級32位高性能嵌入式RISC處理器,它具有獨立的16K指令和16K數據cache、全功能的MMU虛擬內存管理單元、DSP擴展功能的指令集以及豐富的外部接口[2],另外,該芯片功耗非常低,溫度適應范圍廣,而且具有良好的抗電磁干擾能力,因此非常適用于環境惡劣多變的露天監測環境。
考慮到數據集中器的數據量較大,系統自帶的NAND Flash容量有限,因而專門設計了SD卡模塊,用于滿足系統長時間、大容量的存儲需求;另外,系統還設計了簡單的按鍵模塊以及液晶顯示模塊,用于現場布置和調試儀器參數使用。
ARM芯片AT91S AM9261本身自帶的以太網接口僅包括數據鏈路層及以上部分,沒有物理層。我們選用DM9000AEP芯片作為系統的以太網物理層接口。該芯片功能完整、成本低廉。支持外部處理器以字節、字、雙字等方式讀寫其內部的EEPROM,可以自適應10/100M以太網,支持全雙工模式下的流量控制,完全符合IEEE 802.3x標準。另外,該芯片還提供了4K雙字節的SRAM,可以很好地滿足本系統的需要。
文獻[3]針對數據采集儀上的多串口全雙工通信模塊的設計與實現進行了論述,本文在此基礎上實現了對數據集中器串口模塊的擴展。其中,多串口模塊采用硬件描述語言VHDL進行FPGA設計[4],使用Atmega128L微處理器對FPGA進行配置,并通過FPGA和MCU方便地實現多串口的擴展。
在數據集中器中,由于其串口數量較多(每臺數據集中器攜帶32個串口),如果使用專門的串口擴展芯片,不僅價格昂貴,還會導致電路板體積變大,功耗升高,不能適應惡劣多變的露天監測環境。因此,在本系統中,我們將若干接口電路的功能集成到了一片PLD或FPGA芯片,該方法具有集成度高、體積小、功耗低和速度快等優點,而且還具有用戶可編程能力,可以很方便地實現整個系統的功能重構。
由于文章篇幅限制,其實現思路及程序代碼便不再贅述,具體可以參考文獻[3]。
從軟件角度來看,嵌入式Linux系統從上到下可以分為以下四個層次,即啟動與引導程序Bootloader、Linux內核kernel、根文件系統root filesystem以及用戶應用程序[5]。
嵌入式軟件開發中所采用的編譯為交叉編譯,所謂交叉編譯就是在一個平臺上生成可以在另一個平臺上執行的代碼。搭建交叉編譯環境是嵌入式開發的第一步,也是必備的一步,選擇合適的交叉編譯器對于嵌入式開發是非常重要的[6]。在本系統中,主要涉及gcc、glibc、binutils等軟件的安裝,其中,binutils用于生成包括as、ld、objdump等在內的一些輔助工具,以方便嵌入式Linux系統的構建。
U-boot(universal boot loader)是遵循GPL條款的開放源碼項目,U-boot在AT91SAM9261上的移植可以分為源代碼編譯,目標板燒寫以及啟動配置3個步驟。U-boot源代碼可以從開源網站www.sourceforge.net方便獲取,本系統中使用的U-boot版本為1.3.4,將其進行交叉編譯后,即可獲得對應的二進制可執行文件。通過AT91系列處理器專門的燒寫工具sam-ba可以實現對Boot Loader的燒寫。最后,我們還需針對相應的硬件系統,設置U-boot中的環境變量,從而實現其對Linux的引導和啟動,這些環境變量主要包括ethaddr、ipaddr、serverip、stdin、stdout、stderr,等等。
Linux采用的單內核體系統結構,主要負責整個操作系統的進程調度、內存管理、文件管理以及設備驅動,Linux內核由多個在功能上不同的模塊組成,各個模塊負責不同的事務處理且相互關聯,這一特性也方便了用戶對于內核的裁剪,提高了其靈活性。在本系統中,可以直接使用Atmel公司提供的針對AT91SAM9261的Linux源代碼,并進行相關的內核裁剪和配置,然后使用make命令完成對Linux內核的編譯。最后,還需要通過U-boot的mkimage命令,在原映像文件頭部添加64字節的結構體用于記錄啟動參數信息,即可實現U-boot對Linux內核的加載。
在嵌入式系統中,Yaffs是針對NAND Flash而特別設計的文件系統。它去掉了一些多余功能,所以執行速度更快、內存占用更少,同時具有對NAND Flash的保護機制,可以延長其使用壽命。我們可以直接通過“git clone git://www.aleph1.co.uk/yaffs2”下載Yaffs源碼并進行相關編譯。另外,考慮到Linux本身并沒有提供對Yaffs的支持,因此還需額外將Yaffs源碼復制到Linux源碼中,并對其進行重新編譯。為了構造完整的嵌入式Linux系統,除Linux內核外,還需引入對Busybox的支持,它是一個集成了一百多個最常用linux命令和工具的軟件工具包。為簡單起見,我們采取了Busybox的默認配置,在編譯完成后,將之安裝在系統的/usr/local/busybox目錄下。最后,我們通過Yaffs2制作工具將該目錄制作成Yaffs2格式的文件系統,至此,則整個Linux根文件系統制作完畢。
根據設計要求,數據集中器的軟件模塊框圖如圖3所示。其功能主要可以分為以下幾個部分:
1)數據采集:通過調用儀器信息庫中的儀器數據,結合不同廠家的通信協議,以串口通信的方式實現對高速鐵路沿線各類現場儀器的實時數據采集;
2)數據存儲:對采集上來的電壓、電流信號,進行A/D轉換,將之轉化為可以識別和計算的數字量,并進行存儲;
3)業務調度:對數據集中器的各項業務進行調度處理,包括人機交互以及處理來自監控主機的查詢、設置設備參數、用戶管理以及數據提取等指令;
4)網絡通信:負責與監控主機之間的通信,監控主機可以據此對數據集中器的設備參數以及用戶管理等進行相關設置與查詢。
系統需要不同種類儀器的協同工作,由于各生產廠家的通信協議差異較大,必須要求軟件能夠兼容所有協議且具有良好的拓展性。因此,將圖3中的通信協議Protocol類設為抽象類,為外部調用提供統一接口,而具體的協議實現則交由各繼承類來完成。利用工廠方法模式(Factory Method),定義一個用于創建協議對象的通用接口,從而將協議對象的實例化延遲到子類階段,方便以后對協議種類的擴展。

圖3 系統軟件框圖Fig.3 System software diagram
如圖4,Protocol類為工廠方法模式創建協議對象的接口,Protocol_Digital、Protocol_CCD、Protocol_Module等由Protocol類派生,表示不同種類儀器的具體協議。

圖4 工廠方法模式Fig.4 Factory method
在程序設計中,根據依賴倒轉原則,我們把工廠方法類Protocol_Creator抽象成一個接口,該接口中包含方法CreateProtocol,用于創建抽象類Protocol的對象;然后在所有具體的協議類中都添加對該接口的實現。
此時,如果要為數據集中器添加新的儀器協議,就不再需要修改頂層的Protocol_Creator類,而只需添加對應的協議Protocol_XXX以及相應的工廠接口XXX_Creator即可。
在本系統中采用SQLite數據庫用于數據存儲,它支持豐富的SQL語句,是遵守ACID事務的關聯式數據庫管理系統,具有可移植性好、代碼體積小、易于使用、高效可靠、零配置管理等特點[7]。特別值得一提的是,SQLite還支持觸發器以及事務處理。
當數據采集模塊接收到數據后,我們首先將數據存儲到內存中,直至數據接收完畢,系統會對數據包的完整性進行檢查,隨后進行事務提交,即一次性地將全部接收到的數據存儲到數據庫中,從而提高了數據庫的讀寫速度。當測量現場由于監控需求變更或儀器故障損壞,而導致儀器信息發生變動時,現場工作人員可以配合按鍵操作,自動調用SQLite觸發器,實現數據庫中相關表的級聯更改,提高工作效率。另外,對于其他一般性事務,可以通過sqlite3_exec函數執行指定的SQL語句,該函數可以設置回調函數,方便用戶當執行查詢等操作時對查詢結果進行進一步處理。
系統業務調度相當于數據集中器的粘合劑,它不僅要負責處理用戶的按鍵輸入以及液晶顯示,還要處理來自監控主機的各類指令,并將處理結果和監測數據以數據包的形式返回給監控主機,從而實現高速鐵路路基沉降的遠程在線監測。
其流程圖如圖5所示,在系統初始化過程中,業務調度模塊優于其他模塊進行執行,隨后以非阻塞的方式順序循環檢測按鍵事件以及網絡數據包,當發現有業務到達時,即跳轉到業務處理流程,待執行完畢后系統返回主線程繼續操作。從圖中可以看出,按鍵事件的業務優先級高于網絡數據包,這樣可以保證工程人員在現場配置數據集中器參數時,能夠避免網絡數據包的干擾,得到快速及時的響應。

圖5 業務調度流程Fig.5 Business scheduling process
數據集中器包括四個物理按鍵,在按鍵事件處理過程中,通過調用read函數,讀取按鍵所對應的設備文件/dev/event0,并加以判斷。我們在程序中規定,按鍵時間小于150 ms系統不予響應,按鍵時間介于150 ms和600 ms之間觸發“短按”事件,按鍵時間大于600 ms觸發“長按”事件。
考慮到數據集中器與監控主機之間開發平臺的差異,系統的網絡通信模塊采用基于傳輸控制協議TCP的Socket通信來實現。
4.4.1 選擇高效的網絡I/O方法
傳統的處理網絡I/O的技術分為多進程、多線程同步阻塞I/O以及SELECT、POLL的單線程事件驅動I/O等方式[8]。其中多線程、多進程同步阻塞網絡I/O技術因為存在Forking以及切換上下文時的巨大開銷,并不太適合處理高并發的網絡連接;而SELECT、POLL的單線程事件驅動I/O技術由于要持續不斷地寫入Socket或者POLL FD結構,會導致不斷地拷貝用戶空間和內核空間,當網絡負載不斷加大時,系統性能就會急劇惡化。
考慮到數據集中器的實際工作環境,我們采用EPOLL單線程事件驅動I/O技術,它已集成在Linux 2.6及以上版本的內核中,該技術具有套接字遍歷時間短、內存讀寫次數少等優點。其使用要點可簡單歸納如下:
1)定義結構體epoll_event,聲明變量epoll_event ev和指針*pev,其中ev用于登記EPOLL事件,以便處理監控主機的Socket連接,pev用于指向當前活躍的ev;
2)調用epoll_create函數,創建用于EPOLL事件的文件描述符,并調用epoll_ctl函數注冊ev事件;
3)調用epoll_wait等待EPOLL事件發生,在用戶進行I/O操作時,EPOLL作為一種異步事件通知機制,會首先查詢I/O的可讀寫狀態,并通過epoll_wait進行通知,再由用戶決定是否讀寫。
4.4.2 請求使用機制
由于數據集中器是暴露在公共網絡中的,因此其安全問題就顯得尤為重要,本系統通過請求使用操作來解決上述問題,如圖6所示,只有請求使用成功的監控主機才可以向數據集中器進一步進行遠程訪問;監控主機在完成遠程訪問后要及時退出使用,以便其他監控主機來獲得使用權。為了防止某監控主機在進入可操作狀態后上位機軟件的非正常中斷,我們規定,在某連接可操作后,如果連續2分鐘內沒有任何操作則退回到待批準狀態。

圖6 請求使用機制Fig.6 Request-use mechanism
我們在高速鐵路某路段沿線布置了10臺數據集中器,并在距離監控現場200Km外的監控主機上安裝了配套的上位機監測軟件,經過測試,在掛接35臺數字模塊和400余只儀器的情況下,系統依然能夠穩定工作。
在設計中,我們有針對性地使用Atmega128L微處理器對FPGA進行配置,并通過FPGA和MCU方便地實現多串口的擴展;根據實際監測需求合理處理儀器通信協議,運用工廠方法模式(Factory Method),方便以后對協議種類的擴展;充分運用SQLite數據庫的update觸發器以及事務處理能力,提升系統的數據庫性能,采用EPOLL單線程事件驅動I/O技術,提升了數據集中器的網絡并發通信處理能力;采取請求使用機制,增強了數據集中器的網絡安全性。
系統充分結合實際監控環境的特點,結構輕巧,層次清晰,有效地實現了所需功能。做到了轉換協議正確,數據傳輸完整,滿足高速鐵路路基沉降的監控要求,具有節約投資,可移植性強等優點,可廣泛應用于交通、電力、礦山、水利等工業控制領域。
[1]危鳳海.高速鐵路路基沉降的幾種原因及其監測方法[J].筑路機械與施工機械化.2010,27(10):24-27.WEI Hai-feng.Several reasons for subgrade settlement of high-speed railway and monitoring methods[J].Road Machinery&Construction Mechanixation,2010,27(10):24-27.
[2]袁溪.基于AT91SAM9261的嵌入式數據采集系統設計與實現[J].計算機測量與控制,2009,17(9):1854-1856.YUAN Xi.Design of embedded data acquisition system based on AT91SAM9261[J].Computer Measurement&Control,2009,17(9):1854-1856.
[3]張羽,胡玉貴,殷奎喜,等.基于FPGA的多串口擴展實現[J].電子器件,2009,32(1):233-236.ZHANG Yu,HU Yu-gui,YIN Kui-xi,et al.Realization of multi-serials extension based on FPGA[J].Chinese Journal of Electron Devices,2009,32(1):233-236.
[4]潘松.VHDL實用教程[M].成都:電子科技大學出版社,2003.
[5]劉磊,張鳳荔,秦志光.基于U-boot構建嵌入式Linux的Bootloader[J].計算機應用研究,2007,24(12):238-240.LIU Lei,ZHANG Feng-li,QIN Zhi-guang.Embedded Linux’s bootloader based on U-boot[J].Application Research of Computers,2007,24(12):238-240.
[6]冷玉林,鐘將.基于ARM的嵌入式Linux系統構建[J].計算機系統應用,2010,19(11):23-31.LENG Yu-lin,ZHONG Jiang.Building embedded linux system based on ARM[J].Computer Systems&Application,2010,19(11):23-31.
[7]蔣曉宇,賀永勝,王金明.基于SQLite3的用電信息采集終端數據平臺設計及研究[J].電測與儀表.2010,47(536A):103-107.JIANG Xiao-yu,HE Yong-sheng,WANG Jin-ming.Acquisition terminal's information platform design based on SQlite3[J].Electrical Measurement & Instrumentation, 2010,47(536A):103-107.
[8]ROSSI F.An event mechanism for Linux[J].Linux Journal,2003(11).