一、协议标准
以官方的CiA 301-4.2.0基础协议为解读学习标准,同时找到了基于CiA 301标准的通用I/O设备标准的CiA 402,是中文翻译版,还有ZLG多年前发布的CANopen轻松入门作为参考学习,话不多说,接下来就开始进行学习记录吧。
CiA 301中使用的是仲裁域ID为11Bit的标准帧格式,并且发送与接收都是以从机视角来说的,对于多字节数据都是小端模式,即低字节先发送,以下的学习都以此为基础。
二、CANopen报文说明
对CANopen协议内容理解前需要大概了解CANopen都有哪些类型的报文,可以对CANopen有一个大概的了解,以下列举了CANopen的常用报文:
报文类型 | 报文说明 |
---|---|
NMT CMD(网络管理命令) | 由网络主机发出,控制各从机设备工作模式 |
NMT 心跳报文 | 由网络从机发出,包括上线通知与定时上报从机工作状态 |
PDO | 过程数据对象,单向传输,无需接收节点回应 |
SDO | 服务数据对象,主要用于参数配置,每一条信息都有回应 |
Sync | 特殊报文的一种,由主机发出,主要用于整个网络的同步传输 |
Time-Stamp | 特殊报文的一种,由主机发出,主要用于整个网络的时间同步 |
Emergency | 特殊报文的一种,当从机发生内部错误,用于通知主机 |
三、CANopen协议内容
1. ID的理解
在CANopen中有下面这几种ID,COB-ID、Node-ID,那么这两个ID又是什么呢?和CAN BUS的仲裁域的ID(以下用CAN-ID代替)又有什么关系呢?
首先,我们知道CAN-ID是CAN BUS控制器做仲裁、优先级判断使用的,CAN-ID越小优先级越高;而COB-ID(Communication Object Identifier)通信对象报文帧ID,我们可以认为COB-ID就是实际使用的CAN-ID。
Node-ID就是从机节点的编号,在对指定从节点控制时需要使用到,其中PDO与SDO比较特殊(下面会说PDO和SDO,这里知道有这个东西就好),CiA301标准也直接进行了定义,将COB-ID的高4Bit定义为功能码,低7Bit为Node-ID,所以Node-ID的最大数量就是128个各节点,但是由于0不推荐使用,实际节点数量也就127个(1-127)。
在CANopen协议中,定了一部分重要的COB-ID,下面我就列举比较常用的一些COB-ID,以便日后我查找。
通讯对象 | COB-ID |
---|---|
NMT CMD(网络管理命令) | 000h |
NMT心跳报文 | 700h + Node-ID(701h - 77Fh) |
Sync(同步报文) | 080h |
Emergency(紧急报文) | 080h + Node-ID(081h - 0FFh) |
Time stamp(时间戳报文) | 100h |
TPDO1(发送过程数据对象 1) | 180h + Node-ID(181h - 1FFh) |
RPDO1(接收过程数据对象 1) | 200h + Node-ID(201h - 27Fh) |
TPDO2(发送过程数据对象 2) | 280h + Node-ID(281h - 2FFh) |
RPDO2(接收过程数据对象 2) | 300h + Node-ID(301h - 37Fh) |
TPDO3(发送过程数据对象 3) | 380h + Node-ID(381h - 3FFh) |
RPDO3(接收过程数据对象 3) | 400h + Node-ID(401h - 47Fh) |
TPDO4(发送过程数据对象 4) | 480h + Node-ID(481h - 4FFh) |
RPDO4(接收过程数据对象 4) | 500h + Node-ID(501h - 57Fh) |
TPDO4(发送过程数据对象 4) | 480h + Node-ID(481h - 4FFh) |
SDO server->client(服务数据对象-答) | 580h + Node-ID(581h - 5FFh) |
SDO client->server(服务数据对象-问) | 600h + Node-ID(601h - 67Fh) |
2. NMT
NMT(Network Management)网络管理,为了保证CANopen网络中的可靠、可控,设计了NMT,整个CANopen网络中有且只有一个NMT主机,一个或多个NMT从机,与NMT相关的报文,比较重要的有节点状态控制(仅NMT主机)、节点错误控制、节点守护、节点上线、节点心跳报文,由于节点守护使用的是轮询方式,开销较大,已经不建议使用,所以下面也就不进行介绍了。
(1) 节点状态
CANopen中的NMT节点的节点状态有6种状态,分别是:
- 初始化:在节点上电后,对CAN控制器的初始化操作;
- 应用层复位:节点的应用层程序复位;
- 通讯复位:节点的CANopen通讯复位;
- 预操作状态:节点的预操作状态,表示节点已经完成了初始化、CANopen通讯相关配置可以进行SDO与NMT网络管理操作了,但是处于这个状态的节点不可以进行PDO操作;
- 操作状态:此状态可以由节点自主进入或由NMT主机切换进入,在此状态下,可以进行SDO、PDO等数据传输;
- 停止状态:此状态由NMT主机切换进入,仅可以进行SDO与NMT网络管理操作。
报文类型 | 预操作 | 操作 | 停止 |
---|---|---|---|
PDO | √ | ||
SDO | √ | √ | |
SYNC | √ | √ | |
TIME | √ | √ | |
EMCY | √ | √ | |
Node Ctrl | √ | √ | √ |
Err Ctrl | √ | √ | √ |
节点状态切换以及切换回路如下所示:
过程编号 | 切换触发条件 |
---|---|
(1) | 设备上电或者复位后自动进入 |
(2) | 初始化完成,自动进入NMT预操作状态 |
(3) | 通过配置自动进入或由NMT服务主机设置操作状态进入 |
(4),(7) | 通过NMT服务主机设置预操作状态进入 |
(5),(8) | 通过NMT服务主机设置停止远程节点进入 |
(6) | 通过NMT服务主机设置启动远程节点进入 |
(9),(10),(11) | 通过NMT服务主机设置复位远程节点进入 |
(12),(13),(14) | 通过NMT服务主机设置远程节点通讯复位进入 |
节点状态初始化切换回路如下所示:
过程编号 | 切换触发条件 |
---|---|
(1) | 设备上电或者复位后自动进入 |
(2) | 初始化完成,自动进入NMT预操作状态 |
(12),(13),(14) | 通过NMT服务主机设置远程节点通讯复位进入 |
(9),(10),(11) | 通过NMT服务主机设置复位远程节点进入 |
(15) | 初始化完成后自动进入复位应用程序 |
(16) | 复位应用程序完成后自动进入通信复位重置 |
(2) 节点状态控制
NMT CMD网络管理命令只能由NMT主机发出,NMT主机可以对NMT从机节点进行初始化状态以外的5种状态配置,NMT节点控制协议如下表:
COB-ID | DATA0 | DATA1 |
---|---|---|
000h | CS | Node-ID |
CS就是配置对应节点的状态参数,有以下5种:
CS | 说明 |
---|---|
00h | 启动远程节点,即将远程节点状态设置为操作状态 |
02h | 停止远程节点,即将远程节点状态设置为停止状态 |
80h | 远程节点进入预操作,即将远程节点状态设置为预操作状态 |
81h | 远程节点复位,即将远程节点状态设置为应用层复位状态 |
82h | 远程节点通讯复位,即将远程节点状态设置为通讯复位状态 |
(3) 节点心跳报文
节点心跳报文包括两类,一类是节点上线报文与周期上报从节点状态的心跳报文,报文协议如下:
COB-ID | DATA0 |
---|---|
700h+NodeId | STATE |
STATE就是对应节点的状态参数,有以下4种:
STATE | 说明 |
---|---|
00h | 从节点上线 |
04h | 从节点处于停止工作状态 |
05h | 从节点处于操作工作状态 |
7Fh | 从节点处于预操作状态 |
未完待续…