CANopen

canopen motor controller for integrated stepper motor and bldc motor

为了减少车辆线束的长度和减轻重量,Bosch 公司于 1987 年开发了用于网络控制单元的所谓 CAN 总线。CAN 是“控制器局域网”的缩写,通常与“总线”(二进制单元系统)结合使用,以描述在共享传输路径上的不同设备之间传输数据的系统。

CANopen 是一种基于 CAN 的通信协议,主要在自动化设备中用于对复杂或时间关键型机器和系统进行联网。自 1995 年以来,它一直由 CAN 自动化 (CiA) 组织进行管理,并入选欧洲标准 EN 50325-4。CANopen 不仅规范了较低的通信级别,如 RS485,还规范了各种仪器类型的命令结构。

优点

  • 技术成熟稳健,非常适用于具有极短存根和双绞线电缆的线路拓扑
  • 一个网络中可连接多达 127 个节点/设备,支持多轴应用 
  • 高速传输,数据传输速率高达 1 Mbit/s
  • 标准协议,适用于各种设备类型

Nanotec 提供电机控制器,以及直流无刷电机和步进电机,其中配备了集成控制器和  CANopen 接口。 

Nanotec 控制器基于电气驱动 CiA402 标准,并与其他制造商的产品兼容。

Nanotec 是 CAN 自动化 (CiA) — CAN 网络的国际用户和制造商组织 — 的成员


配备 CANopen 的控制器/驱动装置

配备 CANopen 的电机


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 操作分为四个阶段(另请参见下图):

  1. 接收 SYNC 消息。从而将之前接收到的 RX-PDO 数据复制到对象目录(如有)中。此时,也会对数据进行采样,并将数据复制到 TX-PDO,同时启动这些消息的发送。
  2. 然后通过总线上的所有从站发送 TX-PDO。
  3. 随后,通过 CANopen 主站发送 PDO。达到"同步判定时长"后,不再允许发送 PDO。
  4. "同步判定时间"再次关闭后,SDO 消息可进行最新交换。

     

紧急事件对象 (EMCY)

只要控制器中发生不是由 SDO 访问引起的错误,就会发送“紧急事件”类型的消息。该服务未经确认,通过 CAN-ID 80h+节点 ID 发送。紧急事件消息的结构如下: 

此处共传输三个故障代码:"紧急故障代码"(<EMCY Error Code>)、"错误寄存器'' 对象的内容(1001h,<E-REG>)以及制造商特定代码(制造商特定错误)  此处共传输三个故障代码:"紧急故障代码"(<EMCY Error Code>)、"错误寄存器'' 对象的内容(1001h,<E-REG>)以及制造商特定代码(制造商特定错误) 


错误处理

错误处理模块可处理内部发生的所有错误。每个错误均被分类到相应的错误类别中。对每个发生的错误处理如下: 

  1. 设定属于“错误寄存器”对象 (1001h) 中的故障的位。
  2. 然后将三条信息一起写入“预定义错误字段”对象 (1003h:01):
    - 紧急故障代码
    - 错误寄存器
    - 制造商特定故障代码
  3. 如果没有其它待处理错误,则将发送以下错误消息:
    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 时必须考虑对象目录中的三个对象分类:

  1. 描述映射功能的对象。
  2. 描述映射内容的对象。
  3. 接收已收到数据的对象。

功能配置(通信参数) 
第一个映射的配置存储在对象 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 时必须考虑对象目录中的三个对象分类:

  1. 描述映射功能的对象。
  2. 描述映射内容的对象。
  3. 接收待发送数据的对象。

另请注意,将数据复制到 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 状态。 

对于节点保护,存在三个时间间隔(另请参见下图):

  1. 保护时间:两条 RTR 消息之间的之间。每个 CAN 节点可能具有不同的保护时间,保护时间存储在从站的对象 100Ch:00 中(单位:毫秒)
  2. 生存时间因数:保护时间的倍数;存储在 CAN 从站的对象 1 00Dh:00 中,CAN 总线上每个从站可能具有不同的生存时间因数。
  3. 可能的生存时间:保护时间乘以生存时间因数所得出的时间。

在节点保护期间会检查以下条件: 

  1. NMT 主站必须在“可能的生存时间”内发送 RTR 请求。
  2. 从站必须在“可能的生存时间”内发送对 RTR 请求的响应。
  3. 从站的响应必须包含其 NMT 状态。此外,还必须正确设置“切换位”。


心跳

如果激活心跳,从站将自发循环地将其 NMT 状态发送至 CAN 总线。可通过将对象 1017h:00h 中的创建者心跳时间时间设为非零值,从而激活该服务。从站发送的消息格式如下: 

从站必须在心跳使用者时间内发送心跳消息。该时间只有主站知道,且不会存储在控制器中。如果两个功能均已禁用,或者再次在正确的时间内发送心跳,则将重置在此监测过程中发生的错误。 

返回

是否有疑问?

您对这篇知识库文章或我们的产品有任何疑问吗?

联系我们