1 CAN与以太网简介
1.1 CAN简介

  控制器局域网络(Controller Area Network, CAN),由德国BOSCH公司研发并成为国际标准——ISO11898[1]。其被广泛应用在计算机控制系统、嵌入式控制设备局域网等领域中[2]。

  CAN总线协议帧格式有两种类型:CAN标准帧、CAN扩展帧[3]。CAN标准帧由11个字节组成,包括帧信息、帧数据两部分内容。前3个字节为帧信息部分,后8个字节为帧数据部分。CAN协议标准帧格式如表1所示。

  在表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中,字节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模块如图1所示。该模块带有2路CAN接口和一路RJ45以太网接口,可进行双向数据传送。以太网设备可以通过RJ45接口连接一个标准的CAN网络。以太网CAN模块可以作为一个标准的CAN节点。利用该模块,用户可以方便快速地开发出CAN总线应用软件产品。

  以太网CAN模块共有3组对外接口:一个标准的RJ45以太网接口;一个7pin接线端子(电源输入接口),端子定义如表3所示;一个10pin的接线端子(CAN总线信号接口),端子定义如表4所示。

  该模块性能如下:

  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所示。

  1)帧信息

  帧信息Frame Info占一个字节,该字节的bit 定义如表5所示。

  FF:标准帧和扩展帧的标识,0为标准帧,1为扩展帧。

  RTR:远程帧和数据帧的标识,0为数据帧,1为远程帧。除非特殊应用,一般客户都是用数据帧,填0即可。

  DLC3~DLC0:标识该CAN消息帧中的有效数据长度,最多8个。

  2)ID域

  CAN消息帧的ID填充域共4个字节,如表6所示。

  当为标准帧时,占用后2个字节。ID2的高5位无效,补0。例:当ID=0x03FF时,按表7方式填充。

  当为扩展帧时,占用4个字节。ID0的高3位无效,补0。例:当ID=0x12345678时,按表8方式填充

  3)数据域

  根据CAN消息的定义,一个CAN帧中,最多可以包含8个字节的数据。当该CAN帧不需要8个字节时,余下的字节补0。注意:需要在FrameInfo字节中指明有效数据个数。例:FrameInfo中的DLC3~DLC0=8,表明有8个数据有效,如表9所示。

  4)CAN消息帧举例

  如表10所示,是一个标准数据帧,ID为0x3ff,包含6个数据字节,为11h,22h,33h,44h,55h,66h的CAN帧的表示方式。

2.3 模块配置

  该模块可人工配置参数,配置步骤如下。

  1)修改模块网口一侧设备的IP地址为192.168.0.55,子网掩码255.255.255.0,默认网关192.168.0.1。

  2)将R+与R-用导线短接,接入终端电阻,并打开参数配置软件,如图3所示。

  3)点击“设备型号”,选择NET-CAN200,然后点击“设备操作”→“启动设备”,会在弹出的窗口将网络中NET-CAN设备列表显示。显示信息包括该设备的主机IP,主机端口,设备IP和设备端口。运行菜单“设置”→“获取NET-CAN信息”,得到当前模块的参数,并可以进行修改,如图4所示。

  主要参数含义如下:

  1)主机IP:用于通讯转发的主机IP地址;

  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(sendto(socket1, SendData,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端口号

  3.3 CAN数据发送

  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;

  }

  3.4 CAN接收

  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消息

  }

4 结束语

  使用以太网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.

  (收稿日期:2018-01-22)

  (修回日期:2018-02-15)