当前位置:首页 >> 机械/仪表 >>

CANopen通讯协议设计与实现


华 中 科 技 大 学 硕 士 学 位 论 文





近年来,基于 CAN 应用层协议 CANopen 的现场总线网络在工业自动化中得到 了广泛的关注和应用,特别是在分布式运动控制系统中具有良好的应用前景。本文 主要研究、设计、实现基于 DSP TMS320F2812 的 CANopen 通讯协议。 论文首先简单

介绍了 CANopen 协议的应用背景和意义,描述了 CANopen 的网 络模型,分析 CAN 总线网络的结构,构造了相关的主节点和从节点硬件平台。其次 重点分析 CANopen 协议的模型结构及其设计过程,简要介绍了 CANopen 协议的设 备模型、对象字典以及 CANopen 设备的各种状态的基本含义,在此基础上描述了 CANopen 协议的框架结构、软件实现体系结构、设计实现流程,据此确定协议软件 的设计编程思想。CANopen 协议软件包括初始化过程和协议栈设计,论文对硬件和 协议初始化以及协议栈各功能组成模块的设计过程和执行功能进行了详细说明,特 别是对采用具有内嵌 CAN 功能外设部件的 DSP 处理器编程实现 CANopen 协议的方 法进行了详细的描述,包括 DSP 的初始化、中断处理以及接收、发送处理等。最后, 对于编程实现的 CANopen 协议软件在硬件平台上进行了实际验证,按照 CANopen 协议的规定,测试各种通讯对象的基本功能,结果表明协议软件实现了 CANopen 协 议的基本要求。

关键词:现场总线

CANopen 协议

数字信号处理器

主从节点

I

华 中 科 技 大 学 硕 士 学 位 论 文

Abstract
In recent years, the CAN field-bus network based on CANopen protocol has been widely used in the industrial automation especially has showed good prospect in distributed motion control system. The thesis focused on the issue how to research, design and implement CANopen application communication protocols based on DSP TMS320F2812. Firstly, the thesis briefly introduced the practice background and significance of the CANopen protocol, and described the network model of communication. By understanding the requirement of physical layer, the hardware platforms of the master and slave node were setup. Secondly, the communication model structure and implementation procedure were greatly analyzed. The basic concept of device model, object dictionary and all kinds of device state of CANopen protocol were briefly introduced. Based on these, the protocol framework, software architecture, design process were stated in detail and finally the programming idea was established. The software implementing the CANopen protocol included two parts which were system initialization and network protocol stack designing. In thesis, the initialization process of hardware and network protocol, the design procedure and related execution of function modules in stack were stated amply. The emphases was on the realization of CANopen protocol used the DSP processor embedded the CAN peripheral, including DSP peripheral initialization, interrupt management and data frames handling. Lastly, the experiment was done on the related hardware platform to verify the DSP CANopen protocol software. According to the regulation of CANopen protocol, the software module function of various communication objects were tested and the related result were showed to illuminate that the software realize the basic requirement of CANopen protocol.

Key words:

Field-Bus

Canopen Protocol

Digital Signal Processor

Master And Slave Node
II

独创性声明

本人声明所呈交的学位论文是我个人在导师的指导下进行的研究工作及取得的 研究成果。除文中已标明引用的内容外,本论文不包含任何其他人或集体已经发表 或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在文中以明确方 式标明。本人完全意识到本声明的法律结果由本人承担。

学位论文作者签名: 日期: 年 月 日

学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权 保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。 本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检 索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密□,在______年解密后适用本授权数。 本论文属于 不保密□ (请在以上方框内打“√”)

学位论文作者签名: 日期: 年 月 日

指导教师签名: 日期: 年 月 日

华 中 科 技 大 学 硕 士 学 位 论 文

1 绪论
1.1 应用背景和意义
随着计算机网络技术和芯片技术的发展,控制芯片的性能大幅度提高,网络几 乎深入到我们生活的每一个角落,以现场总线为代表的控制网络在工业以及其他控 制系统中受到广泛地应用[1]。而CAN总线就是其中一种在分布式运动控制系统中应 用比较广泛的总线。 1.1.1 CAN 总线的特点

CAN-bus是德国Bosch公司于 1983 年为汽车应用而开发的一种能有效支持分布 式控制实时控制的串行通信网络,属于现场总线(FieldBus) 的范畴[11]。 CAN 结构取 ISO/OSI 模型的第 1、2、7 层,即物理层、数据链路层和应用层, 总线上任意节点可在任意时刻主动向网络上其他节点发送信息而不分主次,因此可 实现各节点之间的自由通信。 由于采用了许多新技术以及独特的设计,与一般的通信总线相比,CAN总线的 数据通信具有突出的可靠性、实时性和灵活性。相对于其他总线,CAN总线有以下 优点[1][2]: 1) CAN 网络上的节点信息分成不同的优先级,可满足不同的实时要求。 2) CAN 采用非破坏总线仲裁技术。当多个节点同时向总线发送信息出现冲突 时,优先级较低的节点主动退出发送,而最高优先级的节点可不受影响地继续传输 数据,从而大大节省了总线冲突仲裁时间。 3) CAN 节点只需通过对报文的标识符滤波即可实现点对点, 一点对多点及全局 广播等几种方式传送接收数据。 4) CAN 的直接通信距离可达 10km(传输速率在 5kbps 以下); 通信速率最高可达 1Mb/s(此时通信距离最长为 40m) 。
1

华 中 科 技 大 学 硕 士 学 位 论 文
5) CAN 上的节点数主要取决于总线驱动电路,目前可达 110 个。报文标识符可 达 2032 种(CAN 2.0A) ,扩展标准(CAN 2.0B) 的报文标识符几乎不受限制。 6) CAN 总线通信格式采用短帧格式,传输时间短,受干扰概率低,保证了数据 出错率极低。每帧字节数最多为 8 个,可满足通常工业领域中控制命令、工作状态 机测试数据的一般要求。 由以上特点可知,CAN总线的可靠性、实时性和灵活性等特点能很好地适应恶 劣的工业现场环境,可以完成对周期性数据和非周期性数据实时性要求都很高的数 据传输任务,其多主方式和仲裁机制也能够方便实现同步控制,在实际运用中CAN 总线已经广泛运用于各种检测和执行机构之间的数据通讯。CAN总线相对于其他总 线的优点决定了其在分布式运动控制系统中也具有一定的适用性,目前在伺服运动 控制尤其是多轴同步运动控制中也得到了一定应用[16]。 1.1.2 CANopen 协议简介

CAN的基本协议只有物理层和数据链路层协议[1],没有规定应用层,本身并不 完整,需要一个高层协议来定义CAN报文中的11/29位标识符和8字节数据的使用[8]。 而且,随着CAN总线的广泛应用,国内外很多公司都开发出使用CAN总线的控制设 备,为了使各种CAN设备可以互相兼容,需要一个开放的、标准化的高层协议来实 现各种CAN设备进行标准的、统一的通讯。 目前应用较多的CAN应用层协议有CANopen和Devicenet协议等,CANopen是一 个基于CAL(CAN应用层) 的子协议,采用面向对象的思想,具有很好的模块化特性 和很高的适应性,通过扩展可以适用于大量的应用领域[2]。在欧洲和美国,CANopen 协 议 已 被 广 泛 应 用 于 各 种 控 制 场 合 , 但 在 我 国 , CAN 的 应 用 层 协 议 主 要 应 用 Devicenet,很少用到CANopen,因此CANopen协议需要在我国进一步推广。 选择 CANopen 为标准实现 CAN 网络的应用层协议,主要是因为 CANopen 与 Devicenet 相比有以下几个优势:

2

华 中 科 技 大 学 硕 士 学 位 论 文
1) Devicenet 网络中最多可接 64 个节点,而 CANopen 最多可接 127 个节点。通 过参数的设置,CANopen 协议可以根据用户的特殊需要最大限度地将系统专用化和 最优化,无须改变硬件设置,就可以获得最优的通讯特性。 2) Devicenet 对物理层的接口设备要求严格,硬件设备必须符合 Devicenet 物理 层协议标准,而 CANopen 对此没有特殊要求,可在 CAN 总线控制系统的硬件基础 上直接构建。 3) Devicenet 协议并不是对所有的人都是公开的,而 CANopen 协议则完全公开, 很容易在各个网站获得。 4) CANopen 协议的子协议——实时伺服驱动和运动控制协议(CiA DSP402)是专 门针对驱动装置和运动控制装置等运动控制系统的协议规范,该协议定义了伺服驱 动器、变频器和步进式电机控制器的功能特性,它还指定了多种操作模式和相应的 组态参数,按照该协议进行编程设计可以构建在运动控制器或者伺服驱动器内的标 准通讯接口。 从上述情况可以看出,CANopen 协议的特点尤其是 DSP402 子协议的针对性决 定了其适用于分布式运动控制系统。CANopen 协议目前还没有开放的协议源代码, 用户使用该协议时可以选择购买或者根据自己的需求进行编程实现。 鉴于 CAN 总线和 CANopen 协议的优点以及在运动控制系统中的适用性,结合 CANopen 协议在我国的发展现状,本文选择 CANopen 协议作为研究的对象,根据 CANopen 协议进行 CAN 总线应用层的软件开发,设计结构灵活,适用于扩展的 CANopen 通讯协议,这对于实现分布式运动控制的应用具有一定意义。 CAN 现场总线只定义了 OSI 网络模型的第一层 ( 物理层 ) 和第二层 ( 数据链路 层) , 而这两层一般已被CAN硬件完全实现了[1], 所以进行CAN节点的开发主要是对 应用层(CANopen协议) 的实现,如图 1-1。

3

华 中 科 技 大 学 硕 士 学 位 论 文

图 1-1

CAN 和 CANopen 标准的 OSI 网络模型

本文就是要对 CANopen 通讯协议(DS301) 用 C 语言进行软件实现, 并在简单的 CAN 网络上检验协议实现的效果。通过实现基本网络管理通讯协议主服务于 DS402 协议,所以在设计过程中会根据 DS402 协议的要求进行一些有选择的实现。

1.2 论文的主要研究内容
论文主要的工作体现在 3 个部分: 1) 进行 CANopen 协议的编程,通过软件实现协议中规定的功能。 2) 对硬件进行调试,保证简单的 CAN 网络可以正常通讯。 3) 将协议软件和 CAN 控制器结合起来,使得协议软件可以在 CAN 网络中正确 实现功能。 论文的主要内容分为四章,各章介绍内容如下: 第一章:简要介绍课题的背景和意义,指出课题的主要研究任务。 第二章:介绍 CANopen 通讯协议的构架和实现流程,重点介绍 CANopen 协议 的初始化和协议栈的软件设计。
4

华 中 科 技 大 学 硕 士 学 位 论 文
第三章:介绍论文使用的硬件电路,阐述对硬件电路进行调试的步骤以及总结 调试过程中遇到的问题和解决方法。重点介绍中断程序以及接收发送程序的软件编 程,详细描述协议程序和今后所使用的实际设备间的接口。 第四章:验证协议软件实现的功能,对全文进行总结。

5

华 中 科 技 大 学 硕 士 学 位 论 文

2

CANopen 通讯协议分析

本文的主要是使用 C 语言实现 CANopen 通讯子协议,即 DS301 协议。对于不 同的 CAN 控制器,软硬件接口设计的细节不同,但对于各种硬件,协议的通讯对象 及其进行的动作是相同的。所以在本文将各种 CAN 控制器都可以直接调用的 CANopen 通讯程序进行了单独实现,以便使用其它 CAN 控制器时也可以直接调用。

2.1
2.1.1

