基于LPC2294的CAN與以太網(wǎng)網(wǎng)關(guān)互聯(lián)的設計
2 軟件設計
2.1 報文結構
CAN總線(xiàn)與以太網(wǎng)互聯(lián)的軟件設計主要包括從以太網(wǎng)中提取CAN數據和將CAN總線(xiàn)的數據轉換成以太網(wǎng)的數據。其中,CAN報文結構可分為兩種不同的幀格式,而兩種幀格式的區別在于其標識符的長(cháng)度不同:標準幀中有11位標識符,擴展幀中有29位標識符。本設計中采用的是擴展幀,且在本網(wǎng)關(guān)模塊收到CAN板卡的報文時(shí),需按上述以太網(wǎng)數據傳輸報文格式對CAN數據進(jìn)行封裝及打包并通過(guò)以太網(wǎng)發(fā)送。在此過(guò)程中不必對CAN報文的13 Byte數據進(jìn)行高低位轉換和移位處理,采用透明轉換方式。便可減少數據解析及處理的時(shí)間,并提高了數據在傳輸過(guò)程中的可靠性。本文引用地址:http://dyxdggzs.com/article/201610/306066.htm
如圖3所示,該網(wǎng)關(guān)中規定的以太網(wǎng)幀格式包括5部分,按照封裝的先后順序分別為:封裝的數據(如本系統中的CAN數據幀等)、自定義UDP首部、標準UDP/TCP首部、IP首部、以太網(wǎng)首部和最終校驗。本系統中主要采用的是UDP協(xié)議,目的是為了自定義控制字來(lái)區別不同類(lèi)型的報文,包括有:CAN數據報文、時(shí)統報文、工作狀態(tài)請求報文、心跳報文及設備故障診斷信息報文。其中時(shí)統報文是在開(kāi)機時(shí)或每30分鐘系統發(fā)送的對時(shí)請求。工作狀態(tài)報文是在各設備開(kāi)機或復位并正常工作后自動(dòng)發(fā)送的,還有收到詢(xún)問(wèn)報文或狀態(tài)改變后發(fā)送,主要發(fā)送時(shí)戳和設備ID信息。心跳報文是在各設備開(kāi)機或復位并正常工作后,每5 s周期發(fā)送,作用是通知其所在的網(wǎng)絡(luò ),是否工作狀態(tài)正常。設備故障診斷信息報文是當接收到故障診斷請求報文或網(wǎng)關(guān)根據CAN板卡數據接收情況,自行檢測到網(wǎng)關(guān)箱內該板卡故障情況的變化,一般網(wǎng)關(guān)在30分鐘內未收到參數設置報文中指定的CAN板卡對應節點(diǎn)的數據和遠程幀等,可認定此節點(diǎn)故障,并發(fā)送故障信息報文。這增添了系統的一些管理信息,根據不同的報文類(lèi)型完成系統不同的通信功能。自定義UDP封裝格式如圖4所示。
在自定義UDP封裝格式中,字節0~3為固定的幀頭信息,用以識別本網(wǎng)關(guān)模塊的數據報信息,無(wú)論是CAN報文、時(shí)統報文或工作狀態(tài)請求報文均使用該格式,若不符合該幀頭的數據報網(wǎng)關(guān)模塊不進(jìn)行處理。需注意的是,第20 bit開(kāi)始才是真正的數據,每個(gè)信息單元均有各自的序號、標識和長(cháng)度等信息。其中信元的序號表示該信元在UDP數據報中的位置;標識代表信息單元內報文的類(lèi)型。
2.2 程序設計
網(wǎng)關(guān)模塊的主要功能是以太網(wǎng)數據包與CAN數據幀之間的格式相互轉換,進(jìn)而完成以太網(wǎng)和CAN網(wǎng)絡(luò )間通訊。本模塊使用嵌入式μC/OS—II作為操作系統,通過(guò)裁剪、移植使其能順利運行于LPC2294控制器。另外,在系統中移植了TCP/IP協(xié)議的核心功能函數,并編寫(xiě)了6個(gè)任務(wù)函數,使其分工合作實(shí)現了模塊的各項功能,并通過(guò)μC/OS—II系統的任務(wù)調度管理機制來(lái)進(jìn)行系統資源的分配。
系統首先建立設備初始化任務(wù)Task0,將該任務(wù)函數主要完成上電自檢,兩路CAN故障自檢,網(wǎng)口斷線(xiàn)檢測,本機IP、兩路CAN波特率及兩路網(wǎng)口等網(wǎng)關(guān)參數的初始化。在完成以上工作后,創(chuàng )建5個(gè)子任務(wù),按優(yōu)先級由高到低依次為T(mén)askB、TaskC、TaskF、TaskD、TaskE的5個(gè)子任務(wù)的具體功能如下:
TaskB:主要功能為接收UDP報文并解析,下發(fā)至CAN;若接收到時(shí)統報文,按照協(xié)議解析,并將時(shí)戳信息寫(xiě)入時(shí)鐘芯片。
TaskC:主要功能為接收TCP報文,按照協(xié)議解析并下發(fā)到CAN。
TaskD:完成接收CAN1口或CAN2口的數據,根據規定的傳輸方式將數據封裝成報文格式,并發(fā)送至以太網(wǎng)。
TaskE:完成接收CAN1口或CAN2口的數據,并按照TCP傳輸方式,將數據封裝并發(fā)送到以太網(wǎng)。
TaskF:主要功能為定時(shí)發(fā)送特殊報文,如:心跳報文、時(shí)統報文、工作狀態(tài)請求報文及設備故障診斷信息報文等,完成網(wǎng)關(guān)模塊的工作狀態(tài)檢測及參數配置等功能。
5個(gè)子任務(wù)創(chuàng )建完成后,TaskB和TaskC進(jìn)入阻塞狀態(tài),等待各自的信號量RecUdpQFlag和RecTcpQ一Flag,由于這兩個(gè)任務(wù)的優(yōu)先級較高,說(shuō)明網(wǎng)關(guān)模塊優(yōu)先轉換以太網(wǎng)向CAN總線(xiàn)方向的數據。因此,當以太網(wǎng)中有數據到來(lái)時(shí)根據報文的類(lèi)型可得到相應的信號量,TaskB或TaskC立即進(jìn)入就緒狀態(tài)等待執行,若當前執行的任務(wù)優(yōu)先級低于這兩個(gè)任務(wù),TaskB和TaskC可進(jìn)行搶占執行。當網(wǎng)關(guān)模塊未收到以太網(wǎng)數據或處理完成后,任務(wù)函數TaskF檢測模塊的定時(shí)器,判斷是否需要發(fā)送工作狀態(tài)報文和心跳報文等特殊報文。執行完成后,判斷CAN節點(diǎn)是否有數據,并選擇用UDP或TCP方式發(fā)送到以太網(wǎng),即選擇執行TaskD或TaskE,完成CAN向以太網(wǎng)方向的數據傳輸過(guò)程,在此期間允許TaskB和TaskC進(jìn)行搶占執行。系統通過(guò)調度這5個(gè)任務(wù)函數完成以太網(wǎng)數據包與CAN數據幀間的格式轉換與傳輸,該程序流程如圖5所示。
3 測試
將該上位機IP地址設置為192.1.1.11,打開(kāi)網(wǎng)關(guān)參數設置界面對一些參數進(jìn)行設置,如:網(wǎng)關(guān)參數回復IP地址、網(wǎng)關(guān)參數回復端口、網(wǎng)關(guān)模塊IP地址、網(wǎng)關(guān)接收端口號和CAN數據目標IP地址等參數。隨后將CAN總線(xiàn)數據報文測試軟件ZLGCANTest打開(kāi),設置CAN總線(xiàn)的波特率為250 khit·s-1,將CAN報文發(fā)出后用ZLGCAN—Test、TcpUdp測試工具及EtherPeek NX軟件來(lái)查看網(wǎng)絡(luò )的通信情況。圖6便是由ZLGCANT est軟件所得到的,從圖中可知,CAN發(fā)送數據的幀類(lèi)型是擴展幀,幀格式是數據幀,幀ID為0x0000 0000,每個(gè)CAN協(xié)議中發(fā)送8 bit的數據。而圖7是通過(guò)TcpUdp測試工具得到的數據,并已在圖中標出,此報文頭由Etherner協(xié)議報文頭、IP協(xié)議報頭、UDP協(xié)議報頭和自定義UDP報頭組成,并從自定義UDP報頭中的報文標識可判別出CAN報文,而后面的數據正是圖6中CAN報文中的13 bit數據,即對CAN報文采用透明轉換方式,將CAN網(wǎng)絡(luò )數據成功發(fā)送到以太網(wǎng)。同樣方法可測試到以太網(wǎng)中數據也成功發(fā)送至CAN。網(wǎng)絡(luò )中其他類(lèi)型的報文也同樣如此。
4 結束語(yǔ)
文中闡述了以ARM7系列LPC2294為核心的以太網(wǎng)與CAN總線(xiàn)網(wǎng)絡(luò )互聯(lián)的通信網(wǎng)關(guān)實(shí)現過(guò)程,概述了本網(wǎng)關(guān)中采用的以太網(wǎng)和CAN總線(xiàn)的報文格式及其自定義UDP數據報文的結構。并提出了網(wǎng)關(guān)的軟、硬件實(shí)現方法。通過(guò)實(shí)驗該網(wǎng)關(guān)模塊實(shí)現了以太網(wǎng)與CAN總線(xiàn)間的數據傳遞,且具有穩定性和較高的可靠性。
評論