左登超 賈 濤
(中車(chē)青島四方車(chē)輛研究所有限公司,山東青島 266031)
現(xiàn)階段我國(guó)動(dòng)車(chē)組數(shù)量龐大、種類(lèi)繁多,不同車(chē)型使用的車(chē)體通訊總線也有差異。不同方式的通訊設(shè)備目前尚不能相互兼容。
為使當(dāng)前已有的以太網(wǎng)通訊設(shè)備能夠適應(yīng)CAN車(chē)體總線,以減少重新開(kāi)發(fā)軟硬件系統(tǒng)的成本,本文提出基于以太網(wǎng)CAN模塊的總線協(xié)議網(wǎng)關(guān)設(shè)計(jì)。
控制器局域網(wǎng)絡(luò)(Controller Area Network,CAN),由德國(guó)BOSCH公司研發(fā)并成為國(guó)際標(biāo)準(zhǔn)——ISO11898[1]。其被廣泛應(yīng)用在計(jì)算機(jī)控制系統(tǒng)、嵌入式控制設(shè)備局域網(wǎng)等領(lǐng)域中[2]。
CAN總線協(xié)議幀格式有兩種類(lèi)型:CAN標(biāo)準(zhǔn)幀、CAN擴(kuò)展幀[3]。CAN標(biāo)準(zhǔn)幀由11個(gè)字節(jié)組成,包括幀信息、幀數(shù)據(jù)兩部分內(nèi)容。前3個(gè)字節(jié)為幀信息部分,后8個(gè)字節(jié)為幀數(shù)據(jù)部分。CAN協(xié)議標(biāo)準(zhǔn)幀格式如表1所示。
表1 標(biāo)準(zhǔn)幀格式Tab.1 Standard frame format
在表1中,字節(jié)1代表幀信息,其第7位——FF代表幀格式,在CAN協(xié)議標(biāo)準(zhǔn)幀格式中,F(xiàn)F的值為0;其第6位——RTR代表幀類(lèi)型,RTR=0時(shí)為數(shù)據(jù)幀,RTR=1時(shí)為遠(yuǎn)程幀;其第0~3位表示幀類(lèi)型為數(shù)據(jù)幀的數(shù)據(jù)部分總長(zhǎng)度。字節(jié)2與字節(jié)3表示幀識(shí)別碼,其低11位有效,高5位則無(wú)效。字節(jié)4到字節(jié)11代表數(shù)據(jù)幀的數(shù)據(jù)部分,幀類(lèi)型為遠(yuǎn)程幀時(shí),字節(jié)4到字節(jié)11無(wú)效。
CAN擴(kuò)展幀由13個(gè)字節(jié)組成,包括幀信息、幀數(shù)據(jù)兩部分內(nèi)容。前5個(gè)字節(jié)為幀信息部分,后8個(gè)字節(jié)為幀數(shù)據(jù)部分。CAN擴(kuò)展幀格式如表2所示。
表2 擴(kuò)展幀格式Tab.2 Extended frame format
在表2中,字節(jié)1代表幀信息,其第7位——FF代表幀格式,在CAN協(xié)議擴(kuò)展幀格式中,F(xiàn)F的值為1;其第6位——RTR代表幀類(lèi)型,RTR=0時(shí)為數(shù)據(jù)幀,RTR=1時(shí)為遠(yuǎn)程幀;其第0到3位表示數(shù)據(jù)幀的實(shí)際數(shù)據(jù)部分總長(zhǎng)度。字節(jié)2到字節(jié)5為幀識(shí)別碼,其低29位有效,高3位則無(wú)效。字節(jié)6到字節(jié)13代表數(shù)據(jù)幀的數(shù)據(jù)部分,幀類(lèi)型為遠(yuǎn)程幀時(shí),字節(jié)6到字節(jié)13無(wú)效。
以太網(wǎng)通信協(xié)議中常用UDP 與TCP協(xié)議。
用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol UDP):是一種無(wú)連接的通信協(xié)議[4]。在OSI模型中,UDP在第四層——傳輸層,是IP協(xié)議的上一層。UDP常用于需要在計(jì)算機(jī)之間進(jìn)行數(shù)據(jù)交互的網(wǎng)絡(luò)應(yīng)用程序中[5]。UDP主要將網(wǎng)絡(luò)應(yīng)用之間傳輸?shù)臄?shù)據(jù)流量壓縮轉(zhuǎn)換成數(shù)據(jù)包[6]。
傳輸控制協(xié)議(Transmission Control Protocol TCP):是一種面向連接、可靠、基于字節(jié)流的通信協(xié)議[7]。在OSI模型中,TCP完成第四層——傳輸層所指定的功能,是與用戶數(shù)據(jù)報(bào)協(xié)議在同一層內(nèi)的另一個(gè)重要傳輸協(xié)議[8]。
以太網(wǎng)CAN模塊如圖2所示。該模塊帶有2路CAN接口和一路RJ45以太網(wǎng)接口,可進(jìn)行雙向數(shù)據(jù)傳送。以太網(wǎng)設(shè)備可以通過(guò)RJ45接口連接一個(gè)標(biāo)準(zhǔn)的CAN網(wǎng)絡(luò)。以太網(wǎng)CAN模塊可以作為一個(gè)標(biāo)準(zhǔn)的CAN節(jié)點(diǎn)。利用該模塊,用戶可以方便快速地開(kāi)發(fā)出CAN總線應(yīng)用軟件產(chǎn)品。
以太網(wǎng)CAN模塊共有3組對(duì)外接口:一個(gè)標(biāo)準(zhǔn)的RJ45以太網(wǎng)接口;一個(gè)7pin接線端子(電源輸入接口),端子定義如表3所示;一個(gè)10pin的接線端子(CAN總線信號(hào)接口),端子定義如表4所示。
圖1 以太網(wǎng)-CAN轉(zhuǎn)換模塊Fig. 1 Ethernet-CAN conversion module
表3 7pin接線端子Tab.3 7pin connection terminal
表4 10pin接線端子Tab.4 10pin connection terminal
該模塊性能如下:
1)以太網(wǎng)與CAN總線協(xié)議轉(zhuǎn)換;
2)具備2路獨(dú)立CAN接口;
3)以太網(wǎng)通訊采用UDP協(xié)議,透明轉(zhuǎn)換;
4)兼容CAN2.0A、CAN2.0B、標(biāo)準(zhǔn)幀、擴(kuò)展幀;
5)可進(jìn)行雙向數(shù)據(jù)交互,CAN發(fā)送與接收;
6)兼容數(shù)據(jù)幀、遠(yuǎn)程幀格式;
7)波特率可調(diào)范圍5 Kbit/s~1 Mbit/s;
8)最大幀轉(zhuǎn)換流量1 200幀/秒;
9)數(shù)據(jù)接收緩沖區(qū)大小可達(dá)100 幀,共1 300 Byte;
10)可檢索、配置模塊網(wǎng)絡(luò)參數(shù);
11)外部直流工作電源7~24 V;
12)隔離模塊絕緣電壓1 000 Vrms;
13)工作溫度為-20~85℃;
14)機(jī)械外殼尺寸100*70 mm,支持DIN導(dǎo)軌安裝。
網(wǎng)絡(luò)設(shè)備將一包或多包CAN幀數(shù)據(jù)填充到UDP包中發(fā)向模塊網(wǎng)口,模塊接收到網(wǎng)絡(luò)數(shù)據(jù)后,將UDP數(shù)據(jù)包中的CAN幀數(shù)據(jù)提取出來(lái),發(fā)向CAN設(shè)備。協(xié)議轉(zhuǎn)換如圖2所示。
圖2 以太網(wǎng)-CAN協(xié)議轉(zhuǎn)換過(guò)程Fig.2 Ethernet-CAN protocol conversion process
1)幀信息
幀信息Frame Info占一個(gè)字節(jié),該字節(jié)的bit定義如表5所示。
表5 幀信息定義Tab.5 Definition of frame information
FF:標(biāo)準(zhǔn)幀和擴(kuò)展幀的標(biāo)識(shí),0為標(biāo)準(zhǔn)幀,1為擴(kuò)展幀。
RTR:遠(yuǎn)程幀和數(shù)據(jù)幀的標(biāo)識(shí),0為數(shù)據(jù)幀,1為遠(yuǎn)程幀。除非特殊應(yīng)用,一般客戶都是用數(shù)據(jù)幀,填0即可。
DLC3~DLC0:標(biāo)識(shí)該CAN消息幀中的有效數(shù)據(jù)長(zhǎng)度,最多8個(gè)。
2)ID域
CAN消息幀的ID填充域共4個(gè)字節(jié),如表6所示。
表6 幀ID定義Tab.6 Definition of frame ID
當(dāng)為標(biāo)準(zhǔn)幀時(shí),占用后2個(gè)字節(jié)。ID2的高5位無(wú)效,補(bǔ)0。例:當(dāng)ID=0x03FF時(shí),按表7方式填充。
表7 標(biāo)準(zhǔn)幀ID實(shí)例Tab.7 Example of standard frame ID
當(dāng)為擴(kuò)展幀時(shí),占用4個(gè)字節(jié)。ID0的高3位無(wú)效,補(bǔ)0。例:當(dāng)ID=0x12345678時(shí),按表8方式填充
表8 擴(kuò)展幀ID實(shí)例Tab.8 Example of extended frame ID
3)數(shù)據(jù)域
根據(jù)CAN消息的定義,一個(gè)CAN幀中,最多可以包含8個(gè)字節(jié)的數(shù)據(jù)。當(dāng)該CAN幀不需要8個(gè)字節(jié)時(shí),余下的字節(jié)補(bǔ)0。注意:需要在FrameInfo字節(jié)中指明有效數(shù)據(jù)個(gè)數(shù)。例:FrameInfo中的DLC3~DLC0=8,表明有8個(gè)數(shù)據(jù)有效,如表9所示。
表9 數(shù)據(jù)域?qū)嵗齌ab.9 Example of data domain
4)CAN消息幀舉例
如表10所示,是一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)幀,ID為0x3ff,包含6個(gè)數(shù)據(jù)字節(jié),為11h,22h,33h,44h,55h,66h的CAN幀的表示方式。
表10 標(biāo)準(zhǔn)數(shù)據(jù)幀實(shí)例Tab.10 Example of standard data frame
該模塊可人工配置參數(shù),配置步驟如下。
1)修改模塊網(wǎng)口一側(cè)設(shè)備的IP地址為192.168.0.55,子網(wǎng)掩碼255.255.255.0,默認(rèn)網(wǎng)關(guān)192.168.0.1。
2)將R+與R-用導(dǎo)線短接,接入終端電阻,并打開(kāi)參數(shù)配置軟件,如圖3所示。
圖3 以太網(wǎng)-CAN模塊參數(shù)配置界面Fig.3 Interface of Ethernet-CAN module parameters configuration
3)點(diǎn)擊“設(shè)備型號(hào)”,選擇NET-CAN200,然后點(diǎn)擊“設(shè)備操作”→“啟動(dòng)設(shè)備”,會(huì)在彈出的窗口將網(wǎng)絡(luò)中NET-CAN設(shè)備列表顯示。顯示信息包括該設(shè)備的主機(jī)IP,主機(jī)端口,設(shè)備IP和設(shè)備端口。運(yùn)行菜單“設(shè)置”→“獲取NET-CAN信息”,得到當(dāng)前模塊的參數(shù),并可以進(jìn)行修改,如圖4所示。
主要參數(shù)含義如下:
1)主機(jī)IP:用于通訊轉(zhuǎn)發(fā)的主機(jī)IP地址;
圖4 設(shè)備參數(shù)配置界面Fig.4 Interface of equipment parameters configuration
2)主機(jī)端口:用于通訊轉(zhuǎn)發(fā)的主機(jī)IP端口;適配器只有接收到從這個(gè)IP地址和端口發(fā)來(lái)的數(shù)據(jù),才能轉(zhuǎn)發(fā)到CAN總線;同時(shí),CAN總線端過(guò)來(lái)的數(shù)據(jù),將通過(guò)以太網(wǎng)UDP方式發(fā)到這個(gè)IP地址和端口;
3)設(shè)備IP:模塊的IP地址;
4)設(shè)備端口:模塊用于UDP通訊的端口號(hào)。主機(jī)必須通過(guò)UDP協(xié)議發(fā)送數(shù)據(jù)到這個(gè)IP地址和端口,設(shè)備才能接收到;
5)波特率:CAN總線的波特率,支持5k~1Mbit/s的15種常規(guī)速率供選擇;
6)自接收使能:在使能方式下,設(shè)備向CAN總線發(fā)送的消息都可以被收回,該模式用于設(shè)備的自測(cè)試。
采用Windows操作系統(tǒng)下的vc6.0集成開(kāi)發(fā)環(huán)境編寫(xiě)通訊代碼,步驟如下。
1)定義網(wǎng)絡(luò)套接字及相關(guān)變量
SOCKET socket1,socket2;
SOCKADDR_IN sockDest,sockDest2,sockDest3;
SOCKADDR_IN sockFrom;
SOCKADDR_IN sockSrc;
CString strDevIpAddress;
int SockAddrlen=sizeof(SOCKADDR);
2)綁定主機(jī)IP和端口
socket1=socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN sockSrc;
sockSrc.sin_family=AF_INET;
sockSrc.sin_port=htons(4060);
sockSrc.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
bind(socket1,(SOCKADDR *)&sockSrc,sizeof(SOCKADDR));
3)生成SockDest用于連接測(cè)試
sockDest.sin_family=AF_INET;
sockDest.sin_port=htons(3000);
sockDest.sin_addr.S_un.S_addr=inet_addr(“192.168.0.101”);
4)生成SockDest2通訊用CAN0通道
sockDest2.sin_family=AF_INET;
sockDest2.sin_port=htons(4001);
sockDest2.sin_addr.S_un.S_addr=inet_addr(“192.168.0.101”);
5)生成SockDest3 通訊用CAN1通道
sockDest3.sin_family=AF_INET;
sockDest3.sin_port=htons(4002);
sockDest3.sin_addr.S_un.S_addr=inet_addr(“192.168.0.101”);
為便于用戶進(jìn)行通信前測(cè)試,以太網(wǎng)CAN模塊提供了一組連接測(cè)試的命令字CDh,0Dh。當(dāng)模塊收到這個(gè)命令后,將回送當(dāng)前設(shè)備中的DevIP 和HostIP等網(wǎng)絡(luò)參數(shù)。
1)定義并賦值相關(guān)變量
char SendData[15];
char rbuf[100];
BYTE rbuf2[100];
SendData[0]=0xCD;//連接測(cè)試命令字
SendData[1]=0x0D;//連接測(cè)試命令字
2)發(fā)送連接測(cè)試請(qǐng)求
if(send to(socket1, Send Data,2,0,(SOCKADDR*)&sockDest,sizeof(SOCKADDR))==SOCKET_ERROR)
{
MessageBox(“udp發(fā)送失敗");
return;
}
3)接收數(shù)據(jù),連接成功
int datalen=recvfrom(socket1, rbuf, 1024,0, (SOCKADDR*)&sockFrom,&SockAddrlen);
if(datalen!=13) return;
for(i=0;i rbuf2[i]=rbuf[i];//格式轉(zhuǎn)換 for(i=0;i<4;i++) DevIP[i]=rbuf2[1+i];//設(shè)備IP地址 for(i=0;i<4;i++) HostIP[i]=rbuf2[5+i];//主機(jī)IP地址 DevUdpPort=rbuf2[9]*256+rbuf2[10];//設(shè)備UDP 端口號(hào) HostUdpPort=rbuf2[11]*256+rbuf2[12];//主機(jī)UDP端口號(hào) 1)定義并賦值相關(guān)變量 char SendData[1500]; char rbuf[1000]; BYTE rbuf2[1000]; for(int i=0;i<40;i++)//UDP攜 帶40個(gè)CAN數(shù)據(jù) { SendData[i*13]=0x08;//幀信息 SendData[i*13+1]=0x00;//ID0 SendData[i*13+2]=0x00;//ID1 SendData[i*13+3]=0x02;//ID2 SendData[i*13+4]=0x15;//ID3 SendData[i*13+5]=i*8;//數(shù)據(jù)1 SendData[i*13+6]=i*8+1;//數(shù)據(jù)2 SendData[i*13+7]=i*8+2;//數(shù)據(jù)3 SendData[i*13+8]=i*8+3;//數(shù)據(jù)4 SendData[i*13+9]=i*8+4;//數(shù)據(jù)5 SendData[i*13+10]=i*8+5;//數(shù)據(jù)6 SendData[i*13+11]=i*8+6;//數(shù)據(jù)7 SendData[i*13+12]=i*8+7;//數(shù)據(jù)8 } 2)發(fā)送攜帶CAN數(shù)據(jù)的UDP包 if(sendto(socket1,SendData,40*13,0,(SOCKADDR*)&sockDest2, sizeof(SOCKADDR))==SOCKET_ERROR) { MessageBox(“udp 發(fā)送失敗”); return; } 1)開(kāi)啟線程處理UDP數(shù)據(jù)接收 AfxBeginThread(ReceiveThread,0); 2)定義相關(guān)變量 char rbuf[1000]; int datalen; 3)接收攜帶CAN數(shù)據(jù)的UDP包 datalen=recvfrom(socket1, rbuf, 1024, 0,(SOCKADDR*)&sockFrom, &SockAddrlen); 4)CAN數(shù)據(jù)解析與處理 if((datalen%13)==0)//如果該字節(jié)數(shù)是13 的整數(shù)倍,表示UDP包字節(jié)完整。 { //CAN消息都在rbuf[datalen]數(shù)組中 //該部分進(jìn)行處理或顯示收到的CAN消息 } 使用以太網(wǎng)CAN模塊作為以太網(wǎng)通訊設(shè)備和CAN總線設(shè)備的網(wǎng)關(guān)進(jìn)行實(shí)時(shí)協(xié)議轉(zhuǎn)換,使以太網(wǎng)通訊設(shè)備能夠兼容通訊方式不同的 CAN車(chē)體總線。減少開(kāi)發(fā)成本,滿足功能需求,增強(qiáng)設(shè)備的可移植性與兼容性,實(shí)用性較強(qiáng)。 [1]付亮,李偉.CAN總線技術(shù)及其在現(xiàn)代汽車(chē)中的應(yīng)用[J].中國(guó)汽車(chē)制造,2006 (1):23-26.Fu Liang,Li Wei.CAN bus technology and its application in modern automobile[J].China Automotive Manufacturing.2006 (1):23-26. [2]葉加青,李軍.CAN總線與Ethernet互連嵌入式研究與實(shí)現(xiàn)[J].計(jì)算機(jī)與現(xiàn)代化,2010(9):45-47.Ye Jiaqing, Li Jun.Embedded research and implementation of CAN bus and Ethernet interconnection[J].Computer and Modernization. 2010(9):45-47. [3]李加升,李寧,曾哲.基于CAN總線與以太網(wǎng)的嵌入式網(wǎng)關(guān)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2009(14):69-71.Li Jiasheng,Li Ning,Zeng Zhe.Design of Embedded Gateway Based on CAN bus and Ethernet[J].Modern Electronics Technique,2009(14):69-71. [4]劉濱,耿雪貞.CAN與以太網(wǎng)數(shù)據(jù)交換的研究與分析[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2003(12):16-18.Liu Bin,Geng Xuezhen.Research and analysis of data exchange between CAN and Ethernet[J].Microcontroller&Embedded Systems. 2003(12):16-18. [5]李正軍.現(xiàn)場(chǎng)總線及其應(yīng)用技術(shù)[M].北京:機(jī)械工業(yè)出版社,2005. [6]劉曉莉,高軍,趙延明.基于ARM的以太網(wǎng)與CAN總線互聯(lián)網(wǎng)關(guān)的設(shè)計(jì)[J].工業(yè)控制計(jì)算機(jī), 2007(4):15-16.Liu Xiaoli,Gao Jun,Zhao Yanming.Design of Ethernet-CAN Gateway Based on ARM[J].Industrial Control Computer,2007(4):15-16. [7]陽(yáng)憲惠.現(xiàn)場(chǎng)總線技術(shù)及其應(yīng)用[M].北京: 清華大學(xué)出版社,1999. [8]林士兵,袁焱,楊煜普.TCP/IP網(wǎng)絡(luò)與CAN網(wǎng)絡(luò)網(wǎng)關(guān)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程.2007(3):243-244.Lin Shibing,Yuan Yan,Yang Yupu.Design and Realization of Gateway Between TCP/IP Network and CAN Network[J].Computer Engineering,2007(3):243-244.3.3 CAN數(shù)據(jù)發(fā)送
3.4 CAN接收
4 結(jié)束語(yǔ)