CANopen学习笔记(一)----CANFestival对象字典环境搭建并新建CANopen节点

前言:
主要介绍了CANopen的整体框架,开源协议栈CANFestival的对象字典和节点的一种建立方式。

1 CANopen协议是什么?
CANopen是一种架构在控制局域网路(Controller Area Network,CAN)上的高层通信协议,包括通信子协议及设备子协议。其中的通信子协议为DS-301,设备子协议有DS-401/402等。

在网络的七层协议中,CAN收发器位于物理层,实现逻辑电平(TTL或者CMOS)和差分电平信号的相互转换;CAN控制器位于数据链路层,实现CAN通信的链路层协议,完成数据的打包/解析,CRC校验,仲裁等功能,现在一般的MCU都集成了CAN控制器。有了物理层和数据链路层,数据通信其实已经建立成功了。所谓数据通信,就是按照协议规范对协议里规定的段进行填充数据、打包发送/接收解析的过程。但怎么能更方便的进行通信程序的开发呢?这就需要除了物理层和数据链路层之外的数据层(应用层)。
在这里插入图片描述

1.1 通信协议分类
通信协议分类描述不同通信协议的原则和消息传输触发的可用模式。不同的通讯方式适用于不同的环境,其实现过程需要不同的机制,一个优秀的协议栈,应该考虑全面的使用情况,尽可能满足所有的使用需求。

1.1.1主-从(master-slave)模型
任意时刻 CANopen 网络中都仅存在一个设备以主设备身份执行特定功能。CANopen 网络中所有其他的设备均为从设备。按协议规定,主设备会向从设备(们)发送请求,从设备(们)可以配置为响应,也可以不响应。比如一个主控板控制5个伺服电机,主控板的CAN可以作为主设备来对5个电机从设备的速度、位置进行控制并获取当前电机的位置、状态,属于一主多从的通信模型。
在这里插入图片描述
无响应类型
在这里插入图片描述
有响应类型

1.1.2客户端-服务器(client-server) 模型
单一客户和单一服务器之间的一种通信协议。客户端发送请求(上传/下载)触发服务器执行某项任务。在任务完成后服务器一定会返回应答消息,保证了数据通信的可靠性。
在这里插入图片描述
1.1.3生产者-消费者(producer-consumer) 模型
生产者/消费者协议涉及一个生产者和若干消费者(没有也可以),有两种模式:push和pull。Push是指生产者将数据推到CAN网络上,并不会管哪个消费者用了这个数据,更不需要消费者的回应,数据的发起者是生产者。Pull是指消费者发起请求,生产者将数据返回至消费者。

在这里插入图片描述
Push模式
在这里插入图片描述
Pull模式

1.2 canopen框架
了解一个协议首先应该掌握它的框架,框架高度概括了CANopen的内容。CANopen主要包含三部分:通信接口、对象字典、应用程序。

通信接口:主要是实现与CAN硬件网络的接口、通信对象以及状态机的使用。这部分是移植CANopen协议的重要部分,因为是根硬件平台相关的。

对象字典:对象字典集合了节点设备上所有影响应用程序对象、通信对象和状态机行为的数据项。它就像是STM32中的一段内存,内存中存放了各种寄存器,访问寄存器需要知道其基地址和偏移地址。基地址就是对象字典中的索引、偏移地址就是对象字典中的子索引。

应用程序:实现对对象字典的操作,对对象字典中的数据进行自定义使用。
因此 , 对象字典是通信对象和应用程序对象之间的接口。
在这里插入图片描述

2 为什么需要canopen协议?
前面提到只用物理层和数据链路层其实已经可以实现数据的通信了,那么为什么还需要上层的CANopen协议呢?