CANopen 通讯协议简介
CANopen 设备模型

要理解CANopen规范,核心是要理解CANopen的设备模型和各类型的通讯对象
[2]

。一个CANopen设备由 3 部分构成,分别是通讯部分、对象字典和应用部分,此设

备一端接到CAN总线,另一端接到应用相关的I/O数据端口,如图 2-1 所示[1]。
I/O 应用 一般 I/O 电机控制 传感器 . . . 对象字典 索引 说明 1000H 设备类型 . . . . . .

通讯部分 PDO SDO NMT 对象 特殊功能对象

CAN 总线

图 2-1

CANopen 设备模型

6

华 中 科 技 大 学 硕 士 学 位 论 文
通讯部分根据CANopen协议的要求在总线上收发CAN报文,不同的CANopen设 备间的通信都是通过交换通信对象完成的[2]。 应用部分由用户根据实际的应用要求编 写具体的应用软件。应用部分和CAN接口部分之间是对象字典,这是一个CANopen 设备的核心部分,每个设备都有一个自己的对象字典,其中描述了设备使用的各种 数据对象和参数。 2.1.2 CANopen 通信模型

通信模型包括CANopen网络上的消息帧以及内容和功能[1]。CANopen总共定义 了 4 种通讯对象类型(报文) 。 1) 过程数据对象 PDO(Process Data Object) :用来传输实时数据(1-8 字节) 。 2) 服务数据对象 SDO(Service Data Object) : 主要用来对设备的对象字典进行访 问。 3) 网络管理对象 NMT(Network Management Object) :主要包括 NMT 对象(主 节点用来传输控制命令) 和心跳报文(从节点向主节点发送本节点状态) 。 4) 预定义报文或者特殊功能对象:包括同步对象(SYNC Object) 、紧急事件对 象(Emergency Object) 和时间标记对象(Time Stamp Object) 。 2.1.3 对象字典 CANopen协议中最重要的部分就是对象字典(Object Dictionary, OD) , 对象字典 是一组有序的对象, 每个对象通过 16 位的索引来寻址。 对于数组和结构类型的对象, 可以使用 8 位的子索引来访问其内部成员[1],对象字典的索引分配如表 2-1。

7

华 中 科 技 大 学 硕 士 学 位 论 文
表 2-1 索引 0000 0001~001F 0020~003F 0040~005F 0060~007F 0080~009F 00A0~0FFF 1000~1FFF 2000~5FFF 6000~9FFF A000~BFFF C000~FFFF CANopen 对象字典

对象 保留 静态数据类型(标准数据类型,如 Boolean,Integer 16) 复杂数据类型(预定义的结构,由标准数据类型组合而成,如 PDOCommPar, SDOParameter) 制造商定义的复杂数据类型 设备规范定义的静态数据类型 设备规范定义的复杂数据类型 保留 通讯规范区域(如设备类型,错误寄存器,支持的 PDO 数目等) 设备制造商相关区域 标准化的设备规范区域(如 DSP 402 等) 接口规范说明区域 保留

2.1.4

CANopen 和 CAN 报文关系

CAN 报文由 7 个不同的位域组成,而 CANopen 就是规定其中的仲裁域(11 位标 识符) 和数据域(8 字节数据) 的使用情况, 11 位标识符和 8 字节数据在 CAN 帧中的 位置如图 2-2。

数据帧

帧起始 仲裁域 控制域 数据域 CRC 域 应答域 帧结束

11 位标识符 10-7 位 功能码 6-0 位 节点 ID

8 字节数据 字节 0 字节 1 字节 2 字节 3 字节 4~字节 7

图 2-2

CANopen 的标识符和数据在 CAN 帧中的位置

CANopen 协议中的各种通讯对象通过 11 位标识符中的功能码部分(10-7 位) 进 行分别, 比如主节点发送 NMT 控制命令功能码为 0000, SDO 的功能码为 1011(发送)

8

华 中 科 技 大 学 硕 士 学 位 论 文
和 1100(接收) 。CAN 网络中各个从节点的 ID 用节点 ID(6-0 位) 表示,最多可以有 127 个从节点。 不同通讯对象对 8 字节数据的使用及各字节代表的意义不同。 (1) 过程数据对象(PDO) :8 个字节全部用来传输实时数据。 (2) 服务数据对象(SDO) :使用 8 个字节,各字节表示的意义如表 2-2。
表 2-2 字节 0 SDO 命令字 SDO 对象数据字节的使用 字节 3 对象子索引 字节 4-7 数据值

字节 1-2 对象索引

(3) 网络管理对象(NMT) :NMT 对象使用 2 字节数据,心跳报文使用 1 字节数 据,表示的意义如表 2-3 和 2-4。
表 2-3 标识符 0x000 表 2-4 标识符 0x700+Node_ID NMT 对象数据字节的使用 字节 0 命令字 心跳报文数据字节的使用 字节 0 从节点状态 字节 1 从节点 ID

2.2
2.2.1

CANopen 协议软件设计流程
CANopen 的设备状态

CANopen 设备在工作时有 4 种状态:初始化、预运行、运行和停止状态。各状 态间的转化流程如图 2-3。

9

华 中 科 技 大 学 硕 士 学 位 论 文
上电或硬件复位 (1) 初始化 (14) (2) 预运行 (13) (3) 运行 (7) (4) (5) 停止 (12) (6) (8) (9) (10) (11)

图 2-3 设备状态转换

除了初始化转换为预运行状态外, 其余各种状态间的转换都是由 NMT 主节点给 设备发送相应命令而触发的,设备的状态由主节点进行控制。各触发点命令含义如 表 2-5。
表 2-5 (1) (2) (3) (6) (4) (7) (5) (8) (9) (10) (11) (12) (13) (14) 触发点命令

上电后自动进入初始化状态 初始化结束后,自动进入预运行状态 启动远程节点命令 进入预运行状态命令 停止远程节点命令 复位节点命令 复位通信命令

2.2.2

设备状态简介 (1) 初始化 在初始化状态,需要对各种通讯对象的参数以及设备的参数进行初始化设置。

初始化结束后,设备发送一个 Boot-up 报文并进入预运行状态。 (2) 预运行 在预运行状态各种通讯对象中只有 PDO 不允许通讯,此状态可通过 SDO 进行 参数配置。在主节点发送一个启动远程节点命令后,设备进入运行状态。
10

华 中 科 技 大 学 硕 士 学 位 论 文
(3) 运行 在运行状态,所有通讯对象都可以进行通讯。此状态是设备进行正常工作的状 态,可以通过 PDO 传输实时数据和命令,也可以通过 SDO 访问对象字典,修改参 数等。 (4) 停止 主节点发送停止远程节点命令后,设备可以从预运行或运行状态直接进入停止 状态,在停止状态,各种通讯活动停止(节点监护和心跳报文除外) ,等待主节点发 送命令进入其它状态。 2.2.3 CANopen 协议软件流程图

1) 协议流程图 根据上述对设备状态的介绍、状态间转换的条件以及各状态允许的通讯对象来 设计协议流程图,如图 2-4 所示。

11

华 中 科 技 大 学 硕 士 学 位 论 文
上电或硬件复位

初始化 e_CAN 模块 初始化 CANopen 参数 初始化中断

复位通信命令

初始化

进入预运行 状态命令

预运行 发送心跳报文 响应主节点命令

启动远程节 点命令命令

处理 SDO 报文 运行 处理接收的 PDO 报文 发送 PDO 报文 响应中断

停止远程 节点命令

停止 接 收 远 程 帧 中 断 接 收 同 步 报 文 中 断

图 2-4

CANopen 协议流程图

设备根据协议要求在不同的状态进行允许的动作,并根据主节点的命令在各种 状态间进行转换。正常情况下,设备应该在运行状态执行协议规定的内容,因为在
12

华 中 科 技 大 学 硕 士 学 位 论 文
此状态下, CANopen 协议所有通讯对象都可以工作, 尤其是传输实时数据的 PDO 对 象只能在运行状态进行工作,所以在进入预运行状态并配置好参数后,主节点应发 送启动远程节点命令,使设备可以在运行状态进行正常工作。 2) 实际流程图 由于 CANopen 协议中的各种报文都要在设备一定的状态下(预运行、运行和停 止) 运行,而相比运行状态,在预运行状态下,只有 PDO 报文不能使用,其它报文 都可以进行通讯,如果以各个状态为模块进行程序设计,将会重复很多程序代码, 考虑到这种情况,本文没有以各个状态为模块,而是根据需要将部分报文执行的动 作为模块,将设备所处的状态作为每种报文执行动作时的使能条件,这样会大大减 少代码的量,精简了程序。所以在对 CANopen 协议进行软件实现时,软件的模块和 执行的顺序如图 2-5。

13

华 中 科 技 大 学 硕 士 学 位 论 文

上电或硬件复位 初始化 e_CAN 模块 初始化 初始化 CANopen 参数 (复位通信) 初始化中断 进入预运行状态

接收到报文

发送心跳报文 运行状 态? N

是 NMT 报文

是 SDO 报文

是 PDO 报文

Y

进入对应状态 ( 预 运行、 运行、 停止)

响应中断

发送 PDO 报文

N

预运行或运 行状态? Y 处理 SDO 报文
图 2-5

运行状态?

N

Y 处理 PDO 报文
软件设计流程图

2.3

CANopen 预定义连接设置
为了减少简单网络的配置工作量,CANopen定义了默认的CAN标识符分配方案。在

简单的网络中,可以使用这些默认的标识符,这样可以简化标识符的配置工作。在默认 标识符分配方案中,11 位ID的前 7 位(0-6) 为节点编号(Node-ID) ,后四位(7-10) 为功能 码(Function Code) 。节点编号的范围是 1~127,根据功能码可以识别各种通讯对象。预 定义连接设置中定义了 4 个接收PDO(RPDO) ,4 个发送PDO(TPDO) ,1 个SDO(使用两
14

华 中 科 技 大 学 硕 士 学 位 论 文
个CAN标识符,分别用来发送和接收) ,1 个紧急对象和一个节点错误控制(NMT Error Control,包括节点保护(Node Guarding) ,心跳报文(Heartbeat) 和Boot-up协议) 标识符。 预定义的连接设置也支持NMT控制服务(NMT Module Control) ,同步(SYNC) 和时间戳 (TIME STAMP) 。 如表 2-6 所示[8]。 表中列出了各种通讯对象的功能码以及默认的标识符 (11 位ID) ,所有通讯对象使用的就是默认的标识符,例如程序中使用的从节点的节点编 号 (7 位 Node-ID) 为 7 ,那么从节点紧急事件的 COB-ID(11 位 ) 就是二进制 087H (00010000111, 4 位功能码 0001, 7 位节点编号 0000111) , PDO1(发送) 的COB-ID是 187H, 其余类推。
表 2-6 CANopen 预定义主/从连接集 CAN 标识符分配表 CANopen 预定义主/从连接集的广播对象 对象 NMT 模块控制 SYNC 时间戳 功能码 (11 位标识符的 7-10 位) 0000 0001 0010 COB-ID (11 位 ID) 000H 080H 100H 通讯参数在 OD 中的索引 1005H,1006H,1007H 1012H,1013H

CANopen 主/从连接集的对等对象 对象 紧急事件 PDO1(发送) PDO1(接收) PDO2(发送) PDO2(接收) PDO3(发送) PDO3(接收) PDO4(发送) PDO4(接收) SDO(发送/服务器) SDO(接收/客户) NMT 错误控制 功能码 (11 位标识符的 7-10 位) 0001 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1110 COB-ID (11 位 ID) 081H-0FFH 181H-1FFH 201H-27FH 281H-2FFH 301H-37FH 381H-3FFH 401H-47FH 481H-4FFH 501H-57FH 581H-5FFH 601H-67FH 701H-77FH 通讯参数在 OD 中的索引 1024H,1015H 1800H 1400H 1801H 1401H 1802H 1402H 1803H 1403H 1200H 1200H 1016H-1017H

