CANopen 服务
CANopen 堆栈提供下表中所列服务;请参见相应章节了解更多详细说明。
默认 CAN-ID | 服务 | 说明 |
---|---|---|
000 h |
网络管理 (NMT) | 网络管理 (NMT)章节 |
080 h |
同步对象 | 同步对象 (SYNC)章节 |
080 h+节点 ID |
紧急事件 | 紧急事件对象 (EMCY)章节 |
180 h+节点 ID |
TX 进程数据对象 (PDO) | 进程数据对象 (PDO)章节 |
200 h+节点 ID |
RX 进程数据对象 (PDO) | |
280 h+节点 ID |
TX 进程数据对象 (PDO) | |
300 h+节点 ID |
RX 进程数据对象 (PDO) | |
380 h+节点 ID |
TX 进程数据对象 (PDO) | |
400 h+节点 ID |
RX 进程数据对象 (PDO) | |
480 h+节点 ID |
TX 进程数据对象 (PDO) | |
500 h+节点 ID |
RX 进程数据对象 (PDO) | |
580 h+节点 ID |
TX 服务数据对象 (SDO) | 服务数据对象 (SDO)章节 |
600 h+节点 ID |
RX 服务数据对象 (SDO) | |
700 h+节点 ID |
BOOT-UP 协议 | Boot-Up 协议章节 |
700 h+节点 ID |
节点保护和心跳 | 心跳和节点保护章节 |
网络管理 (NMT)
网络管理面向 CANopen 设备并遵循主站-从站结构。NMT 需要由网络中的 CANopen 设备充当 CANopen 主站。所有其他设备则充当 NMT 从站。每个 NMT 从站均可通过其各自的节点 ID(范围为 [1–127])进行寻址。NMT 服务可用于启动、开始、监控、重置或停止 CANopen 设备。
这样,控制器即可遵循下图所示的状态图。只有在打开后或通过发送“重置通信”或“重置节点”NMT 命令才能达到“初始化”状态。 初始化之后可自动激活“预操作”状态。
在对象 1F80h 中,可以设置之后是否自动切换到“操作”状态,从而避免发送额外的 NMT 命令。
下表显示了各个状态下的服务活动概览。请注意,停止状态将完全停止通信,而仅允许 NMT 状态机的控制器通信。
服务 | 初始化 | 预操作 | 操作 | 停止 |
---|---|---|---|---|
PDO | 活动 | |||
SDO | 活动 | 活动 | ||
SYNC | 活动 | 活动 | ||
EMCY | 活动 | 活动 | ||
BOOT-UP | 活动 | |||
NMT | 活动 | 活动 | 活动 |
“网络管理”消息的 CAN-ID 为 0。消息长度始终为两字节,结构如下:
<CMD>
对应以下字节之一(另请参见 NMT 状态图中的图例): <CMD> |
含义 |
---|---|
01 h |
切换到“操作”状态 |
02 h |
切换到“停止”状态 |
80 h |
切换到“预操作”状态 |
81 h |
重置节点 |
82 h |
重置通信 |
<Node-ID>
的值可为 00
h;在这种情况下,NMT 命令适用于 CAN 总线(广播)上的所有设备。如果使用了非零数字,则只对具有相应节点 ID 的设备进行寻址。
“重置节点”命令将完全重启控制器;“重置通信”命令仅重置 CANopen 设置并重启通信。
示例:如果要将 CAN 总线上的所有设备切换到“停止”运行状态,则可使用包含“切换到停止状态”命令的广播。NMT 消息的结构如下:
000 | 02 00
如果仅完全重启节点 ID 为 42 的设备,则可发送以下 CAN 消息:
000 | 81 2A
同步对象 (SYNC)
同步对象用于同时验证总线上所有设备的 PDO 数据的时间。同步消息的结构如下:
对于 SYNC 操作,通常为 RX-PDO 使用传输模式(传输类型)0(数据对下次 SYNC 有效);对于 TX-PDO,则选择 1 到 240 的传输模式。(详细信息:请参见进程数据对象 (PDO)一章)。
接收到 SYNC 消息后,会有一个判定时间(“同步判定时间”),在此时间范围内可以发送和接收 PDO 消息;达到此判定时间后,所有设备都必须停止发送 PDO。可在对象 1007h:00h 中设置“同步判定时长”(毫秒)。
典型 CAN-SYNC 操作分为四个阶段(另请参见下图):
- 接收 SYNC 消息。从而将之前接收到的 RX-PDO 数据复制到对象目录(如有)中。此时,也会对数据进行采样,并将数据复制到 TX-PDO,同时启动这些消息的发送。
- 然后通过总线上的所有从站发送 TX-PDO。
- 随后,通过 CANopen 主站发送 PDO。达到“同步判定时长”后,不再允许发送 PDO。
- “同步判定时间”再次关闭后,SDO 消息可进行最新交换。
如果同步创建器支持同步计数器,则同步消息将接收到额外的 1 字节数值。此计数器每发送一条同步消息即增加值“1”,且每次达到值 1019h Synchronous Counter Overflow Value 后就会重置。
对于各个 TX-PDO,可在相应通信参数的子索引 06h 中定义同步计数器的起始值(如在 1800h:06h 中),从站将从该值开始首次响应同步并发送 PDO。只有在 1019h 中设置大于 1 的值后才能全局激活此功能。
紧急事件对象 (EMCY)
只要控制器中发生不是由 SDO 访问引起的错误,就会发送“紧急事件”类型的消息。该服务未经确认,通过 CAN-ID 80h+节点 ID 发送。
紧急事件消息的结构如下:
此处共传输三个故障代码:“紧急故障代码”(<EMCY Error Code>
)、“错误寄存器”对象的内容(1001h,<E-REG>
)以及制造商特定代码(制造商特定错误
)
错误处理
服务数据对象 (SDO)
“服务数据对象”允许对对象目录进行读取或写入访问。
由于 SDO 类型的 CAN 消息包含大量元数据,因此 SDO 消息只能用于配置控制器。如果必须在运行操作中循环交换数据,则使用 PDO 类型的 CANopen 消息更为合理(请参见进程数据对象小节)。
SDO 传送分为三种访问类型:
- “加速传送”,用于传送最多四字节对象。
- “正常传送”,用于传送任意字节数,可对每条 CAN 消息进行单独确认。
- “块传送”同样用于传送任意字节数;其中会对给定的 CAN 票证块一起进行确认。
将 SDO 消息发送至 CAN-ID 600h + 节点 ID,而由 CAN-ID 580h + 节点 ID 进行应答。
加速传送
此方法用于写入(下载)或读取(上传)对象目录中 (UN)SIGNED8、INTEGER16 或 INTEGER32 类型对象中的值。通过确认或错误消息确认该服务,即每次访问均通过数据进行应答。
SDO 下载
用于向服务器的对象目录写入数据的加速 SDO 消息结构如下:
其中,<CMD>
字节取决于要写入的数据长度。<CMD>
可以是以下值之一:
- 1 字节数据长度:
2F
h - 2 字节数据长度:
2B
h - 3 字节数据长度:
27
h - 4 字节数据长度:
23
h
在<Data>
字段中填写要写入的数据;数据的 LSB 在字节 4 中。
来自服务器的应答为写入操作确认或错误消息(消息结构:见下图)。对于后一种情况,会随数据一同发送错误原因(请参见SDO 错误消息章节中的 SDO 错误消息列表)。
示例:将对象 607Ah:00h(目标位置,SIGNED32)设为节点 ID 为 3 的控制器的值 3E8
h (=1000d):
603 | 23 7A 60 00 E8 03 00 00
其中
- 字节 1 (
23
h):SDO 加速下载,4 字节数据 (SIGNED32) - 字节 2 和 3 (
7A
h60
h):对象索引为607A
h - 字节 4 (
00
h):对象子索引为00
h - 字节 5 至 8 (
E8
h03
h00
h00
h):对象的值:000003E8
h
583 | 60 7A 60 00 00 00 00 00
SDO 上传
用于从对象目录中读取对象的 CAN 消息的结构如下:
服务器将回复以下消息之一:
在应答的 <CMD>
中对数据长度进行了加密:
- 1 字节数据长度:
4F
h - 2 字节数据长度:
4B
h - 3 字节数据长度:
47
h - 4 字节数据长度:
43
h
其中数据的 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 (
4B
h):SDO 加速上传,2 字节数据 (UNSIGNED16) - 字节 2 和 3 (
41
h60
h):对象索引为6041
h - 字节 4 (
00
h):对象子索引为00
h - 字节 5 至 6 (
40
h02
h):对象的值:0240
h - 字节 7 至 8 (
00
h2
h h h):空。SDO 消息始终包含 8 字节。
正常传送
CANopen“加速”传送最多只能传送四字节;为了克服这个限制,必须支持所谓的“正常传送”。这种类型的传送可按内容将多条消息的内容组合在一起;这种消息块在下文中称为“传送”。其中会对传送中的每条消息进行单独确认。
生成文档时,只需对“字符串”类型的对象执行此步骤。由于字符串具有“只读”访问限制,不需要进行 SDO 下载;因此本文档中仅对 SDO 上传进行了讨论。
主站不支持“正常传送”
如果控制器由不支持“正常传送”的主站进行操控,则可通过其他方式处理对字符串数据类型对象的访问:可使用 SDO 上传将每个字符串逐个字符读取到子索引 1 以及后续子索引。
示例:要读取对象 6505h(http 驱动目录地址)。如果主站支持“正常传送”,则只需从子索引 00
开始上传对象;控制器将自动切换到“正常传送”。如果主站仅支持“加速传送”,则可使用对象 6505h:01、6505h:02、6505h:03 等逐个字符读取字符串。
SDO 上传
下图显示了“SDO 上传”的步骤(客户端请求将对象内容发送给它)。此传送过程分为两个阶段:初始化阶段和传送阶段。
与“加速传送”一样,上传从客户端向服务器发送“启动 SDO 更新”开始(见下图)。
“正常传送”的应答不包含 <CMD>
中编码的接收字节数量。而是输入下图<DATA LENGTH>
区域中所示的数据范围。
从而完成初始化;然后要做的就是数据上传了。使用以下 SDO 请求请求数据包:
命令 <CMD>
的字节 0 结构如下:
名称为 t
的位根据各个请求进行交替(“切换位”)。它每次传送都从会 0 开始,即使在中止上次传送的情况下也同样如此。
控制器通过数据响应以上消息,其中消息结构如下:
<CMD>
的字节 0 结构如下:
其中位的含义如下:
t
(切换位)- 此位根据各个消息序列进行交替;它在“请求”和“响应”之间的序列中保持不变。
n
(字节数)- 这三个位用于指定不含数据的字节数。示例:如果位 2 和 1 设为 0,位 3 设为 1,则 011b = 03d 字节无效。这反过来又意味着字节 1 至字节 4 包含允许的值,而字节 5 至字节 7 应忽略。
c
(更多分段)- 如果没有发送其他 SDO 分段,这是最后一个分段,则此位设为 1。
示例:在此示例中,将读取“制造商硬件版本”对象 (1009h)。此示例中节点的节点 ID 为 3。
相应的 SDO 消息序列如下表所示。要读取的字符串因控制器而异。
COB-ID | 数据 | 说明 |
---|---|---|
603h | 40 09 10 00 00 00 00 00 | 启动上传;索引:1009h;子索引:00 |
583h | 41 09 10 00 1E 00 00 00 | 启动上传;大小:指定;传送类型:正常;字节数:30;索引:1009h;子索引:00 |
603h | 60 09 10 00 00 00 00 00 | 上传分段请求;切换位:未设置 |
583h | 00 4E 31 30 20 2D 20 57 | 上传分段配置;更多分段:是;字节数:7;切换位:未设置 |
603h | 60 09 10 00 00 00 00 00 | 上传分段请求;切换位:已设置 |
583h | 00 54 31 32 30 39 2D 56 | 上传分段配置;更多分段:是;字节数:7;切换位:已设置 |
603h | 60 09 10 00 00 00 00 00 | 上传分段请求;切换位:未设置 |
583h | 10 31 2E 30 30 2D 38 4D | 上传分段配置;更多分段:是;字节数:7;切换位:未设置 |
603h | 60 09 10 00 00 00 00 00 | 上传分段请求;切换位:已设置 |
583h | 0B 42 00 00 00 00 00 00 | 上传分段配置;更多分段:否(最后分段);字节数:2;切换位:已设置 |
所有组合在一起的传送数据将生成以下字符串(ASCII 值):
4E 31 30 20 2D 20 57 54 31 32 30 39 2D 56 31 2E 30 30 2D 38 4D 42 00
这对应于字符串:"N5 - W004-N-DT1209-V1.00-8MB"
中止 SDO 传送
服务器和客户端均有权随时中止当前传送。要执行此操作,必须发送“中止 SDO 传送”;这将在下文中进行说明。
接收到消息后,SDO 传送将视为结束;服务未确认。然后必须从头开始新的 SDO 传送。可以选择是否传送<ERROR CODE>
;控制器不会评估此代码。
SDO 错误消息
如果出现错误情况,会在数据区域中一同发送表示错误原因的错误编号。
故障代码 | 说明 |
---|---|
05030000 h |
切换位不变:仅对“正常传送”或“块传送”有效。在每次传送后都会进行交替的位的状态没有改变。 |
05040001 h |
命令说明符未知:数据块的字节 0 包含不允许使用的命令。 |
06010000 h |
不支持访问:如果通过 CAN over EtherCAT (CoE) 请求“完全访问”(不支持)。 |
06010002 h |
只读条目:尝试写入常数或只读对象。 |
06020000 h |
对象不存在:尝试访问不存在的对象(索引不正确)。 |
06040041 h |
无法对对象进行 pdo 映射:尝试映射 PDO 中不允许映射的对象。 |
06040042 h |
映射 pdo 超出 pdo:如果要将所需对象附加到 PDO 映射,则将超出 PDO 映射的 8 字节。 |
06070012 h |
参数过长:尝试在对象中写入过多数据;例如,将 <CMD> =23 h(4 字节)写入 Unsigned8 类型对象,而 <CMD> =2F h 是正确的。 |
06070013 h |
参数过短:尝试在对象中写入过少的数据;例如,将 <CMD> =2F h(1 字节)写入 Unsigned32 类型对象,而 <CMD> =23 h 是正确的。 |
06090011 h |
子索引不存在:尝试访问无效的对象子索引;但索引是存在的。 |
06090031 h |
值过大:一些对象对值的大小有限制;在这种情况下,尝试在对象中写入过大的值。例如:1003h:00 的“预定义错误字段:错误数量”对象只能设为值“0”;所有其他数值都会导致此错误。 |
06090032 h |
值过小:一些对象对值的大小有限制。在这种情况下,尝试在对象中写入过小的值。 |
08000000 h |
一般错误:不属于任何其他分类的一般错误。 |
08000022 h |
无法在此状态下读取或存储数据:只能在停止或“预操作”状态下更改 PDO 的参数。在“操作”状态下,不允许对以下对象进行写访问:对象 1400h 至 1407h、1600h 至 1607h、1800h 至 1807h 以及 1A00h 至 1A07h。 |
进程数据对象 (PDO)
仅包含进程数据的消息称为“进程数据对象”(PDO)。PDO 用于需要循环交换的数据。PDO 消息的理念是删除 CAN 消息中的所有附加信息(索引、子索引和数据长度),而仅保留 CAN 消息中的数据。PDO 的源信息和目标信息分别存储在所谓的 PDO 映射中。
只有在 NMT 状态机处于“操作”状态时才能使用 PDO(请参见网络管理 (NMT)章节);必须在“预操作”NMT 状态下配置 PDO。
控制器共支持八个独立的 PDO 映射;每条对应的 PDO 消息可包含最多八字节(= 64 位)用户数据。因此,例如,可以传送两个 UNSIGNED32 值或一个 UNSIGNED32 值和一个 UNSIGNED08 值;消息不需要用满全部八个数据字节。发送和接收配置的配置中 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(但不能被其他服务使用,请参见CANopen 服务一章开头的表格),也能独立设定有效位。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 的内容将包含
<Index><Subindex><Bit length>
或
60400010
。第二个映射 (1600h:02h) 包含条目607A0020
。因此,它可在对象 607Ah:00h 中映射后续四个字节 (=20hBit)
TX 配置
配置 RX-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(但不能被其他服务使用,请参见CANopen 服务一章开头的表格),也能独立设定有效位。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(抑制时间):该子索引包含一个时间锁 (100 µs)(见下图)。这可用于设置发送 PDO 后必须经过的时间,然后才能再次发送 PDO。该时间仅适用于异步 PDO。这是为了防止在映射对象不断变化的情况下连续发送 PDO。
- 子索引 4(兼容项):该子索引没有功能,仅是为了兼容性而存在。
- 子索引 5(事件计时器):该时间 (ms) 可用于触发处理数据复制和 PDO 发送的事件。
- 子索引 6(同步起始值):在此输入同步计数器的起始值,从站从该起始值开始响应同步并发送 PDO。只有在 1019h Synchronous Counter Overflow Value 中设置大于 1 的值后才能全局激活。
映射内容
映射内容的配置结构如下(请参见下图示例):
- 配置对象的所有子索引都在一起。因此,1A00h 及所有子索引描述第一个映射,1A01h 描述第二个 RX-PDO 映射,以此类推。
- 子索引 00 指定映射中的对象数量。它同时也指定了有效子索引的数量。如果对象 1A00h:00h 设为“0”,则 RX 映射将完全关闭。在以下示例中,在条目 1A00h:01h – 1A00h:02h 中映射了两个对象。因此,没有映射条目 1A00h:03h – 1A00h:04h 中的对象(显示为灰色)。
- 从 1A00h:01h 到 1A00h:0Fh 的每个子索引分别依次无间断地(可为间隔使用虚拟对象)描述了一个映射源。从而对索引、子索引和位长进行编码。下图中的示例:将从对象 6041h:00h 读取消息的前两个字节。以十六进制表示的 1A00h:01h 的内容将包含
<Index><Subindex><Bit Length>
,或60410010
。第二个映射 (1A00h:02h) 包含条目60640020
。因此,它可从对象 6064h:00h 映射 TX-PDO 消息中的后续四个字节(对应于 32 位)。
预设
已预设以下配置:
RX-PDO
1.映射(CAN-ID:200h + 节点 ID):
2.映射(CAN-ID:300h + 节点 ID):
3.映射(CAN-ID:400h + 节点 ID):对象 6042h:00h(vl 目标速度)
4.映射(CAN-ID:500h + 节点 ID):对象 60FEh:01h(数字输出)
TX-PDO
1.映射(CAN-ID:180h + 节点 ID):
2.映射(CAN-ID:280h + 节点 ID):6064h:00h(位置实际值)
3.映射(CAN-ID:380h + 节点 ID):6044h:00h(vl 速度实际值)
4.映射(CAN-ID:480h + 节点 ID):对象 60FDh:00h(数字输入)
更改 PDO 映射
- 将相应通信参数(如 1400h:01h)的子索引 01h 的有效位(位 31)设为“1”,从而禁用 PDO。
- 将相应映射参数(如 1600h:00h)的子索引 00h 设为“0”,从而禁用映射。
- 更改所需子索引(如 1600h:01h)中的映射。
- 将要映射的对象数量写入相应映射参数(如 1600h:00h)的子索引 00h,从而激活映射。
- 将相应通信参数(如 1400h:01h)的子索引 01h 的位 31 设为“0”,从而激活 PDO。
Boot-Up 协议
如果 CAN 从站达到“预操作”NMT 状态(见下图),则将发送以下消息表示操作准备就绪。
该服务未经确认;无响应。
心跳和节点保护
通过“心跳”和“节点保护”服务(通常也称为“寿命保护”),可检测 CAN 总线上已关闭或挂起的设备。为此,NMT 主站将循环请求包含从站当前 NMT 状态的消息(节点保护)。另一种方式是每个从站自发循环地发送消息(心跳)。不允许组合使用节点保护和心跳。此外,还建议为心跳设置高于节点保护的优先级,因为节点保护会导致 CAN 总线的负载较高。
节点保护
该服务所依据的原理是 NMT 主站可向相应的从站发送包含 CAN-ID 700h + 节点 ID 的 RTR 消息。随后从站必须发送消息进行响应;此消息结构如下。其中位 7 在每次传送时都会进行交替,从而能够确定消息是否丢失。在位 6 到 0 中输入从站当前的 NMT 状态。
对于节点保护,存在三个时间间隔(另请参见下图):
在节点保护期间会检查以下条件:
- NMT 主站必须在“可能的生存时间”内发送 RTR 请求。
- 从站必须在“可能的生存时间”内发送对 RTR 请求的响应。
- 从站的响应必须包含其 NMT 状态。此外,还必须正确设置“切换位”。