嵌入式CANopen协议

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

1 引言

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

CANopen 实作了OSI模型中的网络层以上(包括网络层)的协定。CANopen 标准包括寻址方案、数个小的通讯子协定及由设备子协定所定义的应用层。 CANopen 支援网络管理、设备监控及节点间的通讯,其中包括一个简易的传输层,可处理资料的分段传送及其组合。一般而言资料链结层及实体层会用CAN来实作。除了 CANopen 外,也有其他的通讯协定(如EtherCAT)实作 CANopen 的设备子协定。基本的 CANopen 设备及通讯子协定定义在 CAN in Automation(CiA) draft standard301. 中。针对个别设备的子协定以 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对对象字典进行读写操作。

相关文档
最新文档