1引言
现场总线 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所示。
图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所示。