技术频道

DeviceNet总线应用层协议的实现

1 DeviceNet简介
  DeviceNet(设备网)是20世纪90年代中期发展起来的一种基于CAN技术的开放型,低成本、高性能的通信网络,目前已成为底层现场总线标准之一。在DeviceNet现场总线体系中属于设备级的总线协议,在协议的分层结构中,它只包括ISO开放系统七层模型结构中三层,即物理层、数据链路层和应用层。
  DeviceNet是基于CAN总线实现的现场总线协议,因此它的许多特性完全沿袭于CAN,是一种无冲突的载波侦听总线协议。这样的协议在载波侦听方面与以太网是一样的,它的特别之处是:当总线上的多个节点在侦听到总线空闲时,同时向总线发送数据。
  在CAN总线中,被传送的每一帧数据的优先级是由位于帧头的标识来决定,因此它们首先发送的是各自的标识数据。此时,只要有一个节点发送了位数据“0”,那么总线上的所有节点监听到的总线状态就是“0”;相反,只有当同时发送数据的节点所发送的位数据为“1”时,总线的状态才为“1”。因此,当某个节点侦听到网络空闲,开始发送标识数据以后,如果此节点在发送标识数据段的过程中,侦听到的总线状态与它自身所发送的数据位不一致,则此节点会认为有其他节点也在发送数据,总线处于竞争状态,而且其他节点的发送数据具有更高的优先级,最终此节点停止发送数据,节点返回至总线监听状态。
  在目前的CAN2.0版本中,标识数据可以是11位或29位,DeviceNet只支持11位的标识,能够产生2032种不同的标识。在总线中,为了保证在并发情况下数据传输的一致性,不同的节点所发送数据的标识是不同的,这样才不会发生同时有多个节点传输各自的整个数据帧而产生冲突的情况。 DeviceNet协议制定规范来确定每个DeviceNet节点数据帧标识的分配,其中对于应用极为普遍的M/S网络,DeviceNet协议制定了一套预先定义好的CAN数据帧的标识分配方案。
2 DeviceNet应用层协议
  DeviceNet的应用层协议是用面向对象的方法来进行描述。它对协议本身所应完成功能进行了抽象和定义,把协议功能划分为多个模块,每个模块抽象出它所具有的属性、完成的任务和与其他模块的接口,然后把这个模块对象化。DeviceNet应用层协议的对象模型如图1所示:整个协议的结构是由对象为基本组成单元;对象之间通过数据交换相互联系。图中用对象之间的连线来表示这些联系,下面对这些对象的功能作简要介绍。非连接通讯对象是用于处理以本设备为目的地址的非连接数据包,它是这个设备与外部设备建立连接通讯的起始点。连接通讯对象的功能与非连接通讯对象的功能相对应,是完成对连接数据包的处理。路由对象对从上述2个通讯对象传来的数据包,根据数据包所指示的目的对象地址或此数据包所完成的功能,把收到的数据分发到相应的对象。数据汇集对象把本设备所需传输的数据集合在一起,组成本设备预先定义的数据格式以便传输;而对于收到的数据,按照一定的格式,抽取相应的数据发送给指定的对象。参数对象、设备身份对象和DeviceNet对象是对设备中的诸多参数的归类、封装,完成的功能比较简单。应用对象是针对具体设备完成复杂功能的对象,例如在DeviceNet的协议规范中,除了定义了基本的模拟量和数字量应用对象外,对于软启动器有软启动应用对象,对于位置控制器有位置控制器应用对象等,而且像这样定义的特定应用设备的对象还会随着DeviceNet设备的发展而不断增多。
3 DeviceNet应用层协议实现
  在实际的DeviceNet产品应用中,目前都是M/S结构的协议实现,而且应用中最为普遍的是运用对CAN的标识进行预先定义分配的方式来实现DeviceNet网络。以下介绍DeviceNet协议的实现。Redstation是DeviceNet的从设备,是一种智能开关设备,功能较为简单,整个设备的应用层对象由4个数字量输入和2个数字量输出组成,通过预定义CAN标识来完成数据帧的传送。
3.1 硬件部分
  此设备的硬件部分主要由MCS51单片机8031,CAN控制器SJA1000,8 kb动态存储器6264,64kb EPROM27512,CAN总线驱动器82c51以及相应的外围电路组成,其原理图如图2所示。实际电路中还必须有相应的锁存器、电源保护电路、看门狗电路和设置节点地址及波特率的拨码开关等电路单元。
3.2 应用层协议部分
  DeviceNet协议中,应用层协议的实现是通过编制程序来完成。此设备是基于单片机系统的,在实现过程中采用单片机的C语言。
  DeviceNet应用层协议是通过面向对象的方式加以描述的,其中对于协议中的各个对象都详细定义了它们的属性、数据类型等基本信息;而且通过事件触发方式来具体定义了各个对象的行为:因此在实现过程中,完全可以按照面向对象的编程方法来编制协议原代码。
  在面向对象编程中,除了定义对象的属性及行为以外,还要构造事件驱动的机制。这里指的事件驱动的机制包括事件的产生,事件队列的实现,事件处理优先级的规定,以及事件的处理等。在一般的面向对象的高级编程中,主要是完成事件的处理,其它的与事件相关的事情都是由操作系统来完成,对编程者来说是透明的,而在此相关事情则必须编程实现。面向对象的程序实现框架使各个对象之间的联系体现的十分明确,对象之间的关联都是与事件的触发紧密相关,整个程序结构非常清晰。
  协议实现的软件主体结构,整个软件的编制工作都是围绕着“事件”而展开的。“事件”是由外部中断或程序内部产生,在实际程序中用事件变量来实现事件队列,它是一个无符号的整型变量,每个特定位代表某个具体的事件。
  在程序的开始是对DeviceNet协议中的对象的定义,C51编译器不支持“类”,因此用“结构”类型来定义对象。在完成对CAN控制器和单片机芯片的初始化工作以后,主程序进入事件处理的无限循环。为了能够及时响应高优先级事件,在每完成一次事件的处理以后,都要执“e=global_event”语句,刷新事件中间变量e。事件的优先级在定义事件的时候就已经确定了,低数据位事件具有高的优先级,如第一个数据位表示IO轮讯请求事件,它就具有最高的优先级,其他事件的优先级随着在global_event中所被代表的数据位的上升而降低。高优先级的事件的响应较低优先级的事件为先,程序中“(e&IO_POLL_REQUEST)&&!(e&(IO_POLL_REQUEST-1))”语句是判定待执行的事件是否是事件队列中具有最高优先级的事件。在进入事件处理程序部分以后,首先清除事件队列中的此事件,以表明此事件已得到响应,然后再进行相应的程序执行。
4 结束语
  DeviceNet的面向对象的协议描述能够清晰地阐明协议各模块之间的数据处理关系,此特点在实现中充分地体现出来;而且对象化的程序实现使得程序代码可以很方便的重复使用,在开发不同的设备时,原先的设备原代码大部分可以得到再利用,这样可以缩短产品开发的时间,同时也利于在实际应用中的推广。

文章版权归西部工控xbgk所有,未经许可不得转载。