
为了减少车辆线束的长度和减轻重量,Bosch 公司于 1987 年开发了用于网络控制单元的所谓 CAN 总线。CAN 是“控制器局域网”的缩写,通常与“总线”(二进制单元系统)结合使用,以描述在共享传输路径上的不同设备之间传输数据的系统。
CANopen 是一种基于 CAN 的通信协议,主要在自动化设备中用于对复杂或时间关键型机器和系统进行联网。自 1995 年以来,它一直由 CAN 自动化 (CiA) 组织进行管理,并入选欧洲标准 EN 50325-4。CANopen 不仅规范了较低的通信级别,如 RS485,还规范了各种仪器类型的命令结构。
优点
- 技术成熟稳健,非常适用于具有极短存根和双绞线电缆的线路拓扑
- 一个网络中可连接多达 127 个节点/设备,支持多轴应用
- 高速传输,数据传输速率高达 1 Mbit/s
- 标准协议,适用于各种设备类型
Nanotec 提供电机控制器,以及直流无刷电机和步进电机,其中配备了集成控制器和 CANopen 接口。
Nanotec 控制器基于电气驱动 CiA402 标准,并与其他制造商的产品兼容。
CANopen 服务
CANopen 堆栈提供下表中所列服务;请参见相应章节了解更多详细说明。
默认 CAN-ID | 服务 | 说明 |
---|---|---|
000 | 网络管理 (NMT) | 章节 网络管理 (NMT) |
080h | 同步对象 | 章节 同步对象 (SYNC) |
080h+节点 lD | 紧急事件 | 章节 紧急事件 (EMCY) |
180h+节点 lD | TX 进程数据对象 (PDO) | 章节 进程数据对象 (PDO) |
200h+节点 ID | RX 进程数据对象 (PDO) | 章节 进程数据对象 (PDO) |
280h+节点 ID | TX 进程数据对象 (PDO) | 章节 进程数据对象 (PDO) |
300h+节点 ID | RX 进程数据对象 (PDO) | 章节 进程数据对象 (PDO) |
380h+节点 ID | TX 进程数据对象 (PDO) | 章节 进程数据对象 (PDO) |
400h+节点 ID | RX 进程数据对象 (PDO) | 章节 进程数据对象 (PDO) |
480h+节点 ID | TX 进程数据对象 (PDO) | 章节 进程数据对象 (PDO) |
500h+节点 ID | RX 进程数据对象 (PDO) | 章节 进程数据对象 (PDO) |
580h+节点 ID | TX 服务数据对象 (SDO) | 章节 服务数据对象 (SDO) |
600h+节点 ID | RX 服务数据对象 (SDO) | 章节 服务数据对象 (SDO) |
700h+节点 ID | BOOT-UP 协议 | 章节 Boot-Up 协议 |
700h+节点 ID | 节点保护和心跳 | 章节 节点保护和心跳 |
网络管理 (NMT)
网络管理面向 CANopen 设备并遵循主站-从站结构。NMT 需要由网络中的 CANopen 设备充当 CANopen 主站。所有其他设备则充当 NMT 从站。每个 NMT 从站均可通过其各自的节点 ID(范围为 [1-127])进行寻址。NMT 服务可用于启动、开始、监控、重置或停止 CANopen 设备。这样,控制器即可遵循下图所示的状态图。只有在打开后或通过发送“重置通信”或“重置节点”NMT 命令才能达到“初始化”状态。初始化之后可自动激活“预操作”状态。

