左登超 賈 濤
(中車青島四方車輛研究所有限公司,山東青島 266031)
現(xiàn)階段我國動車組數(shù)量龐大、種類繁多,不同車型使用的車體通訊總線也有差異。不同方式的通訊設備目前尚不能相互兼容。
為使當前已有的以太網(wǎng)通訊設備能夠適應CAN車體總線,以減少重新開發(fā)軟硬件系統(tǒng)的成本,本文提出基于以太網(wǎng)CAN模塊的總線協(xié)議網(wǎng)關設計。
控制器局域網(wǎng)絡(Controller Area Network,CAN),由德國BOSCH公司研發(fā)并成為國際標準——ISO11898[1]。其被廣泛應用在計算機控制系統(tǒng)、嵌入式控制設備局域網(wǎng)等領域中[2]。
CAN總線協(xié)議幀格式有兩種類型:CAN標準幀、CAN擴展幀[3]。CAN標準幀由11個字節(jié)組成,包括幀信息、幀數(shù)據(jù)兩部分內(nèi)容。前3個字節(jié)為幀信息部分,后8個字節(jié)為幀數(shù)據(jù)部分。CAN協(xié)議標準幀格式如表1所示。
表1 標準幀格式Tab.1 Standard frame format
在表1中,字節(jié)1代表幀信息,其第7位——FF代表幀格式,在CAN協(xié)議標準幀格式中,F(xiàn)F的值為0;其第6位——RTR代表幀類型,RTR=0時為數(shù)據(jù)幀,RTR=1時為遠程幀;其第0~3位表示幀類型為數(shù)據(jù)幀的數(shù)據(jù)部分總長度。字節(jié)2與字節(jié)3表示幀識別碼,其低11位有效,高5位則無效。字節(jié)4到字節(jié)11代表數(shù)據(jù)幀的數(shù)據(jù)部分,幀類型為遠程幀時,字節(jié)4到字節(jié)11無效。
CAN擴展幀由13個字節(jié)組成,包括幀信息、幀數(shù)據(jù)兩部分內(nèi)容。前5個字節(jié)為幀信息部分,后8個字節(jié)為幀數(shù)據(jù)部分。CAN擴展幀格式如表2所示。
表2 擴展幀格式Tab.2 Extended frame format
在表2中,字節(jié)1代表幀信息,其第7位——FF代表幀格式,在CAN協(xié)議擴展幀格式中,F(xiàn)F的值為1;其第6位——RTR代表幀類型,RTR=0時為數(shù)據(jù)幀,RTR=1時為遠程幀;其第0到3位表示數(shù)據(jù)幀的實際數(shù)據(jù)部分總長度。字節(jié)2到字節(jié)5為幀識別碼,其低29位有效,高3位則無效。字節(jié)6到字節(jié)13代表數(shù)據(jù)幀的數(shù)據(jù)部分,幀類型為遠程幀時,字節(jié)6到字節(jié)13無效。
以太網(wǎng)通信協(xié)議中常用UDP 與TCP協(xié)議。
用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol UDP):是一種無連接的通信協(xié)議[4]。在OSI模型中,UDP在第四層——傳輸層,是IP協(xié)議的上一層。UDP常用于需要在計算機之間進行數(shù)據(jù)交互的網(wǎng)絡應用程序中[5]。UDP主要將網(wǎng)絡應用之間傳輸?shù)臄?shù)據(jù)流量壓縮轉(zhuǎn)換成數(shù)據(jù)包[6]。
傳輸控制協(xié)議(Transmission Control Protocol TCP):是一種面向連接、可靠、基于字節(jié)流的通信協(xié)議[7]。在OSI模型中,TCP完成第四層——傳輸層所指定的功能,是與用戶數(shù)據(jù)報協(xié)議在同一層內(nèi)的另一個重要傳輸協(xié)議[8]。
以太網(wǎng)CAN模塊如圖2所示。該模塊帶有2路CAN接口和一路RJ45以太網(wǎng)接口,可進行雙向數(shù)據(jù)傳送。以太網(wǎng)設備可以通過RJ45接口連接一個標準的CAN網(wǎng)絡。以太網(wǎng)CAN模塊可以作為一個標準的CAN節(jié)點。利用該模塊,用戶可以方便快速地開發(fā)出CAN總線應用軟件產(chǎn)品。
以太網(wǎng)CAN模塊共有3組對外接口:一個標準的RJ45以太網(wǎng)接口;一個7pin接線端子(電源輸入接口),端子定義如表3所示;一個10pin的接線端子(CAN總線信號接口),端子定義如表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路獨立CAN接口;
3)以太網(wǎng)通訊采用UDP協(xié)議,透明轉(zhuǎn)換;
4)兼容CAN2.0A、CAN2.0B、標準幀、擴展幀;
5)可進行雙向數(shù)據(jù)交互,CAN發(fā)送與接收;
6)兼容數(shù)據(jù)幀、遠程幀格式;
7)波特率可調(diào)范圍5 Kbit/s~1 Mbit/s;
8)最大幀轉(zhuǎn)換流量1 200幀/秒;
9)數(shù)據(jù)接收緩沖區(qū)大小可達100 幀,共1 300 Byte;
10)可檢索、配置模塊網(wǎng)絡參數(shù);
11)外部直流工作電源7~24 V;
12)隔離模塊絕緣電壓1 000 Vrms;
13)工作溫度為-20~85℃;
14)機械外殼尺寸100*70 mm,支持DIN導軌安裝。
網(wǎng)絡設備將一包或多包CAN幀數(shù)據(jù)填充到UDP包中發(fā)向模塊網(wǎng)口,模塊接收到網(wǎng)絡數(shù)據(jù)后,將UDP數(shù)據(jù)包中的CAN幀數(shù)據(jù)提取出來,發(fā)向CAN設備。協(xié)議轉(zhuǎn)換如圖2所示。
圖2 以太網(wǎng)-CAN協(xié)議轉(zhuǎn)換過程Fig.2 Ethernet-CAN protocol conversion process
1)幀信息
幀信息Frame Info占一個字節(jié),該字節(jié)的bit定義如表5所示。
表5 幀信息定義Tab.5 Definition of frame information
FF:標準幀和擴展幀的標識,0為標準幀,1為擴展幀。
RTR:遠程幀和數(shù)據(jù)幀的標識,0為數(shù)據(jù)幀,1為遠程幀。除非特殊應用,一般客戶都是用數(shù)據(jù)幀,填0即可。
DLC3~DLC0:標識該CAN消息幀中的有效數(shù)據(jù)長度,最多8個。
2)ID域
CAN消息幀的ID填充域共4個字節(jié),如表6所示。
表6 幀ID定義Tab.6 Definition of frame ID
當為標準幀時,占用后2個字節(jié)。ID2的高5位無效,補0。例:當ID=0x03FF時,按表7方式填充。
表7 標準幀ID實例Tab.7 Example of standard frame ID
當為擴展幀時,占用4個字節(jié)。ID0的高3位無效,補0。例:當ID=0x12345678時,按表8方式填充
表8 擴展幀ID實例Tab.8 Example of extended frame ID
3)數(shù)據(jù)域
根據(jù)CAN消息的定義,一個CAN幀中,最多可以包含8個字節(jié)的數(shù)據(jù)。當該CAN幀不需要8個字節(jié)時,余下的字節(jié)補0。注意:需要在FrameInfo字節(jié)中指明有效數(shù)據(jù)個數(shù)。例:FrameInfo中的DLC3~DLC0=8,表明有8個數(shù)據(jù)有效,如表9所示。
表9 數(shù)據(jù)域?qū)嵗齌ab.9 Example of data domain
4)CAN消息幀舉例
如表10所示,是一個標準數(shù)據(jù)幀,ID為0x3ff,包含6個數(shù)據(jù)字節(jié),為11h,22h,33h,44h,55h,66h的CAN幀的表示方式。
表10 標準數(shù)據(jù)幀實例Tab.10 Example of standard data frame
該模塊可人工配置參數(shù),配置步驟如下。
1)修改模塊網(wǎng)口一側(cè)設備的IP地址為192.168.0.55,子網(wǎng)掩碼255.255.255.0,默認網(wǎng)關192.168.0.1。
2)將R+與R-用導線短接,接入終端電阻,并打開參數(shù)配置軟件,如圖3所示。
圖3 以太網(wǎng)-CAN模塊參數(shù)配置界面Fig.3 Interface of Ethernet-CAN module parameters configuration
3)點擊“設備型號”,選擇NET-CAN200,然后點擊“設備操作”→“啟動設備”,會在彈出的窗口將網(wǎng)絡中NET-CAN設備列表顯示。顯示信息包括該設備的主機IP,主機端口,設備IP和設備端口。運行菜單“設置”→“獲取NET-CAN信息”,得到當前模塊的參數(shù),并可以進行修改,如圖4所示。
主要參數(shù)含義如下:
1)主機IP:用于通訊轉(zhuǎn)發(fā)的主機IP地址;
圖4 設備參數(shù)配置界面Fig.4 Interface of equipment parameters configuration
2)主機端口:用于通訊轉(zhuǎn)發(fā)的主機IP端口;適配器只有接收到從這個IP地址和端口發(fā)來的數(shù)據(jù),才能轉(zhuǎn)發(fā)到CAN總線;同時,CAN總線端過來的數(shù)據(jù),將通過以太網(wǎng)UDP方式發(fā)到這個IP地址和端口;
3)設備IP:模塊的IP地址;
4)設備端口:模塊用于UDP通訊的端口號。主機必須通過UDP協(xié)議發(fā)送數(shù)據(jù)到這個IP地址和端口,設備才能接收到;
5)波特率:CAN總線的波特率,支持5k~1Mbit/s的15種常規(guī)速率供選擇;
6)自接收使能:在使能方式下,設備向CAN總線發(fā)送的消息都可以被收回,該模式用于設備的自測試。
采用Windows操作系統(tǒng)下的vc6.0集成開發(fā)環(huán)境編寫通訊代碼,步驟如下。
1)定義網(wǎng)絡套接字及相關變量
SOCKET socket1,socket2;
SOCKADDR_IN sockDest,sockDest2,sockDest3;
SOCKADDR_IN sockFrom;
SOCKADDR_IN sockSrc;
CString strDevIpAddress;
int SockAddrlen=sizeof(SOCKADDR);
2)綁定主機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用于連接測試
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”);
為便于用戶進行通信前測試,以太網(wǎng)CAN模塊提供了一組連接測試的命令字CDh,0Dh。當模塊收到這個命令后,將回送當前設備中的DevIP 和HostIP等網(wǎng)絡參數(shù)。
1)定義并賦值相關變量
char SendData[15];
char rbuf[100];
BYTE rbuf2[100];
SendData[0]=0xCD;//連接測試命令字
SendData[1]=0x0D;//連接測試命令字
2)發(fā)送連接測試請求
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];//設備IP地址 for(i=0;i<4;i++) HostIP[i]=rbuf2[5+i];//主機IP地址 DevUdpPort=rbuf2[9]*256+rbuf2[10];//設備UDP 端口號 HostUdpPort=rbuf2[11]*256+rbuf2[12];//主機UDP端口號 1)定義并賦值相關變量 char SendData[1500]; char rbuf[1000]; BYTE rbuf2[1000]; for(int i=0;i<40;i++)//UDP攜 帶40個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)開啟線程處理UDP數(shù)據(jù)接收 AfxBeginThread(ReceiveThread,0); 2)定義相關變量 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ù)組中 //該部分進行處理或顯示收到的CAN消息 } 使用以太網(wǎng)CAN模塊作為以太網(wǎng)通訊設備和CAN總線設備的網(wǎng)關進行實時協(xié)議轉(zhuǎn)換,使以太網(wǎng)通訊設備能夠兼容通訊方式不同的 CAN車體總線。減少開發(fā)成本,滿足功能需求,增強設備的可移植性與兼容性,實用性較強。 [1]付亮,李偉.CAN總線技術及其在現(xiàn)代汽車中的應用[J].中國汽車制造,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互連嵌入式研究與實現(xiàn)[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)關設計[J].現(xiàn)代電子技術,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].單片機與嵌入式系統(tǒ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)場總線及其應用技術[M].北京:機械工業(yè)出版社,2005. [6]劉曉莉,高軍,趙延明.基于ARM的以太網(wǎng)與CAN總線互聯(lián)網(wǎng)關的設計[J].工業(yè)控制計算機, 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]陽憲惠.現(xiàn)場總線技術及其應用[M].北京: 清華大學出版社,1999. [8]林士兵,袁焱,楊煜普.TCP/IP網(wǎng)絡與CAN網(wǎng)絡網(wǎng)關的設計與實現(xiàn)[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 結束語