CAN 总线是一种串行通信协议,具有较高的通信速率的和较强的抗干扰能力,可以作为现场总线应用于电磁噪声较大的场合。

由于CAN 总线本身只定义ISO/OSI 模型中的第一层(物理层)和第二层(数据链路层),通常情况下 CAN 总线网络都是独立的网络,所以没有网络层。

在实际使用中,用户还需要自己定义应用层的协议,因此在 CAN总线的发展过程中出现了各种版本的CAN应用层协议,现阶段最流行的CAN应用层协议:CANopen协议

CANOpen用来收发数据的通信对象有 SDO(Service Data Object)和 PDO(Process Data Object)

一、协议报文结构

1.1 COB-ID(11/29位)

COB-ID(11) = Function Code(4)  + Node ID(7) (或其他),如图所示:

Function Code( 二进制):
EMCY:0001;
PDO:0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010;
SDOrx : 1011;
SDOtx : 1100;
NMT error control : 1110;
NMT : 0000;
SYNC : 0001;
TIME STAMP : 0010;

例子:182H=0001 1000 0010(B)
11bit为 0011 0000 010:前四位0011为功能码PDO,后四位为节点号,10=2即节点为2.

表 1    功能码

1.2 数据域 (0-8字节)

1.3 CMD命令字(数据域1st字节)

1.4 对象索引(数据域2nd-3rd字节)与子索引(数据域4th字节)

二、SDO和PDO的区别

CANOpen包括多种通信方式:主从站方式、客户服务器方式以及生产者消费者模式。SDO使用客户服务器模式。其中PDO采用生产者消费者模式。

2.1 SDO

SDO(Service Data Object)服务数据对象,用来传输非时间关键数据。服务确认是 SDO 的最大的特点,为每个消息都生成一个应答,确保数据传输的准确性。

使用对象字典的 Index 和 SubIndex 来实现(客户端)节点访问CAN(服务端)节点的对象字典,可以读或者写。 Refer:CAN Open基础知识 (taodudu.cc)

由于SDO(常规)需要用到 Index和 SubIndex,所以一次最多传输4个字节,而PDO一次最多可以传输8个字节。

另外,SDO还有很多其它传输功能,这里就不细说了,有兴趣的可以看官方Spec。

2.2 PDO

PDO(Process Data Object)过程数据对象,8字节全部用来传输实时数据,提供对设备应用对象的直接访问通道,它用来传输实时短帧数据,具有较高的优先权。PDO 传输的数据必须少于或等于 8 个字节,PDO 的 CAN 报文数据域中每个字节都用作数据传输,因此,在应用层上不包含传输控制信息,报文利用率极高。

PDO 通信是基于生产者/消费者的通讯模式[13],如图 3-3 所示,每个 PDO 有一个唯一的标识符且可以通过一个节点发送,但有多个节点可以接收。由生产者发送的 PDO称为发送 PDO(TPDO),同样消费者接收的 PDO 称为接收 PDO(即 RPDO)。PDO 的接收不需要消费者的确认。

而PDO则不使用Index和SubIndex,它是两个CAN(生产者、消费者)节点间约定好传输的数据内容对应哪些对象字典索引,收到数据后就直接读写相应的对象字典索引里的值。

2.2.1 PDO传输与触发方式

PDO 的两种传输方式:同步传输和异步传输。1、2为异步传输,3、4为同步传输。

1) 异步传输(由特定事件触发)

其触发方式可有两种, 第一种是由设备子协议中规定的对象特定事件来触发(例如,定时传输,数据变化传输等)。第二种是通过发送与 PDO 的 COB-ID 相同的远程帧来触发 PDO的发送。 目前应用中的异步传输基本都采用第一种。

2) 同步传输(通过接收同步对象实现同步)

同步传输就是通过同步报文让所有节点能在同一时刻进行上传数据或者执行下达的应用指令,可以有效避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题。 一般发送同步报文的节点是 NMT 主机。

PDO通讯具有三种触发模式:内部事件驱动或内部定时器触发、同步触发、远程请求触发

1) 内部事件驱动或内部定时器触发。通讯由某一事件触发。例如数字 I/O 口状态改变,超过预先设定的值、定时器中断等都会触发节点发送一个 PDO。这种模式可使总线负载达到最小,在相对低的波特率下获得比较高的通讯特性。

2)同步触发。同步触发 PDO 是指 CANopen 节点收到由管理节点发出的同步报文(同步对象 Sync)之后,根据触发报文条件向总线发出 PDO 报文。同步传输又分为周期性和非周期性,周期性是指 CANopen 节点接收到一定数量的同步报文之后才开始发送;非周期性 PDO 是指 PDO 触发条件成立之后,当收到下一个同步对象后马上发送PDO。

3) 远程请求触发。PDO 消费者可以给 PDO 生产者发送远程 PDO 请求,相应 PDO 生产者将对远程帧做出响应,向总线上发送相应的 PDO 数据。

