《CANOpen》 学习笔记2

来源:互联网 发布:软件分类号 编辑:程序博客网 时间:2024/05/17 00:17
Edit

《CANOpen》 学习笔记2

《CANOpen 协议 —— PDO 介绍》

注:这里的 PDO 模式有点类似于 TCP/IP 中的 UDP 模式。即『生产者-消费者』模式
本文主要以一个实例进行讲解。

1. 实验目的:

  1. 实例的目的如图所示,实现节点 1 的数据(A,B)传送到节点2,节点3,同时实现节点2传输数据(C,D)至节点3。


2. 手段:

  1. 使用 PDO 进行数据传输

3. 分析:

  1. PDO 通信是基于生产者/消费者模型,主要用于传输实时数据。产生数据的节点将带有自己节点号的数据放到总线上,需要该数据的节点可以配置为接收该节点发送的数据。

4. 过程:

4.1 对象字典的编写:

  1. 对象字典的结构和条目对于所有设备是共同的,本例中采用索引定位,子索引确定对象的思想构建对象字典,方法是使用结构体定义子索引,子索引结构体的成员变量包含对象的属性(读写权限,数据类型,数据长度等)和指向对象的指针,定义索引时包含指向子索引的指针和子索引数目,对象字典各项在代码中采取如图所示的方法来组织结构构建,这样可以方便地通过索引和子索引找到对应的项。对象定义为指针的形式可以通过主站的 SDO 报文进行读写,实现对对象字典的灵活配置,同时这种方式实现通讯层与应用层共享数据比变量的特点。


4.1.1 各节点ID分配表定义



4.1.2 对节点1进行对象字典编写
  1. 节点1发送数据至节点2,节点3,故需要定义 TPDO,我们在此处定义为 TPDO1。节点1的应用数据区,TPDO1 的通讯参数和映射参数在对象字典中的定义分别如表。
    • 应用数据区:

    • 通讯参数:


    • 映射参数:

4.1.3 对节点2进行对象字典编写
  1. 节点2接收来自节点1的数据(A,B),故需要定义 RPDO1;此外节点2数据(C,D)传输至节点3,故需要定义 TPDO2。

  2. 节点2的应用数据表:


此时的索引为 7200h,子索引为 01h,02h 条目中并没有初始值,这两个条目分别用来接收节点1的数据A,B。接收数据后,子索引为01h的条目的值为 2DFFh,子索引为 02h的条目为 C3h。用于存储发送给节点3的数据。

  1. 通讯参数(RPDO1,RPDO2,TPDO2,TPDO1)







4.1.4 对节点3进行对象字典编写
  1. 节点3分别接收节点1和节点2的数据,需要在节点3的对象字典中定义RPDO1,RPDO2,其中 RPDO1 的 COB-ID 需要与节点1的 TPDO1 的 COB-ID 相同。RPDO2 的 COB-ID 要与节点2的 TPDO2 的 COB-ID 一致。


  1. 通讯参数定义(RPDO1, RPDO2):






4.2 节点1发送数据至节点2,节点3

4.2.1 节点1的 TPDO1 报文组装如图所示:


4.2.2 节点2,节点3从总线接收数据:
  1. 由于节点2的RPDO,节点3中的RPDO1的 COB-ID 与节点1的 TPDO 的 COB-ID 一致,故而节点2,节点3可以顺序通过报文过滤从总线中提取数据。


  1. 由于 PDO 的发送方式为广播方式,当节点1的报文发送到总线上时,理论上所有的节点都能接收到该报文,实际上只有与节点1有一致的 COB-ID 的 RPDO 才能接收该报文。
  2. PDO 可以高速传输数据就在于,其实际传输过程只传输实际数据,无需定义传输数据的来源,接受数据后该存放的地址。因为数据的来源,存放地址等信息已在事先由工程师定义完成(即对对象字典的编写)。
1 0