CANopen之SDO,PDO

时间:2024-02-19 13:09:02

一、简述

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

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

没有网络层。在实际使用中,用户还需要自己定义应用层的协议,因此在 CAN总线的发展过程中出现了各种版本的CAN应用层协议,

现阶段最流行的CAN应用层协议CANopen协议。

二、服务数据对象(SDO)

  SDO提供了直接访问CANopen设备对象字典的入口,入口条件包括数据类型及大小;任何类型的SDO传输都由客户端发起,数据

字典持有者是服务器,客户端和服务器都可以主动中止传输。

  请求读或写的节点是客户端节点;读取或写入数据的节点是服务器节点;

  读或写一个4字节或少于的数据,最简单的方法是使用SDO upload/download expedited protocol 。

1、SDO Upload expedited protocol 

  在服务器节点对象字典去读数据0xd0d1d2d3 。

  客户端请求:

 

 

 

 

 

 例1:数据 0xFE ,对象字典节点5 ,  索引 index 0x1400, 子索引 subindex 2 

客户端请求   : 605 40 00 14 02 00 00 00 00 

若成功,应答: 585 4F 00 14 02 FE 00 00 00

例2:数据 0x60120208 ,对象字典节点5 ,  索引 index 0x1802, 子索引 subindex 1

客户端请求   :605 40 02 18 01 00 00 00 00 

若成功,应答:585 60 02 18 01 08 02 12 60

2、SDO Download expedited protocol

  在服务器节点对象字典去写数据0xd0d1d2d3,(注意数据是最低有效位先写)。

  客户端发送:

 

 

 例1:数据 0xFE ,对象字典节点5 ,  索引 index 0x1400, 子索引 subindex 2 

客户端请求   : 605 2F 00 14 02 FE 00 00 00

若成功,应答: 585 60 00 14 02 00 00 00 00

 例2:数据 0x60120208 ,对象字典节点5 ,  索引 index 0x1802, 子索引 subindex 1

客户端请求   :605 23 02 18 01 08 02 12 60

若成功,应答:585 60 02 18 01 00 00 00 00

3、SDO 中止信息(SDO abort protocol )

  SDO 中止信息是主机在从机进行 SDO 通讯时,从机收到 SDO 后, 如果判断为 SDO 需要中止,就会返回中止信息给主机。

三、过程数据对象(PDO) 

  由对象字典提供PDO数据和配置的接口,数据字典中对应的映射结构决定了一个PDO的数据类型和映射关系。如果CANopen设备

支持可变映射PDO,可通过SDO实现对PDO在数据字典中对应的配置进行修改。  

1、Transmit - PDO (TPDO)

 i :Index 1800 + n,subindex 01 ,COB_ID(通讯对象的标识符):包含CAN-ID和附加控制位的标识符

对于TPDO来说,其通信参数中的COB-ID是自身的COB-ID,当发送TPDO时用来表明这个TPDO是谁发出的。

ii :Index 1800 + n,subindex 02, 写传输类型 t,

               t = 1 -- 0xF0:同步,时间触发模式 ,每 t 一周期

               t = FD    :收到PDO请求后

               t = FE    :事件驱动(制造商指定)

               t = FF    :事件传输,节点自发传输PDO

iii:Index 1800 + n, subindex 03,抑制时间。

  如果传输类型设置为FE和FF,它是最小的PDO传输间隔,单位100us,值为0禁用抑制时间。PDO 报文需要延时 t × 100us

时间才发出,以此避免在多PDO 报文同时发出时,引起的时间冲突 。

iiii:Index 1800 + n, subindex 05,时间定时器。

  如果传输类型设置为FE和FF,它是PDO传输间隔,单位ms,值为0禁用。t =0xCB,200ms。

iiiii:Index 1A00 + n,定义映射

  subindex 0 :定义映射数量(1 byte)。值 0,映射禁用;值 01,子索引01有效;值 02,子索引01--02有效......

  subindex 1 :映射第一个参数。格式,index (2 bytes) – subindex (1 byte) – size (1 byte)

  subindex 2 :映射第二个参数。格式,index (2 bytes) – subindex (1 byte) – size (1 byte) 

 

一个例子:

605 2F 00 18 02 FF 00 00 00   --设置索引Index 1800,事件传输

605 2F 00 18 05 CB 00 00 00  --设置索引Index 1800,时间间隔200ms

605 2F 00 1A 00 00 00 00 00  --设置子索引禁用

605 23 00 1A 01 10 00 30 40  --0x40300010,设置映射索引0x4030,子索引00,大小0x10(16位)

605 23 00 1A 02 20 00 10 20  --0x20100020,设置映射索引0x2010,子索引00,大小0x20(32位)

605 2F 00 1A 00 02 00 00 00  --设置映射数量,用多少设多少,这里用了01--02

注意:定义映射时,先设置子索引禁用;再设置相应映射;然后设置映射数量

2、Receive - PDO (RPDO)

 i :Index 1400 + n, subindex 01 ,COB_ID(通讯对象的标识符)

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

 ii :Index 1400 + n, subindex 02,写传输类型 t,              

               t = 1 -- 0xF0:同步,时间触发模式 ,每 t 一周期

               t = FD    :收到PDO请求后

               t = FE    :事件驱动(制造商指定)

               t = FF    :事件传输,节点自发传输PDO

iii:Index 1600 + n,定义映射

  subindex 0 :定义映射数量(1 byte)。值 0,映射禁用;值 01,子索引01有效;值 02,子索引01--02有效......

  subindex 1 :映射第一个参数。格式,index (2 bytes) – subindex (1 byte) – size (1 byte)

  subindex 2 :映射第二个参数。格式,index (2 bytes) – subindex (1 byte) – size (1 byte) 

 

一个例子:

605 2F 00 14 02 FF 00 00 00    --设置索引Index 1400,事件传输

605 2F 00 16 00 00 00 00 00  --设置子索引禁用

605 23 00 16 01 10 00 30 40  --设置映射索引0x4030,子索引00,大小0x10(16位)

605 2F 00 16 00 01 00 00 00  --设置映射数量,用多少设多少,这里用了01

注意:定义映射时,先设置子索引禁用;再设置相应映射;然后设置映射数量

 

本文链接:https://www.cnblogs.com/listxue/p/12826714.html