(十年前的旧文,不舍等扔)git
建立日期:2005-11-17网络
修改日期:2005-11-17spa
文件名称:简单CANOpen 协议说明.doc设计
做者:winshtonhtm
版本:V1.0对象
(注:本文以24in 24out I/O模块为例说明,对在单片机下实现简单的CANopen简单功能做分析设计,文档中全部功能均已在AVR上实现)blog
本说明是CAN上层协议CANOpen协议的嵌入式简化,较原始CANOpen版本简单易用,且更适应嵌入式模块通信的须要,而且兼容CANOpen协议。索引
下面按照协议支持的功能分别进行说明:文档
网络管理状态表:get
终端主节点→从节点
COB-ID |
0-字节 |
1-字节 |
0 |
命令说明符 |
节点ID |
(16#000) |
(CS) |
(1) |
说明:通常终端主节点是指上位机,如上位用于网络管理和监控的PC机,从节点是指被管理的各模块。
若是节点ID是0表示命令会被广播至全部从节点,从节点必须执行相应的命令。
命令说明符功能见下表:
命令说明符(CS) |
意义 |
1(16#01) |
启动节点进入可操做状态 |
2(16#02) |
中止远程节点 |
128(16#80) |
使节点进入预操做状态 |
129(16#81) |
复位节点 |
130(16#82) |
复位通信 |
例:启动节点1进入可操做状态,
16#000 |
16#80 |
16#04 |
网络管理状态表:
状态转换 |
说明 |
(1) |
通电后自动初始化 |
(2) |
完成初始化自动进入预操做状态 |
(3),(6) |
启动远程节点 |
(4),(7) |
进入预操做状态 |
(5)(8) |
中止远程节点 |
(9),(10),(11) |
复位节点 |
(12),(13),(14) |
复位通信 |
根据节点的状态提供如下服务:
初始化 |
预操做 |
可操做 |
停机 |
|
PDO |
√ |
|||
SDO |
√ |
√ |
||
启动引导 |
√ |
√ |
||
网络管理 |
√ |
√ |
√ |
|
错误控制 |
√ |
√ |
过程数据对象用于在节点之间传送过程数据,如I/O模块I/O状态读取和设定,模拟量采集和模拟量输出等等,本协议考虑从机硬件限制最多支持4组PDO,每组包含一个RPDO和一个TPDO,现已I/O模块为例进行说明:
设I/O模块有24输入,24输出,24输入经过TPDO传给监控终端或其余节点,24输出经过RPDO由控制节点对其进行设定,采用发送和接收PDO1组,即标识符TPDO:0x180+NODE_ID,RPDO:0x200+NODE_ID,用3个字节就能够表示24个I/O量,所以发送和接收PDO能够表示以下(假设NODE_ID=1):
COB-ID |
0字节 |
1字节 |
2字节 |
385(0x181) |
Data:输入I/O状态量 |
||
Input_Digital_1 |
Input_Digital_2 |
Input_Digital_3 |
COB-ID |
0字节 |
1字节 |
2字节 |
513(0x201) |
Data:输出I/O状态量 |
||
Output_Digital_1 |
Output_Digital_2 |
Output_Digital_3 |
若是是8通道的模拟量采集模块则须要两个TPDO来传送采集的数据,不须要RPDO,由于每一个通道产生一个16位数据,一共是16字节,每一个TPDO只可以传送8字节。两个TPDO标识符分别为:0x180+NODE_ID,0x280+NODE_ID。
每帧数据格式以下表(设NODE_ID=2):
TPDO1
COB-ID |
0-1字节 |
2-3字节 |
4-5字节 |
6-7字节 |
385(0x182) |
Data:输入模拟量 |
|||
Output_Anolog_1 |
Output_Anolog_2 |
Output_Anolog_3 |
Output_Anolog_4 |
TPDO2
COB-ID |
0-1字节 |
2-3字节 |
4-5字节 |
6-7字节 |
385(0x182) |
Data:输入模拟量 |
|||
Output_Anolog_5 |
Output_Anolog_6 |
Output_Anolog_7 |
Output_Anolog_8 |
服务数据对象用于读写节点的对象字典,现 只实现SDO下载和上传的全速模式,不支持正常模式也不支持块下载和上传,由于数据量不大,实现的功能足够用,SDO全速下载和上传采用应答式服务,由监控终端向节点发送服务请求,由节点返回应答。
现假设某节点NODE_ID=3,协议报文以下:
读节点OD
假设,读SDO index = 0x1018 subindex = 0x00,返回的是1字节data=0x04
监控终端→节点(终端请求)
COB-ID |
0字节 |
1字节 |
2字节 |
3字节 |
4字节 |
5字节 |
6字节 |
7字节 |
1539(0x603) |
命令 |
index |
subindex |
Reserved(保留) |
||||
0x40 |
0x18 |
0x10 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
监控终端←节点(节点应答)
COB-ID |
0字节 |
1字节 |
2字节 |
3字节 |
4字节 |
5字节 |
6字节 |
7字节 |
1411(0x583) |
命令 |
index |
subindex |
数据 |
凑够8个字节 |
|||
0x4F |
0x18 |
0x10 |
0x00 |
0x04 |
0x00 |
0x00 |
0x00 |
写节点OD
假设,写SDO index=0x1017,subindex=0x00,写数据为0x07D0
监控终端→节点(终端请求)
COB-ID |
0字节 |
1字节 |
2字节 |
3字节 |
4字节 |
5字节 |
6字节 |
7字节 |
1539(0x603) |
命令 |
index |
subindex |
要写入的数据 |
凑8个字节 |
|||
0x2B |
0x17 |
0x10 |
0x00 |
0xD0 |
0x07 |
0x00 |
0x00 |
监控终端←节点(节点应答)
COB-ID |
0字节 |
1字节 |
2字节 |
3字节 |
4字节 |
5字节 |
6字节 |
7字节 |
1411(0x583) |
命令 |
index |
subindex |
凑够8个字节 |
||||
0x60 |
0x18 |
0x10 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
若是监控终端发送的请求,节点处理出错,将返回SDO停止报文,报文以下:
COB-ID |
0字节 |
1字节 |
2字节 |
3字节 |
4字节 |
5字节 |
6字节 |
7字节 |
1411(0x583) |
命令 |
index |
subindex |
错误代码 |
||||
0x80 |
0x18 |
0x10 |
0x00 |
0-7位 |
8-15位 |
16-23位 |
24-31位 |
节点返回的错误代码以下:
SDO_ABORT_UNSUPPORTED 0x06010000UL 不支持该功能
SDO_ABORT_NOT_EXISTS 0x06020000UL 不存在的索引
SDO_ABORT_READONLY 0x06010002UL 只读,不可写
SDO_ABORT_TYPEMISMATCH 0x06070010UL 类型不匹配
SDO_ABORT_UNKNOWN_COMMAND 0x05040001UL 未知命令
SDO_ABORT_UNKNOWNSUB 0x06090011UL 未知子索引
注:命令字节含义请参考CANOpen协议文件DS301。
错误控制用于了解总线上各节点的状态,本文只实现心跳协议,由各节点向监控终端按期发送心跳报文,报告本节点的状态,报文以下:
设节点NODE_ID=2
节点→监控终端
COB-ID |
0字节 |
1794(0x702) |
节点状态 |
0x00 |
返回状态以下:
状态代码 |
状态含义 |
0x00 |
BOOTUP启动状态 |
0x04 |
STOPPED中止 |
0x05 |
OPERATIONAL可操做 |
0x7F |
PRE-OPERATIONAL预操做 |
节点在启动以后发出BOOTUP心跳,而后按固定频率发出脉动消息帧,监控终端接收该报文用以检测该节点状态。
参考文献: