CANopen协议基础知识

CANopen协议基础知识

  • 资料: DS301协议中文文档:https://winshton.gitbooks.io/canopen-ds301-cn/content/chapter5.html
    301_v04020005_cn_v02_ro.pdf

  • 总结文档:https://blog.csdn.net/csdn_zhang99/article/details/81251969

  • LS伺服CANopen手册(详细):
    LS伺服CANopen手册 V3.pdf

CANopen协议对CAN协议的封装关系(PDO、SDO、NMT均封装在CAN数据段):

OD(对象字典): 对象字典是通信对象和应用程序对象之间的接口。

PDO(进程数据对象):PDO 的接收不需要消费者的确认,通过DLC设置数据长度(1~8字节),发送数据帧;TPDO发送(生产者),RPDO接收(消费者)。

SDO(服务数据对象):需要应答,直接对帧ID(索引),发送远程帧,DLC无意义

NMT(网络管理对象):帧ID为0x00,D1(数据段Byte1)为CS,D2为NodeID;NMT模块控制不需要应答;NMT 节点保护需要应答;

由生产者发送的 PDO称为发送 PDO(TPDO),同样消费者接收的 PDO 称为接收 PDO(即 RPDO)

1.2.0 COB_ID帧ID

CANopen协议的帧id只有11位,即全是标准帧

COB_ID(11bits)= 功能码(4bits)+Node_ID(7bit)

1.2.1 DO对象字典

从软件的角度来说,对象字典本质就是一些数据结构的集合。可以这么理解,把对象字典看做是一本书,CANopen设备的行为准则是要参考这本书的,不管它做什么,只要它的行为要参考对象字典,就必须先查阅字典,再决定要不要做。比如它什么时候发送TPDO,这个行为是需要查询对象字典中对应于TPDO的传输类型以及Event timer。还有就是像PDO映射的原理,比如我要发送的数据,都是去查询这本书,看下它那里写的什么内容,然后我在把这部分内容以PDO的形式发送出去。
对象字典( OD: Object Dictionary)是一个有序的对象组;每个对象采用一个** 16 位的索引值**来寻址,为了允许访问数据结构中的单个元素, 同时定义了一个 8 位的子索引
对象字典存储在每个CANopen节点的EDS文件中(单片机写入flash),通过SDO服务访问。

  • 轻松掌握CANOpen最难理解的对象字典:https://wenku.baidu.com/view/dfe7551a195f312b3069a5cd.html
  • CANOpen基本对象字典:https://blog.csdn.net/bood123/article/details/49835619
  • 对象字典表示方式:
    | Index (hex) | Object (Symbolic Name) | Name | Type | Attrib. | M/O |
    |----|----|----|----|----|----|
  • index指示了对象在对象字典中的位置。其中不包含子索引;
  • Object列指示了对象的类型;
  • Name是用来表示对象作用的文本;
  • Type指定数据类型。比如Boolean, Usigned8。如果对象是一个复杂类型,比如ARRAY。就会用子索引来指定组成复杂类型的每个基本类型;
  • Attrbi指定了对象的方位类型;
  • M/O指定对象是必须的还是可选的;

分11段不同类别索引,如图

1.2.2 PDO进程数据对象

  • TPDO为生产者、RPDO为消费者。
  • 每个 PDO 在对象字典(OD)中由两个对象描述:通信参数和映射参数
    • PDO 通信参数指明使用哪个 COB-ID,传输类型,禁用时间和定时时间
    • PDO 映射参数用于设定 PDO报文中的数据的映射关系,确定要传输的数据在 CAN 报文数据域中的定位。该参数允许 PDO 的生产者和消费者知道正在传输什么信息。
  • 一个 PDO 最多可以映射 4 个对象(PDO1~PDO4);
  • 每个逻辑设备不限制 PDO 数量,一个只包含单个逻辑设备的 CANopen 设备可以有多至 512 个 PDO
  • 通用子协议 区域在对象字典中的索引为0x****1000-0x1FFF

0x1400-0x15FF 设置**RPDO**** **通讯参数

0x1600-0x17FF 设置RPDO映射参数

0x1800-0x19FF 设置TPDO通讯参数

0x1A00-0x1BFF 设置TPDO映射参数

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

RPDO映射例子:

TPDO映射例子:

1.2.3 SDO服务数据对象

SDO 主要用来访问节点的对象字典(OD),操作分成读字典操作写字典操作,CANOpen的节点至少需要支持SDO_Server。对象字典是CANOpen节点的数据组织形式,包含了 CANOpen节点的各个参数和数据,比如,心跳报文的发送频率、系统启动次数、节点的通信参数等等等等。可以说,SDO是用来设置CANOpen节点的各个运行参数的
从CANopen协议上看,最大支持127个节点

类似串口的一发一回模式,主站发送请求帧,从站回复应答帧

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

Client ==> Server

Server ==> Client

1、假如CAN节点A通过SDO去访问CAN节点B,那么A就是Client,B就是Server;

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

3、且对于A的对象字典,其Server==>Client的COB-ID还是B的COB-ID

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

例子:(11位帧ID段(功能码+节点ID)+8字节数据段)

SDO通讯具体过程分解:

1.2.4 NMT状态机

  • 帧ID为0x000。(仲裁时最高优先级)
  • NMT详解:https://blog.csdn.net/iamplane/article/details/49925185

LS低压伺服驱动器CANopen 状态机 20191101pdf.pdf

1)NMT 模块控制( NMT Module Control)

只有 NMT-Master 节点能够传送 NMT Module Control 报文。 所有从设备必须支持 NMT 模块控制服务。NMT Module Control 消息不需要应答

NMT帧cs字节定义:

#define NMT_Start_Node 0x01

#define NMT_Stop_Node 0x02

#define NMT_Enter_PreOperational 0x80

#define NMT_Reset_Node 0x81

#define NMT_Reset_Comunication 0x82

2) NMT 节点保护( NMT Node Guarding)

通过节点保护服务, NMT 主节点可以检查每个节点的当前状态, 当这些节点没有数据传送时这种服务尤其有意义。

状态决定

你可能感兴趣的:(通讯协议,canopen)