基于以太网CAN模块的总线协议转换网关设计
2018-07-05左登超
左登超 贾 涛
(中车青岛四方车辆研究所有限公司,山东青岛 266031)
现阶段我国动车组数量庞大、种类繁多,不同车型使用的车体通讯总线也有差异。不同方式的通讯设备目前尚不能相互兼容。
为使当前已有的以太网通讯设备能够适应CAN车体总线,以减少重新开发软硬件系统的成本,本文提出基于以太网CAN模块的总线协议网关设计。
1 CAN与以太网简介
1.1 CAN简介
控制器局域网络(Controller Area Network,CAN),由德国BOSCH公司研发并成为国际标准——ISO11898[1]。其被广泛应用在计算机控制系统、嵌入式控制设备局域网等领域中[2]。
CAN总线协议帧格式有两种类型:CAN标准帧、CAN扩展帧[3]。CAN标准帧由11个字节组成,包括帧信息、帧数据两部分内容。前3个字节为帧信息部分,后8个字节为帧数据部分。CAN协议标准帧格式如表1所示。
表1 标准帧格式Tab.1 Standard frame format
在表1中,字节1代表帧信息,其第7位——FF代表帧格式,在CAN协议标准帧格式中,FF的值为0;其第6位——RTR代表帧类型,RTR=0时为数据帧,RTR=1时为远程帧;其第0~3位表示帧类型为数据帧的数据部分总长度。字节2与字节3表示帧识别码,其低11位有效,高5位则无效。字节4到字节11代表数据帧的数据部分,帧类型为远程帧时,字节4到字节11无效。
CAN扩展帧由13个字节组成,包括帧信息、帧数据两部分内容。前5个字节为帧信息部分,后8个字节为帧数据部分。CAN扩展帧格式如表2所示。
表2 扩展帧格式Tab.2 Extended frame format
在表2中,字节1代表帧信息,其第7位——FF代表帧格式,在CAN协议扩展帧格式中,FF的值为1;其第6位——RTR代表帧类型,RTR=0时为数据帧,RTR=1时为远程帧;其第0到3位表示数据帧的实际数据部分总长度。字节2到字节5为帧识别码,其低29位有效,高3位则无效。字节6到字节13代表数据帧的数据部分,帧类型为远程帧时,字节6到字节13无效。
1.2 以太网
以太网通信协议中常用UDP 与TCP协议。
用户数据报协议(User Datagram Protocol UDP):是一种无连接的通信协议[4]。在OSI模型中,UDP在第四层——传输层,是IP协议的上一层。UDP常用于需要在计算机之间进行数据交互的网络应用程序中[5]。UDP主要将网络应用之间传输的数据流量压缩转换成数据包[6]。
传输控制协议(Transmission Control Protocol TCP):是一种面向连接、可靠、基于字节流的通信协议[7]。在OSI模型中,TCP完成第四层——传输层所指定的功能,是与用户数据报协议在同一层内的另一个重要传输协议[8]。
2 模块简介、转换原理及配置
2.1 模块简介
以太网CAN模块如图2所示。该模块带有2路CAN接口和一路RJ45以太网接口,可进行双向数据传送。以太网设备可以通过RJ45接口连接一个标准的CAN网络。以太网CAN模块可以作为一个标准的CAN节点。利用该模块,用户可以方便快速地开发出CAN总线应用软件产品。
以太网CAN模块共有3组对外接口:一个标准的RJ45以太网接口;一个7pin接线端子(电源输入接口),端子定义如表3所示;一个10pin的接线端子(CAN总线信号接口),端子定义如表4所示。
图1 以太网-CAN转换模块Fig. 1 Ethernet-CAN conversion module
表3 7pin接线端子Tab.3 7pin connection terminal
表4 10pin接线端子Tab.4 10pin connection terminal
该模块性能如下:
1)以太网与CAN总线协议转换;
2)具备2路独立CAN接口;
3)以太网通讯采用UDP协议,透明转换;
4)兼容CAN2.0A、CAN2.0B、标准帧、扩展帧;
5)可进行双向数据交互,CAN发送与接收;
6)兼容数据帧、远程帧格式;
7)波特率可调范围5 Kbit/s~1 Mbit/s;
8)最大帧转换流量1 200帧/秒;
9)数据接收缓冲区大小可达100 帧,共1 300 Byte;
10)可检索、配置模块网络参数;
11)外部直流工作电源7~24 V;
12)隔离模块绝缘电压1 000 Vrms;
13)工作温度为-20~85℃;
14)机械外壳尺寸100*70 mm,支持DIN导轨安装。
2.2 协议转换原理
网络设备将一包或多包CAN帧数据填充到UDP包中发向模块网口,模块接收到网络数据后,将UDP数据包中的CAN帧数据提取出来,发向CAN设备。协议转换如图2所示。
图2 以太网-CAN协议转换过程Fig.2 Ethernet-CAN protocol conversion process
1)帧信息
帧信息Frame Info占一个字节,该字节的bit定义如表5所示。
表5 帧信息定义Tab.5 Definition of frame information
FF:标准帧和扩展帧的标识,0为标准帧,1为扩展帧。
RTR:远程帧和数据帧的标识,0为数据帧,1为远程帧。除非特殊应用,一般客户都是用数据帧,填0即可。
DLC3~DLC0:标识该CAN消息帧中的有效数据长度,最多8个。
2)ID域
CAN消息帧的ID填充域共4个字节,如表6所示。
表6 帧ID定义Tab.6 Definition of frame ID
当为标准帧时,占用后2个字节。ID2的高5位无效,补0。例:当ID=0x03FF时,按表7方式填充。
表7 标准帧ID实例Tab.7 Example of standard frame ID
当为扩展帧时,占用4个字节。ID0的高3位无效,补0。例:当ID=0x12345678时,按表8方式填充
表8 扩展帧ID实例Tab.8 Example of extended frame ID
3)数据域
根据CAN消息的定义,一个CAN帧中,最多可以包含8个字节的数据。当该CAN帧不需要8个字节时,余下的字节补0。注意:需要在FrameInfo字节中指明有效数据个数。例:FrameInfo中的DLC3~DLC0=8,表明有8个数据有效,如表9所示。
表9 数据域实例Tab.9 Example of data domain
4)CAN消息帧举例
如表10所示,是一个标准数据帧,ID为0x3ff,包含6个数据字节,为11h,22h,33h,44h,55h,66h的CAN帧的表示方式。
表10 标准数据帧实例Tab.10 Example of standard data frame
2.3 模块配置
该模块可人工配置参数,配置步骤如下。
1)修改模块网口一侧设备的IP地址为192.168.0.55,子网掩码255.255.255.0,默认网关192.168.0.1。
2)将R+与R-用导线短接,接入终端电阻,并打开参数配置软件,如图3所示。
图3 以太网-CAN模块参数配置界面Fig.3 Interface of Ethernet-CAN module parameters configuration
3)点击“设备型号”,选择NET-CAN200,然后点击“设备操作”→“启动设备”,会在弹出的窗口将网络中NET-CAN设备列表显示。显示信息包括该设备的主机IP,主机端口,设备IP和设备端口。运行菜单“设置”→“获取NET-CAN信息”,得到当前模块的参数,并可以进行修改,如图4所示。
主要参数含义如下:
1)主机IP:用于通讯转发的主机IP地址;
图4 设备参数配置界面Fig.4 Interface of equipment parameters configuration
2)主机端口:用于通讯转发的主机IP端口;适配器只有接收到从这个IP地址和端口发来的数据,才能转发到CAN总线;同时,CAN总线端过来的数据,将通过以太网UDP方式发到这个IP地址和端口;
3)设备IP:模块的IP地址;
4)设备端口:模块用于UDP通讯的端口号。主机必须通过UDP协议发送数据到这个IP地址和端口,设备才能接收到;
5)波特率:CAN总线的波特率,支持5k~1Mbit/s的15种常规速率供选择;
6)自接收使能:在使能方式下,设备向CAN总线发送的消息都可以被收回,该模式用于设备的自测试。
3 软件实现
采用Windows操作系统下的vc6.0集成开发环境编写通讯代码,步骤如下。
3.1 初始化网络套接字
1)定义网络套接字及相关变量
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”);
3.2 设备连接测试
为便于用户进行通信前测试,以太网CAN模块提供了一组连接测试的命令字CDh,0Dh。当模块收到这个命令后,将回送当前设备中的DevIP 和HostIP等网络参数。
1)定义并赋值相关变量
char SendData[15];
char rbuf[100];
BYTE rbuf2[100];
SendData[0]=0xCD;//连接测试命令字
SendData[1]=0x0D;//连接测试命令字
2)发送连接测试请求
if(send to(socket1, Send Data,2,0,(SOCKADDR*)&sockDest,sizeof(SOCKADDR))==SOCKET_ERROR)
{
MessageBox(“udp发送失败");
return;
}
3)接收数据,连接成功
int datalen=recvfrom(socket1, rbuf, 1024,0, (SOCKADDR*)&sockFrom,&SockAddrlen);
if(datalen!=13) return;
for(i=0;i rbuf2[i]=rbuf[i];//格式转换 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数据 { 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;//数据1 SendData[i*13+6]=i*8+1;//数据2 SendData[i*13+7]=i*8+2;//数据3 SendData[i*13+8]=i*8+3;//数据4 SendData[i*13+9]=i*8+4;//数据5 SendData[i*13+10]=i*8+5;//数据6 SendData[i*13+11]=i*8+6;//数据7 SendData[i*13+12]=i*8+7;//数据8 } 2)发送携带CAN数据的UDP包 if(sendto(socket1,SendData,40*13,0,(SOCKADDR*)&sockDest2, sizeof(SOCKADDR))==SOCKET_ERROR) { MessageBox(“udp 发送失败”); return; } 1)开启线程处理UDP数据接收 AfxBeginThread(ReceiveThread,0); 2)定义相关变量 char rbuf[1000]; int datalen; 3)接收携带CAN数据的UDP包 datalen=recvfrom(socket1, rbuf, 1024, 0,(SOCKADDR*)&sockFrom, &SockAddrlen); 4)CAN数据解析与处理 if((datalen%13)==0)//如果该字节数是13 的整数倍,表示UDP包字节完整。 { //CAN消息都在rbuf[datalen]数组中 //该部分进行处理或显示收到的CAN消息 } 使用以太网CAN模块作为以太网通讯设备和CAN总线设备的网关进行实时协议转换,使以太网通讯设备能够兼容通讯方式不同的 CAN车体总线。减少开发成本,满足功能需求,增强设备的可移植性与兼容性,实用性较强。 [1]付亮,李伟.CAN总线技术及其在现代汽车中的应用[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互连嵌入式研究与实现[J].计算机与现代化,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总线与以太网的嵌入式网关设计[J].现代电子技术,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与以太网数据交换的研究与分析[J].单片机与嵌入式系统应用,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]李正军.现场总线及其应用技术[M].北京:机械工业出版社,2005. [6]刘晓莉,高军,赵延明.基于ARM的以太网与CAN总线互联网关的设计[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]阳宪惠.现场总线技术及其应用[M].北京: 清华大学出版社,1999. [8]林士兵,袁焱,杨煜普.TCP/IP网络与CAN网络网关的设计与实现[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数据发送
3.4 CAN接收
4 结束语