一、简述
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
注意:定义映射时,先设置子索引禁用;再设置相应映射;然后设置映射数量