PDO 通讯时的触发模式由 PDO 通信参数中的传输类型来确定,传输类型是一个 8位无符号整数,这个传输类型值的大小与 PDO 触发方式的对应关系如下表所示。

SYNC为同步帧,RTR为远程帧,Event为事件例如定时器或者值改变。其中B表示都需要,而O代表一个或者多个触发条件满足就发送。

 a) 00h:非循环同步
  只能异步发送(即接收到发送请求或者主动发送),接收到SYNC帧不会发送。
 b) 01h:循环同步
  根据TestSlave_obj1400_SYNC_start_value里面设置的值接收到SYNC的个数发送一次。
 c) FCh:远程同步  
  当收到PDO请求,若该PDO_status的状态位PDO_RTR_SYNC_READY置位(会在接收到SYNC信号调用的_sendPDOevent中BuildPDO并置该位),则直接发出PDO的最后一帧。
 d) FDh:远程异步  
  当收到PDO请求(SendPDORequest)后立即BuildPDO发送被请求的PDO帧(cob_id标示)。
 e) FEh:异步,制造商特定事件和 FFh:异步,设备子协议特定事件  
  调用sendPDOevent()(未被阻止inhibited)后建立PDO并检查其PDO帧与上一次发送(PDO_status.last_message)的PDO帧内容是否发生变化,若发生变化则发送,否则不发送。接收到SYNC帧不会发送该帧。但是若接收到PDO请求则强制建立并发送。

2.2.2 PDO描述

每个 PDO 在对象字典中由两个对象描述:通信参数映射参数

通信参数:定义了该设备所使用的COB-ID,传输类型,禁用时间和定时时间;决定该节点需要接收来自哪个节点的数据,或者将数据发送给哪个节点。对于从节点,由于发送数据桢是广播的,因此不需要设置该参数;对于主站的发送数据桢 Preq,需要设置该参数,来标示该数据桢是发送给哪个从节点的。
      RPDO通讯参数位于对象字典索引的1400h to 15FFh,TPDO通讯参数位于对象字典索引的1800h to 19FFh。 每条索引代表一个PDO的通信参数集,其中的子索引分别指向具体的各种参数。

映射参数:映射参数包含了一个对象字典中的对象列表,其中包括数据的长度(单位,位),指定PDO传输数据在对象词典中的位置索引,也就是确定对象字典中的对象(Object)与数据包中数据(域)段的对应关系。决定该节点如何组成要发送的CAN报文或者如何解析收到的数据包。而不需要在 CAN 报文中增加额外的协议控制信息,使传输的效率达到最高。一个 PDO 最多可以映射 64 个对象。

注:PDO映射相当于定义该PDO的数据组成成分,相当于将各个映射到的索引所指示的内容拼接成一个PDO帧发送。

2.2.1.1 TPDO通讯参数

0x1800-0x1807

TPDO映射参数

0x1A00-0x1A07

2.2.2.2 RPDO通讯参数

0x1400-0x1407

RPDO映射参数

0x1600-0x1607

2.2.3 对象字典:通信参数、映射参数、数据区

上图,这就是PDO的配置过程:
0x1402(接收PDO通讯参数),PDO使用的cob-id,传输类型,Inhibit time,EventTimer。
0x1602(映射对象),上例中映射为Controlword,Target position。

2.2.3.1 字典编辑器Objdictedit 实例如下图:

2.3 PDO的COB-ID

PDO有2种,TPDO和RPDO,一个用来发送,一个用来接收。由生产者定义并发送的 PDO称为发送 PDO(TPDO),同样消费者定义并接收的 PDO 称为接收 PDO(即 RPDO)

注意:PDO通信参数里需要设置COB-ID。发送方与接收方,双(或多)方是通过COB-ID, 来匹配的,而不是对象字典的 索引Index 和 子索引SubIndex。

对于TPDO来说,其通信参数中的COB-ID是 自身 的COB-ID,当发送TPDO时用来表明这个TPDO是谁发出的。
    对于RPDO来说,其通信参数的COB-ID是 发送方 的COB-ID,用来表示自己只接受某个CAN节点发过来的TPDO。

2.4 SDO的COB-ID

SDO中的COB-ID有2个,分为:

Client ==> Server
Server ==> Client
乍一看有点晕,如果我们换个角度思考下就容易理解了,假如CAN节点A通过SDO去访问CAN节点B,那么A就是Client,B就是Server。

类似于平时上网时去打开百度,需要在浏览器的地址栏里输入百度的地址,然后就可以打开百度了。网民是Client,百度是Server,百度的网址就是Client==>Server的COB-ID。

这样在A的对象字典里,设置 Client==>Server的COB-ID为B的COB-ID

而A的Server==>Client的COB-ID怎么设置呢?当A发送SDO给B时,B收到SDO后会回传一个SDO给A来表示应答。之前说了,A访问B,A是Client,B是Server,现在B回传一个应答SDO给A,那么路径就是Server==>Client,这样对于A来说,其 Server==>Client的COB-ID还是B的COB-ID,用来表示收到的应答SDO是来自Server的。

