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