这里做一个比喻:一个将军和十个士兵之间,只要他们的说的语言一样,就意味着他们可以进行谈话交流。但是怎么方便的管理这十个士兵呢(组网)?上岗出勤怎么打开(上线报文)?什么时候需要集合开会交流(广播)?什么时候只需单独和一人交流(点对点)?如何检查上岗期间都在岗位上呢(心跳包)?这些功能可以形成规范,按照规范编写程序,就构成了一套上层的通信协议栈。所以CANopen协议有以下功能:
1、 配置CAN通信网络,组成一个最多128个节点的局域网
2、 以点对点或广播形式发送数据
3、 管理网络,比如可以检测无回应的节点

3 如何实现CANopen协议?
根据相关规范(CiA301)可以自己实现一套CANopen协议栈,主要实现通信接口里的通信对象(NMT,PDO,SDO)、状态机,对象字典,一系列通信机制。当然了,也可以使用开源的协议栈,根据自己的平台来进行移植和配置、修改。开源CANopen的协议栈有一些,这里用的是CANFestival。

3.1 开源canopen协议----CanFestival
有基于python的对象字典编辑器GUI,便于可视化配置节点的对象字典并自动生成源代码。协议栈代码由C语言编写,可跨平台使用,并遵循CiA-301协议规范。

3.2 CanFestival框架
CanFestival也是基于CANopen协议的框架的,通信接口实现定时器、can接口的功能;库实现了SDO/PDO/NMT等通信对象,并实现调度功能以及对象字典的操作接口和回调接口;应用程序实现对象字典和节点回调函数(数据发送、初始化、运行、停止等)。
在这里插入图片描述

3.3 创建一个新的节点
3.3.1 对象字典的环境搭建(开发环境ubuntu 16.04)
1 CanFestival源码
https://bitbucket.org/Mongo/canfestival-3-asc/get/1a25f5151a8d.zip
2 python下载
https://www.python.org/downloads/
3 wxpython下载
https://pypi.org/project/wxPython/#files

首先安装python(建议用python2.7,我用python3.6运行objedit.py有报错,怀疑是不兼容问题),再安装wxpython。

需要注意的是 运行objedit.py还需要Gnosis xml 工具,CanFestival源码中的objdictgen目录中有Gnosis xml,使用方法:

  1. 解压Gnosis_Utils-1.2.2
  2. 将gnosis文件夹copy至objdictgen目录下
    在这里插入图片描述
    3.3.2 对象字典编辑器的使用
    1.终端进入到objdictgen目录 输入 ./objdicedit
    在这里插入图片描述
    若成功,会显示对象字典的GUI,如下图。若没有显示,那么需要检查下python和wxpython是否安装正确,以及是否将gnosis文件夹copy至objdictgen目录下。
    在这里插入图片描述
    2. 创建一个新的节点
    在这里插入图片描述
    点击new菜单,选择节点的类型、名字、协议规范、网络管理。点击OK,如下图,上面是对象字典中的数据分类和分段,包含数据类型、通信参数、SDO参数、PDO通信参数和映射参数等;左下方是对象字典的索引,不同的数据有不同的索引;右下方是子索引,比如TPDO的子索引,包含通信对象ID、传输类型、抑制时间等参数。
    在这里插入图片描述
    这里有个需要理解的是PDO的映射:PDO有两个参数,一是通信参数,二是映射参数,这里的映射参数,子索引中数据的最高16位是PDO的数据在对象字典的索引,中间8位是子索引,最后8位是数据的位数。也就是说,通信双方使用PDO通信时,8字节的数据段全部用来发数据,至于数据存放在什么地址(索引+子索引),由规定的PDO映射关系来确定。
    在这里插入图片描述
    3. 建立对象字典并生成源码
    点击build dictionary菜单,输入字典的名字(建议和节点名一致),选择好保存路径,自动生成.c 和.h 以及.od这三个文件。在移植CANFestival协议栈时会用到。
    在这里插入图片描述
    在这里插入图片描述
    到这里,就建立起一个新节点和对应的对象字典了,接下来就可以根据对应的嵌入式硬件平台来进行协议栈移植了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值