APP下载

基于以太网CAN模块的总线协议转换网关设计

2018-07-05左登超

铁路通信信号工程技术 2018年5期
关键词:IP地址字节以太网

左登超 贾 涛

(中车青岛四方车辆研究所有限公司,山东青岛 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端口号

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.

猜你喜欢

IP地址字节以太网
No.8 字节跳动将推出独立出口电商APP
基于1500以太网养猪场的智能饲喂控制系统的设计与实现
铁路远动系统几种组网方式IP地址的申请和设置
No.10 “字节跳动手机”要来了?
轻量级分组密码Midori64的积分攻击
谈实时以太网EtherCAT技术在变电站自动化中的应用
公安网络中IP地址智能管理的研究与思考
《IP地址及其管理》教学设计
浅谈EPON与工业以太网在贵遵高速公路中的应用
人类进入“泽它时代”