嵌入式CAN-Ethernet接入网关的设计与实现
摘要:针对煤矿安全监测监控系统中 CAN现场总线与以太网互联的需求,采用 32位 RISC ARM处理器,设计了CAN-Ethernet嵌入式接入网关,运行在 Linux嵌入式实时操作系统上。详细介绍了网关的硬件与软件设计方案,实现了 CAN总线与以太网的无缝连接。经现场应用验证,该网关较好地完成了两种网络之间的协议转换和数据通信。
本文引用地址://m.amcfsurvey.com/article/148702.htm1引言
现场总线 CAN-bus最早由德国 Bosch公司提出,主要用于汽车内部单元与控制中心之间的数据通信[1],由于其在网络开放性、通讯可靠性、数据传输实时性、系统设计成本、系统扩展能力、纠错能力等方面具有强大的优势,使得 CAN现场总线越来越受到人们的关注。而且基于开放的现场总线 CAN-bus技术,构建煤矿行业的通讯网络,或开发特定功能的通讯设备,都已经不会存在技术上的门槛。CAN-bus本身也是符合本质安全要求的,所以当 CAN-bus应用于煤矿通讯系统时,也立即获得了广大设备用户的认可,成为煤矿行业中首选的设备通信网络,通过由 CAN-bus构建的煤矿现场设备网络,管理者和主控设备能即时了解、处理当前的矿井情况,发觉事故隐患,避免危机的发生。同时,煤矿系统中工业以太网技术也日趋成熟。CAN-bus现场总线与以太网互连,既能保证工业现场数据的可靠实时传输,又能满足数据信息的分析、记录、管理以及远程共享管理,推进煤矿监测监控系统的标准化和开放性,实现现代化煤矿的综合自动化。而 CAN-bus和以太网采用的是不同的通信标准,要实现它们之间的互联就要通过总线标准转换设备(即网关)来实现。
本文设计开发CAN-Ethernet网关,实现了煤矿安全监控系统中的井下 CAN总线设备与以太网的互连互通,从而将现场总线设备接入到无处不在的 Internet网络,实现数十公里以外,乃至整个地区的数据采集和管理满足煤矿行业现场数据的现代化管理要求。2硬件设计
本网关的硬件部分主要由协议转换模块、CAN总线接口模块和以太网接口模块等部分组成。本网关系统还提供了 RS232接口模块,用来在调试过程中与 PC机进行通信,串口作为控制台输入调试命令,显示调试结果。内置工业级电源系统,支持扩展电源输出,用于为其他设备提供电源。系统硬件结构如图 1所示。
![](http://m.amcfsurvey.com/uphotos/fetch/20130729/148702_1_0.jpg)
图1硬件结构图
2.1协议转换模块
协议转换模块是嵌入式网关的核心,由嵌入式微处理器及大容量的存储系统组成。微处理器采用 S3C2410A,S3C2410A是三星公司推出的基于 ARM920T内核的 16/32位 RISC嵌入式微处理器。配置了两片 HY57V561620并联构成的 32位 64MB SDRAM存储系统,存放系统运行时的用户数据、堆栈等信息。FLASH选用一片 64M的 K9F1208U0B,它是一款 NAND flash存储器,用来存放用户应用程序、嵌入式操作系统及现场总线传输来的数据
2.2 CAN总线接口模块
CAN总线接口模块实现网关与 CAN总线设备的互联。网关的 CAN总线接口采用的是两片SJA1000CAN总线控制器和两片 TJA1050高速 CAN收发器。此外,在煤矿井下环境中,为提高系统的抗干扰能力,电路中要采用光电隔离技术将嵌入式网关内部电路与现场总线进行电气隔离,保护网关的正常准确工作,因此在 CAN控制器与收发器之间使用光耦 6N137进行隔离,在光耦前后需要采用 2个相互隔离的 DC5V电源,本系统选用 B0505S-1W DC-DC变换器,实现系统与外界的真正隔离,抑制干扰的串入。SJA1000与微处理器的接口是以外部存储器的方式,数据线与地址线共用,基地址由 SJA1000的片选信号 CS决定,本设计中其地址定义在 BANK5中,因此使用此基地址加上 SJA1000内部寄存器地址的偏移量就可以访问 SJA1000内部 RAM空间;SJA1000的模式输入引脚(MODE)接正 5V电源,使其在 intel模式下工作;将 SJA1000的中断输出 INT引脚分别接 S3C2410A的 INT16和 17,使得数据接收采用了中断方式。
2.3以太网接口模块
自适应以太网接口模块提供了网关接入以太网的接口。以太网控制器采用DM9000,它具有高度的集成性,具有独特的 Packetpage结构可自动适应网络通信量模式的改变和现有系统资源,使网关以 10Mb/s或 100Mb/s的速率接入以太网网络。DM9000与 CPU按照16位方式连接,以太网控制芯片复位后默认工作方式为 I/O连接。
3软件设计
本网关的设计采用了基于消息队列的多线程以及多进程的方式,实现了CAN总线数据收发和以太网通信的同步;以太网通信程序采用流行的 socket套接字编程,传输层协议选择UDP(用户数据报协议)。要实现进程间通信,可以通过管道、信号量、消息队列及共享内存区等多种方式,在不同的系统中使用时各有优点,文献[2]中提出,经测试,对于小消息(100字节左右),在除了darwin6.6以外的所有系统中,system Ⅴ消息队列性能最好。而网关中每次收发的数据也在 100个字节以内。所以本设计中使用system Ⅴ消息队列在进程间传送数据。
在软件设计上可将其分为两大部分:CAN总线设备通信程序进程(主程序)和协议转换及以太网通信程序进程(server)。
3.1 CAN总线设备通信程序
主程序中,初始化包括模式寄存器MOD、命令寄存器CMR、状态寄存器SR、总线定时寄
存器BTR0,BTR1、验收代码寄存器ACR、验收屏蔽寄存器 AMR和输出控制寄存器 OCR等的设置。下面将创建 3个线程,CAN数据接收线程(CAN.receive)、CAN数据发送线程(CAN.send)和调用 server进程的线程。这就保证了两个 CAN口能分别同时接收和发送数据,网关同时也能与上位机软件通信。
CAN.receive线程 : for(;;) {if CAN0口有数据
break;} read(ca,rcvbuf,0);//从底层现场总线网络中接受各种智能设备采集的实时数据或报警信息,将其存入缓冲区,然后将 rcvbuf中数据放入 msg0.buffer
msgsend(msgid,msg0,sizeof(struct msgtype0),0);//将数据发送到消息队列 0中。这里发送到消息队列上的数据包括 CAN报文的 ID识别码,RTR帧等信息,即不解析收到的CAN数据包内容,直接将其发送到消息队列 0
CAN.send线程: msgrecv(msgid,msg1,sizeof(struct msgtype1),2,0);//从消息队列1中读取数据 添加本地 CAN地址,写入发送缓冲区sendbuf; write(ca,sendbuf,1);//将从缓冲区中读取的数据通过 CAN1口发送到目的CAN节点当然,也可以只用一个 CAN口实现CAN数据收发,但这时要注意防止 CAN口的收发冲突,
这就要加入互斥锁[3]。 CAN总线设备通信程序主要流程如图 2所示。
![](http://m.amcfsurvey.com/uphotos/fetch/20130729/148702_1_1.jpg)
3.2协议转换及以太网通信程序
我们知道,CAN协议为了提高实时性采用了短帧结构,而以太网帧相对要长得多;CAN协议采用载波侦听多路存取/消息优越仲裁(CSMA/AMP)机制解决冲突,而以太网帧采用CSMA/CD机制。这两点构成了 CAN与以太网之间的主要差异,也使得CAN-Ethernet网关的转换协议复杂度提高,但由于本系统中采用了 Server/Client的通信服务模式,网关即作为服务端,相对于文献[4]省去了网关与服务器通信这一过程,所以转换协议也相对较简单。
在本系统中,由于网关实现的是 CAN总线报文和 UDP报文的数据转发,任务相对简单,因此传输层协议选择较为简洁的 UDP协议,建立无连接的服务端。服务端首先确立端口号,通过调用 Socket建立套接字,然后使用 bind绑定本地地址,通过调用 sendto()和 recvfrom()就可以向以太网发送和接收数据。 定义 Socket地址常用的是 sockaddr_in结构,该结构如下所示: struct sockaddr_in {
在本系统中,Socket地址定义为gatewayAddr,端口号设置为8888。不同的计算机存放多字节值的顺序不同,有的计算机在起始地址存放低字节,有的则起始存放高字节,为了程序的可移植性,需要将主机字节顺序转换成网络字节顺序。调用htons()将端口号 8888转换成网络字节顺序,然后赋值给 gatewayAddr.sin_port。gatewayAddr.sin_addr. s_addr定义了主机的 IP地址,在本系统中并不关心主机的 IP地址,故将主机的 IP设置为INADDR_ANY,即可以侦听局域网内的任一主机的报文。
协议转换与以太网通信程序流程如图 3所示。
![](http://m.amcfsurvey.com/uphotos/fetch/20130729/148702_1_2.jpg)
if有udp报文到达{ recvfrom(gatewayfd,rcvbuf1,sizeof(rcvbuf1),0,(structsockaddr *)cliaddr, clilen);//接收以太网报文
将rcvbuf1内数据放入消息队列msg1.buffer;}
else if 消息队列 0有 CAN报文 //通过判断 CAN报文标志位来实现
{ msgrcv(msgid,msg0,sizeof(struct msgtype0),1,0);//接受消息队列 0中数据
置位 CAN报文标志位;
将消息队列值读入rcvbuf0;
sendto(gatewayfd,rcvbuf0,sizeof(struct rcvbuf0),(struct sockaddr *)cliaddr,clilen); }//将 UDP报文发送到以太网
else return;
4应用
该网关应用于基于 CAN总线的监测监控系统和测控设备接入以太网的场合,已经在江苏徐州大屯煤电公司姚桥煤矿得到了应用,目前设备运行良好。应用本网关可以解决现场总线设备接入以太网的问题,真正实现了大范围的数据采集和管理,满足了煤矿企业的现代化管理要求。CAN-Ethernet网关在井下监测监控系统中的位置如图 4所示。
![](http://m.amcfsurvey.com/uphotos/fetch/20130729/148702_1_3.jpg)
5结束语
本文的创新点:本文设计的 CAN-Ethernet网关,采用ARM 处理器,软件上采用消息队列机制实现不同进程间通信,实现了基于CAN总线的煤矿井下监控系统与矿井综合业务数字网的互联,为煤矿企业信息化建设奠定了基础。本设计实现的 CAN-Ethernet通信程序,无须另外添加转换接口设备,在原有硬件基础上仅通过软件修改即可实现 CAN与以太网的互联。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)linux相关文章:linux教程
评论