??? 摘??要: 為了通過以太網(wǎng)遠(yuǎn)程監(jiān)控基于CAN總線的工業(yè)控制系統(tǒng),設(shè)計了一個CAN-以太網(wǎng)協(xié)議轉(zhuǎn)換器。TCP/IP傳輸層的協(xié)議選擇UDP協(xié)議,,用單片機(jī)實現(xiàn)CAN與UDP協(xié)議之間的轉(zhuǎn)換,。
??? 關(guān)鍵詞: CAN; UDP; 協(xié)議轉(zhuǎn)換; 單片機(jī)
?
隨著計算機(jī)技術(shù)、現(xiàn)場總線技術(shù)及信息技術(shù)的發(fā)展,,CAN(Controller Area Network)總線在工業(yè)控制中的應(yīng)用越來越普遍。CAN總線能實現(xiàn)現(xiàn)場各類儀表相互間的通信,,但其遠(yuǎn)程通信能力較弱,。而以太網(wǎng)作為當(dāng)今的主流網(wǎng)絡(luò),具有很強的遠(yuǎn)程通信能力,。為了融合這兩類網(wǎng)絡(luò)的技術(shù)優(yōu)勢,,實現(xiàn)CAN總線網(wǎng)絡(luò)與以太網(wǎng)的數(shù)據(jù)互聯(lián),必須設(shè)計CAN-以太網(wǎng)協(xié)議轉(zhuǎn)換器,。
本文提出一種設(shè)計CAN-以太網(wǎng)協(xié)議轉(zhuǎn)換器的方法,,用16位PIC單片機(jī)設(shè)計一種CAN總線協(xié)議與TCP/IP協(xié)議的轉(zhuǎn)換網(wǎng)關(guān)。由于所針對的傳輸層協(xié)議是UDP(User Datagram Protocol),,因此,,實際上設(shè)計的是CAN總線協(xié)議與UDP協(xié)議的轉(zhuǎn)換網(wǎng)關(guān)。
1 CAN-以太網(wǎng)協(xié)議轉(zhuǎn)換器的系統(tǒng)結(jié)構(gòu)
系統(tǒng)主要由CAN通信模塊,、以太網(wǎng)通信模塊和協(xié)議轉(zhuǎn)換模塊三部分構(gòu)成,,通過一個16位的PIC單片機(jī)相連。CAN通信模塊主要用于采集現(xiàn)場儀表的數(shù)據(jù)和與協(xié)議轉(zhuǎn)換模塊之間的數(shù)據(jù)傳遞,;以太網(wǎng)通信模塊主要負(fù)責(zé)協(xié)議轉(zhuǎn)換模塊與以太網(wǎng)之間的數(shù)據(jù)傳輸,;協(xié)議轉(zhuǎn)換模塊是將CAN協(xié)議數(shù)據(jù)包與UDP協(xié)議數(shù)據(jù)包進(jìn)行轉(zhuǎn)換。
當(dāng)現(xiàn)場儀表有數(shù)據(jù)要傳送到以太網(wǎng)上的工控機(jī)時,,CAN通信模塊會采集CAN節(jié)點的數(shù)據(jù),,放入數(shù)據(jù)緩沖區(qū),;協(xié)議的轉(zhuǎn)換由PIC單片機(jī)完成,它將數(shù)據(jù)緩沖區(qū)CAN協(xié)議數(shù)據(jù)包轉(zhuǎn)換成UDP協(xié)議數(shù)據(jù)包,,最后由以太網(wǎng)通信模塊發(fā)送給以太網(wǎng),。當(dāng)控制命令或數(shù)據(jù)要從以太網(wǎng)傳送給現(xiàn)場儀表時,以太網(wǎng)通信模塊將接收以太網(wǎng)上的數(shù)據(jù)包,,并放入數(shù)據(jù)緩沖區(qū),;然后協(xié)議轉(zhuǎn)換模塊把從以太網(wǎng)上接收到的UDP協(xié)議數(shù)據(jù)包轉(zhuǎn)換成CAN協(xié)議數(shù)據(jù)包;最后通過CAN通信模塊,,將數(shù)據(jù)包發(fā)送給相應(yīng)的現(xiàn)場儀表,,從而實現(xiàn)對現(xiàn)場儀表的遠(yuǎn)程控制。
2 硬件設(shè)計
CAN-以太網(wǎng)協(xié)議轉(zhuǎn)換器的硬件主要由兩部分組成:CAN通信模塊接口電路和以太網(wǎng)通信接口電路,。協(xié)議轉(zhuǎn)換主要通過單片機(jī)進(jìn)行編程實現(xiàn),。
2.1 CAN通信模塊接口電路設(shè)計
CAN通信接口電路主要由主控芯片PIC24FJ64GA008、CAN總線控制器SJA1000,、CAN總線收發(fā)器82C250和高速光耦6N137組成,其接口電路如圖1所示,。PIC24FJ64GA008單片機(jī)初始化CAN總線控制器SJA1000,,并通過讀寫SJA1000的數(shù)據(jù)緩沖區(qū)實現(xiàn)CAN幀信息的接收和發(fā)送。CAN總線控制器SJA1000實現(xiàn)CAN總線數(shù)據(jù)鏈路層協(xié)議,??偩€收發(fā)器82C250將CAN協(xié)議控制器與物理通信線路連接在一起。高速光耦6N137用于隔離,,起到保護(hù)SJA1000型CAN總線控制器的作用,。接口電路主要用到了單片機(jī)的并行主控端口模塊,它能夠很方便地實現(xiàn)與并行外設(shè)的連接,。通過對并行端口控制寄存器(PMCON)和并行端口模式寄存器(PMMODE)進(jìn)行適當(dāng)?shù)呐渲?,使并行主控端口模塊的8位地址線與數(shù)據(jù)線復(fù)用,并提供鎖存信號PMALL,、片選信號,、讀信號、寫信號PMWR[1],。連接時將SJA1000的AD7~AD0腳與單片機(jī)的PMD[7..0]相連,,用于傳送地址和數(shù)據(jù)。單片機(jī)通過引腳PMALL,、,、控制SJA1000的ALE、引腳,,實現(xiàn)對SJA1000的讀寫控制,。若片選信號與SJA1000的片選引腳相連,,使SJA1000的基地址為0X8000,則SJA1000內(nèi)部的32個寄存器的地址為:0X8000~0X801F,。單片機(jī)的引腳與SJA1000的引腳INT相連,,由于SJA1000的引腳是集電極開路輸出,因此需要加上拉電阻,,這樣單片機(jī)就可以通過中斷方式讀寫SJA1000中的數(shù)據(jù)緩沖區(qū)[2],。
?
2.2 以太網(wǎng)接口電路設(shè)計
以太網(wǎng)接口電路用到的主要芯片有單片機(jī)PIC24FJ64GA008、以太網(wǎng)控制器RTL8019AS,、鎖存器74LS373,、存儲器93LC46、隔離濾波器20F001N,。RTL8019AS是臺灣Realtek公司生產(chǎn)的以太網(wǎng)控制器,,符合Ethernet II和IEEE802.3標(biāo)準(zhǔn),收發(fā)速率可同時達(dá)到10Mb/s,,內(nèi)部有16K BRAM,。接收數(shù)據(jù)和發(fā)送數(shù)據(jù)需通過DMA(Direct Memory Access)讀寫RTL8019AS的內(nèi)部RAM來實現(xiàn),單片機(jī)讀寫RAM時使用的是遠(yuǎn)程DMA,,RTL8019AS讀寫RAM時使用的是本地DMA,。其接口電路如圖2所示[3],圖中,,RTL8019AS的數(shù)據(jù)線SD[7..0]與單片機(jī)的PMD[7..0]相連,,地址線SA9、SA8與PMCS1相連,,低五位地址SA4~SA0與74LS373的Q[4..0]相連,。93LC46是三線SPI串行接口EEPROM,主要保存RTL8019AS的配置信息,,其00H~03H地址空間用于存儲RTL8019AS的配置寄存器CONFIG1~4的初始化值,;04H~11H地址空間存儲網(wǎng)絡(luò)節(jié)點的地址;12H~7FH地址空間存儲即插即用的配置信息,。若00H單元的值為0X00,,RTL8019AS在復(fù)位后會自動讀取93LC46,這樣配置寄存器CONFIG1的值為00H,,低四位IOS3~0的值為0,,而當(dāng)IOS[3..0]=0時,RTL8019AS的I/O端口的基地址為300H,。因為RTL8019AS的地址為20位,,所以其I/O口的地址空間為00300H~0031FH。據(jù)此,,在接線時將SA19~SA10直接接地,,SA9~SA8與PMCS1相連,,SA7~SA5接地,當(dāng)PMCS1=1時就可以選中芯片RTL8019AS,。PMCS1是單片機(jī)的ADDR14,,因此,RTL8019AS的內(nèi)部地址空間00300H~0031FH的外部映射地址是4000H~401FH,。RTL8019AS的IOCS16B引腳通過27k?贅的電阻下拉接地,,將數(shù)據(jù)總線定義為8位[2,4]。
?
RTL8019AS內(nèi)置了10BASE-T收發(fā)器,,可以通過雙絞線進(jìn)行以太網(wǎng)通信,。TPIN±為接收線,TPOUT±為發(fā)送線,,經(jīng)隔離濾波器20F001N后分別與RJ-45的RX±,、TX±相連接。
??? LED0和LED1各接一個發(fā)光二極管以反映通信狀態(tài),,LED0被點亮表示通信沖突,,LED1被點亮表示收到了網(wǎng)上的數(shù)據(jù)包。
3 軟件設(shè)計
??? 軟件主要分為三部分:CAN通信程序,、以太網(wǎng)通信程序和CAN-UDP協(xié)議轉(zhuǎn)換程序,。軟件設(shè)計的整體思路為:當(dāng)現(xiàn)場儀表有數(shù)據(jù)要發(fā)送到以太網(wǎng)時,首先由CAN通信程序采集現(xiàn)場儀表的CAN協(xié)議數(shù)據(jù)包,,并存放在緩沖區(qū)Buffer1中,然后調(diào)用CAN-UDP協(xié)議轉(zhuǎn)換程序?qū)AN協(xié)議數(shù)據(jù)包封裝成UDP數(shù)據(jù)包,,最后由以太網(wǎng)通信程序發(fā)送到以太網(wǎng)的應(yīng)用層,。反之,當(dāng)以太網(wǎng)上的數(shù)據(jù)要發(fā)送給某個CAN節(jié)點時,以太網(wǎng)通信程序首先將以太網(wǎng)傳輸層的UDP數(shù)據(jù)包放入緩沖區(qū)Buffer2,,然后調(diào)用協(xié)議轉(zhuǎn)換程序?qū)DP數(shù)據(jù)包轉(zhuǎn)換成CAN協(xié)議數(shù)據(jù)包,,最后調(diào)用CAN通信程序?qū)⒕彌_區(qū)Buffer2中的數(shù)據(jù)發(fā)送到CAN總線上的指定節(jié)點。
3.1 CAN通信程序
??? CAN通信網(wǎng)絡(luò)是根據(jù)CAN協(xié)議2.0A構(gòu)建的,,SJA1000工作在BasicCAN模式,。CAN通信程序主要由以下幾部分構(gòu)成:SJA1000初始化程序Config_SJA1000( )、讀寫SJA1000內(nèi)部寄存器程序Read_SJA1000( )和Write_SJA1000( ),、CAN發(fā)送程序BCAN_DATA_SEND( ),、CAN接收程序BCAN_DATA_RECEIVE( )。
??? Config_SJA1000( )程序主要完成波特率的設(shè)置,、CAN節(jié)點地址的設(shè)定,、驗收屏蔽寄存器AMR的設(shè)置、中斷寄存器IR的設(shè)置以及命令寄存器CMR的設(shè)置,。為了確保CAN通信正常,,CAN總線所有節(jié)點的波特率必須相同,。當(dāng)發(fā)送CAN協(xié)議數(shù)據(jù)包給CAN節(jié)點時,執(zhí)行BCAN_DATA_SEND( )函數(shù),,該函數(shù)通過調(diào)用Write_SJA1000( )子程序,,將待發(fā)送的數(shù)據(jù)寫入CAN的數(shù)據(jù)發(fā)送寄存器,從而實現(xiàn)發(fā)送,。當(dāng)SJA1000接收到CAN節(jié)點的數(shù)據(jù)時,,通過單片機(jī)的外部中斷INT2向單片機(jī)申請中斷,單片機(jī)在INT2的中斷服務(wù)程序中會調(diào)用CAN接收程序,,由CAN接收程序調(diào)用Read_SJA1000( ),,將SJA1000數(shù)據(jù)接收緩沖區(qū)中的數(shù)據(jù)讀到單片機(jī)的數(shù)據(jù)緩沖區(qū)Buffer1中。
3.2 CAN-UDP協(xié)議轉(zhuǎn)換程序
??? CAN-UDP協(xié)議轉(zhuǎn)換程序主要負(fù)責(zé)將數(shù)據(jù)緩沖區(qū)Buffer1中的CAN協(xié)議數(shù)據(jù)包封裝成UDP數(shù)據(jù)包,;同時也會從以太網(wǎng)的傳輸層上接收UDP數(shù)據(jù)包,,然后封裝成CAN協(xié)議數(shù)據(jù)包,存入數(shù)據(jù)緩沖區(qū)Buffer2,。UDP協(xié)議的幀格式如圖3所示,。
?
源端口號(2B):發(fā)送進(jìn)程的端口,即假定在沒有其他信息的情況下,,返回信息應(yīng)該向什么地方發(fā)送,。
??? 目標(biāo)端口號(2B):UDP數(shù)據(jù)包的接收端號。
數(shù)據(jù)報長度(2B):包括報頭和數(shù)據(jù)報在內(nèi)的總字節(jié)數(shù),。
校驗值(2B):對IP頭,、UDP頭和數(shù)據(jù)中信息包頭的數(shù)位取反之和再取反。源端口號,、目標(biāo)端口號,、數(shù)據(jù)報長度和校驗值構(gòu)成UDP報頭。
UDP數(shù)據(jù):是實際的傳輸信息,,數(shù)據(jù)的最大長度可達(dá)到65 527 字節(jié),。在傳輸過程中數(shù)據(jù)字節(jié)設(shè)為8B,且第一個數(shù)據(jù)字節(jié)為CAN節(jié)點的地址,。CAN數(shù)據(jù)包幀格式如圖4所示,。
?
地址(1B):8位標(biāo)識符,表示發(fā)送數(shù)據(jù)或接收數(shù)據(jù)的節(jié)點地址,。字節(jié)數(shù)(1B):數(shù)據(jù)報和校驗和的字節(jié)數(shù)之和,,固定值設(shè)為8。數(shù)據(jù)報(8B):前7個字節(jié)為傳送的實際信息,,第8個字節(jié)為校驗和,。
將UDP協(xié)議數(shù)據(jù)包轉(zhuǎn)換成CAN協(xié)議數(shù)據(jù)包時,單片機(jī)將UDP數(shù)據(jù)包的報頭去掉,將第1個數(shù)據(jù)字節(jié)作為CAN協(xié)議包的第1個字節(jié),,UDP的第3個數(shù)據(jù)字節(jié)~第10個數(shù)據(jù)字節(jié)作為CAN協(xié)議包的第3字節(jié)~第10字節(jié),,UDP的第2個數(shù)據(jù)字節(jié)作為CAN協(xié)議包的第2個字節(jié),固定值設(shè)為8,,最后將轉(zhuǎn)換好的數(shù)據(jù)包發(fā)送出去,。將CAN協(xié)議數(shù)據(jù)包轉(zhuǎn)換成UDP協(xié)議數(shù)據(jù)包時,單片機(jī)要給UDP協(xié)議數(shù)據(jù)包加上報頭,。數(shù)據(jù)報的轉(zhuǎn)換過程與上述過程類似,,不再贅述。
3.3 以太網(wǎng)通信程序
以太網(wǎng)通信程序主要由RTL8019AS的初始化程序,、數(shù)據(jù)接收函數(shù)和數(shù)據(jù)發(fā)送函數(shù)組成,。系統(tǒng)上電后,先執(zhí)行RTL8019AS的初始化程序,,該子程序主要是對RTL8019AS中第0頁和第1頁的相關(guān)寄存器進(jìn)行設(shè)置,;然后程序?qū)TL8019AS數(shù)據(jù)發(fā)送寄存器、接收寄存器進(jìn)行檢測,,當(dāng)數(shù)據(jù)緩沖區(qū)Buffer1有數(shù)據(jù)向以太網(wǎng)發(fā)送時,,單片機(jī)通過遠(yuǎn)程DMA通道將數(shù)據(jù)送到RTL8019AS的RAM中,然后發(fā)出傳送命令,;之后RTL8019AS啟動本地DMA,,將數(shù)據(jù)發(fā)送到以太網(wǎng)上。 反之,,當(dāng)以太網(wǎng)上有數(shù)據(jù)要傳給CAN節(jié)點時,,先啟動本地DMA,將網(wǎng)上的數(shù)據(jù)讀到RTL8019AS的RAM中,,然后單片機(jī)通過遠(yuǎn)程DMA通道將RAM中的數(shù)據(jù)讀到緩沖區(qū)Buffer2,。
本文設(shè)計了一款價格低廉、性能可靠的CAN—以太網(wǎng)協(xié)議轉(zhuǎn)換器,,為部分工業(yè)控制系統(tǒng)的遠(yuǎn)程監(jiān)控設(shè)計提供了一種新的選擇方案。
參考文獻(xiàn)
[1]?Microchip Technology Inc.PIC24FJ128GA系列數(shù)據(jù)手冊.2006.
[2]?Philips Semiconductors. SJA1000 datasheet.2000.
[3]?曹宇,魏豐,胡士毅.用51單片機(jī)控制RTL8019AS實現(xiàn)以太網(wǎng)通訊[J]. 電子技術(shù)應(yīng)用,,2003,29(1):21-23.
[4]?REALTEK. Realtek RTL8019AS datasheet.2005.