目录
一、简介
CANopen是一种使用在CAN总线上了高层应用层的协议,其还包括LSS等子协议。
CANOpen遵循CAN2.0B的协议标准.数据帧组成如下:
帧起始 | 仲裁域 | 控制域 | 数据域 | CRC域 | 应答域 | 帧结束 |
二、协议介绍
在CANOpen协议中不同的通信对象COB通过CAN_ID又称COB-ID由11位标识符:(10-7 位)功能码+ 节点的 ID 用节点 ID(6-0 位),进行识别。
通信对象COB分类和使用如下:
报文类型 | 功能码(B) | COB-ID范围(Hex) | 通信参数(Hex) |
NMT | 0000 | 000h | - |
SYNC | 0001 | 080h | 1005,1006,1007 |
EMERGENCY | 0001 | 081h~0FFh | 1014,1015 |
TIME | 0010 | 100h | 1012,1013 |
TPDO1 | 0011 | 181h~1FFh | 1800 |
RPDO1 | 0100 | 201h~27Fh | 1400 |
TPDO2 | 0101 | 281h~2FFh | 1801 |
RPDO2 | 0110 | 301h~37Fh | 1401 |
TPDO3 | 0111 | 381h~3FFh | 1802 |
RPDO3 | 1000 | 401h~47Fh | 1402 |
TPDO4 | 1001 | 481h~4FFh | 1803 |
RPDO4 | 1010 | 501h~57Fh | 1403 |
SDO发送 | 1011 | 581h~5FFh | 1200 |
SDO接收 | 1100 | 601h~67Fh | 1200 |
NMT Error Control | 1110 | 701h~77Fh | 1016,101 |
索引段和对应的数据类型
索引(Hex) | 对象 |
0000 | 保留 |
0001~001F | 基本数据类型 |
0020~003F | 复杂数据类型 |
0040~005F | 生产商相关数据类型 |
0060~007F | 设备描述基本数据类型 |
0080~009F | 设备描述复杂数据类型 |
00A0~0FFF | 保留 |
1000~1FFF | 通信参数 |
2000~5FFF | 制造上的特色设备描述文件 |
6000~9FFF | 标准设备描述文件 |
A000~BFFF | 标准接口描述文件 |
C000~FFFF | 保留 |
1、PDO(process data object)过程数据对象,主要用于主从节点数据交互,属于“生产-消费模型”,数据域8字节用来传输实时数据。
特点:使用PD0时接收报文的节点不需要应答,数据访问效率比SD0高,可同步或异步。
2、SDO(server data object)服务数据对象。
主要作用主节点与从节点数据交互,特点是接收报文节点需要应答报文,如果超时没有确认,则发送节点将会重新发送原报文,属于”服务器-客户端模型“:数据域8字节含有如下:
Byte0 | Byte1~2 | Byte3 | Byte4~7 |
SD0命令字 | 对象索引 | 对象子索引 | 数据值 |
例子1:读SDO
假设我们要查询从机的电机速度
查询:
COB-ID | CMD命令 | 索引L | 索引H | 子索引 | data0 | data3 | ||
601h | 40 | 42 | 60 | 00 | 00 | 00 | 00 | 00h |
读取成功:
CMD可以理解数据长度,4B代表数据长度为2,00 C8(小端)
COB-ID(580+Node-Id) | CMD | Index_L | Index_H | Sub-Index | data0 | data1 | res | res |
581h | 4B | 42 | 60 | 00 | C8 | 00 | 00 | 00 |
读取失败也必须反馈:
COB-ID(580+Node-Id) | CMD | Index_L | Index_H | Sub-Index | error_code | error_code | error_code | error_code |
581h | 80 | 42 | 60 | 00 | C8 | 00 | 00 | 00 |
例子2:写SDO
我们要设置电机速度
COB-ID(600+Node-Id) | CMD | Index_L | Index_H | Sub-Index | data0 | data1 | data2 | data3 |
601h | 2B | 42 | 60 | 00 | C8 | 00 | 00 | 00 |
设置成功应答:
COB-ID(600+Node-Id) | CMD | Index_L | Index_H | Sub-Index | data0 | data1 | data2 | data3 |
601h | 60 | 42 | 60 | 00 | 00 | 00 | 00 | 00 |
设置失败应答:
COB-ID(580+Node-Id) | CMD | Index_L | Index_H | Sub-Index | error_code | error_code | error_code | error_code |
601h | 80 | 42 | 60 | 00 | xx | xx | xxx | xx |
三、NMT(net managerment)网络管理
主要进行网络管理,作用控制从节点的启动、停止、运行的状态切换及侦测失效节点,从节点通过NMT报文(具体来说是心跳报文)来通知主节点自己上线或者下线
CANID为000h,最高优先级,数据2字节
第1字节,状态:
value | 状态 |
01 | 启动命令,让节点进入操作状态 |
02 | 停止,让节点进入停止状态 |
80 | 让节点进入预操作状态 |
81 | 让节点应用恢复初始化状态 |
82 | 让节点通信重新初始化,总线干扰时用 |
第2字节,节点号。注意:若为0,则同时操作所有节点。
1)NMT对象如下:
标识符 | Byte0 | Byte1 |
0x000 | 命令字 | 从节点ID |
2)心跳报文:
标识符 | 字节0 |
0x700+Node_ID | 从节点状态 |
4、特殊功能报文:同步报文、紧急事件报文,时间邮戳报文等
5、节点守护
早期通过轮询模式监控从站节点与心跳模式二选一,因为网络开销逐渐淘汰
主轮询:0x700+Node_ID 数据长度0
从应答:0x700+Node_ID 数据长度1 data0
data0的bit7首次设置为0,后面0和1交替翻转,bit0~6的value为节点状态
value | 状态 |
4 | Stopped停止 |
5 | Operational 操作 |
127 | Pre-Operational 预操作 |
四、CANOpen网络结构
CANOpen网络中仅有一个主站,多个从站。主站负责网络管理、从站参数配置即从站数据处理,每个节点有独立的地址(NodeID),从站和从站也能建立通信,通信前需要进行配置,使各从站间建立独立的PDO通信。
复杂的网络结构还可以增加CANOpen网关设备,网关可CANOpen转DeviceNet、Profibus、Modbus,该网关可作为主或从设备。
五、从站配置
从站配置参数与地址绑定,常用配置有PDO的COB-ID、PDO映射参数、以及节点/寿命保护等参数,其配置通过SDO进行传输,所以主、从站必须支持SDO,配置前需要NMT进入预操作状态。
1)通信参数配置包括COB-ID、传输类型、禁止时间以及映射参数:
禁用PDO(COB-ID的最高位(31位)置1禁止)-->修改COB-ID->传输类型->映射参数数量改为0-->修改映射参数-->修改映射参数数量-->启用PDO
六、配置软件截图
例如:通信参数0x1400里面的1400.01若填0x1600该参数为映射参数
映射0x1600里的 1600.01~1600.xx对应的默认值选项填写的是对应RPDO1里不同的传输对象。如下0x62000108对应:0x6200主索引,01子索引 08对应数据长度8bit即1个字节,对应第0字节位置,
62000208对应:0x6200主索引,02子索引,数据长度8bit即1个字节对应第1个字节位置。以此类推,填满8个字节。
如下:
COB id | entry0 | Entry1 | Entry2 | Entry3 | Entry4 |
6092 | 0 | 1 | 2 | 3 | 4 |
索引 | 通道0 | 通道1 | 通道2 | 通道3 | 通道4 |
七、canopen协议的使用流程
八、实际测试案例(心跳帧方式)
1、从站节点状态表
状态:启动 | 状态:停止 | 状态:运行 | 状态:预操作 |
---|---|---|---|
0x00 | 0x04 | 0x05 | 0x7f |
2、Command specifier命令符:
3、上电后从站发出节点状态,数据如下:
0x00000600+node_id 数据帧 标准帧 数据长度0x01 00h
0x00000600+node_id 数据帧 标准帧 数据长度0x01 7fh
4、配置PDO的通信参数
主栈操作从节点为操作状态
0x00000000 数据帧 标准帧 数据长度0x01 node_id 01h
主栈向索引1800 子索引05 写SDO数据:
发送:0x600+node_id 数据帧 标准帧 数据长度0x08 2b 00 18 05 01 02 00 00
反馈:0x580+node_id 数据帧 标准帧 数据长度0x08 60 00 18 05 00 00 00 00
反馈字节0命令:0x60写成功,0x80异常
5、验证写SDO的效果,读SDO
发送:0x600+node_id 数据帧 标准帧 数据长度0x08 40 00 18 01 00 00 00 00
反馈:0x580+node_id 数据帧 标准帧 数据长度0x08 43 00 18 01 01 02 00 00
6、例子里是设置PDO的发送间隔时间,设置完毕,启用从节点,PDO发送的间隔时间改变为目标值。