目录
一、简介
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发送的间隔时间改变为目标值。