下表显示了各个状态下的服务活动概览。请注意,停止状态将完全停止通信,而仅允许 NMT 状态机的控制器通信。
服务 | 初始化 | 预操作 | 操作 | 停止 |
---|---|---|---|---|
PDO | 活动 | |||
SDO | 活动 | 活动 | ||
SYNC | 活动 | 活动 | ||
EMCY | 活动 | 活动 | ||
BOOT-UP | 活动 | |||
NMT | 活动 | 活动 | 活动 |
“网络管理”消息的 CAN-ID 为 0。消息长度始终为两字节,结构如下:
此处,<CMD> 对应以下字节之一(另请参见NMT 状态图中的图例):
含义为 | |
---|---|
01h | 切换到 "操作"状态 |
02h | 切换到"停止"状态 |
80h | 切换到"预操作"状态 |
81h | 重置节点 |
82h | 重置通讯 |
<Node-ID> 的值可为 00h;在这种情况下,NMT 命令适用于CAN总线上的所有设备(广播)。如果使用不等于零的数字,则仅寻址具有相应节点 lD 的设备。
同步对象 (SYNC)
同步对象用于同时验证总线上所有设备的 PDO 数据的时间。同步消息的结构如下:
对于 SYNC 操作,通常为 RX-PDO 使用传输模式(传输类型)0(数据对下次 SYNC 有效);对于 TX-PDO,则选择 1 到 240 的传输模式。(详情:见进程数据对象 (PDO)).接收到 SYNC 消息后,会有一个判定时间("同步判定时间"),在此时间范围内可以发送和接收 PDO 消息;达到此判定时间后,所有设备都必须停止发送 PDO。典型 CAN-SYNC 操作分为四个阶段(另请参见下图):
- 接收 SYNC 消息。从而将之前接收到的 RX-PDO 数据复制到对象目录(如有)中。此时,也会对数据进行采样,并将数据复制到 TX-PDO,同时启动这些消息的发送。
- 然后通过总线上的所有从站发送 TX-PDO。
- 随后,通过 CANopen 主站发送 PDO。达到"同步判定时长"后,不再允许发送 PDO。
- "同步判定时间"再次关闭后,SDO 消息可进行最新交换。

