CAN现场总线只定义了OSI网络模型的第一层(物理层) 和第二层(数据链路层) ,而这两层一般已被CAN硬件完全实现了。由于没有规定应用层,本身并不完整,需要一个高层协议来定义CAN报文中的11/29位标识符和8字节数据的使用。而且,随着CAN总线的广泛应用,国内外很多公司都开发出使用CAN总线的控制设备,为了使各种CAN设备可以互相兼容,需要一个开放的、标准化的高层协议来实现各种CAN设备进行标准的、统一的通讯。

  CANopen协议的子协议——实时伺服驱动和运动控制协议(CiA DSP402)是专门针对驱动装置和运动控制装置等运动控制系统的协议规范,该协议定义了伺服驱动器、变频器和步进式电机控制器的功能特性,它还指定了多种操作模式和相应的组态参数。CANopen协议的特点尤其是 DSP402 子协议的针对性决定了其适用于分布式运动控制系统。CANopen协议目前还没有开放的协议源代码,用户使用该协议时可以选择购买或者根据自己的需求进行编程实现。

  • CANopen和CAN报文关系

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

  • 术语

  COB —— 通讯对象,在 CAN 网络上的一个传输单元。Communication object; a CAN message

  SDO —— 服务数据对象,一种COB。主要用来在设备之间传输大的低优先级数据,典型的是用来配置CANopen网络上的设备。

  PDO —— 进程数据对象,一种COB。用来传输实时数据,比如控制命令、给定值和实际值。

  EDS —— 电子数据表。 EDS 文件包含关于节点及其对象字典的信息。

  NMT —— 网络管理。它负责CAN 网络上的初始化、配置和故障处理。

  OD  —— 对象字典。对象字典是所有数据结构的集合,这些数据涉及设备的应用程序、通信以及状态机,对象字典利用对象来描述CANopen设备的全部功能。对象字典位于通信层和用户层之间,它的作用主要是为用户提供服务接口。

  • COB-ID

  CANopen 是一个基于 CAN (控制局域网)串行总线系统和 CAL( CAN 应用层)的高层协议。 CANopen 的核心概念是设备对象字典( OD: Object Dictionary),CANopen 通讯通过对象字典( OD)能够访问驱动器的所有参数。

  COB-ID(通讯对象标识符)分配:

  The type of COB transmitted is indicated in the arbitration field of the message, and thereby determines its priority. 注意:PDO/SDO 的发送/接受是由( slave)CAN节点方观察的。即要发送SDO数据帧给设备(如驱动器),COB应为SDO-Receive类型。

  • SDO

  SDO 用来访问一个设备的对象字典。访问者被称作客户 (client),对象字典被访问且提供所请求服务的 CANopen 设备别称作服务器(server)。客户端的 CAN 报文和服务器的应答CAN 报文长度为8个字节(注意不是所有的数据字节都包含有效信息,不够8字节的要补0)。SDO主要用于CANopen主站对从节点的参数配置。服务确认是SDO的最大的特点,为每个消息都生成一个应答,确保数据传输的准确性。When using SDOs, it is important to remember that: An SDO has a lower priority than a PDO;An SDO session is not complete until it is confirmed.

  SDO的通讯原则很简单,发送方(客户端)发送CAN-ID为600h+Node-ID的报文,其中Node-ID为接收方(服务器)的节点地址,数据长度均为8字节;接收方(服务器)成功接收后,回应CAN-ID为580h+Node-ID的报文。这里的Node-ID依然是接收方(服务器)的节点地址,数据长度均为8字节。如下图所示。

  SDO 有 2 种传送机制:

1. 快速传送(Expedited transfer) :   最多传输 4 字节数据
2. 分段传送(Segmented transfer): 传输数据长度大于 4 字节

  最常用最常见的SDO协议是快速SDO,所谓快速,就是1次来回就搞定。前提是读取和写入的值不能大于32位。通过快速SDO,可以直接对CANopen节点的对象字典中的值进行读取和修改,所以在做参数配置之外,也经常作为关键性数据传输之用。比如CANopen控制机器人的电机转动角度时,就使用SDO来传输,保证可靠到达。当需要传输的值超过32位时,就不能使用快速SDO传输。必须使用普通SDO进行分帧传输。在应用中较少用到,一般用于CANopen节点的程序固件升级,或者做网关转换MVB总线之类数据最大可达256位的应用。

  读指令的详细信息参考DS-301协议中的Chapter4.3 Initiate SDO Upload Protocol;写指令参考Initiate SDO Download Protocol.

  比如读取设备对象字典0x1000处的内容(假设为32位数据0x00020192),发送的数据格式如下:

  返回数据格式如下:

  下面是写指令的例子(假设设备节点地址为1,COB-ID = 功能码 + 节点地址),在对象字典0x607F处写入数据0x50000。0x22为SDO命令,具体代表的意思要参考DS301手册