可能会想到B的这两个COB-ID干嘛去了呢,对于B来说,只有B是Client时才会用到这2个COB-ID,如果B通过SDO去访问A,那么B的Client==>Server和Server==>Client的COB-ID就是A的COB-ID了。

CANopen中SDO、PDO、以及COB-ID理解相关推荐

  1. CANOpen中SDO和PDO的COB-ID理解

    CANOpen用来收发数据的通信对象有SDO(Service Data Object)和PDO(Process Data Object) 一 SDO和PDO的区别 SDO使用对象字典的Index和Su ...

  2. canopen pdo通信c语言,CANopen通信之PDO通信

    过程数据对象(Process Data Object,PDO)是用来传输实时数据的,提供对设备应用对象的直接访问通道,它用来传输实时短帧数据,具有较高的优先权.PDO 传输的数据必须少于或等于 8 个 ...

  3. 基于STM32F4的CANopen快速SDO通信(超级详细)

    基于STM32的CANopen快速SDO通信 前言 1 快速sdo介绍 2 工程配置 2.1 主站词典配置 2.2节点词典配置 3 快速SDO调用代码 4 末尾 本专题相关教程: 基于STM32F4的 ...

  4. 【实践】NLP领域中的ERNIE模型在阅读理解中的应用

    使用ERNIE在DuReader_robust上进行阅读理解 1. 实验内容 机器阅读理解 (Machine Reading Comprehension) 是指让机器阅读文本,然后回答和阅读内容相关的 ...

  5. 对ajax中onreadystatechange事件执行流程的理解

    对Ajax中onreadystatechange事件执行流程的理解 onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务. 每当 readyState 改 ...

  6. Java中关于进程和线程的理解

    进程:进程是操作系统的基础结构,是一次程序的执行,是一个程序及其数据在处理机上顺序执行所发生的的活动,是程序在数据集合上运行的过程,它是操作系统进行资源调度和分配的一个  独            立 ...

  7. Android项目中出现的Plugin with id ‘kotlin-android‘ not found解决方法

    Android项目中出现的Plugin with id 'kotlin-android' not found解决方法 参考文章: (1)Android项目中出现的Plugin with id 'kot ...

  8. html怎么在页面中获取操作用户的id,CSS ID 选择器详解

    类选择器还是 ID 选择器? 在类选择器这一章中我们曾讲解过,可以为任意多个元素指定类.前一章中类名 important 被应用到 p 和 h1 元素,而且它还可以应用到更多元素. 区别 1:只能在文 ...

  9. VMware找不到父磁盘 父虚拟磁盘在子虚拟磁盘创建之后被修改过。父虚拟磁盘的内容 ID 与子虚拟磁盘中对应的父内容 ID 不匹配

    在移动VMDK磁盘或者更改操作系统后,往往会出现"VMware找不到父磁盘 父虚拟磁盘在子虚拟磁盘创建之后被修改过.父虚拟磁盘的内容 ID 与子虚拟磁盘中对应的父内容 ID 不匹配" ...

最新文章

  1. zabbix安装--LAMP环境下
  2. 审计署计算机培训心得体会,审计署计算机中级培训心得体会
  3. 题目1166:迭代求立方根
  4. java按位取反“~“运算符,负数右移
  5. 【语义分割】OCRNet:Object-Context Representations for Semantic Segmentation
  6. 我真out了,高端人士都这样玩儿?
  7. 前端使用js发起http请求的几种方法
  8. nohttp网络框架
  9. Matlab常用的标记符号和颜色
  10. 绕过PDF阅读编辑要VIP才能无水印保存的方法
  11. ubuntu14.04 + dlib19.2+【 C++ 】+Face Landmark Detection
  12. 七周成为数据分析师 第七周:Python
  13. Navicat Premium远程连接ORACLE
  14. 运维就是一场没有硝烟的战争
  15. TI DSP各种库文件
  16. 梆梆爱加密java反调试绕过
  17. java scavenge_Java虚拟机(JVM)垃圾回收器Parallel Scavenge收集器 - Break易站
  18. 【随笔记】NDK 编译开源库 SQLite3
  19. Nginx之一:Nginx的编译安装
  20. java毕业设计能源控制系统mybatis+源码+调试部署+系统+数据库+lw

热门文章

  1. PS合成不会做阴影?自学 Photoshop 2022 Mac版,悬空?一眼假?这招屡试不爽
  2. Elasticsearch TLS 激活:X-Pack 安全性
  3. RISC-V嵌入式开发准备篇1:编译过程简介
  4. Java——计算圆面积
  5. mobaxterm 传文件夹_MobaXterm怎么上传文件-MobaXterm实现linux和windows之间传输文件的具体步骤...
  6. 批量新建文件夹的方法步骤
  7. 产业区块链:像投资股票一样投资数字资产
  8. Android ViewPager简单实现 - 倒计时、引导页左右滑动
  9. 爬取boss直聘网上海地区python相关职业招聘信息
  10. Windows10锁屏 Windows聚焦功能不生效解决方案(Windows 10 1909版)