摘 要:本文闡述了基于Linux的現(xiàn)場(chǎng)總線無(wú)線通信卡的實(shí)現(xiàn)過(guò)程,成功地解決了IO模塊控制卡與其之間的通信問(wèn)題,通過(guò)無(wú)線通信卡實(shí)現(xiàn)了無(wú)線現(xiàn)場(chǎng)設(shè)備通過(guò)標(biāo)準(zhǔn)的無(wú)線技術(shù)接入到現(xiàn)有的現(xiàn)場(chǎng)總線中。同時(shí)進(jìn)行了簡(jiǎn)單測(cè)試,實(shí)驗(yàn)證明測(cè)試系統(tǒng)運(yùn)行效果良好,達(dá)到了預(yù)期目標(biāo)。
關(guān)鍵字:無(wú)線通信卡 現(xiàn)場(chǎng)總線 Linux驅(qū)動(dòng)
Abstract: This paper expatiate the realization technique of fieldbus wireless communication card based on Linux, and successfully solve the problem of communication with IO card. It provides the feasibility of realization of wireless extension of fieldbus by wireless communication card. Simple testing shows that system works orderly and achieves anticipative aim.
Key words: Wireless Communication Card;Fieldbus;Linux driver;
1.引言
使用無(wú)線連接設(shè)備的便利已經(jīng)導(dǎo)致了在消費(fèi)電子(商業(yè))領(lǐng)域中無(wú)線技術(shù)被空前成功的應(yīng)用。在此基礎(chǔ)上基于無(wú)線技術(shù)的應(yīng)用開始出現(xiàn)在各個(gè)領(lǐng)域。在工業(yè)或工廠底層環(huán)境中,使用無(wú)線技術(shù)的優(yōu)勢(shì)更是多方面的。
第一,在工業(yè)環(huán)境中往往需要大量的布線,采用無(wú)線技術(shù)不僅會(huì)使安裝和維護(hù)的成本有效減少,而且會(huì)使設(shè)備的調(diào)整規(guī)劃和重新配置更加的容易。
第二,無(wú)線技術(shù)的引入對(duì)于解決在有化學(xué)腐蝕、震動(dòng)和移動(dòng)部件等惡劣環(huán)境中對(duì)各種線纜的潛在損傷等問(wèn)題顯得更加有效。
第三,考慮到工廠設(shè)備中適應(yīng)性和靈活性,固定系統(tǒng)可以通過(guò)無(wú)線技術(shù)和現(xiàn)有的移動(dòng)子系統(tǒng)或移動(dòng)機(jī)器人連接通信。
第四,對(duì)在工廠設(shè)備進(jìn)行臨時(shí)訪問(wèn)任務(wù)(如診斷或程序設(shè)計(jì)等)使用無(wú)線技術(shù)會(huì)更加簡(jiǎn)化(如使用無(wú)線手持設(shè)備)。
在解決工業(yè)環(huán)境及過(guò)程控制環(huán)境下的許多移動(dòng)對(duì)象,如移動(dòng)機(jī)器人與自治運(yùn)輸設(shè)備之間的協(xié)調(diào);旋轉(zhuǎn)對(duì)象,如機(jī)械臂;危險(xiǎn)環(huán)境對(duì)象的監(jiān)測(cè)與控制問(wèn)題,如分布式控制等工業(yè)環(huán)境無(wú)線技術(shù)發(fā)揮極大的作用。將無(wú)線技術(shù)應(yīng)用到現(xiàn)場(chǎng)總線中來(lái)解決傳統(tǒng)現(xiàn)場(chǎng)總線存在的問(wèn)題,正受到學(xué)術(shù)界和工業(yè)界的極大關(guān)注。
2.現(xiàn)場(chǎng)總線的無(wú)線接入方法
為了使無(wú)線技術(shù)能夠無(wú)縫而更廣泛地應(yīng)用于工業(yè)現(xiàn)場(chǎng),使現(xiàn)場(chǎng)設(shè)備無(wú)線接入到現(xiàn)存的現(xiàn)場(chǎng)總線,國(guó)內(nèi)外相關(guān)領(lǐng)域的技術(shù)人員進(jìn)行了一定的嘗試。按在不同層上實(shí)現(xiàn)接入可以將接入方案分為三大類:用戶層接入、數(shù)據(jù)鏈路層接入和物理層接入。
?。?)用戶層接入:在用戶層設(shè)一個(gè)OPC服務(wù)器,通過(guò)OPC服務(wù)器進(jìn)行有線網(wǎng)段與無(wú)線網(wǎng)段之間的數(shù)據(jù)交換。該方案其優(yōu)點(diǎn)是簡(jiǎn)單易實(shí)現(xiàn),雙方可保持原有結(jié)構(gòu)不動(dòng),兩側(cè)的“連接”可隨時(shí)通過(guò)軟件的控制建立或分離。缺點(diǎn)是中間環(huán)節(jié)太多,實(shí)時(shí)性得不到保證。
(2)物理層的接入:在某些站點(diǎn)的有線連接“下”面加裝Modem。無(wú)線站點(diǎn)的信號(hào)經(jīng)過(guò)此無(wú)線收發(fā)裝置將幀格式轉(zhuǎn)換后,聯(lián)入有線網(wǎng)段接口,因此遠(yuǎn)端的無(wú)線站點(diǎn)被“視為”同質(zhì)站點(diǎn)。這樣,所有的有線、無(wú)線站點(diǎn)均采用原有現(xiàn)場(chǎng)總線協(xié)議,只是在最底層的某些物理連接上,無(wú)線連接代替了有線的連接。其缺點(diǎn)是此方法僅實(shí)現(xiàn)了點(diǎn)對(duì)點(diǎn)的連接,無(wú)線站點(diǎn)不具有“漫游接入”的能力。
(3)數(shù)據(jù)鏈路層的接入:此方法源自WLAN和以太網(wǎng)的聯(lián)接方式,即在PHY層和DDL層之上加一個(gè)無(wú)線網(wǎng)關(guān)。該無(wú)線網(wǎng)關(guān)實(shí)現(xiàn)了無(wú)線網(wǎng)段數(shù)據(jù)與有線網(wǎng)段之間的數(shù)據(jù)格式轉(zhuǎn)換和轉(zhuǎn)發(fā)。原有的現(xiàn)場(chǎng)總線保持不動(dòng),加裝一個(gè)無(wú)線網(wǎng)段的AP接入點(diǎn)。當(dāng)兩網(wǎng)段間有數(shù)據(jù)交換時(shí),才會(huì)通過(guò)AP點(diǎn)經(jīng)過(guò)協(xié)議轉(zhuǎn)換把數(shù)據(jù)轉(zhuǎn)發(fā)到另一端。
數(shù)據(jù)鏈路層的接入是現(xiàn)階段最被關(guān)注的方法。其具體實(shí)現(xiàn)方法較多,但大多處于理論研究階段或需要對(duì)原有的現(xiàn)場(chǎng)總線進(jìn)行改造,而工業(yè)廠家又不想使現(xiàn)正運(yùn)行的現(xiàn)場(chǎng)總線暫停工作。這使得現(xiàn)階段的一些其無(wú)線接入技術(shù)在現(xiàn)場(chǎng)總線中應(yīng)用變得困難。為了使無(wú)線現(xiàn)場(chǎng)設(shè)備能夠應(yīng)用于工業(yè)現(xiàn)場(chǎng),又不改動(dòng)現(xiàn)有的現(xiàn)場(chǎng)總線系統(tǒng),目前較成熟的技術(shù)就是使用無(wú)線分散控制站來(lái)與原有的現(xiàn)場(chǎng)總線連接,實(shí)現(xiàn)現(xiàn)場(chǎng)設(shè)備的無(wú)線接入。無(wú)線分散控制站一般由IO模塊控制卡、無(wú)線通信卡兩部分組成。兩塊板卡通過(guò)IO模塊控制卡上的雙端口RAM交換數(shù)據(jù),通過(guò)中斷觸發(fā)數(shù)據(jù)讀寫操作,從而達(dá)到通信效果。其關(guān)鍵技術(shù)就是如何實(shí)現(xiàn)無(wú)線通信卡的軟件設(shè)計(jì)。
3.基于Linux的無(wú)線通信卡
在無(wú)線分散控制站中無(wú)線通信卡使用AT91RM9200控制器并通過(guò)USB接口加載符合802.11b協(xié)議的無(wú)線傳輸模塊,其操作系統(tǒng)為L(zhǎng)inux系統(tǒng)。
3.1基于Linux的無(wú)線通信卡的工作原理
無(wú)線通信卡運(yùn)行著現(xiàn)場(chǎng)總線協(xié)議棧和功能塊(MAI,MAO,MDI,MDO)等。根據(jù)所接入的現(xiàn)場(chǎng)總線的不同選用相應(yīng)的協(xié)議棧。使用向IO模塊控制卡發(fā)中斷及響應(yīng)IO模塊控制卡中斷的方式,通過(guò)IO模塊控制卡來(lái)配置、讀取和控制現(xiàn)場(chǎng)設(shè)備。無(wú)線通信卡與IO模塊控制卡之間數(shù)據(jù)傳輸是直接通過(guò)讀寫IO模塊控制卡上的雙端口RAM實(shí)現(xiàn)的。另一方面,無(wú)線通信卡通過(guò)其上面的USB接口加載了符合802.11b協(xié)議的無(wú)線傳輸模塊,能夠通過(guò)該模塊實(shí)現(xiàn)與有線網(wǎng)絡(luò)相連,使其與相應(yīng)的現(xiàn)場(chǎng)總線工作站通信,其結(jié)構(gòu)示意圖如圖3-1所示:
[align=center]

