前言
想学习些新东西了,原本想直接学学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则规定
发起一方的CAN ID固定就是600H+Node-ID(值为被询问的节点地址),回复一方的ID就是580H+Node-ID
一般来说,只有主机能发起SDO,用来配置和关键参数的传递,另外从机也可以对其他从机发送SDO通讯。
PDO的传输形式
PDO可以同步传输,也可以异步传输
异步传输一般由特定的事件来触发。
同步传输一般是主站通过同步报文让所有的从站在同一时刻传输数据。
有细分为周期传输(循环)和非周期传输(无循环)
周期传输通过接收SYNC(同步对象),可以设置1-240个同步对象
非周期传输由远程帧触发或者特定事件对象触发。
PDO的通信参数
PDO通信参数定义了设备的CAN -ID,传输类型,定时周期。
RPDO位于1400H-15FFH
TPDO位于1800H-19FFH
试了试编辑器
PDO的映射参数
它包含了一个对象字典中的对象列表,这些对象映射到相应的 PDO,其中包括数据的长度(单位,位),对于生产者和
消费者都必须要知道这个映射参数,才能够正确的解释 PDO 内容。就是将通信参数、应用数据和具体 CAN 报文中数据联系起来。
RPDO映射参数范围为1600H–17FFH
TPDO映射参数范围为1A00H–1BFFH
对象字典
它描述了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.