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