====================================================================================================================

注意:CANopen使用的是小端模式,即低位字节在前,高位字节在后!

错误报文代码参考Abort SDO Transfer Protocol章节

参考:

http://www.zlg.cn/can/article/detail/id/753.html

http://www.cnblogs.com/winshton/p/4897163.html

CANopen笔记1的更多相关文章

  1. CANopen笔记2

    PDO 过程数据对象用于在节点之间传送过程数据,如I/O模块I/O状态读取和设定,模拟量采集和模拟量输出等等,协议考虑从机硬件限制最多支持4组PDO,每组包含一个RPDO和一个TPDO.The Gol ...

  2. CANopen——笔记

    1. c语言的typedef高级用法 typedef void (*post_sync_t)(CO_Data*); http://zhidao.baidu.com/link?url=_lDBGq_uk ...

  3. 【转】(笔记)CANopen协议【CANFestival】移植方法

    一.背景 CAN组网就必须得要应用层协议,原因就在于 * 便于网络管理与控制 * 确认数据的收发 * 发送大于8个字节的数据块(CAN每帧数据传输大小为8字节) * 为不同节点分配不同的报文标识符 * ...

  4. (笔记)CanOpen协议【CanFestival】移植方法 支持VC、QT、STM32

    转自http://bbs.21ic.com/icview-878522-1-1.html   前段时间学习了CanOpen协议,到网上下载的CanFestival3-10源码,移植到VC.QT.STM ...

  5. (笔记)CANOpen移植(CanFestival移植)

    在网上下载CanFestival源码最新版本CanFestival-3-884a60cbb83e建立以下文件夹:inc文件夹:放LM3S8962硬件相关以及驱动部分的头文件,adc.h.hw_adc. ...

  6. 基于CANopen DSP402的运动控制笔记

    常用的mode of operation 有以下几种: 控制字 control word: 6--------------7---------------15--------------------7 ...

  7. Apollo学习笔记(一):canbus模块与车辆底盘之间的CAN数据传输过程

    Apollo学习笔记(一):canbus模块与车辆底盘之间的CAN数据传输过程 博主现在从车载自组网信道分配和多跳路由转向了自动驾驶,没啥经验,想快些做出来个Demo还是得站在巨人的肩膀上才行,我选择 ...

  8. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  9. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

随机推荐

  1. 帮初学者改代码——playerc之“练习:求完数问题”(上)

    原文:“练习:求完数问题” 原代码: // #include <stdio.h> #include <stdlib.h> #include <math.h> #de ...

  2. 【NOIP模拟赛】秦时明月

    秦时明月 (sword.cpp/c/pas) [问题描述]   卫庄与盖聂又要论剑了,因为渊虹和鲨齿都是天下名剑,论剑容易互相损伤,太过可惜,于是两位换了两把木剑.因为木剑质地不匀,剑的每一段都有一个 ...

  3. OpenStack 镜像制作

    Contents [hide] 1 Centos6.5 img制作 1.1 基础环境安装 1.2 下载或从本地上传系统镜像 1.3 启动服务 1.4 建立镜像文件 1.5 通过virt-install ...

  4. 提高PHP性能的实用方法+40个技巧优化您的PHP代码

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数" ...

  5. C#:WPF绘制问题

    1.问题描述:切换画笔后,鼠标呈现画笔,但绘制界面需要点击后才能绘制,体验比较差 注:如果将切换为画笔或橡皮擦的功能放在二级菜单中则无次问题 解决方法(大体如此): 1)在第三方中,先创建完绘制画面和 ...

  6. Asp.net Vnext api CORS( 跨域)

    概述 跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的.CORS系统定义了一种浏览器和服务器交互的方式 ...

  7. css样式(二)(伪类 | 伪元素 | 导航 | 图像拼合 | 属性选择器 )

    一.rgb值: RGBA 颜色 RGBA 颜色值得到以下浏览器的支持:IE9+.Firefox +.Chrome.Safari 以及 Opera +. RGBA 颜色值是 RGB 颜色值的扩展,带有一 ...

  8. mysql5.5.x升级到mysql5.6.x

    大概步骤是: 把配置文件添加:skip-grant-tables参数,把basedir升级成新版本,启动mysql,执行命令:mysql_upgrade升级一下字典信息,然后flush privile ...

  9. css常用命名规则

    (一)常用的CSS命名规则 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrappe ...

  10. [STL]set/multiset用法详解[自从VS2010开始,set的iterator类型自动就是const的引用类型]

    集合 使用set或multiset之前,必须加入头文件<set> Set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素. sets和mul ...