一种嵌入式CANopen协议栈开发模块的实现

时间:2011-07-18

 

  1 引言

  CANopen是一种架构在控制局域网路(Control Area Network, CAN)上的高层通讯协定,包括通讯子协定及设备子协定常在嵌入式系统中使用,也是工业控制常用到的一种现场总线。

  CANopen 实作了OSI模型中的网络层以上(包括网络层)的协定。CANopen 标准包括寻址方案、数个小的通讯子协定及由设备子协定所定义的应用层。 CANopen 支援网络管理、设备监控及节点间的通讯,其中包括一个简易的传输层,可处理资料的分段传送及其组合。一般而言资料链结层及实体层会用CAN来实作。除了 CANopen 外,也有其他的通讯协定(如EtherCAT)实作 CANopen 的设备子协定。基本的 CANopen 设备及通讯子协定定义在 CAN in Automation (CiA) draft standard 301. 中。针对个别设备的子协定以 CiA 301 为基础再进行扩充。如针对 I/O 模组的 CiA401 及针对运动控制的 CiA402.

  2 TinyARM简介

  TinyARM模块内置了CANopen从站协议,为用户灵活快速设计CANopen从站,构建符合国际标准的工业现场总线及分布式网络提供了更多、更好的选择。TinyARM模块外观如图1所示。


  TinyARM CANopen从站模块提供了网络管理(NMT)、实时数据发送(TPDO)、实时数据接收(RPDO)、服务数据对象、同步报文、紧急事件等支持,同时还能够根据需求支持不同的协议描述规范。使用Tiny-ARM CANopen从站模块可快速开发基于CANopen协议的控制设备、数据采集设备等,配合CANopen系列主站设备组建CANopen网络,迅速搭建工业现场总线分布式监控系统

  3 TinyARM CANopen协议栈配置

  TinyARM是一款可二次开发的嵌入式模块,提供API函数库。CANopen协议栈也是以API函数库形式提供,使开发者在开发CANopen设备的时候使用起来非常方便。由于CANopen协议栈会使用到相应的硬件资源,因此开发者首先需要配置CANopen协议栈硬件资源,例如CANopen RUN和ERROR指示灯所对应的I/O端口等,正确的硬件配置可使协议栈稳定可靠地运行。

  3.1 CANopen协议栈硬件资源配置

  通讯单元 处理和网络上其他模组通讯所需要的通讯协定。 设备的启动及重置由状态机 (state machine)控制。状态机需包括以下的几个状态:Initialization, Pre-operational, Operational 及 Stopped.当接收到网络管理 (NMT) 通讯对象,状态机会转换到对应的状态。 对象字典 (Object Dictionary) 是一个有 16 位元索引 (Index) 的变量阵列。每个变量可以(但非必须)有 8 位元的子索引 (Subindex)。变量可用来调整设备的组态,也可以对应设备量测的资料或设备的输出。 当状态机设定为 operational 之后,设备的应用 (application) 部份就会实现设备预期的机能。此部份可以由对象字典中的变量调整其设定,而资料由通讯层传收或接收。

  (1)指示灯端口配置

  按照CANopen协议DS303-3的定义,CANopen从站需要使用两种颜色的LED指示灯来指示运行和错误状态,运行指示灯使用绿色,错误指示灯使用红色,根据实际硬件来设置LED控制端口。协议栈通过调用如表1所示的3个函数来实现,配置文件与协议栈结构如图2所示。


  (2)参数存储函数

  参数存储相对来说更复杂一些,需要根据实际硬件条件来修改相应的实现函数,其中的_TgtCavInit、_TgtCavOpen、_TgtCavClose、_TgtCavDelete、_TgtCavCreate、_TgtCavShutDown等函数执行对存储器进行初始化或关闭存储器等操作,在协议栈初始化或关闭时被调用。函数_TgtCavStore、_TgtCavRestore主要负责参数的存储与读取,CANopen协议栈的参数存储以对象字典为单位,每存储或恢复对象字典的参数都会调用存储或恢复参数函数,存储、恢复函数与协议栈的关系如图2所示。

  3.2 设计对象字典

  设计CANopen的对象字典主要分为以下两个步骤,其与协议栈结构关系如图2所示。

  (1)生成对象字典

  对象字典是CANopen的,不同的设备描述规范或不同的应用就有不同的对象字典,因此对于一款能支持二次开发的模块来说,根据具体需求生成相应的对象字典也是必不可少。TinyARM 中的CANopen对象字典可以通过ODBuilder软件来生成,生成的对象字典为3个标准C文件,文件名分别为:obdcfg.h,、objdict.c、objdict.h,把工程中的同名文件覆盖即可将CANopen的对象字典项目更改为新设定的对象字典项目,CANopen所支持的设备规范也可随之改变。

  (2)对象字典的变量定义

  对于对象字典索引在0x1000~0x1FFF范围内的对象字典,其变量存储地址已经在协议栈中预定义,不需要开发者再次定义。索引在0x2000~0x9FFF之间的索引,需要重新映射变量地址,否则对象字典无法正确存储数据。在TinyARM CANopen中,为了使开发者方便映射对象字典变量,在文件名为usrcoppardef.c的文件中定义了一个参数数组__VarTabg,将需要定义的对象字典变量地址添加到该表格中即可,其格式与使用示例如图3所示。


  3.3 预定义连接设置

  在CANopen运行时通常采用DS301所建议的预定义连接COB-ID(通信对象标识),其中预定义连接集包括PDO、SDO、NMT、SYNC以及EMCY等服务。协议栈在启动时已经将(除RPDO和TPDO以外)一些服务的COB-ID设定为预定义连接,开发者只需要重新设定RPDO和TPDO的预定义连接即可。同样开发者只需要在PDO预定义表格中添加项目即可,实现示例如图4所示。


  4 TinyARM CANopen API函数编程

  如图5所示为CANopen协议栈工作流程图,其中CopInit为初始化CANopen协议栈,CopBootUp发送CANopen启动信息并且进入预操作状态,CopThread 为CANopen协议栈线程函数,需要应用程序循环调用。开发者可以通过CopODRead和CopODWrite对对象字典进行读写操作。


      实现实例:图6展示了如何启动CANopen协议栈并使之处于运行状态。


  开发者利用TinyARM CANopen可完全自主进行二次开发,方便地实现各种标准CANopen从站设备。例如,数字量输入输出设备、电机控制设备、数字传感器设备、织布机设备、充电设备等各种设备。使开发者在短的时间内开发出CANopen从站设备,抢占市场先机。

 


  
上一篇:一种有源电力滤波器控制系统的硬件实现
下一篇:多功能可视对讲门禁系统的设计与应用

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料