圖3-1無(wú)線通信卡的結(jié)構(gòu)示意圖[/align]
3.2基于Linux的無(wú)線通信卡的軟件設(shè)計(jì)
無(wú)線分散控制站中無(wú)線通信卡軟件開發(fā)基于Linux操作系統(tǒng)。由于Linux系統(tǒng)基于802.11b協(xié)議的無(wú)線驅(qū)動(dòng)已經(jīng)很成熟了,而基于Linux操作系統(tǒng)的協(xié)議棧軟件移植也比較容易。因此,選擇Linux系統(tǒng)會(huì)有效的提高無(wú)線通信卡的開發(fā)周期。
基于Linux的無(wú)線通信卡與有線的通信卡在協(xié)議棧和功能塊方面大致相同,僅需將應(yīng)用程序向Linux系統(tǒng)上移植即可。但由于采用了Linux系統(tǒng)在與IO模塊控制卡通信的實(shí)現(xiàn)上就相對(duì)比較復(fù)雜了。與IO模塊控制卡通信的程序流程圖如下圖3-2所示:
[align=center]

圖3-2 與IO模塊控制卡通信的程序流程圖[/align]
3.3軟件實(shí)現(xiàn)中關(guān)鍵性問(wèn)題的解決
在Linux操作系統(tǒng)下對(duì)于中斷及其它系統(tǒng)資源的操作有特定的規(guī)范,如內(nèi)核模式操作和用戶模式操作具有不同操作權(quán)限,內(nèi)核空間與用戶空間也不能隨意互訪。導(dǎo)致如協(xié)議棧無(wú)法直接對(duì)雙端口RAM進(jìn)行讀寫,也無(wú)法直接向I/O模塊控制卡收發(fā)中斷,在Linux系統(tǒng)下,只有在內(nèi)核模式下才可以做到。那么,怎么樣將數(shù)據(jù)寫入到雙端口RAM中,然后發(fā)送中斷信號(hào)通知對(duì)方及如何響應(yīng)對(duì)方的中斷并從雙端口RAM中讀數(shù)是軟件實(shí)現(xiàn)中的關(guān)鍵性問(wèn)題。
3.3.1發(fā)中斷與注冊(cè)中斷處理程序的實(shí)現(xiàn)
由于發(fā)中斷與注冊(cè)中斷處理程序是對(duì)硬件直接操作,在Linux系統(tǒng)下用戶程序無(wú)法直接對(duì)其硬件進(jìn)行操作。因此,必須編寫相應(yīng)的內(nèi)核模塊,在內(nèi)核模塊中完成發(fā)中斷與注冊(cè)中斷處理程序的操作。在用戶程序中動(dòng)態(tài)加載相應(yīng)內(nèi)核模塊來(lái)達(dá)到用戶程序發(fā)中斷與注冊(cè)中斷處理程序的效果。其注冊(cè)中斷處理程序的內(nèi)核模塊關(guān)鍵性代碼如下:
int init_module(void) //中斷注冊(cè)模塊初始化
?。?…… /* 初始化設(shè)置 */
AT91_SYS->AIC_SMR[25]|=0X20; //設(shè)置中斷下跳沿觸發(fā)
if (request_irq(n, interrupt_program, INTERRUPT," IRQ1",NULL))
// 請(qǐng)求分配中斷號(hào)為n的快速中斷處理
// interrupt_program為指向處理這個(gè)中斷的中斷處理程序的指針
?。?……/*沒有申請(qǐng)成功 根據(jù)返回值進(jìn)行出錯(cuò)處理 * / }
else
?。?printk("<1> 注冊(cè)中斷成功 ! \n");
return 0;}
init_waitqueue_head(&my_queue);
}
void cleanup_module(void)
{ …… /* 釋放資源 */
free_irq(n,NULL); //釋放中斷線n
?。?
在用戶程序中發(fā)中斷時(shí),通過(guò)調(diào)用system(send_riq)來(lái)動(dòng)態(tài)執(zhí)行內(nèi)核模塊程序來(lái)控制發(fā)送中斷的管腳的信號(hào),從而實(shí)現(xiàn)在用戶程序發(fā)中斷的效果。其發(fā)中斷的內(nèi)核模塊關(guān)鍵性代碼如下:
AT91_SYS->PIOC_PER |= AT91C_PIO_PC15;//設(shè)置PC15IO使能
AT91_SYS->PIOC_OER |= AT91C_PIO_PC15;//設(shè)置PC15輸出使能
//發(fā)送一個(gè)方波中斷信號(hào)
AT91_SYS->PIOC_CODR |= AT91C_PIO_PC15;
for(i=1;i
AT91_SYS->PIOC_SODR |= AT91C_PIO_PC15;
3.3.2雙端口RAM驅(qū)動(dòng)的實(shí)現(xiàn)
由于用戶程序不能直接對(duì)雙端口RAM進(jìn)行讀寫,因此必須根據(jù)用戶程序的需要編寫雙端口RAM的驅(qū)動(dòng),以內(nèi)核模塊的形式動(dòng)態(tài)加載到系統(tǒng)中去。Linux系統(tǒng)將所有設(shè)備都看做是文件,對(duì)設(shè)備的讀寫相當(dāng)于對(duì)文件的讀寫。雙端口RAM驅(qū)動(dòng)模塊加載后,用戶程序就可以像讀寫文件一樣,間接的對(duì)雙端口RAM進(jìn)行讀寫了。其雙端口RAM驅(qū)動(dòng)模塊的主要實(shí)現(xiàn)過(guò)程如下:
static int write_dpram(struct file *file, const char *buf, u32 count, loff_t *f_pos)
?。?…… /* 寫初始化 */
copy_from_user(wMessage,buf,count);
…… /* 進(jìn)行數(shù)據(jù)處理 */
for (i=0;i
?。?writeb(wMessage[i], base+wadd);
wadd++; }
…… /*向IO模塊控制卡發(fā)中斷信號(hào)*/
?。?
static int read_dpram(struct file *file,char *buf,u32 count,loff_t *f_pos)
{ …… /*讀函數(shù)則調(diào)用相應(yīng)的readb( )和copy_to_user( )函數(shù),與寫函數(shù)同理*/}
static int open_dpram(struct inode *inode,struct file *file )
?。?…… /*初始化*/
if (!request_mem_region(AT91_DPRAM,BUF_LEN*sizeof(u8),DEVICE_NAME))
?。?…… /*未申請(qǐng)到該內(nèi)存空間時(shí)進(jìn)行相應(yīng)處理*/} //申請(qǐng)使用內(nèi)存空間
base =ioremap(AT91_DPRAM,BUF_LEN*sizeof(u8));//為設(shè)備內(nèi)存區(qū)域分配虛擬地址
…… /* 設(shè)置DPRAM讀寫時(shí)序*/
?。?
static int release_dpram(struct inode *inode,struct file *file )
?。?…… /* 釋放相應(yīng)資iounmap( )和release_mem_region();}
以上為DPRAM設(shè)備驅(qū)動(dòng)的打開、讀寫、關(guān)閉函數(shù)的實(shí)現(xiàn),然后通過(guò)以下標(biāo)記化結(jié)構(gòu)將其驅(qū)動(dòng)的功能映射到前面的具體實(shí)現(xiàn)函數(shù)上:
static struct file_operations test_fops = {
read:read_dpram,
write:write_dpram,
open: open_dpram,
release:release_dpram
?。?
另外,在驅(qū)動(dòng)程序初始化時(shí)必須通過(guò)register_chrdev( )注冊(cè)。在加載該驅(qū)動(dòng)前要使用system("mknod /dev/設(shè)備名 c 主設(shè)備號(hào) 次設(shè)備號(hào)")創(chuàng)建設(shè)備文件并為該設(shè)備分配設(shè)備號(hào)。該雙端口RAM驅(qū)動(dòng)是通用的,無(wú)論什么功能的板卡上面有雙端口RAM并且是基于Linux的系統(tǒng)的都可以使用該驅(qū)動(dòng)。
4. 測(cè)試
為了測(cè)試該無(wú)線通信卡的性能,該測(cè)試選用了符合EPA(Ethernet for Plant Automation)標(biāo)準(zhǔn)的現(xiàn)場(chǎng)總線系統(tǒng)進(jìn)行無(wú)線擴(kuò)展。EPA是我國(guó)第一個(gè)擁有自主知識(shí)產(chǎn)權(quán)的現(xiàn)場(chǎng)總線標(biāo)準(zhǔn)。所搭建的測(cè)試系統(tǒng)基本和有線EPA演示系統(tǒng)一致。包括一個(gè)EPA無(wú)線現(xiàn)場(chǎng)設(shè)備B(包括EPA無(wú)線通信卡和IO模塊控制卡)和一個(gè)EPA無(wú)線接入網(wǎng)橋、一臺(tái)PC機(jī)及一個(gè)燈箱,如圖4-1所示。燈箱中的溫度傳感器與AI模塊相連,將溫度值傳遞給AI模塊,并通過(guò)設(shè)備A發(fā)送到以太網(wǎng)上。設(shè)備B接收到此溫度值后,將其與額定溫度值相比較,如果低于額定溫度值,則通過(guò)AO模塊輸出電流來(lái)控制燈箱內(nèi)燈泡加熱;如果高于額定溫度值,則中斷AO模塊的輸出電流,切斷燈泡的電流輸入,使燈箱內(nèi)的溫度下降,從而達(dá)到保持燈箱內(nèi)溫度恒定的目的。
[align=center]

圖4-1測(cè)試系統(tǒng)示意圖[/align]
實(shí)驗(yàn)證明,無(wú)線通信卡與IO模塊控制卡之間數(shù)據(jù)傳輸穩(wěn)定,這個(gè)系統(tǒng)運(yùn)行效果良好,達(dá)到了預(yù)期目標(biāo),能夠滿足工業(yè)現(xiàn)場(chǎng)設(shè)備的通信要求。同時(shí),并沒有改變和影響原來(lái)的有線現(xiàn)場(chǎng)總線的正常工作。
5.小結(jié)
通過(guò)使用無(wú)線分散控制站和無(wú)線網(wǎng)橋?qū)崿F(xiàn)現(xiàn)場(chǎng)總線的無(wú)線接入,目前是比較穩(wěn)定、便捷的無(wú)限擴(kuò)展方法。本文提出的無(wú)線分散控制站中無(wú)線通信卡的軟硬件實(shí)現(xiàn)方法是一個(gè)通用的快捷開發(fā)方案。無(wú)線技術(shù)給工業(yè)帶來(lái)很多益處如減少設(shè)備配置和安裝時(shí)間。市場(chǎng)也提供了較成熟的無(wú)線技術(shù)如IEEE 802.11標(biāo)準(zhǔn), IEEE 802.15.4 標(biāo)準(zhǔn)和藍(lán)牙技術(shù)。但在工業(yè)現(xiàn)場(chǎng)無(wú)線技術(shù)仍不能被廣泛使用。原因之一是無(wú)線信道的實(shí)時(shí)性和出錯(cuò)率達(dá)不到要求。隨著合適的協(xié)議機(jī)制和傳輸調(diào)度的設(shè)計(jì),并細(xì)致結(jié)合這些方案,無(wú)線技術(shù)必將會(huì)在工業(yè)現(xiàn)場(chǎng)總線中得到廣泛使用。
主要參考文獻(xiàn):
[1]吳愛國(guó),郭昕.現(xiàn)場(chǎng)總線CAN與無(wú)線以太網(wǎng)IEEE802.11的結(jié)合[J].組合機(jī)床與自動(dòng)化加工技術(shù),2004,(11): 61-62,64.
[2]侯維巖,許靜,費(fèi)敏銳,陳伯時(shí).工業(yè)現(xiàn)場(chǎng)總線與無(wú)線通信的集成模式[J].自動(dòng)化儀表,2003,24(12):10-14.
[3]高路,于海濱,王宏,徐皚冬.EPA網(wǎng)絡(luò)體系結(jié)構(gòu)[J].計(jì)算機(jī)工程, 2004,17(30):81-82.
[4]Alessandro Rubini. LINUX設(shè)備驅(qū)動(dòng)程序(第二版)[M].中國(guó)電力出版社,2002.2.