0 引言
CAN总线是一种设备互连的总线型控制网络,与其它的现场总线相比,CAN 总线的数据通信具有突出的可靠性、实时性和灵活性。这些特点使得其能同时满足过程控制和制造业自动化的需求,因此被认为是最具有发展前途的现场总线之一。但是,由于其收发器驱动能力的限制,约束了CAN 总线的最远直接传输距离和总线上可以挂接的最大节点数,给系统组网带来了一定的困难。而另一方面,由于以太网的低成本、开放性、应用软硬件的支持以及强大的组网能力,目前已经是应用最广泛的局域网络技术,越来越多的工程师们开始采用CAN 总线与以太网结合的技术。针对这样一种情况,本文提出一种CAN 总线和以太网互连系统的设计方案,实现CAN 总线网和以太网的数据互连。
1 系统结构
用网关连接CAN 现场总线和以太网的网络架构图如图1 所示。
图1 系统网络结构示意图
网关的嵌入不仅使管理深入到控制现场,同时给系统组网带来了很大的方便。
1.1 网关嵌入的益处
① 增大了系统的最大CAN节点数
在不接中继器的条件下,一个CAN 子网内最多可以挂接110 个节点,而每个网关下可以连接一个子网,通过多个网关可以把多个子网联系在一起,从而增加了系统的节点数。
② 扩大了系统的组网范围
CAN 的直接通信距离大概只有10km 左右,系统按照现场区域和节点数构建子网,子网与子网通过以太网连接,从而突破了区域和距离的限制。
③ 实现了具有不同传输速度的现场总线子网的相互通信网关提供一个友好的人机接口,用户可以根据需要设置IP 地址和CAN 控制器的波特率。
1.2 网关嵌入的问题
网关的应用给系统带来方便的同时,也付出了一定的代价,在设计中必须考虑这些问题,以提高系统的整体效率。这些问题表现在:
①实时性
由于使用网关,对数据的处理必须经历先存储,再转换,最后再发送的过程,增加了一些存储转发延时。因此在设计中必须考虑系统的实时性,要求系统能在存储新接收到的数据后立即启动协议转换和数据转发任务,尽量减小系统延时。
② 安全性
若网关出现故障,会对CAN 子网和以太网间的通信产生影响,甚至会瘫痪这个子网与整个系统的通信。因此在硬件设计中,要尽量避免干扰等问题的出现;软件设计必须能对一些可纠正错误及时作出反应,并把错误信息返回给用户。
2 网关硬件设计
网关硬件设计分为CAN 接口、以太网网络接口和人机接口等3 个部分。
2.1 主控制器的选择
主控制器采用Philips 的ARM 控制器LPC2292。LPC2292基于一个支持实时仿真和跟踪TM 的16/32 位ARM7TDMI-SCPU。CPU 内核工作电压为1.8V,引脚工作电压为3.3V。
LPC2292 带有256 k 字节(kB)嵌入的高速Flash 存储器,完全可以满足系统代码的容量要求,无需外扩存储器;独特的加速结构使32 位代码能够在最大时钟速率下运行,可实现TCP/IP 协议栈中的ARP、TCP、UDP、ICMP 等网络协议。
LPC2292 内部集成两个CAN 控制器,方便系统采用冗余设计。CAN控制器主要特性有:单个总线上的数据传输速率高达1Mb/s;32 位寄存器和RAM 访问;兼容CAN2.0B,ISO11898-1规范;全局验收滤波器可以识别所有的11 位和29 位Rx 标识符;验收滤波器为选择的标准标识符提供了FullCAN-style 自动接收。
CPU 外部静态存储器控制器为CPU 内部系统总线和外部存储器或外部I/O 器件提供了一个接口。利用这种外部总线可以方便与以太网网卡控制器进行连接。
2.2 CAN 接口
考虑系统的安全性,CAN 接口部分采用冗余设计。当正常通道发生故障时自动调用冗余通道进行传输;如果冗余通道也发生故障,则进入故障处理。其硬件接口示意图如图2 所示。LPC2292 两路通道分别通过高速总线驱动器TJA1050 与总线相连。总线驱动器采用带隔离的DC/DC 单独供电,不仅实现了两路通道之间的电气隔离,也实现了网关与总线之间的电气隔离。
2.3 网络接口
网卡控制器采用台湾RETACK 公司的10M 以太网控制芯片RTL8019 ,支持全双工工作模式,软件兼容8 位或16 位的NE2000 模式;内部集成DMA 控制器、ISA 总线控制器以及16kRAM 、网络PHY 收发器等。RTL8019 使用LPC2292 外部存储控制的BANK3 部分,它的数据地址范围为0x83400000~0x8340001F 。RTL8019 的工作电压为+5V,而LPC2292 的引脚工作电压为3.3V ,所以还应在连接线上串联470 Ω 的保护电阻。网络采用双绞线传输。
图2 网络硬件结构示意图
2.4 人机接口
除了上面的主要部分外,还有LED 数码管显示和键盘部分,LED 用来显示工作状态,键盘根据具体实际情况修正总线波特率和网关的IP 地址。
3 软件设计
3.1 引入RTOS
网关设计对系统的实时性要求比较高,而采用传统的前后台设计方法又会显得过于复杂,实时性得不到保证。解决这个问题的最好方法就是采用实时操作系统RTOS 。目前世界上已有一大批成熟的嵌入式操作系统,其中μC/OS-II 操作系统是一种源代码公开的嵌入式操作系统,具有代码短小精悍、简单易学的特点,针对网关的设计,这是一个理想的选择。
μC/OS-II 完全是占先式的实时内核,是基于优先级的,即总是让就绪态中优先级最高的任务先运行,因此实时性比非占先的内核要好。它的绝大部分代码是用C 语言编写的,可移植性强。
图3 嵌入式计算机系统
3.2 系统构成
嵌入式网关的功能主要是进行以太网数据报文和CAN 数据帧之间的协议转换,实现以太网和CAN 总线的互连;其次是根据应用环境,通过人机交互接口改变网关的IP 地址和CAN 总线的波特率。整个嵌入式系统的构成如图3 所示。在进行任务设计之前的前期工作有:
① 实时操作系统的移植。μC/OS-II 可以在绝大多数8 位、16 位、32 位、以至64 位微处理器、微控制器、数字信号处理器(DSP)上运行。μC/OS-II 在LPC2292 上的移植可参考文献[1]。
② TCP/IP 协议和CAN 协议的嵌入。由于μC/OS-II 操作系统只包含了实时内核、任务管理、时间管理、任务间的通信同步(信号量、邮箱、消息队列)和内存管理等功能,所以用户必须根据自己的需要添加一些功能模块。网关的设计将TCP/IP 和CAN 协议嵌入到操作系统中,并提供一些API 接口函数供用户调用。
3.3 系统实现
采用RTOS 使整个设计简单且易调试,各个任务相互独立,而且各个任务具有不同的优先级可以保证紧急任务及时响应,从而能有效地对任务进行调度。系统软件设计由操作系统和一系列用户应用程序构成。 主函数是程序首先执行的一个函数。该函数永远不返回,主要实现系统的硬件(包括中断、键盘、显示等)和操作系统(包括任务控制块、事件控制块)的初始化,而且在启动多任务调度之前,必须至少创建一个任务。在本系统中创建了一个启动任务,主要负责时钟的初始化和启动、中断的启动、CAN 控制器的初始化与启动、端口与IP 地址的初始化和RTL8019 的初始化与启动,并且对各个应用任务进行了划分。在交出CPU 的使用权之后自做一些空闲处理。
3.3.1 任务的划分
要完成多任务系统的各种功能必须对任务进行划分。本程序根据各个任务的重要性和实时性,把整个模块分成7 个具有不同优先级的应用任务:系统监控、CAN 数据发送、键盘扫描、以太网数据发送、协议转换、LED显示、系统配置等。表1 所示为任务划分表。
表1 任物划分表
除了7 个主要应用任务之外,还有两个中断服务子程序:一个时钟节拍中断,提供周期性信号源;另一个接收中断,把接收到的数据写入缓冲区。
3.1.2 任务的具体实现任务划分后,各任务具有独立的堆栈空间,彼此争夺CPU 的使用权。一旦获得CPU 的使用权,就会独立运行而完成特定的功能。
CAN 总线通信模块包括数据传输和总线管理两个部分。数据传输实现的功能有CAN 初始化、CAN 报文发送和CAN 报文接收。CAN 初始化及报文的接收在启动任务与中断服务程序中实现,CAN 报文发送和总线管理作为一个单独的任务独立运行。总线管理功能块实现的主要是总线检测,判断一路总线是否良好。如果不是,就进入另一路总线检测;如果冗余总线良好,就采用冗余总线通信。CAN 数据发送任务需要系统调度器通知是否有待发送数据进入发送队列,任务的实现如图4 所示。
图4 数据发送任务实现图
以太网通信模块由以太网数据收发功能块和数据协议管理功能块构成。数据的收发功能块主要实现RTL8019 的初始化、数据报文的发送与接收。同理,RTL8019 的初始化在系统的启动任务中实现。数据的接收在RTL8019 的中断服务程序中实现。数据协议管理主要实现对接收数据报文的解析,以及给待发送数据添加协议报头。以太网数据发送与协议管理分别作为独立任务运行。
以太网数据发送任务同样需要系统调度器通知发送队列中是否有待发送的数据。若没有数据发送,则将 该任务挂起,系统运行其他任务。以太网数据发送任务通过对RTL8019 的操作完成,根据RTL8019 的状态,将发送队列中数据通过DMA 传送到8019 的发送缓冲区启动发送,并根据发送结果,对发送队列指针进行调整。
以太网协议管理即协议转换任务在用户数据与8019 驱动需要的数据报文之间进行协议转换。TCP/IP 协议为应用层、传输层、网络层和数据链路层等4 层模型,每层具有不同的功能,并对应相应的子协议,而且层与层之间在逻辑上是相互独立的。在编程时,可以直接调用嵌入的TCP/IP 协议的API 函数对数据报文进行分层。该任务对从8019 传过来的数据处理示意图如图5 所示。不同的子协议具有不同的功能号,任务根据功能号对协议进行区别。把用户数据传递给8019 驱动的示意图是图5 的逆序表示。
图5 协议转换任务的数据处理的示意图
3.3.3 任务间的同步与调度
通常多任务操作系统的任务不同于一般的函数,它是一个无限循环,而且没有返回值。如果没有更高优先级的任务进入就绪态,当前任务是不会放弃对CPU 的使用权的。为了实现操作系统的正常运行和有关事件的同步,必须正确处理任务间的通信和事件标志的设置。整个系统的功能结构如图6 所示。
图6 系统运行示意图
各个任务具有不同的优先级,通过调用系统挂起函数或延时函数可以启动具有更高优先级的进入就绪态的任务。高优先级的任务,例如1、2、3、4 号任务,往往由于申请某个资源而发生阻塞,进入挂起态。系统调度器启动低优先级的任务,通过对延时参数的设置,每隔一定时钟节拍就启动键盘扫描或LED 显示任务。如果其中有任何一事件发生就启动相关的任务,这个过程通过信号量的通信机制来实现。对每一个事件分配一个信号量,一旦事件发生就启动信号量的等待任务列表中进入就绪态的任务,从而保证任务与事件的同步。
4 结束语
在嵌入式硬件平台的基础上,用μC/OS-II 实时操作系统开发应用程序有其独到之处,用户可以直接利用系统的接口函数编写自己的应用程序,毋需另行开发,大大方便了用户编程,缩短了软件的开发周期,提高了开发效率;基于ARM LPC2292 CAN 总线和以太网间的网关,在实验调试过程中运行状况良好,工作稳定。
参考文献
周立功等.ARM微控制器基础与实战.北京航空航天大学出版社,2003.11
Jean.Labrosses 著,邵贝贝等译.嵌入式实时操作系统μC/OS-II.北京航天航空大学出版社,2003
饶运涛等.现场总线CAN 原理与应用技术.北京航空航天大学出版社,2003.6
莫传孟.基于嵌入式系统μC/OS-II 的双CAN 通信构件.微计算机信息,2004,20(3)
Jean J.Labrosses 著,袁勤勇等译.嵌入式系统构件.机械工业出版社,2002
村三公保著.TCP/IP网络试验程序篇.科学出版社,2003.4.