15

华 中 科 技 大 学 硕 士 学 位 论 文
2.4 状态初始化程序
对于 CANopen 协议栈的初始化,主要是对节点和各种通讯对象进行参数的初始 化。程序中多使用模块化设计,将执行的功能在各个函数中完成。如图 2-6。
CANopen 协议栈初始化

初始化 CANopen 节点

初始化 PDO 报文

初始化同步报文

图 2-6

初始化各模块

2.4.1

初始化 CANOpen 节点(CAN_Init()) (1) 函数功能 完成的功能包括初始化本节点 ID、心跳报文(包括发送时间间隔,报文 ID,

长度以及数据初始化为 0) 、SDO 响应/中止报文(包括报文 ID,长度以及数据初始 化为 0) 。 (2) 函数说明 由于心跳报文和 SDO 报文的参数较少,所以将其归入节点初始化中。初始化完 成后将 TPDONr(表示 TPDO 的数目) 赋值为 0xFF,表示初始化完成,接下来的程序 根据 TPDONr 的值判断是否进入预运行状态。 (3) 报文的 ID 设置方法 在程序设计中,对于各种通讯对象 ID 的设置采用的是功能码加上节点 ID 的方 法,例如从节点使用的 ID 为 7,则初始化心跳报文(NMT 错误控制对象) 代码为: “CANOpenConfig.heartbeat_msg.ID=0x700+Node_ID; ” 上面代码中 0x700 为心跳报文的功能码,Node_ID 为节点 ID(值为 7) ,所以心 跳报文的 ID 为 0x707H。没有直接赋予 0x707H,而这样初始化的好处是在节点 ID

16

华 中 科 技 大 学 硕 士 学 位 论 文
改变的时候,各种通讯对象的 ID 可以随之变化,避免对每个通讯对象进行修改,尤 其是在多个从节点的系统中,对于不同的节点只需修改 Node_ID,就可以配置好本 节点所有通讯对象的 ID。 2.4.2 初始化 RPDO(CAN_InitRPDO()) (1) 函数功能 ① 检查 RPDO 数目的范围和节点 ID 的范围(1-127) 以及 PROD 指向过程映 射数组的偏移量(offset) 是否超过映射数组的最大范围; ② 初始化通讯子索引(通讯参数的个数) 的数目,传输类型,事件定时周期,数 据长度,偏移量(offset) 和 ID。 (2) 函数说明 对 RPDO 的参数进行检查是为了保证用户设置的正确性,如果出现对象的数目 超出了程序中设定的范围,会提示用户出错;通讯子索引数目的设置是为了符合协 议要求,可以让用户查询 PDO 使用的参数个数。 (3) PDO 的 ID 设置方法 对于 PDO 的 ID 设置,程序中用了两种方法:第一种是按照前面所介绍的报文 功能码加上节点 ID 的方法, 此种方法要求 TPDO 和 RPDO 的个数不多于 4 个; 第二 种是直接赋给完整 ID。这样做是考虑到在实际应用中,PDO 的个数可能可能超过 CANopen 协议默认分配表中的 8 个(4 个 TPDO 和 4 个 RPDO) ,所以在应用中如果 TPDO 或 RPDO 的个数超过 4 个,可以采用第二种方法进行 ID 的配置。函数中定义 了参数 CAN_ID,如果在函数调用时此参数为 0,则执行第一种方法,否则,实参值 即为报文的 ID。 2.4.3 初始化 TPDO(CAN_InitTPDO()) (1) 函数功能 ① 检查 TPDO 数目和节点 ID 的范围(1-127) 、数据长度(1-8) 和事件定时周 期、禁止时间的设置(两个变量至少定义一个) 以及 offset(指向过程数组的偏移
17

华 中 科 技 大 学 硕 士 学 位 论 文
量) 是否超过映射对象的范围; ② 初始化通讯子索引,传输类型,数据长度,偏移量,接收同步对象计数器, ID,时间定时周期,时间定时周期计数器,禁止时间,禁止时间计数器。 (2) 函数说明 相比于 RPDO,TPDO 多了一些参数的配置。检查数据长度是因为 PDO 最多只 能传输 8 字节数据。TPDO 的禁止时间和事件定时周期决定了 TPDO 何时触发。 (3) 禁止时间 禁止时间为两个连续 TPDO 传输的最小时间间隔,避免由于高优先级信息的数 据量太大,始终占据总线,而使其它优先级较低的数据无力竞争总线的问题。TPDO 的禁止时间如果为设为 0,则表示此 TPDO 的传输不受禁止时间的限制。 (4) 事件定时周期 事件定时周期为 TPDO 的发送周期,当超过此时间后,TPDO 开始发送。当事 件定时周期超过,而禁止时间没有到,则不允许发送。 (5) 传输类型 协议中定义了 PDO 的传输类型,传输类型定义了 CANopen 设备何时可以发送 它的数据。如表 2-7。
表 2-7 PDO 的传输条件 触发PDO条件 传输类型 B:两者必须同时成立, O:只要有一个成立即可触发 收到SYNC消息 收到RTR消息 B O — B — — — — — — B O O O PDO传输 事件 B — — — — O O 同步,非周期 同步,周期 保留 同步,收到RTR后发送 异步,收到RTR后发送 异步,制造商指定的事件 异步,设备子协议指定的事件

0 1~240 241~251 252 253 254 255

① TPDO 传输类型

18

华 中 科 技 大 学 硕 士 学 位 论 文
TPDO 传输的是采样的数据,当发生触发 TPDO 传输的事件时,各个 TPDO 根 据自己的传输类型决定是否进行采样并传输。TPDO 的传输分为同步和异步两大类, 传输类型为同步的, 需要在接收到同步消息(SYNC) 时采样数据。 同步又分为周期和 非周期两种。传输类型 0 为非周期传输,表示只有接收到同步消息并且规定的事件 发生才进行采样数据发送,具体是在收到同步对象后,判断规定的事件是否发生, 如果发生则进行采样并触发 TPDO 的发送。传输类型 1~240 为周期传输,传输类型 的值表示在接收到对应个数的同步消息后采样并触发 TPDO 的发送, 例如某个 TPDO 的传输类型为 10, 就表示此 TPDO 每次接收到 10 个同步消息后采样并发送数据。 传 输类型 252 为非周期传输,在接收到同步对象后进行采样但不发送,在接收到请求 该数据的远程帧后发送。传输类型 253-255 为异步传输,定义为此三种类型的 TPDO 在接收到远程帧或规定的事件发生后进行传输。 ② RPDO 传输类型 RPDO 接收的是设备需要执行的命令或数据,虽然从字面意思上看传输类型的 定义更符合 TPDO,但 RPDO 也要根据传输类型为同步或异步进行相应的动作。传 输类型为 0-240 的同步 RPDO 在接收到同步对象后,执行上一个同步周期内收到的 RPDO 的内容,然后接收一个新的 RPDO 数据,并在下一次接收到同步对象后执行 此次收到的数据内容,以此类推。传输类型为 254-255 的异步 RPDO 在接收到新数 据后立即执行新数据的内容。传输类型 252、253 只适用于 TPDO。 ③ 传输类型的使用 将 PDO 的传输类型作为 PDO 初始化时的一个参数,用户可以根据实际要求对 各个 PDO 进行传输类型的设置。对于异步传输类型中的特定事件,可以将超过事件 定时周期和 TPDO 的过程数据改变作为两个触发 TPDO 传输的事件,在连接实际设 备时,用户可以根据需要在用户程序里进行添加其它事件作为触发 TPDO 传输的条 件。 2.4.4 初始化同步报文(CAN_InitSYNC()) (1) 函数功能
19

华 中 科 技 大 学 硕 士 学 位 论 文
设置同步对象的 ID,长度,发送周期以及周期计数器。 (2) 同步报文 在多个从节点的网络中,需要进行同步操作的设备在接收到同步对象后同时执 行相应的动作。同步报文可以让主节点发送,在多个从节点的网络中也可以选择任 务较少的从节点发送,同步报文向 CAN 网络进行周期性的广播。在程序中采用宏定 义的方式确定本节点是否发送同步对象。同步报文的 ID 是固定的为 80H,同步报文 不携带任何数据,但它可以根据用户要求携带多达 8 字节的用户数据。

2.5

CANopen 协议栈设计
在 CANopen 设备初始化状态结束后,设备进入了可以由用户控制执行的实际操

作状态,即 CANopen 协议栈定义的各个过程函数。在这一部分中,CANopen 协议栈 的各个执行函数要在主函数中循环运行,以处理各种命令和数据。如图 2-7。
CANopen 协议栈

发送 TPDO 报文

处理接收的报文

发送心跳报文

处理 NMT 报文

处理 SDO 报文

处理 PDO 报文

图 2-7

CANopen 协议栈结构

2.5.1

初始化后的动作(CANOpen_EnterPDO()) (1) 函数功能 ① 发送心跳报文(Boot-up 报文) 给主节点,设备进入预运行状态; ② 如果需要发送同步对象则开始发送;
20

华 中 科 技 大 学 硕 士 学 位 论 文
③ 启动定时器(StartCpuTimer()) ; ④ TPDONr 设为预定的个数。 (2) 函数功能说明 ① 函数调用的前提 设备初始化结束后,自动进入预运行状态,所以此函数必须在初始化结束后执 行,根据图 2-3 的 CANopen 设备状态转换图可知,设备可以从其它状态进入初始化 状态,所以在 CANopen 协议栈中循环执行此函数时要判断设备是否刚经过初始化状 态,如果经过则执行函数内的动作,否则不需执行; ② 变量 TPDONr 的说明 前面初始化部分提到的变量 TPDONr 就是作为判断的条件,初始化后 TPDONr 的值设为了 0xFF, 紧接着进入预运行状态后 TPDONr 又设为预定的 TPDO 的个数(小 于 0xFF) ,所以可以根据 TPDONr 的值来判断设备是否需要执行此函数以进入预运 行状态; ③ 定时器说明 在进入预运行状态后,硬件设备的定时器开始工作,为 CANopen 协议中各个和 时间相关的对象提供时钟参考。定时器的启动和工作由用户根据实际的硬件设备进 行编程设置。 2.5.2 处理接收到的报文(CANOpen_ProcessMessage()) (1) 函数功能 在进入预运行状态后, 用户和设备可以通过主从节点以 CAN 报文的形式给其它 节点发送各种命令或数据,接收节点收到 CAN 报文后,需要根据节点的状态对报文 进行判断和处理,如图 2-8 所示。

21

华 中 科 技 大 学 硕 士 学 位 论 文
接收到报文,放入指定数组

报文类型判断

本节点为主节点, 获取 发 送消息 的 ID 和数据

处理 NMT 命令 报文

处理 SDO 报 文

处理 PDO 报 文

图 2-8

处理接收报文流程

