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