1引言
现场总线的多样性,为总线设备用户提供了更多产品选择的同时,也为总线用户带了总线设备间兼容性问题。工厂在扩建,改建等过程中很可能会选用与原先现场设备总线标准不同的产品,这些设备由于使用不同的现场总线,彼此间不能实现数据共享,于是就降低了设备间功能互补的优点。因此针对多种总线共存的客观事实,探讨如何解决不同现场总线系统的互联有着重要的现实意义。本文主要研究profibus-dp与can两种总线的协议转换的原理,并设计出了一种网关实现了这两种总线的互联。
2方案设计
对于两个异构的现场总线,其数据链路层和应用层协议是截然不同的,要实现它们的互联,需要采用网关进行协议转换。协议转换在网关内是按分层逐次进行的。网关将现场总线设备1发送来的数据在不同的协议层次进行解包,最终得到报文中的用户数据。然后再按照现场总线协议2逐层打包,然后发送到现场总线2中的设备。
网关(gateway)是用于实现数据链路层以上层的网络互联设备,它相当于一个协议转换器,可以是双向的,也可以是单向的,用来连接不同协议的网络。它不像网桥一样要求数据链路层和应用层的协议完全一致。
通常见到的现场总线网关是单cpu结构的,在这种结构里,cpu要完成两种总线信息的传输与控制,同时还要完成两种总线协议的转换工作,该方案cpu负担较重,控制复杂,软件采用多重嵌套。这里提出了一种基于双cpu结构的网关设计方法,系统中的两个cpu对两种总线协议的数据各自进行处理与控制,并将需要传递的信息放在双口ram内,实现信息共享与传递,这种方案容易控制,软件简单,同时减轻了cpu的负担,增强了可靠性。
3系统的硬件设计
系统的硬件根据功能可分为三大部分,一是can总线接口电路,完成can总线的数据收发与控制;二是profibus-dp总线接口电路,完成profibus总线数据的收发与控制;三是双口ram接口电路,用来完成两种总线数据的交换。
3.1can总线接口硬件结构
can总线接口的整体硬件结构如图1。电路主要由四部分所构成,微控制器89c52(1),独立can通信控制器sja1000,can总线收发器82c250和高速光电耦合器6n137。
89c52(1)负责sja1000的初始化,通过控制sja1000实现数据的接收和发送等通信任务,同时还负责与profibus总线接口侧的的数据交换,选择89c52(1)作为cpu的主要是因为它不仅与can控制芯片sja1000兼容,而且内部集成8kflashram,可以满足系统的存储要求,不需要再外扩程序存储器。
sja1000为can总线控制器。它是一种独立can控制器,是philips公司的ca82c200can控制器的替代产品,它在软件和引脚上都保持了与pca82c200的兼容。它具有basiccan和pelican两种工作方式,其中basiccan是与pca82c200兼容的方式;pelican是扩展特性方式,支持具有很多新特性的can2.0b协议。sja1000的主要新功能有:标准结构和扩展结构报文的接收和发送;64字节的接收fifo;标准和扩展帧格式都具有单/双接收滤波器含接收屏蔽和接收码寄存器;可进行读/写访问的错误计数器;可编程的错误报警限制;最近一次的错误代码寄存器;每一个can总线错误都可以产生错误中断;具有丢失仲裁定位功能的丢失仲裁中断;单发方式当发生错误或丢失仲裁时不重发;只听方式监听can总线无应答无错误标志;支持热插拔无干扰软件驱动位速率检测;硬件禁止clkout输出。
sja1000的ad0-ad7连接到89c52(1)的p0口,cs连接到89c52(1)的p2.7,p2.7为0的cpu片外存贮器地址可选中sja1000,cpu通过这些地址可对sja1000执行相应的读写操作sja1000的rd,wr,ale分别与89c52的对应引脚相连。
为了增强can总线节点的抗干扰能力,sja1000的tx0和rx0并不是直接与82c250的txd和rxd相连,而是通过高速光耦6n137后与82c250相连,这样就很好的实现了总线上各can节点间的电气隔离,其中光耦部分电路所采用的两个电源vcc和vdd完全隔离。另外82c250与can总线的接口部分也采用了一定的安全和抗干扰措施。82c250的canh和canl引脚各自通过一个5ω的电阻与can总线相连电阻可起到一定的限流作用,保护82c250免受过流的冲击。canh和canl与地之间并联了2个30p的小电容,可以起到滤除总线上的高频干扰和一定的防电磁辐射的能力,另外在两根can总线接入端与地之间分别反接了一个保护二极管,当can总线有较高的负电压时通过二极管的短路可起到一定的过压保护作用,82c250的rs脚上接有一个斜率电阻。
3.2profibus-dp总线接口电路
profibus-dp总线接口的硬件电路也由四部分所构成,微控制器89c52(2),profibus-dp通信控制器协议芯片spc3,光耦hcpl7101和6n137,rs485总线驱动电路。图2为profibus-dp通信控制器到rs485总线驱动器的硬件电路图。
89c52(2)主要负责控制spc3,实现profibus-dp总线数据的转换与共享。
spc3已集成了profibus-dp物理层的数据收发功能,可独立处理profibusdp协议,另外spc3内部还集成有1.5k的双口ram,作为spc3与用户程序之间的接口,并且at89c52(2)可对spc3内部ram访问。
尽管spc3已经集成了物理层的数据传输功能,但它不具备rs-485的驱动接口,因此添加了rs-485的驱动电路。
另外为了避免总线上的信号对电路的影响,在spc3与rs485总线驱动电路之间采用光电隔离。txd、rxd信号的隔离器件选用hewlettpackard公司的12m高速光耦hcpl710,rts信号的隔离器件选用了6n137。
3.3双口ram的接口电路
两种总线数据的共享与传递是通过双口ram实现的,系统里选用了器件idt7130。它是高速的1k双口静态ram。该器件提供两个独立的端口,分别有独立的控制、地址和i/o引脚,并允许独立的异步读写访问内存的任何地址,自动的电源管理特性由ce控制,允许芯片上的每一个端口电路进入一个非常低的电源模式。idt7130的片内总线仲裁电路具有busy和int两种总线仲裁方式。基于所采用的单片机型号,在系统里采用了中断仲裁方案,这种方式的工作原理是一个内存地址(邮箱或者信息中心)被指派给每个端口。左端口的中断标志被宣称当右端口写到内存地址3feh时,左端口通过访问3fe内存地址清除中断。相似的,当左端口写内存地址3ffh时右端口标志被宣称,为了清除这个中断标志,右端口必须访问内存地址3ffh,系统里3fe和3ff两个单元的内容赋予新的内涵,即定义两个码0ffh和00h。其中0ffh代表发送命令要求对方传送数据,而00h代表发送的是对方所要求的数据。系统里两个cpu与双口ram的连接如图3。双口ram的剩余的存储单元被分为四大部分,其中0000h-00ffh这256个单元用来存储can总线上传来的数据或地址,并且相邻的两个单元用于存储一个can子站的数据信息;0100h-01f9h这250个单元用来存储profibus总线上传来的数据或地址,相邻的两个单元用于存储一个profibus子站的信息,另外03fch单元用于存放can总线设备所要读的profibus站点的id号,03fdh单元用于存放profibus总线设备所要读的can站点的id号。
由图可知双口ram在负责can总线通信的微处理器的映射地址为0x7c00h-0x7fffh,在负责profibus总线通信的微处理器的映射地址为0x2c00h-0x2fffh。
4系统软件设计
网关的软件可分为两大部分,一部分用于负责can总线的数据通信,另一部分用于负责profibus总线的数据通信。
每侧的程序根据功能又可以分为三个子模块:协议芯片初始化程序,接受数据接受子程序,数据发送子程序。其中数据接受子程序考外部中断触发执行。下面以网关的can总线接口侧程序为例,列出程序流程图,profibus侧的接口程序与之相似,就不再赘述。
can总线侧的初始化与发送程序流程如图4:
因为sja1000的初始化只有在复位模式下才可以进行,因此程序首先将sja1000的中断屏蔽,使它进入复位模式,然后对它进行初始化。初始化内容主要包括工作方式的设置、接受滤波方式的设置、接受屏蔽寄存器和接受代码寄存器的设置、波特率参数设置和中断允许寄存器的设置等。sja1000完成初始化设置后,再让它返回到工作状态,进行正常的通信任务。
在接受子程序里,系统以查询的方式接受can子站传送过来的数据,网关通过接受缓冲区数据区的第一个字节的内容判断接受的是真正的数据,还是发给profibus-dp站点的发送数据请求。如果数据区第一个字节是00h,则传送的是数据信息,于是根据id查表求得该站所对应的存储单元,并将数据区的第二、三字节的内容存在该单元内,同时把id放在7ffch中,告诉对方发送数据的站点号;如果该字节内容是ffh,则说明是发送数据请求,数据区第二个字节存放的是被要求发送数据的站点号,将他放入7ffch内即可。
can总线接口发送数据子程序流程图如图5:
上面的发送程序是由双口ram的中断信号触发的,收到中断信号后,首先读取7ffeh单元的内容,将中断信号消除,然后根据该单元的内容,判断双口ram内存放的是数据,还是被要求发送数据的can子站的id号。如果7ffeh内容为00h,则说明所要发送到can子站的为正常的数据,于是将发送缓冲区的第一个字节设置为00h,告诉can子站发送的为数据,然后读取7ffdh单元内容,查表求得数据在双口ram中的地址,并从该地址取两个字节存到sja1000输出缓冲区数据区的第二、三个字节,同时把7ffdh作为发送的id号。如果7ffdh是ffh,则说明profibus-dp发送过来得是被要求发送数据的can子站的站点号,于是只要把它放到sja1000发送缓冲区数据区的第二个字节,并把第一个字节设为ffh,以通知can站点,发送的数据为id号。以上工作完成后,最后通过写命令字发送数据。
5结束语
实践证明,双cpu结构的双向网关可以很好地完成can总线到profibus-dp总线协议转换的任务,并且解决了单cpu结构网关中存在的数据传输速率低,数据传输可靠性差等问题,满足了can总线与profibus-dp总线协议转换的要求。它将can总线设备与profibus总线设备的连接起来,使两种现场总线设备可以高效的通信,最终达到数据共享与功能互补的目的。并且工作人员在使用过程中不必关心两种总线物理层和数据链路层的全部内容,给总线产品的研究开发带来极大方便。另外这种双cpu结构的设计方案对其他现场总线之间的网关设计具有借鉴意义,是一种值得推广的方法。