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