摘 要:本文闡述了基于Linux的現場總線無線通信卡的實現過程,成功地解決了IO模塊控制卡與其之間的通信問題,通過無線通信卡實現了無線現場設備通過標準的無線技術接入到現有的現場總線中。同時進行了簡單測試,實驗證明測試系統運行效果良好,達到了預期目標。
關鍵字:無線通信卡 現場總線 Linux驅動
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.引言
使用無線連接設備的便利已經導致了在消費電子(商業)領域中無線技術被空前成功的應用。在此基礎上基于無線技術的應用開始出現在各個領域。在工業或工廠底層環境中,使用無線技術的優勢更是多方面的。
第一,在工業環境中往往需要大量的布線,采用無線技術不僅會使安裝和維護的成本有效減少,而且會使設備的調整規劃和重新配置更加的容易。
第二,無線技術的引入對于解決在有化學腐蝕、震動和移動部件等惡劣環境中對各種線纜的潛在損傷等問題顯得更加有效。
第三,考慮到工廠設備中適應性和靈活性,固定系統可以通過無線技術和現有的移動子系統或移動機器人連接通信。
第四,對在工廠設備進行臨時訪問任務(如診斷或程序設計等)使用無線技術會更加簡化(如使用無線手持設備)。
在解決工業環境及過程控制環境下的許多移動對象,如移動機器人與自治運輸設備之間的協調;旋轉對象,如機械臂;危險環境對象的監測與控制問題,如分布式控制等工業環境無線技術發揮極大的作用。將無線技術應用到現場總線中來解決傳統現場總線存在的問題,正受到學術界和工業界的極大關注。
2.現場總線的無線接入方法
為了使無線技術能夠無縫而更廣泛地應用于工業現場,使現場設備無線接入到現存的現場總線,國內外相關領域的技術人員進行了一定的嘗試。按在不同層上實現接入可以將接入方案分為三大類:用戶層接入、數據鏈路層接入和物理層接入。
?。?)用戶層接入:在用戶層設一個OPC服務器,通過OPC服務器進行有線網段與無線網段之間的數據交換。該方案其優點是簡單易實現,雙方可保持原有結構不動,兩側的“連接”可隨時通過軟件的控制建立或分離。缺點是中間環節太多,實時性得不到保證。
?。?)物理層的接入:在某些站點的有線連接“下”面加裝Modem。無線站點的信號經過此無線收發裝置將幀格式轉換后,聯入有線網段接口,因此遠端的無線站點被“視為”同質站點。這樣,所有的有線、無線站點均采用原有現場總線協議,只是在最底層的某些物理連接上,無線連接代替了有線的連接。其缺點是此方法僅實現了點對點的連接,無線站點不具有“漫游接入”的能力。
(3)數據鏈路層的接入:此方法源自WLAN和以太網的聯接方式,即在PHY層和DDL層之上加一個無線網關。該無線網關實現了無線網段數據與有線網段之間的數據格式轉換和轉發。原有的現場總線保持不動,加裝一個無線網段的AP接入點。當兩網段間有數據交換時,才會通過AP點經過協議轉換把數據轉發到另一端。
數據鏈路層的接入是現階段最被關注的方法。其具體實現方法較多,但大多處于理論研究階段或需要對原有的現場總線進行改造,而工業廠家又不想使現正運行的現場總線暫停工作。這使得現階段的一些其無線接入技術在現場總線中應用變得困難。為了使無線現場設備能夠應用于工業現場,又不改動現有的現場總線系統,目前較成熟的技術就是使用無線分散控制站來與原有的現場總線連接,實現現場設備的無線接入。無線分散控制站一般由IO模塊控制卡、無線通信卡兩部分組成。兩塊板卡通過IO模塊控制卡上的雙端口RAM交換數據,通過中斷觸發數據讀寫操作,從而達到通信效果。其關鍵技術就是如何實現無線通信卡的軟件設計。
3.基于Linux的無線通信卡
在無線分散控制站中無線通信卡使用AT91RM9200控制器并通過USB接口加載符合802.11b協議的無線傳輸模塊,其操作系統為Linux系統。
3.1基于Linux的無線通信卡的工作原理
無線通信卡運行著現場總線協議棧和功能塊(MAI,MAO,MDI,MDO)等。根據所接入的現場總線的不同選用相應的協議棧。使用向IO模塊控制卡發中斷及響應IO模塊控制卡中斷的方式,通過IO模塊控制卡來配置、讀取和控制現場設備。無線通信卡與IO模塊控制卡之間數據傳輸是直接通過讀寫IO模塊控制卡上的雙端口RAM實現的。另一方面,無線通信卡通過其上面的USB接口加載了符合802.11b協議的無線傳輸模塊,能夠通過該模塊實現與有線網絡相連,使其與相應的現場總線工作站通信,其結構示意圖如圖3-1所示:
[align=center]

圖3-1無線通信卡的結構示意圖[/align]
3.2基于Linux的無線通信卡的軟件設計
無線分散控制站中無線通信卡軟件開發基于Linux操作系統。由于Linux系統基于802.11b協議的無線驅動已經很成熟了,而基于Linux操作系統的協議棧軟件移植也比較容易。因此,選擇Linux系統會有效的提高無線通信卡的開發周期。
基于Linux的無線通信卡與有線的通信卡在協議棧和功能塊方面大致相同,僅需將應用程序向Linux系統上移植即可。但由于采用了Linux系統在與IO模塊控制卡通信的實現上就相對比較復雜了。與IO模塊控制卡通信的程序流程圖如下圖3-2所示:
[align=center]

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

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