紧急事件对象 (EMCY)
只要控制器中发生不是由 SDO 访问引起的错误,就会发送“紧急事件”类型的消息。该服务未经确认,通过 CAN-ID 80h+节点 ID 发送。紧急事件消息的结构如下:
此处共传输三个故障代码:"紧急故障代码"(<EMCY Error Code>)、"错误寄存器'' 对象的内容(1001h,<E-REG>)以及制造商特定代码(制造商特定错误) 此处共传输三个故障代码:"紧急故障代码"(<EMCY Error Code>)、"错误寄存器'' 对象的内容(1001h,<E-REG>)以及制造商特定代码(制造商特定错误)
错误处理
错误处理模块可处理内部发生的所有错误。每个错误均被分类到相应的错误类别中。对每个发生的错误处理如下:
- 设定属于“错误寄存器”对象 (1001h) 中的故障的位。
- 然后将三条信息一起写入“预定义错误字段”对象 (1003h:01):
- 紧急故障代码
- 错误寄存器
- 制造商特定故障代码 - 如果没有其它待处理错误,则将发送以下错误消息:
80 + Node-ID 1 00 00 00 00 00 00 00 00
服务数据对象 (SDO)
“服务数据对象”允许对对象目录进行读取或写入访问。""在下文中,将对象目录的所有者称为"服务器'';将想要发出请求或写入数据的 CAN 节点称为"客户端"。"上传"是指从对象目录读取对象的值;"下载"是指将值写入对象目录。此外,图表中还使用了以下缩写:
- <IDX>:要在对象目录中读/写的对象的索引;其中索引的 LSB 在字节 1 中。示例:控制器的状态字索引为 6041h;则字节 1 写为 41h,字节 2 写为 60h。
- <SUBIDX>:对象目录中从 00h 到 FFh 的对象的子索引。
由于 SDO 类型的 CAN 消息包含大量元数据,因此 SDO 消息只能用于配置控制器。如果必须在运行操作中循环交换数据,则使用 PDO 类型的 CANopen 消息更为合理(请参见进程数据对象)。SDO 传送分为三种访问类型:
- "加速传送"用于传送最多四字节对象。
- "正常传送"用于传送任意字节数,可对每条 CAN 消息进行单独确认。
- "块传送"同样用于传送任意字节数;其中会对给定的 CAN 票证块一起进行确认。
将 SDO 消息发送至 CAN-ID 600h + 节点 ID,而由 CAN-ID 580h + 节点 ID 进行应答。
加速传送
此方法用于写入(下载)或读取(上传)对象目录中 (UN)SIGNEDS、INTEGER16 或 INTEGER32 类型对象中的值。通过确认或错误消息确认该服务,即每次访问均通过数据进行应答。
SDO 下载
用于向服务器的对象目录写入数据的加速 SDO 消息结构如下:
此处,字节<CMD>取决于要写入的数据长度。<CMD> 可以是以下任一值:
- 1 字节数据长度:2Fh
- 2 字节数据长度:2Bh
- 3 字节数据长度:27h
- 4 字节数据长度:23h
<Data> 字段中填写要写入的数据;数据的 LSB 在字节 4 中。来自服务器的应答为写入操作确认或错误消息(消息结构:见下图)。对于后一种情况,会随数据一同发送错误原因(请参见SDO 错误消息章节中的 SDO 错误消息列表)。
示例:
将对象 607Ah:00h(目标位置,SIGNED32)设为节点 ID 为 3 的控制器的值 3E8h (=1000d): 603 | 23 7A 60 00 E8 03 00 00
- 字节 1 (23h):SDO 加速下载,4 字节数据 (SIGNED32)
- 字节 2 和 3 (7Ah 60h):对象索引为 607Ah
- 字节 4 (00h):对象子索引为 00h
- 字节 5 至 8 (E8h 03h 00h 00h):对象的值:000003E8h
如果成功,则控制器响应以下消息:583 | 60 7A 60 00 00 00 00 00
SDO上传
用于从对象目录读取对象的 CAN 消息具有以下结构:
服务器将回复以下消息之一:
数据长度在应答的<CMD>中加密:
- 1 字节数据长度:4Fh
- 2 字节数据长度:4Bh
- 3 字节数据长度:47h
- 4 字节数据长度:43h
此处数据的 LSB 再次位于字节 4。
如果出现错误情况,会在数据中指明错误原因(请参见 SDO 错误消息中的SDO 错误消息列表)。
示例
要从对象目录读取"状态字"目标 (6041h:00),发送以下消息(总是 8 个字节)就足够了:
603 | 40 41 60 00 00 00 00 00
一般控制器响应以下消息:
583 | 4B 41 60 00 40 02 00 00
其中
- 字节 1 (4Bh):SDO 加速上传,2 字节数据(UNSIGNED16)
- 字节 2 和 3 (41h 60h):对象索引为 6041h
- 字节 4 (00h):对象子索引为 00h
- 字节 5 到 6 (40h 02h):对象值:0240h
- 字节 7 到 8 (00h 2h):空。SDO 消息始终包含 8 字节。
SDO 错误消息
如果出现错误情况,会在数据区域中一同发送表示错误原因的错误编号。
故障代码 | 说明 |
---|---|
05030000h | 切换位不变: 仅对"正常传送"或"块传送"有效。在每次传送后都会进行交替的位的状态没有改变。 |
05040000h | 命令说明符未知:数据块的字节 0 包含不允许使用的命令。 |
06010000h | 不支持访问:如果通过 CAN over EtherCAT (CoE) 请求"完全访问"(不支持)。 |
06010002h | 只读条目:尝试写入常数或只读对象。 |
06020000h | 对象不存在:尝试访问不存在的对象(索引不正确)。 |
06040041h | 无法对对象进行 pdo 映射:尝试映射 PDO 中不允许映射的对象。 |
06040042h | 映射 pdo 超出 pdo:如果要将所需对象附加到 PDO 映射,则将超出 PDO 映射的 8 字节。 |
06070012h | 参数过长:尝试在对象中写入过多数据;例如,将 =23h(4 字节)写入 Unsigned8 类型对象,而 =2Fh 是正确的。 |
06070013h | 参数过短:尝试在对象中写入过少数据;例如,将 =2Fh (1 字节)写入 Unsigned32 类型对象,=23h 是正确的。 |
06090011h | 子索引不存在:尝试访问无效的对象子索引;但索引是存在的。 |
06090031h | 值过大:一些对象对值的大小有限制;在这种情况下,尝试在对象中写入过大的值。例如:1003h:00 的"预定义错误字段:错误数量"对象只能设为值"0";所有其它数值都会导致此错误。 |
06090032h | 值过小:一些对象对值的大小有限制。在这种情况下,尝试在对象中写入过小的值。 |
08000000h | 一般错误:不属于任何其它分类的一般错误。 |
08000022h | 无法在此状态下读取或存储数据:只能在"停止"或"预操作"状态下更改 PDO 的参数。在"操作"状态下,不允许对以下对象进行写访问:对象 1400h 至 1407h、1600h 至 1607h、1800h 至 1807h 以及 1A00h 至 1A07h。 |
进程数据对象 (PDO)
仅包含进程数据的消息称为"进程数据对象"(PDO)。PDO 用于需要循环交换的数据。PDO 消息的理念是删除 CAN 消息中的所有附加信息(索引、子索引和数据长度),而仅保留 CAN 消息中的数据。PDO 的源信息和目标信息分别存储在所谓的 PDO 映射中。只有在 NMT 状态机处于"操作"状态时才能使用 PDO(请参见<link knowledge-base-article canopen-motors-controllers _top>网络管理 (NMT));必须在"预操作"NMT 状态下配置 PDO。控制器共支持八个独立的 PDO 映射;每条对应的 PDO 消息可包含最多八字节(= 64 位)用户数据。因此,例如,可以传送两个 UNSIGNED32 值或一个 UNSIGNED32 值和一个 UNSIGNED0B 值;消息不需要用满全部八个数据字节。发送和接收配置的配置中 PDO 又有所不同。接收配置说明了对已发送 PDO 消息的处理,发送配置说明了对待发送 PDO 消息的处理。 仅包含进程数据的消息称为"进程数据对象"(PDO)。PDO 用于需要循环交换的数据。PDO 消息的理念是删除 CAN 消息中的所有附加信息(索引、子索引和数据长度),而仅保留 CAN 消息中的数据。PDO 的源信息和目标信息分别存储在所谓的 PDO 映射中。只有在 NMT 状态机处于"操作"状态时才能使用 PDO(请参见<link knowledge-base-article canopen-motors-controllers _top>网络管理 (NMT));必须在"预操作"NMT 状态下配置 PDO。控制器共支持八个独立的 PDO 映射;每条对应的 PDO 消息可包含最多八字节(= 64 位)用户数据。因此,例如,可以传送两个 UNSIGNED32 值或一个 UNSIGNED32 值和一个 UNSIGNED0B 值;消息不需要用满全部八个数据字节。发送和接收配置的配置中 PDO 又有所不同。接收配置说明了对已发送 PDO 消息的处理,发送配置说明了对待发送 PDO 消息的处理。
Rx 配置
配置 RX-PDO 时必须考虑对象目录中的三个对象分类:
- 描述映射功能的对象。
- 描述映射内容的对象。
- 接收已收到数据的对象。
功能配置(通信参数)
第一个映射的配置存储在对象 1400h 的子索引中。第二个映射在 1401h 中配置,以此类推。在下文中,我们以 140Nh 为参考。此处,配置会影响 PDO 消息的 COB-ID 和传送类型。 对象 140Nh具有三个子索引:
- 子索引 0(最大子索引):子索引总数
- 子索引 1 (COB-ID):COB-ID 存储在此处。对于 PDO 映射 1-4 (1600h-1603h),根据节点 ID 确定 CAN-ID,且只能在 COB-ID 中设定有效位(位 31)。从 1604h 至 -1607h,可以独立设定 CAN-ID(但不能被其它服务使用,请参见表格),也能独立设定有效位。COB-ID 的更改在控制器或通信重启后才会生效(请参见网络管理 (NMT))。
映射 | COB-ID |
---|---|
1600h | 200h + 节点 ID |
1601h | 300h + 节点 ID |
1602h | 400h + 节点 ID |
1603h | 500h + 节点 ID |
1604h | XXXh + 节点 ID |
1605h | XXXh + 节点 ID |
1606h | XXXh + 节点 ID |
1607h | XXXh + 节点 ID |
- 子索引 2 (传输类型)该子索引中存储的数字定义了接收到的数据生效的时间。请参见下表查看数字及相应的含义。
140Nh:02h | 含义 |
---|---|
00h-F0h | 同步:数据经过缓冲,且只有在接收到下一条 SYNC 消息后才会生效并传递至对象目录。 |
F1h-FDh | 保留 |
FEh,FFh | 异步:数据在接收到 PDO 消息后生效并传递至对象目录。 |
映射内容
映射内容的配置结构如下(另请参见下图示例):
- 配置对象的所有子索引都在一起。因此,1600h 及所有子索引描述第一个映射,1601h 描述第二个 RX-PDO 映射,以此类推。
- 子索引 00h 指定映射中的对象数量。它同时还指定多少子索引有效。如果对象 1600h:00h 被设置为 "0",RX 映射则被完全关闭。在下图的示例中,映射了两个对象;因此,对象 1600h:03h 和 1600h:04h 处于非活动状态(显示为灰色)。
- 从 1600h:01h 至 1600h:0Fh 的每个子索引依次无间断地描述了一个映射目标。从而对索引、子索引和位长进行编码。下图中的示例:消息的前两个字节将写入对象 6040h:00h 中。以十六进制表示的 1600h:01h 的内容将包含
或 60400010。第二个映射 (1600h:02h) 包含条目 607A0020。因此,它可在对象 607Ah:00h 中映射后续四个字节 (=20h
Bit)配置
TX 配置
配置 TX-PDO 时必须考虑对象目录中的三个对象分类:
- 描述映射功能的对象。
- 描述映射内容的对象。
- 接收待发送数据的对象。
另请注意,将数据复制到 TX-PDO 消息的时间和发送时间不需要一致(取决于模式)。
功能配置(通信参数)
第一个映射的功能配置存储在对象 1800h 的子索引中。第二个映射在 1801h 中配置,以此类推。在下文中,我们以 180Nh 为参考。此处,配置会影响 PDO 消息的 COB-ID 和传送类型。
对象 180Nh 有以下子索引:
- 子索引 0(最大子索引):子索引总数
- 子索引 1 (COB-ID):COB-ID 存储在这里。对于 PDO 映射 1-4 (1A00h-1A03h),根据节点 ID 确定 CAN-ID,且只能在 COB-ID 中设定有效位(位 31)。从 1A04h–1A07h,可以独立设定 CAN-ID(但不能被其他服务使用,请参见表格),也能独立设定有效位。COB-ID 的更改在控制器或通信重启后才会生效(请参见网络管理 (NMT))。
映射 | COB-ID |
---|---|
1A00h | 180h + 节点 ID |
1A01h | 280h + 节点 ID |
1A02h | 380h + 节点 ID |
1A03h | 480h + 节点 ID |
1A04h | XXXh + 节点 ID |
1A05h | XXXh + 节点 ID |
1A06h | XXXh + 节点 ID |
1A07h | XXXh + 节点 ID |
- 子索引 2(传输类型):该子索引中存储的数字定义了将数据复制到 PDO 消息的时间以及消息的发送时间。请参见下表查看数字及相应的含义。下面,我们以能够触发数据复制和/或发送的事件为参考。该事件包括三个事件,这三个事件可视为相互独立:
- NMT 状态机切换为“操作”。
- 当前数据已根据上条 PDO 消息发生更改。
-事件计时器已过期(请参见 180Nh:5)。
如果使用事件计时器,则对它的处理与更改无关;事件计时器在当前事件计时器过期后才会重启,而不是基于另一个事件。
180Nh:02h | 含义 |
---|---|
0 | 同步(非循环):收到 SYNC 时会立即将数据复制到 TX-PDO,但在事件发生时才会发送数据。 |
01h-F0h | 同步(循环):收到第 n 条 SYNC 消息时会立即复制数据,随后立即发送数据(n 对应数字 1 到 240,传输类型“1”在每次 SYNC 时都会发送新数据)。 |
F1h-FBh | 保留 |
FCh | 仅 RTR(同步):收到每条 SYNC 消息时都会立即复制数据,但仅在通过 RTR 消息进行请求时才会发送数据。 |
FDh | 仅 RTR(事件驱动):收到 RTR 消息时立即将数据复制到 TX-PDO 消息,随后立即发送数据。 |
FEh,FFh | 事件到达时复制数据,并立即发送数据。 |
- 子索引 3(抑制时间):该子索引包含一个时间锁(见下图)。这可用于设置发送 PDO 后必须经过的时间,然后才能再次发送 PDO。该时间仅适用于异步 PDO。这是为了防止在映射对象不断变化的情况下连续发送 PDO。
- 子索引 4(兼容项):该子索引没有功能,仅是为了兼容性而存在。
- 子索引 5(事件计时器):该时间可用于触发处理数据复制和 PDO 发送的事件。
- 子索引 6(同步起始值):在此输入同步计数器的起始值,从站从该起始值开始响应同步并发送 PDO。只有在 1019h 同步计数器溢出值中设置大于 1 的值后才能全局激活。