① 首先将接收到的 CAN 报文放到指定数组中; ② 判断如果本节点为主节点,则获取发送消息的从节点的功能 ID、节点 ID 以 及数据长度,将数据保存在指定的数组中; ③ 如果本节点不是主节点,而且收到的报文为 NMT 主节点发送的控制报文, 则判断并执行相应的命令, 根据控制报文的命令使设备进入相应的状态(运行、 停止、 预运行、复位节点、复位通信) ,在设备进入了运行状态后,立即生成 TPDO 报文 准备发送。 ④ 如果收到的是 SDO 报文, 并且节点处于预运行或运行状态(此时 SDO 报文有 效) ,则处理 SDO 报文请求; ⑤ 如果收到的是 PDO 报文,并且节点处于运行状态(此时 PDO 有效) ,则根据 传输类型(254 或 255,此时为异步) 和 ID 找到符合的 RPDO,将接收的数据复制到 对应 RPDO 的过程映射数组中,然后激发收到的数据。 (2) 函数功能说明 ① 函数介绍 处理报文函数是 CANopen 协议栈中一个主要的处理函数,节点收到的命令或数 据都通过此函数进行处理。在设备进入预运行状态后,除了 PDO 报文外,设备可以 执行其它命令和数据传输, 如果需要对 PDO 的映射进行分配的话, 可以在此时进行。
22

华 中 科 技 大 学 硕 士 学 位 论 文
② NMT 命令 用户通过 NMT 主节点发送控制命令。NMT 主节点可以根据实际需要发送控制 命令使设备节点按照图 2-3 所示在初始化(上述提到的复位节点和复位通信) 、预运 行、运行和停止几种状态间进行转化。 ③ PDO 报文的处理 对于传输过程数据的 PDO 报文,在预运行状态下不能通讯,在对 PDO 的配置 和设备参数配置好后(如果需要此时进行) ,用户可以通过 NMT 主节点发送启动远 程节点命令使设备进入运行状态,在运行状态,所有对象都可以进行通讯。PDO 的 传输分为同步和异步,在此函数中运行的 PDO 为异步传输,由于同步传输实时性要 求较高,需要在接收到同步对象后立即执行,所以在同步 PDO 的操作需要在中断子 程序中实现。 2.5.3 处理 SDO 报文请求(CAN_Handle_SDO_Request()) CANopen 协议中的通讯对象只有 PDO 和 SDO 是用于数据传输,PDO 用于传输 实时的数据,而 SDO 更多的用于对对象字典进行访问。处理 SDO 报文请求函数实 现了 SDO 报文读写对象字典的功能。函数流程如图 2-9。

23

华 中 科 技 大 学 硕 士 学 位 论 文
接收到 SDO 报文

获取命令信息、索引和子索引

N 命令为读或写? Y 根据索引和子索引寻找对象

对象读写属性 满足?

N 发送中止报文

Y N 读命令? Y 通过 SDO 发送对象值
图 2-9 处理 SDO 报文流程

写命令,将报文内容赋 给对象并发送响应报文

(1) 函数功能 ① 接收到 SDO 报文后,获取报文的命令信息以及索引和子索引。 ② 判断命令信息,如果为上传或下载(读或写) 命令,则根据索引和子索引寻找 对象字典中对应的对象(CAN_Search_OD(index,subindex)) ,在对象的读写属性满足 命令信息(命令为读或写,对象可读或可写) 的条件下,如果是读命令,则将对象的 值赋给 SDO 响应报文,发送给请求节点(CANHW_PushMessage(&TxSDO)) ,如果 是写命令,则将报文内容赋给相应的对象并给请求节点发送响应报文。 ③ 如果找到对象的读写属性不符合命令要求,则发送中止报文,告知发送报文 的节点请求的对象为只读或只写。
24

华 中 科 技 大 学 硕 士 学 位 论 文
④ 如果对象为 RPDO、TPDO、错误寄存器(只读) 或心跳时间,则根据命令对 RPDO 或 TPDO 的参数进行相应的读写。 ⑤ 如果不是读写命令则发送中止报文(只支持读写命令) 。 (2) SDO 使用的传输机制 SDO 有 3 种传送机制,分别是加速传送(最多传输 4 字节数据) 、分段传送(传输 数据长度大于 4 字节) 和最新版本中的块传送(当数据长度大于 4 字节时,多个分段 只由一个确认报文应答) 。 主节点发送 SDO 请求报文(读写) 都会得到从节点的应答。 由于在大部分应用中,4 字节数据可以满足 SDO 报文要求,因此 SDO 报文可以考虑 只支持加速传送。加速传送只需下载 (Initiate Domain Download) 和上传 (Initiate Domain Upload)两种命令即可。由于主要是针对从节点进行程序设计,而从节点一般 情况下不需要发送 SDO 请求报文,所以发送给请求节点的中止报文(Abort Domain Transfer)也暂不支持。如果实际应用中需要其它的命令也可以进行添加。 (3) 对象字典中需要的对象 对象字典中存放的对象应该根据协议(CANopen 通讯协议 DS301 和设备子协议) 和设备制造商的规定进行添加,设备的对象字典中只需添加设备需要的对象,而不 用列出协议中所有的对象。虽然一般情况下过程数据由 PDO 进行传输,但在实际设 备的应用中,可能会遇到某些对象不允许映射到 PDO 中,此时只能将对象写入对象 字典,通过 SDO 进行传输。 2.5.4 主节点接收报文的设计方法 这里主要考虑主节点接收各个从节点消息的情况。由于实际应用中从节点个数 可能有很多(最多可以到达 127) , 每个从节点又会有各种 ID 不同的报文(预定义中有 紧急报文、SDO 报文、4 个 RPDO 报文和错误控制报文) ,如果主节点根据每个从 节点发送报文的 ID 判断是否接收此报文,将会需要大量的空间预先来存储 ID 以进 行比较,这对于一般的 CAN 控制器是难以满足的,所以采用只判断报文类型的方式 进行接收。因为各种报文都有自己的功能码,那么根据功能码可以判断出报文类型, 只要功能码符合则不论报文是哪个从节点发送的都接收,在接收之后,再获取报文
25

华 中 科 技 大 学 硕 士 学 位 论 文
的完整 ID,然后根据 Node-ID 就可以判断发送此报文的从节点。这样主节点的接收 ID 可以只考虑报文的类型,而不用关心有多少个从节点,对于一般的 CAN 控制器 而言可以满足这样的需求。由于只比较 ID 中的功能码部分,所以对于 CAN 控制器 需要进行 Node-ID 的屏蔽。 2.5.5 发送 TPDO 报文(CAN_TransmitPDO(TPDONr)) TPDO 报文的发送有同步和异步两种方式, 同步发送需要在同步中断子程序中进 行,在 CANopen 协议栈中进行的是异步发送。对 TPDO 的判断发送需要循环进行。 发送 TPDO 函数流程如图 2-10 所示。 1) 函数功能 判断节点所处状态,要保证节点处在运行状态(此状态下 PDO 可用) ,并且此 TPDO 传输类型为 254 或 255(异步传输) : (1) 根据定时周期发送 如果定义了事件定时周期(如果使用了的话) 并且事件定时周期超过,将过程映 射数组中的数据复制到 TPDO 并发送,如果没有定义事件定时周期则直接将过程映 射数组中的数据复制到 TPDO 并发送。 (2) 根据禁止时间发送 ① 禁止时间超过(此时允许发送 TPDO) ,如果已经有等待发送的 TPDO 报文, 则立即发送报文(CAN_TransmitPDO(TPDONr)) , 并且将禁止状态设为 1(表示无报文 发送且禁止时间在计时) ;如果没有报文等待发送则设置禁止时间状态为 0(表示无 报文发送,但禁止时间超过) ; ② 禁止时间状态为 0 或 1(无报文等待发送) , 查看过程数据是否改变(即有无采 样的新数据) ,如果数据改变了,则判断禁止时间是否超过,超过则将新数据通过 TPDO 发送出去,未超过则将禁止状态设为 2(有报文等待发送) 。 2) 函数说明 上述提到的异步传输是由特定事件(事件定时周期到和 TPDO 的过程数据改变) 触发的,对于远程帧触发的 TPDO 需要在接收到远程帧后进行传输,本文采用中断 进行远程帧的接收,这一部分将在中断子程序中介绍。

26

华 中 科 技 大 学 硕 士 学 位 论 文
节点处于运行状态

TPDO 传输类型 为 254 或 255? Y 定义了事件定时 周期且时间超过? Y N 定义了 禁止时间? Y 禁止时间 超过? Y 发送 TPDO N

N 跳出此函数

N 定义了禁 止时间? Y N 禁止时间 超过? Y 有报文等 待发送? Y 状态设为 0 发送 TPDO, 状态设为 1

N

N 无报文等 待发送? Y 过程数据 被改变? Y 将新数据放 入 TPDO 中 N

N

N

禁止时间 超过? Y

状态设为 2

发送 TPDO

图 2-10 发送 TPDO 流程图

27

华 中 科 技 大 学 硕 士 学 位 论 文
2.5.6 发送心跳报文(CANOpen_GenerateHM()) (1) 函数功能 判断如果心跳时间计数器超过心跳周期,则发送心跳报文,同时心跳时间计数 器清零。 (2) 心跳报文介绍 心跳报文(Heartbeat) 周期性地将从节点所处的状态发送给主节点,使主节点可 以获知从节点的工作状态,如果发现从节点的状态和期望的不符,可以及时进行调 整。 当一个节点初始化完成后, 需要发送 Boot-up 报文通知主节点它已经从初始化状 态进入预运行状态, 除了 Boot-up 报文外,在设备正常运行期间节点的状态将是预运 行、运行和停止状态中的一个,这些状态在报文中用数值表示,各状态的数值如表 2-8 所示。
表 2-8 数值 0 4 5 127 心跳报文各状态的数值表示 表示的状态 启动(Boot-up) 停止(Stopped) 运行(Operational) 预运行(Pre-operational)

(3) 节点保护报文 CANopen 通信协议中还定义了一种和心跳报文功能相似的节点保护 (Node guarding) 服务,这种服务是由 NMT 主节点主动地发送查询帧,从节点收到后进行 响应,将本节点的状态发送给主节点。在这种服务中主节点可以主动地随时查询从 节点状态,但这种服务主从节点都需要向总线发送报文,增加了总线的负载,尤其 是在很多节点的 CAN 网络,节点保护服务将极大地增加总线的负载量,可能影响总 线的正常工作。综合考虑,本文只使用心跳报文。

28

华 中 科 技 大 学 硕 士 学 位 论 文

3 基于 DSP TMS320F2812 的 CANopen 从节点设计
本文使用 DSP TMS320F2812 进行 CANopen 从节点的设计与编程,这一章将介 绍硬件平台的搭建以及如何对 DSP 进行配置和编程使从节点可以根据 CANopen 协 议的要求进行通讯。

3.1
3.1.1

硬件平台搭建
硬件平台的作用 硬件平台是为了构造进行 CAN 通讯的总线网络和主从节点, 在此平台上运行协

议软件, 检验软件设计的效果。 本文主要任务是将 CANopen 通讯子协议 DS301 进行 软件化实现,而实现 CANopen 协议需要以 CAN 网络为基础,所以需要根据网络模 型的要求搭建一个简单的 CAN 总线网络。 3.1.2 CAN 网络搭建

一个简单的 CAN 网络可以只由两个节点构成, 一个作为发送命令和数据的主节 点,另一个作为根据主节点要求进行动作的从节点。 本文选用凌华公司双口隔离 CAN 总线接口卡 PCI-7841 构成上位机 CAN 节点, PCI-7841 卡内含 Philips 公司生产的独立 CAN 控制芯片 SJA1000,并以上位机作为 通讯的主节点。选用北京瑞泰创新责任有限公司的 ICETEK-2812-B DSP 开发板,开 发板上有面向电机控制的 TMS320F2812 芯片作为下位机的控制芯片, 进行实时收发 数据,DSP 在实际使用中主要完成和上位机的 CAN 接口卡通讯;使用 DSP 自带的 CAN 控制器模块,外接总线收发器 SN65HVD230D(VP230) 构成下位机 CAN 节点, 作为通讯从节点。上位机向下位机发送各种数据,下位机根据要求主动或被动向上 位机发送数据。硬件通讯电路结构如图 3-1 所示。

29

华 中 科 技 大 学 硕 士 学 位 论 文
应用层

应用层

数据链路层

物理层

数据链路层 CAN

CAN_H
PC 机 通讯卡

CAN_L

SN65HVD 230D

DSP TMS320F2812

图 3-1

CAN 通信系统示意图

总线收发器芯片VP230 供电电压为 3.3V,与DSP电平完全兼容。从ICETEK-2812-B DSP开发板上将 3.3V供电电压、地线以及CAN发送(CANTX) 、接收(CANRX) 引脚接到 VP230 相应的引脚,如图 3-2 所示。VP230 进行信号的电平和形式的转换,实现总线的 差动发送和接收功能,总线两端的电阻为终端匹配电阻通常取为 120?,引脚Rs与地之间 的电阻R4 称为斜率电阻,其值决定了系统处于高速控制方式还是斜率控制方式,这里采 用斜率控制方式,以降低射频干扰(RFI) [12][20]。
ICETEK-2812-B CANTX 地 3.3V CANRX
图 3-2

VP230 D GND VCC R Rs CANH CANL VREF

R4=10kΩ

R3=120Ω

DSP 与 VP230 的接口电路

3.2

CAN 总线网络硬件测试
在搭建出简单的 CAN 网络后,需要进行基本通讯的验证,这是在没有应用层参

与的情况下对网络进行验证,保证物理层和数据链路层的正常通讯。

30

华 中 科 技 大 学 硕 士 学 位 论 文
3.2.1 主从节点的配置 上位 PC 机通过 PCI-7841 CAN 总线接口卡和 CAN 总线进行通讯。PCI 卡上含 有两个独立 CAN 控制器 SJA1000 和总线收发器 82C250,可以通过两个接口(两个 DB-9 接头) 连接到 CAN 网络上。两个接口一个配置为发送接口,一个配置为接收 接口,这样 PC 机可以同时发送和接收数据。 DSP TMS320F2812 拥有 32 个邮箱, 每个邮箱都可以被配置为发送或接收邮箱,通过信息控制器的控制,进行 CAN 报文 的发送和接收。配置完成后两个节点就可以互相发送和接收 CAN 报文,模拟在实际 应用中的收发功能,检验 CAN 通讯的效果。 3.2.2 PCI 和 DSP 通讯测试 由于 CANopen 协议的缺省标识符只支持 11 位的 ID, 最多可以支持 127 个节点, 而这可以满足大部分的 CAN 通讯应用场合,所以传输的报文是 11 位 ID 的标准帧。 (1) PCI 接口卡的通讯 将 PCI 的两个端口连接在一起,运行发送接收程序,如果发送接收的数据一致 则说明 PCI 工作正常。PCI-7841 CAN 总线接口卡自带了基本的库函数,可以方便地 进行基本通讯。在进行 CANopen 协议的检验时,可以通过修改 PCI 的通讯例程,使 上位机可以按照要求进行 CAN 报文的发送和接收。 (2) DSP CAN 控制器的通讯 DSP 的 CAN 通讯需要按照要求对各寄存器进行相应的配置,配置完成后,首先 在自测试模式下(主控制寄存器 STM 位置 1) 测试 CAN 模块的工作状态,在自测试 模式下,CAN 模块接收自己发送的数据。运行 CAN 发送程序,查看接收邮箱中的 数据是否和发送的数据一致,如果一致,则说明 DSP 的 CAN 模块工作正常。 (3) PCI 和 DSP 之间的通讯 将 DSP CAN 模块的 STM 位置 0,使 CAN 模块工作在正常模式,可以对外发送 和接收数据,检验能否和 PCI 卡进行正确的通讯。 检验过程如下:

31

华 中 科 技 大 学 硕 士 学 位 论 文
① 检验 PCI 发送数据,DSP 接收数据 将 PCI 发送报文的 ID 设为 0x307,配置 DSP 邮箱 7 为接收邮箱,ID 设为 0C1C0000(由于 DSP 的 11 位 ID 存储在 CAN 模块消息标志寄存器的 18-28 位,所以 报文 ID 也为 0x307) 。 配置完成后, PCI 发送长度为 8 个字节的任意数据(十六进制) , 如图 3-3 所示。DSP 接收数据后,查看 DSP 邮箱 7 的内容,邮箱接收到的数据和发 送的数据相同,说明通讯正常,如图 3-4 所示。

图 3-3

PCI 发送长度为 8 字节的数据

图 3-4

DSP 接收数据的长度和内容
32

华 中 科 技 大 学 硕 士 学 位 论 文
② 检验 DSP 发送数据,PCI 接收数据 配置 DSP 邮箱 5 为发送邮箱,ID 设为 001C0000(11 位报文 ID 为 0x007) ,将 PCI 接收报文的 ID 设为 0x007。 配置完成后, DSP 发送 8 个字节的数据(十六进制) , 如图 3-5 所示。PCI 接收数据,数据内容和发送的数据相同,如图 3-6 所示。

图 3-5

DSP 发送数据的长度和内容

图 3-6

PCI 接收 ID 为 0x7,长度为 8 字节的数据

由以上结果可知,PCI 和 DSP 可以互相发送接收数据,两个 CAN 节点间可以正 常进行通讯。

3.3

从节点初始化
初始化部分包括 CANopen 协议对象的初始化以及硬件设备的初始化。由于没有

针对具体的 CANopen 设备,所以初始化的硬件设备主要是对 DSP 的初始化。2.4 节 介绍了对 CANopen 协议中通讯对象的初始化,本节将要介绍如何对 DSP 进行配置 和初始化,以使其满足 CANopen 通讯协议的要求。
33

华 中 科 技 大 学 硕 士 学 位 论 文
3.3.1 e_CAN 模块的初始化(InitEcan())

从节点使用的 CAN 控制器是 DSP 的 e_CAN 模块,对 e_CAN 模块的初始化包 括了 CAN 通讯中关键的报文 ID 和波特率的设置。 (1) 函数功能 ① 进行系统初始化,根据 e_CAN 模块的配置步骤,配置 CAN 的发送和接收引 脚。 ② 配置 CAN 总线通信速率为 1Mbps; 32 个邮箱中 0-15 配置为接收邮箱, 16-31 配置为发送邮箱。 ③ 根据要求配置 32 个邮箱的 ID,当节点为主节点时,接收邮箱采用 ID 屏蔽, 以便接收不同从节点的同一种报文。 (2) 波特率的配置 对于 CAN 控制器初始化的关键是通讯速率和报文 ID 的配置, 进行 CAN 通讯的 各个节点通讯速率必须相同。e_CAN 的波特率配置需要进行计算后对位时序配置寄 存器的 BRPreg 、 TSEG1reg 和 TSEG 2reg 进行设定。波特率的计算方法如下:

波特率 =
BRP= BRPreg +1

SYSCLK BRP × Bit _ time

Bit_time=( TSEG1reg +1)+( TSEG 2reg +1)+1

SYSCLK 为 CAN 模块的系统时钟频率,即 CPU 的时钟频率,为 150MHZ。 (3) 邮箱 ID 设置说明
当 CAN 模块接收到消息时,会比较消息的 ID 和接收邮箱的 ID 是否匹配,如果 匹配则接收。所以对于邮箱 ID 的设置要根据每种报文的 ID 对接收邮箱进行正确配 置。2.5.4 小节提到当节点作为主节点时,接收消息时 11 位 ID 中只比较 7-10 位的功 能码,而忽略掉 0-6 位的 Node_ID,这样在进行 e_CAN 模块的配置时需要对接收邮 箱 11 位 ID 的 0-6 位进行屏蔽设置。

34

华 中 科 技 大 学 硕 士 学 位 论 文
3.3.2 中断的初始化(InrerruptINT()) 在实现协议的过程中,程序需要进行中断来处理一些需要及时响应的事件。设 计中使用了 DSP 的 CPU 定时器和 e_CAN 模块两种类型的中断,定时器中断用来计 时,e_CAN 中断用于接收特定消息时进行及时处理。

(1) 函数功能
① 指定中断服务子程序。 ② 配置 e_CAN 中断,使邮箱 14(接收同步对象)中断产生在 eCAN1INT 上,邮 箱 0(接收远程帧)中断产生在 eCAN0INT 上。 ③ 配置定时器 1 中断,中断时间为 1ms,然后使能各个中断。

(2) e_CAN 模块的中断源 e_CAN 模块设置了 2 个中断,接收同步对象中断和接收远程帧中断。同步对象
用于使多个设备同步进行动作,需要及时进行响应。远程帧中断是为了能及时响应 主节点请求的报文数据。

(3) 定时器的中断时间
使用 DSP TMS320F2812 事件管理模块的通用定时器进行计时,在 CANopen 协 议和时间相关的对象中,时间最小的单位是 1us(通信循环周期) ,但在实际应用中,

ms 级的精确度可以满足大部分应用的要求, 所以设计中对于 DSP 的定时器中断采用 1ms 中断一次,CANopen 协议中和时间相关的对象也要按照 ms 单位进行计时。

3.4

中断程序设计
中断程序是在 CAN 控制器上实现 CANopen 协议的重要部分,中断程序实现了

CANopen 协议中和时间相关的通讯对象正确及时发送, 保证 CANopen 协议中的同步
机制能正确执行。中断程序响应如图 3-7 所示。

35

华 中 科 技 大 学 硕 士 学 位 论 文
禁止中断 配置 e_CAN 中断 中断初始化 配置定时器中断 使能中断

产生中断

定时器中断

接收远程帧中断

接收同步中断

图 3-7 中断响应图

3.4.1

定时器中断(cpu_timer0_isr())

(1) 中断后执行的动作
定时器产生中断后,进入定时器中断子程序: ① 如果本节点为发送同步对象的节点,则将通信循环周期计数器加 1,判断如 果同步周期时间到,则发送同步对象,同步周期计数器清零; ② 心跳时间计数器加 1,如果节点处于运行状态,TPDO 的禁止时间和事件定 时周期计数器加 1。 ③ 清除周期中断标志,清零 PIEACK 中的中断对应位。

(2) 定时器中断的作用
定时器中断子程序为 CANopen 协议中和时间相关的对象提供了时间参考。由于

CANopen 协议中各个对象执行动作的时间周期不同,无法通过在中断子程序定义一
个时间计数器为所有对象提供时间参考,所以在以结构体定义这些和时间有关的对 象时,将时间计数器作为每个对象的元素,定时器每 1ms 产生一次中断,各个对象 的时间计数器加 1,这样可以通过一个定时器给多个通讯对象提供时间参考。
36

华 中 科 技 大 学 硕 士 学 位 论 文
(3) 同步发送周期的要求 CANopen 协议中一个重要的方面就是同步机制,同步机制需要通过接收同步报
文来进行,协议中规定的同步报文发送周期的单位为 us,但如 3.3.2 所述,ms 级的 周期可以满足大部分应用要求,所以设计中将 DSP 发送同步报文的时间单位定义成

1ms,在实际应用中如果需要发送 us 级周期的同步报文,可以对事件管理器的定时
器 1 重新进行设置,使其进行 us 级的中断。 3.4.2 邮箱接收远程帧中断(eCAN0INT_ISR(void))

