文獻標識碼: A
文章編號: 0258-7998(2013)09-0034-04
目前,地震預(yù)報的信息來源主要依靠遍布在各處的地震觀測臺站所監(jiān)測到的地震數(shù)據(jù)。隨著地震觀測臺網(wǎng)規(guī)模日益擴大,實時性和數(shù)據(jù)量的要求也在不斷提高。除了固定的地方地震觀測臺站以外,還有大量野外流動地震觀測站。流動觀測站主要對一定時間和地區(qū)內(nèi)的數(shù)據(jù)進行強化觀測,用以提高監(jiān)測能力和異常跟蹤能力,并可以針對多種物理量進行采集,將數(shù)據(jù)反饋到臺網(wǎng)中心[1]。因此,一個流動站常常會布置數(shù)量眾多而又分散的采集點,而如何將這些分散的采集點的數(shù)據(jù)傳輸?shù)降卣鹋_網(wǎng),是野外流動觀測技術(shù)的關(guān)鍵之一。
在野外復(fù)雜環(huán)境中,通常將采集節(jié)點數(shù)據(jù)匯總至流動站,再由流動站統(tǒng)一接入互聯(lián)網(wǎng)。局部數(shù)據(jù)的傳輸方式可有多種選擇,需要綜合考慮距離、便捷性、可靠性及成本等多種因素。本文中設(shè)計了一種采用控制器局域網(wǎng)(CAN)進行地震數(shù)據(jù)傳輸?shù)姆绞?,以滿足分散的采集點能在相對較廣范圍內(nèi)進行組網(wǎng)通信的要求。
1 系統(tǒng)框架
本文以激光多普勒地震儀項目為背景進行系統(tǒng)構(gòu)建,主要解決將分散的采集點進行集中管理的問題。由于野外采集點數(shù)量眾多,且安裝位置較分散,若都與流動站之間直接組建局部網(wǎng)絡(luò)連接,則無論采用何種組網(wǎng)方式,都必將加重人力、物力的投入,同時也會加重流動站的管理負擔(dān)。因此,本文采用中繼站的思想,將一定區(qū)域內(nèi)的采集點利用總線方式匯總到主控機上,再由主控機統(tǒng)一將數(shù)據(jù)傳輸?shù)搅鲃诱荆到y(tǒng)結(jié)構(gòu)如圖1所示。采用這種分布式結(jié)構(gòu),一方面可以降低采集點組建網(wǎng)絡(luò)的成本,另一方面主控機可以取代部分流動站的功能,對本局域網(wǎng)內(nèi)的采集點進行管理和監(jiān)控,便于組成規(guī)模更大的野外流動站。
系統(tǒng)采用的控制器局域網(wǎng)(CAN)是一種ISO國際標準化的串行通信協(xié)議,能有效支持具有很高安全等級的分布實時控制。相對于其他總線,CAN總線具有傳輸距離遠、速度較快、抗干擾能力強、介質(zhì)簡單、可靠性高等優(yōu)勢[2-3],適合野外無人值守的環(huán)境。
2 采集節(jié)點的CAN通信實現(xiàn)
項目中采集點的主控芯片采用TI公司C54系列DSP,因芯片不帶CAN控制端口,所以要在DSP平臺上實現(xiàn)CAN通信節(jié)點的設(shè)計。
2.1 基于DSP的傳輸節(jié)點設(shè)計
項目選取SPI接口的獨立控制器MCP2515作為總線控制端,收發(fā)器采用帶有隔離的總線收發(fā)器ADM3054,該芯片直接將隔離器和收發(fā)器集成到一起,省去了控制器與收發(fā)器之間的光耦隔離,同時也可解決控制器與收發(fā)器之間的電平匹配問題,簡化外圍電路設(shè)計。
將DSP的多通道緩沖串行口(McBSP)配置成SPI兼容模式,這種模式下每一幀的長度是固定的。但MCP2515的SPI控制指令長度并不統(tǒng)一,因此,采取折中方案以最長的指令位數(shù)來配置串行口。
使用SPI模式通信時,關(guān)鍵的問題是時序的匹配,因為DSP的工作時鐘頻率遠高于SPI傳輸時鐘頻率,所以需要在讀操作時加入足夠長的延時。圖2中的(a)、(b)可反映這一情況,采用控制器的環(huán)回模式進行測試,DataSend數(shù)組中存放的是發(fā)送的8 B數(shù)據(jù),RecvBuff數(shù)組中存放的則是通過SPI讀取接收數(shù)據(jù)寄存器得到的值。圖2(a)是沒有加入足夠延時的讀操作,從虛線框標出的數(shù)據(jù)看出,讀操作在時間上發(fā)生了錯位,當前的讀操作實際讀到的是上一個指令傳送回來的數(shù)據(jù),而圖2(b)在加入了足夠長的延時之后,能在時間上對應(yīng),讀到正確的數(shù)值。
2.2 節(jié)點的通信策略
CAN協(xié)議所采用的對報文進行地址編碼的方式便于在總線上增刪節(jié)點。在本項目中,由于各個節(jié)點都只與主控機進行通信,所以,充分利用CAN報文幀ID識別碼的特性,將發(fā)送幀的識別碼、本節(jié)點的編碼以及本節(jié)點接收濾波器的識別碼相統(tǒng)一。而主控機的節(jié)點則可以讀取所有總線上的報文,所采用的通信策略如圖3所示,這樣的設(shè)計實際上就將原先總線式的拓撲結(jié)構(gòu)轉(zhuǎn)換成了類似星形拓撲的結(jié)構(gòu),便于主機管理所有節(jié)點。
3 主控制點的設(shè)計
相對于采集節(jié)點單一的采集處理任務(wù)而言,主控機需要實現(xiàn)更多的功能,單任務(wù)的MCU則無法滿足要求。因此,本文選用嵌入式微處理器ARM11作為主控機的硬件平臺,ARM處理器具有豐富的外設(shè)接口和良好的實時控制性能,無論從尋址空間還是處理性能上,都要優(yōu)于一般的單片機,適合充當小型控制中心。
3.1 Linux下CAN網(wǎng)絡(luò)設(shè)備驅(qū)動的實現(xiàn)
項目中移植了Linux 3.0.1版本內(nèi)核作為軟件運行的系統(tǒng)平臺,內(nèi)核會為驅(qū)動提供統(tǒng)一的接口。在較新版本的內(nèi)核中,CAN設(shè)備已經(jīng)不再簡單定義成字符設(shè)備,而是定義成網(wǎng)絡(luò)設(shè)備,這更接近于CAN是一種局域網(wǎng)的本質(zhì),從而可以使用Socket套接字操作CAN設(shè)備,并使用內(nèi)核提供的高級功能。
對內(nèi)核已提供的MCP2515的驅(qū)動文件進行修改以符合硬件平臺的實現(xiàn)。通過定義mcp251x_priv結(jié)構(gòu)體來管理設(shè)備所有的信息,如下所示:
struct mcp251x_priv {
struct can_priv can;
struct net_device *net;
struct spi_device *spi;
……
};
以上3個結(jié)構(gòu)體變量分別存放了設(shè)備需要使用的協(xié)議層、網(wǎng)絡(luò)層和硬件層的相關(guān)信息。通常,網(wǎng)絡(luò)設(shè)備驅(qū)動模塊主要包括網(wǎng)絡(luò)協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、設(shè)備驅(qū)動功能層和網(wǎng)絡(luò)設(shè)備與媒介層4層[4],各部分模塊在內(nèi)核中的結(jié)構(gòu)關(guān)系如圖4所示。設(shè)備通過SPI子系統(tǒng)來實現(xiàn)硬件層操作,網(wǎng)絡(luò)設(shè)備與SPI設(shè)備之間的連接橋梁是驅(qū)動功能層struct net_device_ops,通過它向上層提供網(wǎng)絡(luò)設(shè)備的底層硬件操作接口函數(shù):
struct net_device_ops mcp251x_netdev_ops = {
.ndo_open = mcp251x_open,
.ndo_stop = mcp251x_stop,
.ndo_start_xmit = mcp251x_hard_start_xmit,
};
采用“頂半部”和“底半部”的機制來處理中斷,可以解決在中斷中讀寫SPI耗時的問題,這種機制將耗時過長的中斷程序放到更安全的時段中運行,以使系統(tǒng)能及時響應(yīng)其他的中斷請求[5]。因此,僅僅在中斷函數(shù)中喚醒一個處理函數(shù)的工作隊列:schedule_work(&priv->irq_
work),而將真正的處理程序放到這個工作隊列中運行,以保證系統(tǒng)實時響應(yīng)的性能。
運行驅(qū)動還需要向內(nèi)核注冊必要的硬件信息,如晶振頻率(.oscillator_frequency)、SPI總線號(.bus_num)、硬件中斷號(.irq)等硬件信息。其中設(shè)備名(.modalias)必須要和驅(qū)動中定義的設(shè)備名相同,否則內(nèi)核無法把這些信息傳遞到驅(qū)動中。
struct mcp251x_platform_data mcp251x_info = {
.oscillator_frequency = 8000000,
.board_specific_setup = mcp251x_ioSetup,
……
};
struct spi_board_info spi_mcp251x_info[] = {
{ .modalias = "mcp2515",
.platform_data = &mcp251x_info,
.irq = IRQ_EINT(16),
.bus_num = 1,
……
},
};
3.2 基于Qt的控制應(yīng)用程序開發(fā)
上層應(yīng)用程序是實現(xiàn)主控制點所有功能的入口,也是人機交互的平臺。項目采用跨平臺的C++應(yīng)用程序開發(fā)框架Qt來實現(xiàn)圖形化用戶界面程序的開發(fā),其具有良好的適應(yīng)性和可移植性[6]。
本系統(tǒng)中移植了4.8.0版本的Qt庫,如圖5所示。項目應(yīng)用程序的主要框架通過窗體部件類QWidget來構(gòu)建。為了使界面更直觀,加入了對標簽窗體類QTabWidget的支持。同時,主控機的Socket CAN通信功能由多線程來實現(xiàn),多線程機制可以使Qt程序在同時運行多個阻塞式任務(wù)時,不會影響用戶界面的響應(yīng)。
子線程類RecvThrd主要實現(xiàn)對CAN口的監(jiān)聽任務(wù),并通過信號-槽機制將數(shù)據(jù)傳給主線程,重寫虛成員函數(shù)void RecvThrd :: run( )加載新的線程任務(wù)。Socket CAN的使用類似于其他網(wǎng)絡(luò)協(xié)議操作,主要包括建立套接字、綁定端口和監(jiān)聽等,不同的是CAN通信不需要與對方建立連接,主要實現(xiàn)方式如下:
void RecvThrd :: run( )
{
rv_sk=socket(PF_CAN,SOCK_RAW,CAN_RAW);
recv_addr.can_family = AF_CAN;
recv_addr.can_ifindex = 0;
bind(rv_sk, (struct sockaddr *)&recv_addr, len);
recvfrom(rv_sk,(void*)&recv_frame,sizeof(struct can_frame),0,(struct sockaddr *)&recv_addr, &len);
……
}
如圖6所示,使用繪圖類QPainter在子窗口Graph中實時顯示動態(tài)數(shù)據(jù)曲線和坐標。繪制坐標曲線時首先要使用QPainter的視窗轉(zhuǎn)換函數(shù)將Qt中默認的繪圖坐標原點從屏幕的左上角移到左下角。動態(tài)曲線采用折線方式繪制,當曲線超過一定寬度后,會實時向左平移。由于在Qt中使用專門定義的數(shù)據(jù)類型,所以C中的通用數(shù)據(jù)類型都需經(jīng)過特定轉(zhuǎn)換后才能供Qt使用和顯示。管理數(shù)據(jù)和文件時使用流操作可有效減少系統(tǒng)調(diào)用次數(shù),提高運行速度[7]。
4 測試與總結(jié)
將Qt應(yīng)用程序交叉編譯后,下載到ARM平臺上運行,產(chǎn)生圖6中的標簽式窗口界面。在構(gòu)造主窗體時傳入Qt :: FramelessWindowHint參數(shù),可以讓界面不產(chǎn)生標題欄,使窗口界面能準確并完整地顯示在液晶屏上。
當主線程檢測到新的地震采集節(jié)點號時,會彈出消息框通知用戶處理,新節(jié)點會被加入每個子窗口的設(shè)備列表中,或被丟棄。引入Qt的互斥鎖QMutex機制,可以有效避免因命令沒有得到及時處理而導(dǎo)致重復(fù)添加相同ID號的情況。在另外兩個子窗口中可以瀏覽接收的數(shù)據(jù)以及管理對應(yīng)節(jié)點。
測試表明,基于ARM平臺的主控機可以滿足數(shù)據(jù)收發(fā)、實時顯示、節(jié)點監(jiān)控以及異常記錄等多任務(wù)要求,在不影響與地震采集節(jié)點間通信的前提下,實現(xiàn)良好的人機交互和實時控制性能,在整個網(wǎng)絡(luò)系統(tǒng)中起中繼站的作用,方便了流動站對分散的地震采集節(jié)點的控制和管理。
本文設(shè)計了一種采用CAN總線通信技術(shù)在地震數(shù)據(jù)采集點與流動站之間進行數(shù)據(jù)傳輸?shù)姆绞?,利用CAN總線通信傳輸距離長、抗干擾能力強、易于施工布線的特點,以及微處理器ARM優(yōu)越的實時控制能力和良好的通信能力,在地震采集節(jié)點與流動站之間構(gòu)建中間控制點,以星形拓撲的方式將一定范圍內(nèi)分散的采集點集中控制。同時,通過在ARM硬件平臺上構(gòu)建Linux多任務(wù)系統(tǒng)平臺,采用Qt嵌入式應(yīng)用程序框架搭建人機交互界面,實現(xiàn)了良好的實時控制和管理功能。這種基于CAN總線和嵌入式技術(shù)的地震數(shù)據(jù)傳輸方式,既便于野外環(huán)境中網(wǎng)絡(luò)的組建和拓展,也有利于減輕流動站的管理任務(wù)。
參考文獻
[1] 王晨,滕云田,王曉美,等.地震前兆野外流動觀測無線組網(wǎng)系統(tǒng)[J].地球物理學(xué)進展,2012,27(3):945-949.
[2] 郭成鎮(zhèn),何迪.CAN總線的PLC通信網(wǎng)絡(luò)的研究[J].通信技術(shù),2012,45(7):51-53,74.
[3] 梁金芝.CAN總線協(xié)議在嵌入式系統(tǒng)中的應(yīng)用[J].電腦知識與技術(shù),2011,7(20):5003-5004.
[4] 宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解(第2版)[M].北京:人民郵電出版社,2010.
[5] CORBET J,RUBIN A,KROAH-HARTMAN G.Linux設(shè)備驅(qū)動程序(第3版)[M].魏永明,耿岳,鐘書毅,譯.北京:中國電力出版社,2005.
[6] BLANCHETTE J,SUMMERFIELD M.C++ GUI Qt 4編程(第2版)[M].閆鋒欣,譯.北京:電子工業(yè)出版社,2008.
[7] MATTHEW N,STONES R.Linux程序設(shè)計(第4版)[M].陳健,宋健建,譯.北京:人民郵電出版社,2010.