CANopen通讯协议笔记
CANopen通讯协议笔记
- CANopen 通信对象编号
- CANopen整体框架
- 网络管理(NMT)
- 主要任务
- 上线报文
- 心跳报文
- 过程数据对象(PDO)
- SDO服务数据对象
- 对象字典概述
CANopen 通信对象编号
CANopen报文传输采用 CAN 标准帧格式。
这里的CAN-ID也叫COB-ID(C通信对象编号),Node-ID节点ID,最大128个,范围0-127。
简易CANopen消息
COB-ID 数据结构解析:
COB-ID:Communication Object Identifier,即 CANopen 中对某种通讯对象的报文帧ID,即 CAN 报文的 11 位 ID。代表了一种通讯含义。
Node-ID:节点 ID 号,即 CANopen 网络中的节点地址,CANopen 规定了逻辑上最大 128 个节点,所以 Node-ID 最大为 128(7 位)。COB-ID 和 Node-ID 无必然联系,但在过程数据对象(PDO)和服务数据对象(SDO)中,COB-ID 中包含了 Node-ID。
CANopen整体框架
网络管理(NMT)
CANopen所有节点通信地位平等,区别于普通的CAN有仲裁判断优先级。
网络管理主机 NMT-Master(Network Management-Master)。采用的主从方式,主机节点可以向从节点发送和请求数据。同一个网络中只能有一个主节点,一个或者多个从节点。NMT 主机和 NMT 从机之间通讯的报文就称为 NMT 网络管理报文。
主要任务
协调各个节点的同步、心跳、时间、错误提示等通讯控制,CANopen 还定义了一系列特殊协议(Special protocols)报文作用指挥所有节点的启动、停止。进入预操作状态、复位节点等。
从下图可以看到,预操作状态与操作状态可以互相切换。
以下表格是各种状态下可以运行或操作的指令
节点只要它上线,就会有一个上线报文消息,之后会有心跳报文持续的发送过来,如果没有心跳报文只有上线报文,可能的原因是1.没有设置心跳报文的间隔时间。2.状态没有跳转到预操作状态。
上线报文
不要误以为CAN-ID:0x705是CANopen节点的身份,CANopen节点的身份是0x05才对。那么0x705是什么意思?? 0x705 = 0x700(心跳报文)+ Node-ID(0x05),其中的Node-ID才是CANopen节点的身份。
符合CANopen对NMT节点上线报文的定义:CAN-ID = 0x700 + node-ID(0x05 = 0x705,然后长度01,接着数据段是0。
心跳报文
CANopen 应用中通常都要求在线
上电的从站定时发送状态报文(心跳报文),以便于主站确认从站是否故障、是否脱离网络。
CANopen 从站按其对象字典中 1017h 中填写的心跳生产时间(ms)进行心跳报文的发送,而 CANopen 主站(NMT 主站)则会按其 1016h 中填写的心跳消费时间进行检查,假设超过诺干次心跳消费时间没有收到从站的心跳报文,则认为从站已经离线或者损坏。
在CANbus总线上发送以下指令:
CANID : 0x00
帧长度:0x02
帧类型:数据帧
数据段:0x02,0x00(总线上所有节点)
有意思的是,CANopen从站收到该命令后,心跳报文停止了。
1、从时间戳上看到,报文是每1秒发送1次。
2、从CANID = 0x705得到,这个是Node_ID = 0x05的CANopen节点发出来的心跳报文。
3、报文的数据段只有1个字节(7F),表示该CANopen节点处于预操作状态。(在该状态下,PDO功能是关闭的)
CANID : 0x00
帧长度:0x02
帧类型:数据帧
数据段:0x80,0x05(Node-ID为0x05的CANopen节点)(单独对0x05节点开启预操作状态)
过程数据对象(PDO)
SDO服务数据对象
SDO服务数据对象 (Service Data object) 采用服务器客户端模式,这种模式的特色是一问一答。注意CANopen主节点是客户端(主要是索取消息),CANopen从节点是服务器(提供消息)。主要工作特定:有指定被接收节点的地址(Node-ID),并且需要指定的接收节点回应 CAN 报文来确认已经接收,如果超时没有确认,则发送节点将会重新发送原报文。
而 SDO 就相对比较简单固定,发起通讯的“问”SDO 的 CAN 帧 ID 就是 600h +node-ID,这里的 Node-ID 是被问的节点地址,而被问的节点应“答”SDO 的 CAN 帧 ID 就是 580h +node-ID。
这里先提下PDO,PDO 和 SDO 的通讯区别在于,PDO 属于过程数据,即单向传输,无需接收节点回应CAN 报文来确认(无需应答,发送之后不管你有没有收到),从通讯术语上来说是属于“生产消费”模型。
由于需要区分每个 CANopen 节点的输入和输出,所以 PDO 分为 TPDO(发送 PDO)和(接收 RPDO),发送和接收是以 CANopen 从站节点为参考(如果 CAN 主站就相反)。TPDO和 RPDO 分别有 4 个数据对象,每种数据对象就是 1 条 CAN 报文封装
PDO 的两种传输方式:同步传输和异步传输。
对象字典概述
通用通讯对象十分重要,NMT 主站(CANopen 主站)在启动时,通常都全部或者部分读取所有从站中通用通讯对象中的索引,所以所有的通用通讯对象都必须在CANopen 从站中实现