(1) 函数功能
邮箱 0 接收到远程消息后,读取远程帧标志位和 TPDO 的 ID,根据远程帧标志 位、TPDO 的 ID 和对应 TPDO 的传输类型判断此远程帧是否被响应,如符合,则进 行采样,并将采样的数据发送给主节点。

(2) 邮箱 0 的接收屏蔽设置
远程帧为触发 TPDO 传输的条件之一(见表 2-7) ,考虑到 TPDO 的个数可能不 止一个以及为了节省 DSP 的邮箱空间,所以将邮箱设置成屏蔽接收,可以接收和预 定义的 4 个 TPDO 标识符一致的报文,由表 2-6 可知,4 个发送 PDO 的功能码的最 所以只需屏蔽功能码的前 3 位即可。 这样主节点请求 4 个 TPDO 的远 后一位都为 1, 程帧报文都可以接收到。但从表 2-6 可以看出,屏蔽前三位还可能收到其它的报文, 比如 SDO(发送/服务器) 的功能码为 1011,为了避免这种情况的出现,将邮箱 0 作 为接收远程帧的邮箱,这是因为当 CAN 模块接收消息时,消息控制器是从邮箱编号 最高的邮箱开始比较标识符的,如果查询到了标识符匹配的邮箱,则不再对后面的 邮箱进行比较,这样,在接收数据的过程中,邮箱 0 接收到的将是和前面邮箱 ID 都 不匹配的的消息,而前面的邮箱已经包含了所有其它报文的 ID,所以邮箱 0 收到的 将是请求 TPDO 报文的远程帧。为了防止恰巧接收到错误的 ID 报文(报文的 ID 和前 面的接收邮箱都不符) ,在中断子程序中对屏蔽的 ID 位进行了判断,确保接收到的 是请求 TPDO 报文发送的远程帧。

37

华 中 科 技 大 学 硕 士 学 位 论 文
3.4.3 邮箱接收同步报文中断(eCAN1INT_ISR(void)) 接收同步报文中断实现了 CANopen 协议中同步机制的要求,程序在每次收到同 步报文后进行一次中断,流程如图 3-8、3-9 所示。
接收同步报文中断 采样并判断发送

采样并判断发送 传输类型为 0 且 Event 发生? 上一周期收 到 RPDO? Y 激发数据 N N 传输类型<240 且同步 对象达到要求数目? N 邮箱中有新 RPDO 报文? Y 将 收 到 RPDO 放入过程数组 N 传输类型 为 252? Y 采样并将数据 放入对应邮箱 N

Y

Y

采样并发送

中断返回

跳出

图 3-8 接收同步报文中断子程序

图 3-9

采样判断发送函数流程

(1) 中断子程序具体功能
① 接收到同步报文后,进行采样并判断发送(SYNC_SamplingT()) : 如果传输类型为 0(同步,非循环) 且 Event 发生则进行采样并将采样数据发送; 如果传输类型小于 240(同步,循环) 并且接收的同步对象达到要求数目,则采 样并发送; 如果传输类型为 252(同步, 在 RTR 之后) 则采样并将采样数据放入对应的 TPDO

38

华 中 科 技 大 学 硕 士 学 位 论 文
中,准备好待发送的远程帧数据(将 TPDO 中的数据放入对应的发送邮箱,当接收到 远程帧后进行自动应答) 。 ② 如果上一周期收到同步 RPDO,执行收到的 RPDO 的内容。 ③ 检查邮箱中是否有新的同步 RPDO 报文, 如果有则将报文放到过程映射数组 中,等待下个周期激发。

(2) 同步机制的说明
同步机制包括同步采样(发送) 和同步激发(接收) 。可以采用宏定义的方式选择 执行采样和激发,在实际应用中可根据需要选择其一或全部。同步采样通过同步

TPDO 实现:当收到一个同步对象后,如果传输类型和收到的同步对象个数符合,立
即采样,并将采样的数据用 TPDO 发送给主机。同步激发通过同步 RPDO 实现:当 收到一个同步对象后,立即激发上一个同步周期内收到的 RPDO 数据内容,然后接 收一个新的 RPDO 数据,并在下一个同步周期内激发此数据,如此反复执行。设计 中采用的是主节点发送同步对象前发送一组 RPDO 数据,也可以定义一个专门接收 同步 RPDO 的数组,在进行同步激发前,将数据发送到这个数组中,从节点在每个 同步周期激发后从这个数组中获取一组数据。

(3) 远程帧的自动应答
进行同步采样后,根据 TPDO 的传输类型判断是否将采样的数据发送出去。对 需要满足接收到同步消息和接收到远程帧两个条件后才 于传输类型为 252 的 TPDO, 触发(见表 2-7) , 所以传输类型为 252 的 TPDO 在接收同步报文后只进行采样而不发 送,在接收到远程帧后才发送数据。设计中使用的 DSP 的 CAN 模块有自动应答功 能,即配置为自动应答的邮箱在接收到匹配的远程帧请求后,CAN 模块可以自动发 送对应邮箱中的数据,而与运行的程序无关,所以在设计中利用了 CAN 模块的这个 功能,将传输类型为 252 的 TPDO 采样后的数据放入指定邮箱中,并将此邮箱设置 为自动应答,这样 DSP 在任何时刻收到远程帧都可以自动进行应答,简化了程序的 设计。

39

华 中 科 技 大 学 硕 士 学 位 论 文
3.4.4 中断控制 程序中有 3 个中断,而根据 CANopen 协议的要求,每处中断都要在一定的条件 或状态下才允许发生,而且设备的状态随时可能变化,所以需要对各个中断进行控 制,使得中断发生符合 CANopen 协议的要求。

(1) 定时器中断控制
定时器中断是为了给 CANopen 协议中通讯对象提供时间参考的,而协议中各个 通讯对象是在初始化后进入预运行状态后才有效的,所以在每次进入初始化状态时 需要停止定时器,而在进入预运行状态后再启动,这样设备在初始化和其它状态间 进行转换时,可以保证定时器的正确计时,为需要时间参考的有关对象提供动作依 据。

(2) 接收远程帧和同步报文中断控制
① 允许中断的条件 与定时器中断为各种通讯对象提供时间参考不同,接收远程帧中断和接收同步 报文中断只和 PDO 对象相关——接收远程帧中断是为了发送请求的 PDO 数据,接 收同步报文中断是为了使各个节点的 PDO 可以同步进行动作。因此这两个中断允许 发生的条件和 PDO 有效的状态一致,即在运行状态时处理。和定时器中断的控制类 似,在 CANopen 协议栈的循环中判断设备所处的状态,如果在运行状态,则使能

e_CAN 模块的中断,可以产生接收远程帧和同步报文中断。
② 自动应答控制 由于邮箱的自动应答发送的也是 TPDO 报文的内容, 所以在此处对 CAN 模块的 自动应答进行了控制:判断每个 TPDO 的传输类型,如果传输类型为 252(同步 RTR) 且接收到同步报文, 则置位自动应答模式位(自动应答只适用于 252 类型), 允许应答, 否则将自动应答位清零,以保证邮箱只在设备的运行状态并且是在收到同步对象后 进行自动应答,符合了 CANopen 协议的要求。 如果节点没有处于运行状态,则禁止 e_CAN 模块的中断和自动应答。 通过上述设置可以保证 PDO 的各种动作只在运行状态进行。

40

华 中 科 技 大 学 硕 士 学 位 论 文
3.5 接收发送程序设计
接收发送程序是 CANopen 协议和 CAN 控制器间的纽带,接收程序将邮箱中接 而发送程序则按照邮箱存放消息的方式将 收到的消息取出转变成 CAN 消息的格式,

CAN 消息放入发送邮箱中, 这样可以将 CANopen 协议程序和 CAN 控制器联系起来。
3.5.1 查询邮箱接收到的消息(SearchMbox(void)) 除了远程帧和同步报文的接收使用中断外,其它报文的接收是通过查询邮箱是 否有新数据的方法实现的,如果有新的数据,则进行处理。由于接收到消息的邮箱 可能不止一个,所以在查询过程中需要记下每个接收到消息的邮箱号,来逐次进行 处理。每次处理完一个邮箱的消息后,需要清除这个邮箱的接收消息标志位,以便 下次查询。程序中定义了一个标志报文处理的全局变量,CANopen 协议的处理程序 处理完一个报文后,标志置 1,CAN 控制器根据这个标志来判断消息是否被处理。 3.5.2 接收程序设计(CANHW_PullMessage(CAN_MSG *ReceiveBuf))

CAN 控制器邮箱接收的消息标识符、 长度以及 8 个字节数据都是存放在 32 位寄
存器中(8 字节数据存放于高低两个 32 位寄存器) ,而在程序中用到的处理的 CAN 消息的标识符为 11 位,数据长度为 int 型,数据存放于 8 位的数组中,所以要通过 接收程序取出邮箱中需要的 11 位标识符、长度,以及将邮箱中的数据按照顺序正确 存放在程序指定的数组中。

(1) 邮箱标识符的读取
当使用 11 位标识符时,邮箱是将标识符存放于消息标志寄存器的 18-28 位,所 以需要读出这 11 位的值,采用先右移 18 位再和 0x7FF 进行与的方式实现:

ReceiveBuf->ID=(Mailbox->MSGID.all>>18)&0x7FF; (2) 邮箱中数据的读取
数据长度(0~8 字节) 值位于控制寄存器的 0~3 位,可直接通过与的方式读出。 邮箱中的数据存放于 2 个 32 位寄存器中,如图 3-10 和 3-11 所示,所以在读取邮箱

41

华 中 科 技 大 学 硕 士 学 位 论 文
数据时需要根据数据长度分别进行读取。

31
字节 0

24

23
字节 1

16

15
字节 2

8

7
字节 3

0

图 3-10 邮箱存放数据低寄存器

31
字节 4

24

23
字节 5 图 3-11

16

15
字节 6

8

7
字节 7

0

邮箱存放数据高寄存器

如果数据长度不大于 4 个字节,则只读取邮箱的低寄存器,读取时按照顺序从 第 0 字节开始——将 32 位值右移 24 位,并以与的方式取出低 8 位,将取出的值赋 给数组的第 0 个单元。

*(Uint8 *)(ReceiveBuf->BUF+i)=(Mailbox->MDRL.all>>(8*(3-i)))&0xFF;
以此类推,根据数据的长度采用循环的方式将邮箱中所有数据放入指定数组中。 数据长度大于 4 个字节时读取方式相似,只需进行两次循环即可。 3.5.3 发送程序设计(CANHW_PushMessage(CAN_MSG *TransmitBuf)) 发送程序类似于接收程序的逆过程,需要发送报文时,将 CAN 消息格式的报文 放入发送邮箱进行发送。设计中发送的报文,除了自动应答报文放入指定邮箱中外, 其它发送的报文都是使用邮箱 16 发送的, 这样做节省了邮箱空间, 简化了程序设计。 报文的标识符、数据长度通过简单的移位就可以符合邮箱的格式要求。

(1) 标识符格式的转换
将 11 为报文标识符放入邮箱消息标志寄存器的 18-28 位, 只需将 11 位标识符左 移 18 位即可。

(2) 数据格式的转换
当数据长度不大于 4 个字节时,要将发送报文的数据值赋给邮箱存放数据的低 寄存器。按照图 3-10 所示,将数组中的每个元素值(字节) 放入相应的位置。通过循 环方式将数组的第 0、1、2、3 个元素分别左移 24、16、8、0 位再相加实现:

PsMailbox.MDRL.all += (Uint32)(*(Uint8 *)(TransmitBuf->BUF+i))<<(8*(3-i));
需要注意的是,由于寄存器为 32 位,而数组为 8 位,在移位前需要将数组中的
42

