前言
想学习些新东西了,原本想直接学学Ethercat,但是简单看了看对象字典啥的概念一头雾水的,决定先从CANopen开始,Ethercat看着头疼。Etehrcat和CANopen有挺多类似的地方。感谢ZLG的这个入门笔记,我似乎是看懂了些,想写写笔记。
CANopen的ID定义
作为一个CAN的应用层协议
- 采用11位的标准帧的格式
- 数据能少发就少发,能单向就单向,能不分包就不分包,提高实时性。
网络管理,特殊协议报文的ID定义
CANopen中需要定义一个主机,也就是网络管理主机,它负责管理网络中的其他从机。
主机和从机之间会进行一系列的通讯,例如初始化,同步,配置等等网络管理报文和特殊报文。
过程对象数据PDO和服务数据对象SDO
PDO | SDO |
---|---|
单向传输 | 需要应答 |
生产者-消费者模型 | 服务器-客户端模型 |
对于PDO和SDO,协议强制规定了其CAN ID的划分方法。
高4位是功能码,低7位的节点号。CAN ID叫做COB-ID,节点号叫做Node-ID,一个网络最多128个节点。
协议又更进一步的将PDO细分
分成发送PDO和接收PDO,以从站为参考点。TPDO和RPDO各有4个对象,每个对象一条CAN数据
一般来说,只有主机能发起SDO,用来配置和关键参数的传递,另外从机也可以对其他从机发送SDO通讯。
PDO
PDO的传输形式
PDO可以同步传输,也可以异步传输
异步传输一般由特定的事件来触发。
同步传输一般是主站通过同步报文让所有的从站在同一时刻传输数据。
有细分为周期传输(循环)和非周期传输(无循环)
周期传输通过接收SYNC(同步对象),可以设置1-240个同步对象
非周期传输由远程帧触发或者特定事件对象触发。
PDO的通信参数
PDO通信参数定义了设备的CAN -ID,传输类型,定时周期。
RPDO位于1400H-15FFH
TPDO位于1800H-19FFH
试了试编辑器
PDO的映射参数
它包含了一个对象字典中的对象列表,这些对象映射到相应的 PDO,其中包括数据的长度(单位,位),对于生产者和
消费者都必须要知道这个映射参数,才能够正确的解释 PDO 内容。就是将通信参数、应用数据和具体 CAN 报文中数据联系起来。
RPDO通讯参数的1400H-15FFH,映射参数范围为1600H–17FFH,数据存放为2000H之后的厂商自定义区域
TPDO通讯参数的1800H-19FFH,映射参数范围为1A00H–1BFFH,数据存放为2000H之后的厂商自定义区域
我再试了试ZLG他们自己家的工具打开它教程中说的那个ESD文件,看了看TPDO的映射,不得不说,它这个工具确实是好用一些。
SDO
SDO则规定
发起一方的CAN ID固定就是600H+Node-ID(值为被询问的节点地址),回复一方的ID就是580H+Node-ID
快速SDO协议
就是一次最多传输4字节的SDO通信,一次来回就完成的。
普通SDO协议
就是需要传输超过4字节的数据,就需要弄分包了
下载协议
上传协议
对象字典
它描述了CANopen节点中的所有参数,它可以以EDS文件的形式进行传递。
其中的每一个对象都采用16位的索引来寻址,范围0-0xFFFF
某些索引下又定义了8位的子索引,范围0-0xFF
每一个索引内具体的参数,最大支持用4字节表示。
每一个具体的参数,都包含名字,索引,子索引,数据类型,是否必须,读写属性。
用的最多的就是DS301子协议,其他的子协议都是对301的补充和扩展。
对象字典区域的定义如下:
我这里打开一个CANopen的对象字典编辑器给看了看,加深印象
通讯对象子协议区
其中1000H-1029H是所有CANopen设备都要用到的。
通用通讯对象
主站在启动时,通常都全部或者部分读取所有从站中通用通讯对象中的索引,所以所有的通用通讯对象都必须在
CANopen 从站中实现。
这里我也在字典对象编辑器里看到了他们的身影~
制造商特定子协议
对象字典索引 2000H to 5FFFH为制造商特定子协议,通常是存放所应用子协议的应用数据,这里就可以允许用户自定定义需要的参数。
标准化设备子协议
这些就是为不同行业的设备定义的对象字典了,范围从0x6000H-0x9FFF
CANopen的主站
节点状态
任何一个CANopen节点都包含这6种运行状态
- 初始化
- 应用层复位
- 通讯复位
- 预操作状态
- 操作状态
- 停止状态
主机是可以通过主站命令让从站进行状态切换的
节点上线报文
从站用来提示主站,自己已加入网络或者避免与其他从站ID冲突,必须发,ID为700H+Node-ID,数据就是1个字节0
节点状态与心跳报文
心跳报文的CAN ID为700H+Node-ID,数据就是1个字节,反映节点的状态,04h为停止状态,05h为操作状态,7Fh为预操作状态。
我也去编辑器里试了试这个心跳生产者时间1017H和检查时间1016H的设置
节点守护
早期的CANopen通过轮询从站的方式监测从站。
通过远程帧来实现。
后期由于CAN总线种远程帧逐渐淡出使用,现在都是用心跳报文来做的了
主站节点状态切换命令
CAN-ID是最高优先级的0,数据两个字节,第一个字节是命令类型,第二个字节是被控制的Node-ID,如果需要控制所有节点就写0.
特殊协议
同步协议
就是每个从节点都以该同步报文作为PDO的触发参数。
一般同步报文由 NMT 主机发出,CAN 报文的数据为 0 字节。
一个网络内有 2个同步机制,就需要设置不同的同步节拍,比如某些节点按 1 个同步帧发送 1 次 PDO,其
他的节点收到2个同步帧才发送1此PDO,所以这里PDO参数中的同步起始值就起了作用。
在同步协议中,有 2 个约束条件
同步窗口时间: 索引 1007h约束了同步帧发送后,从节点发送 PDO 的时效,即在这个时间内发送的 PDO 才有效,超过时间的 PDO 将被丢弃。
通讯循环周期: 索引 1006h规定了同步帧的循环周期。
时间戳协议
CAN-ID 为100H,长度为6,数据为当1984年1月1日0时起。
紧急报文协议
CAN-ID 为80H+Node-ID,数据包含8个字节。
与 PDO 的生产禁止时间类似,紧急报文也有生产禁止时间,存储在对象字典的 1015h
中,为了限制节点不断发送紧急报文,导致总线负载过大。