映射内容
映射内容的配置结构如下(另请参见下图示例):
- 配置对象的所有子索引都在一起。因此,1A00h 及所有子索引描述第一个映射,1A01h 描述第二个 TX-PDO 映射,以此类推。
- 子索引 00 指定映射中的对象数量。它同时还指定多少子索引有效。如果对象 1A00h:00h 被设置为 "0",TX 映射则被完全关闭。在以下示例中,在条目 1A00h:01h – 1A00h:02h 中映射了两个对象 - 因此,没有映射条目 1A00h:03h – 1A00h:04h 中的对象(显示为灰色)。
- 从 1A00h:01h 到 1A00h:0Fh 的每个子索引分别依次无间断地(可为间隔使用虚拟对象)描述了一个映射源。从而对索引、子索引和位长进行编码。下图中的示例:将从对象 6041h:00h 读取消息的前两个字节。以十六进制表示的 1A00h:01h 的内容将包含 ,或 60410010。第二个映射 (1A00h:02h) 包含条目 60640020。因此,它可从对象 6064h:00h 映射 TX-PDO 消息中的后续四个字节(对应于 32 位)。
Boot-Up 协议
如果 CAN 从站达到“预操作”NMT 状态(见下图),则将发送以下消息表示操作准备就绪。
该服务未经确认;无响应。
心跳和节点保护
通过“心跳”和“节点保护”服务(通常也称为“寿命保护”),可检测 CAN 总线上已关闭或挂起的设备。为此,NMT 主站将循环请求包含从站当前 NMT 状态的消息(节点保护)。另一种方式是每个从站自发循环地发送消息(心跳)。不允许组合使用节点保护和心跳。此外,还建议为心跳设置高于节点保护的优先级,因为节点保护会导致 CAN 总线的负载较高。
节点保护
该服务所依据的原理是 NMT 主站可向相应的从站发送包含 CAN-ID 700h + 节点 ID 的 RTR 消息。随后从站必须发送消息进行响应;此消息结构如下。其中位 7 在每次传送时都会进行交替,从而能够确定消息是否丢失。在位 6 到 0 中输入从站当前的 NMT 状态。
对于节点保护,存在三个时间间隔(另请参见下图):
- 保护时间:两条 RTR 消息之间的之间。每个 CAN 节点可能具有不同的保护时间,保护时间存储在从站的对象 100Ch:00 中(单位:毫秒)
- 生存时间因数:保护时间的倍数;存储在 CAN 从站的对象 1 00Dh:00 中,CAN 总线上每个从站可能具有不同的生存时间因数。
- 可能的生存时间:保护时间乘以生存时间因数所得出的时间。

在节点保护期间会检查以下条件:
- NMT 主站必须在“可能的生存时间”内发送 RTR 请求。
- 从站必须在“可能的生存时间”内发送对 RTR 请求的响应。
- 从站的响应必须包含其 NMT 状态。此外,还必须正确设置“切换位”。
心跳
如果激活心跳,从站将自发循环地将其 NMT 状态发送至 CAN 总线。可通过将对象 1017h:00h 中的创建者心跳时间时间设为非零值,从而激活该服务。从站发送的消息格式如下:
从站必须在心跳使用者时间内发送心跳消息。该时间只有主站知道,且不会存储在控制器中。如果两个功能均已禁用,或者再次在正确的时间内发送心跳,则将重置在此监测过程中发生的错误。