华 中 科 技 大 学 硕 士 学 位 论 文
数据转换为 32 位,否则,移位时会出现错误。 同接收数据时相似,数据长度大于 4 字节时,需要两次循环。

3.6

程序与应用设备接口
从节点中 CANopen 协议程序执行的目的是将主节点的命令和数据传送给设备以

及将设备反馈的数据发送给主节点,这样在协议程序和实际设备间需要有一个进行 数据交换的接口。

(1) 程序和设备间的数组接口 CANopen 协议的通讯对象中只有 SDO 和 PDO 是用于数据传输的,SDO 读写的
数据存放于对象字典数组中,PDO 传送的数据存放于过程数组中,所以将这两个数 组作为和设备之间的接口——设备根据数组中的命令和数据运行,设备反馈的数据 也放入数组中根据要求发送。至于设备的数据需要通过哪种对象传输,需要根据子 协议和实际的设备要求而定——如果设备的参数可以映射到 PDO 中,则使用 PDO 传输,否则使用 SDO 传输。

(2) 数组接口中参数值的读取
为了方便读取数组中参数的值,定义了两个函数用于读取 SDO 和 PDO 数组中 的具体参数的值: ① 获得对象字典中参数值

Uint32 RequireODValue(Uint8 N,Uint8 LEN): 根据对象在对象字典数组(OD[]) 中
的位置(N,表示第 N 个对象) 和长度(LEN) 获得对象的实际值。在对象字典中对象 占用 8 字节的空间,每个对象的数据分配了 4 个字节的空间,读取参数实际值的方 法和发送函数中的方法类似:

value+=((Uint32)(OD[(N-1)*8+4+i]))<<(8*i);
② 获得过程数组中参数的值

Uint32 RequireProcImgValue(Uint8 offset,Uint8 len) : 根 据 对 象 在 过 程 数 组 (ProcImg[]) 中的偏移量(offset) 和长度(len) 获得映射到 PDO 中的对象的值。 过程数

43

华 中 科 技 大 学 硕 士 学 位 论 文
组为 8 位的数组,大小根据实际要求而定,存放 TPDO 和 RPDO 的数据。在用户程 序中需要为每个 PDO 对象设置一个偏移量,根据这个偏移量确定每个 PDO 的数据 在过程数组中的存放位置。 将这两个函数的返回值赋予参数变量,并使之在主程序中循环执行,这样就可 以随时得到需要参数的实际值。

(3) 实际应用中的参数
和实际设备接口方面的程序需要用户在使用中根据具体协议和设备要求进行设 计,比如 DSP402 协议中规定了默认的 PDO 映射,但映射的对象只是少数几个比如 控制字(Controlword) 、状态字(Statusword) 、操作模式(Modes of operation) 、目标 位置(Target position) 以及其它一些基本的参数, 而具体的 CANopen 设备本身也有一 些特定的参数,所以在实际使用时需要综合协议规定和设备规定进行设计。设计中 只是列举了 DSP402 协议中几个简单的参数作为例子。

44

华 中 科 技 大 学 硕 士 学 位 论 文

4 实验结果、总结及展望
4.1 实验结果
本节介绍协议程序实现的效果, 在搭建的 CAN 总线网络上进行协议软件的运行, 上位机主节点发送各种命令和数据,从节点根据协议软件处理和反馈数据。按照前 面介绍的协议程序对各种功能进行一一验证。 4.1.1 从节点初始化后发送心跳报文 从节点上电启动后,硬件设备和 CANopen 协议程序进入初始化状态,初始化完 成后从节点向主节点发送 Boot-up 报文并自动进入预运行状态,同时从节点开始以

2000ms 为周期向主节点发送心跳报文,显示从节点当前状态,如图 4-1 所示。

图 4-1

从节点以 2000ms 为周期发送心跳报文

Boot-up 报文是从节点的第一个心跳报文,心跳报文的标识符为 0x707,数据长

45

华 中 科 技 大 学 硕 士 学 位 论 文
度为 1 个字节,由表 2-8 可知,数据 0 表示 Boot-up 报文,7f 表示从节点目前处于预 运行状态。 4.1.2 NMT 主节点命令的处理 进入预运行状态后,主节点可以发送 NMT 命令,使从节点进入运行状态。如图

4-2、4-3 所示。

图 4-2

主节点发送 NMT 命令

主节点发送 ID 为 0 的 NMT 控制报文, 字节 0 表示命令字, 字节 1 表示节点 ID。 各命令字及其表示的意义如表 4-1 所示。
表 4-1 命令字 1 2 128 129 130 NMT 命令字及其意义 表示的意义 进入运行状态 进入停止状态 进入预操作状态 进入初始化(复位节点) 状态 进入初始化(复位通信) 状态

46

华 中 科 技 大 学 硕 士 学 位 论 文

图 4-3

从节点处于运行状态

从节点收到命令后,通过向主节点发送心跳报文表示进入了运行状态。由表 2-8 可知,字节 0 的数据 5 表示运行状态。 同样,主节点可以发送其它命令字使从节点进入不同的状态。 4.1.3 SDO 报文的处理

进入预运行状态后,除了 PDO 报文外,其它报文都可以进行处理。SDO 报文的 处理包括上传(读) 和下载(写) 两部分。SDO 报文的基本结构如表 4-2。
表 4-2 字节 0 SDO 命令字 字节 1-2 对象索引 SDO 报文的基本结构 字节 3 对象子索引 字节 4-7 数据值

字节 1 表示索引的低字节, 字节 2 表示索引的高字节。 字节 4-7 表示的是数据的 由低到高位。图 4-4、4-5 显示的是主节点通过 SDO 将值 0x3412 写入从节点的指定 对象中去。

47

华 中 科 技 大 学 硕 士 学 位 论 文

图 4-4

主节点发送 SDO 写请求报文

从节点的 Node-ID 为 7,根据表 2-6 可知主节点发送 SDO 报文的 ID 为 0x607, 写入数据的长度为 2 个字节,命令字 2B 表示加速传输 2 字节数据的 SDO 写报文, 写入的对象索引为 0x1800,子索引为 3。

图 4-5

数据写入到从节点指定对象

由 DS301 协议知,索引 1800 代表通讯对象 TPDO1,子索引 3 代表 TPDO1 的参 数禁止时间(inhibit time) ,通过 SDO 写操作后,TPDO1 的禁止时间值变为 0x3412。 数据写入对象后,从节点向主节点发送一个应答报文,SDO 应答报文 ID 为

0x587,写应答报文不携带数据值,如图 4-6 所示。

48

华 中 科 技 大 学 硕 士 学 位 论 文

图 4-6

主节点收到的从节点应答报文

图 4-7~4-10 显示的是对 DS402 协议中规定的对象电机类型(Motor type) 进行写 操作,该对象的索引为 0x6402,长度为 2 个字节。DS402 协议中规定了该对象各个 值的含义,其中 0x0008 表示步进电机(Stepper motor) ,所以实际应用中如果使用了 步进电机,可以根据需要将此对象值赋为 0x0008。

图 4-7

主节点发送 SDO 写请求报文
49

华 中 科 技 大 学 硕 士 学 位 论 文

图 4-8

数据写入到从节点的指定对象

图 4-9

对象参数的实际值

图 4-10 主节点收到的从节点应答报文

50

华 中 科 技 大 学 硕 士 学 位 论 文

图 4-11

主节点发送 SDO 读请求报文

图 4-12 主节点收到的从节点应答报文

4.1.4

异步 PDO 报文的处理 由表 2-7 可知,PDO 的发送和接收分为同步和异步两种方式,同步需要同步对

象(SYNC) 的触发, 异步需要远程帧或特定事件的触发, 这里先对异步处理进行验证。 进入运行状态后,PDO 报文有效,可以接收和发送 PDO 报文。设计中列举的 4

51

华 中 科 技 大 学 硕 士 学 位 论 文
个 RPDO 和 4 个 TPDO 按照 DS402 协议中默认的方案映射,如表 4-3。
表 4-3 PDO RPDO1 RPDO2 RPDO3 RPDO4 TPDO1 TPDO2 TPDO3 TPDO4 映射的 对 象索引 6040h 6040h 6060h 6040h 607Ah 6040h 60FFh 6041h 6041h 6061h 6041h 6064h 6041h 606Ch DS402 协议中默认的 PDO 映射 映射的对象意义 控制字(Controlword) 控制字(Controlword) 操作模式(Modes of operation) 控制字(Controlword) 目标位置(Target position) 控制字(Controlword) 目标速度(Target velocity) 状态字(Statusword) 状态字(Statusword) 操作模式显示(Modes of operation display) 状态字(Statusword) 位置实际值(Position actual value) 状态字(Statusword) 速度实际值(Velocity actual value)

占用的字节 2 2 1 2 4 2 4 2 2 1 2 4 2 4

(1) 从节点接收 RPDO RPDO 是相对于从节点而言的,RPDO1 的 ID 为 0x207,发送任意十六进制数据 0x2211,主节点发送的 RPDO1 报文如图 4-13 所示。

图 4-13 主节点发送 RPDO1 报文
52

华 中 科 技 大 学 硕 士 学 位 论 文

根据 RPDO1 的映射位置,2 字节的数据内容存放在过程数组的前 2 个元素,而

RPDO1 的数据内容表示的是控制字(Controlword) 的值, 且根据 DS402 协议和表 4-3,
所以参数 Controlword 的值变为 0x2211,如图 4-14 所示。

图 4-14 从节点收到的 RPDO1 报文

同样,主节点可以根据需要发送其余 RPDO 报文。

(2) 从节点发送 TPDO
异步 TPDO 的发送包括主节点发送远程帧触发和事件定时周期触发。将 TPDO4 的传输类型设置为 253(远程帧触发) ,主节点发送远程帧,如图 4-15 所示。 由于 TPDO 发送的是设备反馈到过程数组中的数据,但设计中尚无设备反馈, 所以 TPDO 发送的数据值都为 0,由表 4-3 知,TPDO4 携带的数据为 6 个字节。如 图 4-16 所示。

图 4-15 主节点发送远程帧请求 TPDO4 的数据
53

华 中 科 技 大 学 硕 士 学 位 论 文

图 4-16 主节点收到的 TPDO4 的数据

事件定时周期触发表示 TPDO 的发送是周期性的,将 TPDO2 的传输类型设为

255, 定时周期设为 2000ms(DS301 协议中规定事件定时周期由 16 位无符号整数定义,
单位为 1ms ,可以根据需要设置事件定时周期,而且设定的心跳报文时间也为

2000ms, 这样两者可以进行比较) , 则每隔 2s, TPDO2 会自动发送, 如图 4-17, TPDO2
和心跳报文都以 2s 为周期进行发送,且 TPDO2 为 3 个字节。

54

华 中 科 技 大 学 硕 士 学 位 论 文

图 4-17 TPDO2 的事件定时周期触发

4.1.5

同步 PDO 报文的处理

PDO 进行同步接收和发送是为了使多个设备可以同时进行动作,所以需要同步
对象的触发。 对于同步 TPDO 报文而言,主节点发送同步报文,同步报文不携带任何数据, 从节点根据传输类型进行 TPDO 的发送, 将 TPDO3 的传输类型设为 3, 意味着 TPDO3

55

华 中 科 技 大 学 硕 士 学 位 论 文
每接收到 3 次同步对象进行一次发送。如图 4-18、4-19。

图 4-18 主节点发送同步报文

图 4-19 从节点收到 3 个同步对象后,发送 TPDO3

(2) 同步 RPDO 的处理
设计中,主节点在每次发送同步对象前需要发送一组 RPDO 的数据,以使从节 点激发后进行再次接收数据。 将 RPDO2 传输类型设置为 10(可以是 0-240 的任意值) , 由表 4-3 知,RPDO2 占用 3 个字节,所以在过程数组(ProcImg[]) 中的存放位置为第

56

华 中 科 技 大 学 硕 士 学 位 论 文
2-4 个元素,主节点发送数据后,从节点并没有将数据接收到过程数组中,而在收到
同步对象激发后,接收此组数据。如图 4-20、4-21 所示。

图 4-20 主节点发送 RPDO2 数据

57

华 中 科 技 大 学 硕 士 学 位 论 文

图 4-21 主节点发送同步对象后从节点接收 RPDO2 数据

设计中通过查询每个 RPDO 的传输类型进行激发和接收,如果应用中需要多个 同步 RPDO 报文,也可以满足。

4.2

全文总结和展望
随着 CAN 总线的广泛应用,其应用层协议 CANopen 也被越来越广泛的使用。

本文根据 CANopen 协议在运动控制中越来越多的应用,进行了 CANopen 协议的软 件设计。综上所述,主要完成了以下的工作:

1、根据 CANopen 通讯协议 DS301 的规定,进行了 CANopen 协议的软件化实
现,通过 C 语言编程实现了协议中要求的各种通讯规则。

2、设计搭建了由两个节点构成的简单的 CAN 通讯网络,并进行了硬件调试,

58

华 中 科 技 大 学 硕 士 学 位 论 文
使得网络在物理层和数据链路层上可以正确 CAN 报文的收发, 为进行协议软件验证 提供了基础。

3、结合 DSP TMS320F2812 芯片,将 CANopen 协议软件和硬件结合起来,使得
作为 CANopen 的从节点可以按照通讯协议的要求进行数据的处理和收发,在 DSP 上实现了 CANopen 协议的运行。 设计中只是实现了数据的处理和收发可以按照 CANopen 协议要求进行,要在具 体应用中实现 CANopen 设备的正确运行,还要做进一步的工作:

1、DSP 只是从节点的一个控制芯片,完整的节点还需要根据实际的 CANopen
设备要求进行应用程序的设计编程。

2、完整的 CANopen 网络还需要一个功能完善的主节点,设计中的主节点只进
行了数据的收发,实际应用中可以根据要求进行数据的处理和显示。还需要设计一 个完善的人机界面,以方便操作。

3、程序的设计编程还应该有可以优化的地方,另外由于没有经过实际设备的检
验,协议设计和编程可能存在疏漏之处。

59

华 中 科 技 大 学 硕 士 学 位 论 文

致 谢
本文是在导师李叶松教授的精心指导和帮助下完成的。李老师渊博的知识、科 学的工作方法、严谨的治学态度以及对学生认真负责的态度使我终身获益,这两年 从李老师身上学到了很多学习、做人的方法也更加端正自己做事的态度,不仅使我 顺利地完成了学业,而且对我今后进入社会有莫大的帮助。在此向悉心指导帮助和 培养我的导师表示深深的敬意和衷心的感谢! 在研究生的学习研究过程中,杨凯峰硕士、许林硕士、彭雨硕士、赵云博士、 杨静硕士等给了我许多帮助和建议,在此对他们表示感谢。另外还要特别提到大学 6 年来在学习和生活中给予我很多帮助的好友宋淼,一直以来他的很多帮助和建议使 我解决了学习和生活中的很多困难,在此深表谢意。 这里还要深深感谢生我养我的父母,正是他们 20 多年来的辛勤劳作给我提供了 学习的机会,使我能安心进行我的学业,在以后的日子里,我要加倍努力不辜负父 母的期望。 最后感谢所有关心帮助过我的亲友、老师和同学!

60

华 中 科 技 大 学 硕 士 学 位 论 文

参考文献
[1] [2]
史久根等. CAN 现场总线系统设计技术. 北京:国防工业出版社,2004 饶运涛等. 现场总线 CAN 原理与应用技术(第 2 版) . 北京: 北京航空航天大学 出版社,2007

[3] [4] [5] [6] [7]

苏奎峰等. TMS320F2812 原理与开发. 北京:电子工业出版社,2005 邬宽明. CAN 总线原理和应用系统设计. 北京: 北京航空航天大学出版社, 1996 谭浩强. C 程序设计(第二版) . 北京:清华大学出版社,1999

CANopen Application Layer and Communication Profile.CiA Draft Standard 301 ,Version 4.02,2002 CANopen Device Profile Drives and Motion Control. CiA Draft Standard Proposal 402 ,Version 4.02,2002

[8] [9]

广州周立功单片机发展有限公司. CANopen 协议介绍 刘和平等. 数字信号处理器原理、机构及应用基础——TMS320F28x. 北京: 机械工业出版社,2007

[10] [11] [12] [13] [14]

Copley Controls Corp. CANopen Programmer’s Manual,Version 3,2006
王黎明等. CAN 现场总线系统的设计与应用. 北京:电子工业出版社,2008 杨凯峰. 单轴运动控制器的设计:硕士学位论文. 华中科技大学图书馆,2008 广州周立功单片机发展有限公司. CAN—bus 规范 V2.0 版本

ADLINK Technology Inc. PCI-7841 Dual-Port Isolated CAN Interface Card User’ Guide,2001

[15]

TEXAS INSTRUMENTS. TMS320x28xx,28xxx DSP Enhanced Controller Area Network(eCAN) Reference Guide,2006

[16]

郑楠. 无刷直流电机控制系统的通讯策略研究:硕士学位论文. 华中科技大学 图书馆,2008

[17]

宋晓梅,贾佳. CANopen 协议在伺服电机控制系统中的实现. 单片机与嵌入式

61

华 中 科 技 大 学 硕 士 学 位 论 文
系统应用,2006,(6) :5~7

[18]

李博, 李晓汀, 郇极. CANopen 运动控制协议驱动程序设计. 控制与检测, 2007,

(4) :52~55 [19] [20] [21] CAN in Automation. CAN Specification 2.0, Part B Texas Instruments. SN65HVD230 datasheet[Z],2002
严世华,何永强,郎滨. 基于 DSP 的 CAN 总线应用层协议开发与实现. 科学 技术与工程,2007,7(22) :5939~5942

[22]

CAN in Automation e. V. Work Draft: CANopen Electronic Data Sheet Specification for CANopen,1999

[23] [24] [25]

CAN in Automation. Device Profile for Generic I/O Modules,2002 Texas Instruments. TMS320x28xx, 28xxx DSP Peripheral Reference Guide,2006
吴爱国,刘莉. CAN 总线控制系统的应用层协议 CANopen 剖析. 微计算机信 息,2002,19(3) :27~28,75

[26] [27] [28] [29] [30]

Texas Instruments. Programming Examples for the TMS320F281x eCAN,2003 Texas Instruments. TMS320x281x DSP System Control and Interrupts Reference Guide,2006
北京博控自动化技术有限公司. CANopen 协议介绍

CAN in Automation. CAN Specification 2.0, Part A
王俊波,胥布工. CANopen 协议分析与实现. 嵌入式网络技术应用,2006,

22(6-2) :104~106 [31]
杨如峰,赵国军,郑尚透. 基于 CANopen 协议的电梯控制系统的研究. 工业 控制计算机,2006,19(6) :3~4

[32]

H.Boterenbrood. CANopen: high—level protocol for CAN-bus Version 3.0[Z], March 2000
孙树文,杨建武,张慧慧,赵建光. 基于 CANopen 协议的分布式控制系统 I/O 从站设计. 工业控制,2007,15(12) :1705~1707

[33]

[34]

CANopen Object Dictionary(Software Manual). SYS TEC electronic GmbH[S],

62

华 中 科 技 大 学 硕 士 学 位 论 文
2003 [35] [36] [37] Robert Bosch GmbH. CAN Specification Version 2.0[EB],1991 CAN in Automation. CAN Physical Layer for Industrial Applications. CiA Draft Standard 102 Version 2.0,1994
潘伟,王汉功,张霞. 基于 TMS320F2812 DSP 的智能 CAN 节点设计. 自动化 仪表,2005,26(10) :36~37

[38]

陈佳佳, 曾岳南, 罗彬. 基于 TMS320F2812 DSP 的 CAN 总线通信系统设计. 工 业控制计算机,2007,20(5) :14~15

[39]

马艳歌,贾凯,徐方. 基于 DSP 的 CANopen 通讯协议的实现. DSP 开发与应 用,2006,22(2-2) :146~148,237

[40]

李洪波,王旭东,薛玲,李晓燕. 基于 DSP 的 CAN 总线节点的研究与通信实 现. 哈尔滨理工大学学报,2005,10(2) :72~75

[41]

蒋智康. 基于 CANopen 协议的分布式控制系统的研究:硕士学位论文. 华中 科技大学图书馆,2008

63


相关文章:
几大通信协议区别
CAN 是一种多主方式的串行通讯 总线,基本设计规范要求有高的位速率、高抗电磁...其典型的应用协议有: SAE J1939/ISO11783、CANOpen、CANaerospace、DeviceNet、...
分布式总线技术的基本原理及协议分析(20160411)
(ECU) ,如果这些电子控制单元使用 了分布式的设计,...的不同通信协议标准,运用于实际生产现场,实现智能...协议、CiACANOpen 协议、ODVA Device Net 协议、...
CANopen通讯协议介绍
CANopen 通讯协议介绍 CANopen 是一种架构在控制局域网路(Control Area Network, CAN)上的高层通讯协定,包括通讯子协定及 设备子协定常在嵌入式系统中使用,也是工业...
自动售货机的设计与实现_叶银兰.pdf
自动售货机的设计与实现_叶银兰.pdf_信息与通信_工程科技_专业资料。您的论文...一种开放式的现场总线协议 CANopen[J]. 制 造业自动化, 2002,24(10):34-...
理解并使用控制器局域网通讯协议 理论及实践
送的通讯协议,本书向读者提供了基于控制器局域网 总线通信基础结构的设计、分析...协议栈实施及配置、协议栈 /应用校准; 9.高级协议:j1939 标准、canopen 标准、...
基于DSP的CANopen通讯协议的实现
此部分的使用使 CANopen 协议既保证了设备的通用性,又保证了系统 良好的扩展性。 3.3 通讯程序的设计实现 针对带 CAN 控制器的 TMS320LF2407A 和 PC 机 ...
基于CAN总线的通信系统设计
一种基于 CAN 总线的通信系统设计与实现摘 要: 本文设计了应用于分布式控制结构...鉴于本 分析仪器硬件特点以及各模块通信的易可行性,CANopen 协议相对复杂,为此...
CANOPEN协议详解
CANOPEN协议详解_信息与通信_工程科技_专业资料。CAN-BUSCANOPEN协议格详细说明一...(见 ISO11898 标准);实际设计 中,这两层完全由硬件实现,设计人员 无需再为此...
现场总线实验指导书
实现双机通讯 一、 实验目的 1. 了解 CAN 总线的基本知识 2. 掌握 CAN 控制...而 CANopen 协议是从 CAN Application Layer 的一个子集设计 而成的协议。...
CANopen协议SDO部分基础知识实例介绍
基于 CANopen 协议的分布式控制系统智能从站设计 [D]. 2010. [12] 陈涛. 汽车仪表的 CANopen 节点通信的研究与实现 [D]. 2007. [13] 宋威. CANOPEN 现场...
更多相关标签:
canopen通讯协议 | mqtt协议实现即时通讯 | 使用nsq实现 通讯协议 | canopen通讯 | 台达伺服canopen通讯 | canopen通讯速度 | canopen通讯plc | canopen通讯距离 |