1 CANOpen概述

  • CANopen属于应用层协议:从OSI的7层网络模型的角度来看,CAN现成总线仅仅定义了第1层(物理层)、第二层(数据链路层)。实际开发中,这两层完全是由硬件实现,设计人员无需再为此开发相关软件和固件。

    CANopen 是一个基于 CAN 串行总线的网络传输系统的应用层协议,遵循 ISO/OSI 标准模型。

  • CANopen面对对象设计: 网络管理对象(NMT)、服务数据对象 (SDO)、过程数据对象(PDO)、 同步对象 (SYNC)、紧急报文 (EMCY)

  • CANopen定位为小网络、控制信号的实时通讯: 所以报文采用的CAN标准帧格式,即11bit的ID,以尽量减小传输时间。

  • CANopen是主从模式通信:并不是CAN的所有节点都允许自行发送报文,必须等主站发送,从站需要响应的时候,才能回复。

2 CANopen核心概念

2.1 CANopen帧格式定义

alt text

alt text

功能码就是用来定义:网络管理对象(NMT)、服务数据对象 (SDO)、过程数据对象(PDO)、 同步对象 (SYNC)、紧急报文 (EMCY)

alt text

2.2 CANopen对象字典

CANopen对象字典(OD: Object Dictionary)是CANopen协议最为核心的概念。

  • 对象字典就是一个有序的对象组,描述了对应CANopen节点的所有参数。可以把节点看成一个对象,对象字典就是节点具有的属性。

  • 每个对象采用一个16位的索引值来寻址,这个索引值通常被称为索引,其范围在 0x0000 到 0xFFFF 之间为了避免数据大量时无索引可分配,所以在某些索引下也定义了一个 8 位 的索引值,这个索引值通常被称为子索引,其范围是 0x00 到 0xFF 之间。索引范围及描述如下如所示:

  • 对象字典索引是由CANopen协议自定义的一个地址范围,就是为了对应每个属性。

  • CANopen对象字典中的项由功能、名字、索引、子索引、数据类型、读/写属性,以及这个对象是否必需等构成。

  • 从设备可以被另外设备(比如主设备)通过SDO修改对象字典属性对应的值。比如:修改从属节点的心跳发送频率。

如表所示,为对象字典索引区域定义,其中标绿色底纹的通讯对象子协议区和制造商特定子协议区是用户需要关注的区域。

alt text

2.2.1 通讯对象子协议区

通讯对象子协议区(Communication profile area)定义了所有和通信有关的对象参数,如表2所示,标绿色底纹的索引范围1000h to 1029h为通用通讯对象,所有CANopen节点都必须具备这些索引,否则将无法加入CANopen网络。其他索引根据实际情况进行分配与定义。

2.2.2 制造商特定子协议

alt text

对象字典索引2000h to 5FFFh为制造商特定子协议,通常是存放所应用子协议的应用数据。而上文所描述的通讯对象子协议区(Communication profile area)是存放这些应用数据的通信参数。一般从站模块都是以下这样规定的:

  1. RPDO的通讯参数存放在1400h to 15FFh;映射参数存放在1600h to 17FFh;数据存放为2000h之后厂商自定义区;

  2. TPDO的通讯参数存放在1800h to 19FFh;映射参数存放在1A00h to 1BFFh;数据存放为2000h之后厂商自定义区。 对于在设备子协议中未定义的特殊功能,制造商也可以在此区域根据需求定义对象字典对象。因此这个区域对于不同的厂商来说,相同的对象字典项其定义不一定相同。

2.2.3 标准化设备子协议

标准化设备子协议,为各种行业不同类型的标准设备定义对象字典中的对象。目前已有十几种为不同类型的设备定义的子协议,例如 DS401、DS402、DS406等,其索引值范围为0x6000~0x9FFF。同样,这个区域对于不同的标准化设备子协议来说,相同的对象字典项其定义不一定相同。

3 网络管理(NMT控制)

  • NMT报文是单向命令、从机不会直接应答NMT主站的指令。

  • 但从机的状态变化可以通过心跳或节点守护机制发送到总线。

3.1 从机状态切换

alt text

节点状态切换的命令格式如下:

000(COB-ID) 02(数据位长度) 01(命令符) 00(节点地址,00表示所有节点)

状态切换的命令符定义如下:

  • 0x01:进入操作状态

  • 0x02:进入停止状态

  • 0x80:进入预操作状态

  • 0x81:复位应用层

  • 0x82:复位节点通讯

alt text

节点地址 0x00 表示对所有设备进行操作,可以通过查看心跳帧,确定从机处于那种状态。

3.1.1 示例:所有节点进入操作状态

让CAN总线上所有节点进入操作状态。发送的CAN报文格式如下:

alt text

3.1.1 示例:所有某个节点进入操作状态

让某个节点进入操作状态,发送的CAN报文格式如下:

alt text

3.2 心跳

心跳帧的格式如下:

0x705(COB-ID,节点5) 0x01(数据位长度) 0x05(表示进入操作状态)

以下是心跳帧的一字节数据对应的含义:

//CanFestival-3.0-rc3\include\states.h
enum enum_nodeState {
  Initialisation  = 0x00, 
  Disconnected    = 0x01,
  Connecting      = 0x02,
  Preparing       = 0x02,
  Stopped         = 0x04, /* 停止状态 */
  Operational     = 0x05, /* 操作状态 */
  Pre_operational = 0x7F, /* 预操作状态 */
  Unknown_state   = 0x0F
};

alt text

3.3 节点上线

alt text

3.3.1 节点上线示例

alt text

符合CANopen对NMT节点上线报文的定义:CAN-ID = 0x700 + node-ID(0x05 = 0x705,然后长度01,接着数据段是0。

alt text

4 SDO报文类型

  1. SDO用来访问一个设备的对象字典。

  2. SDO报文,每个发送都会有相应的回复。发送和接收报文都是8字节

  3. SDO有2种传送机制:

    • 快速传送:最多传输4字节数据

    • 分段传送:传输数据长度大于4字节

下面目前只写了快速传送方式。

4.1 快速传送

CANopen使用的是小端模式,即低字节在前,高字节在后。

alt text

  • 命令代码含义如下:

    alt text

4.1.1 快速写

示例:

alt text

alt text

4.1.2 快速读

示例:

alt text

5 RPDO

从站接收数据PDO数据

参考:https://wallace-zhang89.blog.csdn.net/article/details/130187224

6 TPDO

从站发送PDO数据

参考:https://wallace-zhang89.blog.csdn.net/article/details/130188380

参考

参考1:网络管理NMT02 - 节点状态切换命令

参考2:网络管理NMT01 - 节点上线报文与心跳报文

参考3:启动CANopen节点的服务数据对象SDO

参考4:CANOpen轻松入门—对象字典OD

参考5:CANopen笔记1 – SDO服务数据对象

参考6:04_服务数据对象(SDO)