在 CANOpen 创立之初
即使在 CAN 总线应用最广泛的汽车电子行业,网络中的 CAN节点数量和需要通讯的信息都是比较少的
人们使用 CAN 取代 RS485, 主要是看重其可以突发发送的实时性优势
而在多节点、长距离应用中, CAN 总线和 RS485 比起来并无优势
比如同样的波特率下, CAN 的通信距离只能达到 RS485 的 0.6-0.8 倍
而多节点通信 CAN无法进行任意的突发发送
不得不遵循 RS485 那样的轮询通信机制,否则会导致拥堵
就像十字路口的汽车,如果车只有 10 辆,即使没有交通灯,根本不会拥堵
而如果有 100 辆,如果任意行驶,就会发生严重拥堵
CANOpen 的创始人是非常了解 CAN 总线这个特征
所以在设计 CANOpen 时,对其定义为小网络、 控制信号的实时通讯:
网络控制报文均采用数据最小字节数
比如心跳报文,只有 1 个字节数据
实时更新的 过程数据无需接收方报文应答
即采用生产消费模型,降低总线负载
需要接收方确认的配置参数一般都是采用快速单字传输
即 1 个报文最多传送 1 个 32 字节的参数变量,避免了分帧引起的实时性降低
以上这些定义都是 为了节约时间开销,最大限度保证实时性
同时 为了减小简单网络的组态工作量, CANOpen 定义了强制性的缺省标识符(CAN 帧 ID) 分配表
以减少使用者与维护者的学习时间,快速上手
虽然 CANOpen 的通讯发挥了 CAN 的特色,所有节点通信地位平等, 运行时允许自行发送报文
但 CANOpen 网络为了稳定可靠可控,都需要设置一个网络管理主机 NMT - Master(Network Management - Master)
就像一个交响乐团的指挥家,所有节点的启动、停止都是有他进行指挥
NMT 主机一般是 CANOpen 网络中具备监控的 PLC 或者 PC(当然也可以是一般的功能节点)
所以也成为 CANOpen 主站
相对应的其他 CANOpen 节点就是 NMT从机(NMT-slaves)
NMT 主机和 NMT 从机之间通讯的报文就称为 NMT 网络管理报文
管理报文负责层管理、网络管理和 ID 分配服务
例如,初始化、配置和网络管理(其中包括节点保护)
网络管理中,同一个网络中只允许有一个主节点、一个或多个从节点,并遵循主从模式
另外,为了 协调各个节点的同步、心跳、时间、错误 提示等通讯控制
CANOpen 还定义了一系列 特殊协议(Special protocols)报文
CANOpen 预定义报文(Pre-defined CAN-IDs)的 NMT 报文和特殊协议报文
CAN-ID 就是这类报文的 COB-ID, 其中绿色底纹的这些常用是必须需要记住的
CAN-ID 含义,在研发和应用 CANOpen 中,这三类是最为常用的 NMT 与特殊协议报文
用户应用 CANOpen 时
需要传递的 配置信息 和 应用信息 都是放在 过程数据对象 PDO(Process data object)和 服务数据对象 SDO (Service data object)里面
这些对象就和市场上卖水果的箩筐,大小是一样的,只是装的东西(应用数据)不一样
这就是 CiA301 协议 所规定的基础协议——“箩筐”
而 CiA4xx 的子协议或者用户自定义的对象,就是“箩筐”里面的东西
筐已经通过CiA301 协议规定好了,至于筐上要放什么就看自己了
PDO 和 SDO 的通讯区别:
对于 PDO 和 SDO 的报文 ID 分配
为了减少网络的组态工作量, CANOpen 预定义了强制性的缺省标识符(CAN-ID)分配表
该分配表是基于 11 位 CAN-ID 的标准帧格式
将其划分为 4 位的 功能码(Function-ID) 和 7 位的 节点号(Node-ID)
在 CANOpen 里也通常把 CAN-ID 称为 通信对象编号 COB-ID(Communication Object Identifier)
所以可以分清楚两个易于混淆的名称:
COB-ID:
通信对象 ID 号,即 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 节点的输入和输出
所以 PDO 分为 TPDO(发送PDO)和 RPDO(接收PDO)
发送和接收是 以 CANopen 从站节点为参考(如果 CAN 主站就相反)
TPDO 和 RPDO 分别有 4 个数据对象,每种数据对象就是 1 条 CAN 报文封装:
这些都是数据收发的容器
筐为使用者准备好,就看使用者在里面放什么东西了
而 SDO 就相对比较简单固定
发起通讯的 “问”SDO 的 CAN 帧 ID 就是 600h +node-ID
这里的 Node-ID 是被问的节点地址
而被问的节点 “应答” SDO 的 CAN 帧 ID 就是 580h +node-ID
一般在 CANopen 网络中,只有 NMT 主机能发起 SDO 通讯,进行节点参数配置或者关键性参数的传递
当然从节点也可以对其他从节点发起 SDO 通讯
参考:
《CANopen 轻松入门》
相关推荐:
CAN笔记(16) CANOpen简介
CAN笔记(15) STM32-M4 CAN通讯
CAN笔记(14) STM32-M4 寄存器
CAN笔记(13) STM32-M4 bxCAN
CAN笔记(12) 同步
谢谢!