CANopen TPDO 配置详解:对象 1800h、1A00h 与实践指南
目录
- [CANopen TPDO 配置详解:对象 1800h、1A00h 与实践指南](#CANopen TPDO 配置详解:对象 1800h、1A00h 与实践指南)
- 目录
- 引言
- [TPDO 通讯参数详解 (对象
1800h
)](#TPDO 通讯参数详解 (对象 1800h))- [
1800h/00h
: 子索引数量](#1800h/00h: 子索引数量) - [
1800h/01h
: COB-ID used by PDO](#1800h/01h: COB-ID used by PDO) - [
1800h/02h
: Transmission Type](#1800h/02h: Transmission Type) - [
1800h/03h
: Inhibit Time](#1800h/03h: Inhibit Time) - [
1800h/04h
: Compatibility Entry](#1800h/04h: Compatibility Entry) - [
1800h/05h
: Event Timer](#1800h/05h: Event Timer) - [
1800h/06h
: Sync Start Value](#1800h/06h: Sync Start Value)
- [
- [TPDO 映射参数详解 (对象
1A00h
)](#TPDO 映射参数详解 (对象 1A00h))- [
1A00h/00h
: 映射的对象个数](#1A00h/00h: 映射的对象个数) - [
1A00h/01h
至1A00h/08h
: PDO 映射条目](#1A00h/01h 至 1A00h/08h: PDO 映射条目)
- [
- [TPDO1 配置实例:一步步指南](#TPDO1 配置实例:一步步指南)
- 准备工作
- 配置步骤
- [1. 禁用 TXPDO1 的发送](#1. 禁用 TXPDO1 的发送)
- [2. 清除 TXPDO1 当前的映射条目](#2. 清除 TXPDO1 当前的映射条目)
- [3. 配置 TXPDO1 的第一个映射条目 (当前位置
6064h
)](#3. 配置 TXPDO1 的第一个映射条目 (当前位置 6064h)) - [4. 配置 TXPDO1 的第二个映射条目 (当前速度
6069h
)](#4. 配置 TXPDO1 的第二个映射条目 (当前速度 6069h)) - [5. 设置 TXPDO1 的映射对象个数为 2](#5. 设置 TXPDO1 的映射对象个数为 2)
- [6. 配置 TXPDO1 的传输类型](#6. 配置 TXPDO1 的传输类型)
- [7. 配置 TXPDO1 的抑制时间 (Inhibit Time)](#7. 配置 TXPDO1 的抑制时间 (Inhibit Time))
- [8. 配置 TXPDO1 的事件定时器 (Event Timer)](#8. 配置 TXPDO1 的事件定时器 (Event Timer))
- [9. 使能 TXPDO1 的发送](#9. 使能 TXPDO1 的发送)
- 预期结果与验证
- 故障排除提示
- 总结
引言
在stm32上配置电机驱动器的CANOPEN,各种报文配置特别是配置TPDO真的是件很麻烦的事,对着文档进行配置都要配半天,现在越来越多的机器人开始用伺服驱动了,最近因为项目原因又复习了下CANOPEN的知识,整理成文章,以便日后忘了能直接看自己写的文章,大部分伺服驱动的对象字典都是通用的,可能也就各个索引子索引的默认值不一样而已,因此学会本文就能学会市面上所有主流的伺服驱动器的CANOPEN配置了,由于SDO太简单了本文不讲,就讲解PDO最关键的两个对象1800和1A00。
CANopen 是一种基于 CAN (Controller Area Network) 总线的高层通信协议和设备规范,广泛应用于自动化领域。在 CANopen 网络中,过程数据对象 (Process Data Objects, PDO) 用于实时传输过程数据。其中,传输 PDO (Transmit PDO, TPDO) 由设备主动发送给网络上的其他设备,例如传感器发送测量值,驱动器反馈状态等。
正确配置 TPDO 对于确保 CANopen 系统中数据交换的效率和可靠性至关重要。TPDO 的配置主要涉及两个核心对象:通讯参数对象(如 1800h
系列,用于定义 TPDO 如何 发送)和映射参数对象(如 1A00h
系列,用于定义 TPDO 包含什么数据)。
本文将详细解释与 TPDO1 相关的通讯参数对象 1800h
和映射参数对象 1A00h
的各个子索引及其含义,并通过一个具体的配置实例,一步步指导读者如何通过服务数据对象 (Service Data Objects, SDO) 来配置 TPDO1。
TPDO 通讯参数详解 (对象 1800h
)
对象索引 1800h
(通常代表 TxPDO1 Communication Parameter) 用于配置第一个发送过程数据对象 (TXPDO1) 的通信设置。它定义了 TXPDO1 如何发送,例如使用哪个 CAN ID,什么时候发送(传输类型),以及发送的最小间隔等。该对象包含一系列子索引,下面分别介绍。
1800h/00h
: 子索引数量
- 含义: 子索引数量 (Number of sub-indices)。
- 数据类型:
UNSIGNED8
(1 字节)。 - 作用: 表示此对象 (
1800h
) 有效的子索引数量。根据 CiA402 标准和常见的对象字典,TXPDO 通讯参数通常包含 6 个子索引 (01h
到06h
),因此这个值通常是 6。
1800h/01h
: COB-ID used by PDO
- 含义: 该 TXPDO 的 CAN 标识符 (COB-ID)。
- 数据类型:
UNSIGNED32
(4 字节)。 - 作用: 这是 TXPDO1 报文在 CAN 总线上使用的唯一标识符。通常,低 11 位(对于标准帧)或低 29 位(对于扩展帧)是实际的 CAN-ID。此 32 位值中的 Bit 31 是一个重要的标志位:
- 如果 Bit 31 置 1 (逻辑值,对应十六进制值的最高位为
8
,例如80000000h
),表示禁用该 TXPDO 的发送 (PDO is not valid)。 - 如果 Bit 31 置 0 (逻辑值,对应十六进制值的最高位为
0
,例如00000000h
),表示使能该 TXPDO 的发送 (PDO is valid and active)。 - CiA301 标准规定了默认的 TPDO COB-ID 分配方案。例如,TPDO1 的默认 COB-ID 通常是
180h + Node ID
。然而,许多驱动器(如 CiA402)使用280h + Node ID
作为 TPDO1 的默认值。请务必查阅您设备的手册以确认准确的默认值。 - 示例:假设节点 ID 为 1,且设备使用
280h + Node ID
作为 TPDO1 默认值,则默认 COB-ID 为281h
。要使能发送,写入的值是00000281h
;要禁用发送,写入的值是80000281h
。
- 如果 Bit 31 置 1 (逻辑值,对应十六进制值的最高位为
1800h/02h
: Transmission Type
- 含义: 该 TXPDO 的传输类型。
- 数据类型:
UNSIGNED8
(1 字节)。 - 作用: 定义了设备何时发送该 TXPDO 报文:
0
: 同步循环传输 (Synchronous Cyclic) - 收到 SYNC 报文后发送。每收到一个 SYNC 或每 n 个 SYNC (n 由子索引06h
SYNC Start Value 定义,但通常用于控制 SYNC 计数器匹配) 发送一次。更准确地说,当06h
为 0 时,PDO 在每个 SYNC 后发送;当06h
为 n (1-240) 时,PDO 在第 n 个 SYNC 后发送,然后是第 2n, 3n... (此解释有待商榷,CiA301 中06h
定义为 sync start value,而 "every n SYNCs" 更像是通过1006h
(Communication Cycle Period) 与1005h
(SYNC COB-ID) 的关系来实现,或者通过 RTR 方式)。对于循环同步,通常值0
表示在每个 SYNC 后发送。1-240
: 同步循环传输 (Synchronous Cyclic) / 周期性同步 - 收到 SYNC 报文后发送。数字 n 代表每收到 n 个 SYNC 报文后发送一次。例如,值为1
表示每个 SYNC 后发送,值为2
表示每隔一个 SYNC 发送一次。252
: 同步,仅 RTR (Synchronous, RTR only) - 仅在收到远程传输请求 (RTR) 且该 RTR 的 CAN ID 与此 PDO 的 COB-ID 匹配时,并在下一个 SYNC 之后发送。(不常用)253
: 异步,仅 RTR (Asynchronous, RTR only) - 仅在收到远程传输请求 (RTR) 且该 RTR 的 CAN ID 与此 PDO 的 COB-ID 匹配时发送。(不常用)254
: 异步,事件驱动,制造商特定 (Asynchronous, event-driven, manufacturer specific) - 当映射到此 PDO 的一个或多个应用对象的数值发生变化时,PDO 被发送。具体行为可能由制造商定义,但通常受抑制时间 (1800h/03h
) 限制。255
(FFh
): 异步,事件驱动,设备行规特定 (Asynchronous, event-driven, device profile specific) - 当映射到此 PDO 的一个或多个应用对象的数值发生变化时,PDO 被发送。这是最常用的异步传输类型之一,用于实时反馈。发送行为受抑制时间 (1800h/03h
) 和事件定时器 (1800h/05h
) 的影响。
1800h/03h
: Inhibit Time
- 含义: 抑制时间。
- 数据类型:
UNSIGNED16
(2 字节)。 - 作用: 设置该 TXPDO 连续两次发送之间的最小时间间隔。单位是 100 微秒 (µs) 。例如,要设置 10 毫秒 (10000 微秒) 的抑制时间,需要写入的值是
100
(十六进制0064h
)。这用于防止 PDO 报文因数据频繁变化而发送过于频繁,从而占用过多总线带宽。如果设置为 0,则抑制时间无效。
1800h/04h
: Compatibility Entry
- 含义: 兼容性条目。
- 数据类型:
UNSIGNED8
(1 字节)。 - 作用: 此子索引保留,通常用于兼容性目的,在 CiA402 等常见的设备行规中通常未使用或值为 0。
1800h/05h
: Event Timer
- 含义: 事件定时器。
- 数据类型:
UNSIGNED16
(2 字节)。 - 作用: 对于事件驱动的传输类型 (例如
254
和255
),事件定时器提供了一个额外的周期性发送机制。即使映射的数据没有发生变化,如果自上次发送以来超过了事件定时器设定的时间,PDO 也会被发送。单位是 1 毫秒 (ms) 。例如,设置 100 毫秒的事件定时器,需要写入的值是100
(十六进制0064h
)。如果设置为 0,则事件定时器无效。
1800h/06h
: Sync Start Value
- 含义: SYNC 起始值。
- 数据类型:
UNSIGNED8
(1 字节)。 - 作用: 主要与同步传输类型 (如
0
到240
) 相关。它定义了一个计数器值,当 SYNC 对象的计数器达到此值时,PDO 才被发送。如果此值为 0,则 PDO 在每个相应的 SYNC 事件后发送(取决于传输类型0
还是1-240
)。CiA301 对此的描述是 "This parameter defines the value of the SYNC counter, when this PDO is transmitted synchronously."。对于传输类型0
(acyclic/event-driven synchronous),此参数通常不使用或为0。对于传输类型1-240
(cyclic synchronous),此参数与 SYNC 计数器一起决定 PDO 的发送时机。
TPDO 映射参数详解 (对象 1A00h
)
对象索引 1A00h
(通常代表 TxPDO1 Mapping Parameter) 用于定义第一个发送过程数据对象 (TXPDO1) 报文数据段的具体内容。它包含一个子索引 00h
用于记录映射对象的数量,以及多个用于存放实际映射条目的子索引 (例如 01h
到 08h
,最多可以映射 8 个对象,组成最多 64 位的数据)。
1A00h/00h
: 映射的对象个数
- 含义: 映射的对象个数 (Number of mapped application objects in PDO)。
- 数据类型:
UNSIGNED8
(1 字节)。 - 作用: 指示 TXPDO1 报文的数据段中实际包含了多少个来自对象字典的应用对象的数值。这个值也间接决定了该 PDO 数据段的总长度(所有映射对象的数据长度之和)。例如,如果映射了两个
INT32
(每个 4 字节) 对象,那么映射对象个数就是 2,PDO 数据段长度就是 8 字节。- 配置注意: 在配置或修改 PDO 映射时,CiA301 标准建议的标准流程是:
- 首先将此子索引 (
1A00h/00h
) 的值设为0
。这会使 PDO 失效并允许修改映射条目。 - 然后配置或修改子索引
01h
到08h
中的具体映射条目。 - 最后,将此子索引 (
1A00h/00h
) 的值设为实际映射的对象数量,以使新的映射生效。PDO 的总长度不能超过 8 字节。
- 首先将此子索引 (
- 配置注意: 在配置或修改 PDO 映射时,CiA301 标准建议的标准流程是:
1A00h/01h
至 1A00h/08h
: PDO 映射条目
-
含义: 具体的 PDO 映射条目。
-
数据类型:
UNSIGNED32
(4 字节)。 -
作用: 每个子索引 (
1A00h/01h
,1A00h/02h
, ..., 最多到1A00h/08h
,取决于设备能力和子索引00h
的值) 存储一个 32 位的数值。这个数值定义了 PDO 数据段中对应位置的数据是来自驱动器对象字典中的哪个对象、哪个子索引,以及该数据的位长度。这个 32 位值的结构是标准的 CiA 格式:- Bit 31 - Bit 16 (高 16 位): 对象索引 (Object Index)。要映射的对象的索引号(例如
6064h
表示当前位置反馈值,6069h
表示当前速度反馈值)。 - Bit 15 - Bit 08 (中间 8 位): 子索引 (Sub-index)。要映射的对象的子索引号(例如
00h
)。如果对象本身没有子索引(是一个简单变量),则此值为00h
。 - Bit 07 - Bit 00 (低 8 位): 数据大小 (Length of object in bits)。该对象数据在 PDO 报文中所占的位 数(例如
INT32
是 32 位,对应十六进制20h
;INT16
是 16 位,对应10h
;BOOLEAN
或UNSIGNED8
是 8 位,对应08h
)。
- Bit 31 - Bit 16 (高 16 位): 对象索引 (Object Index)。要映射的对象的索引号(例如
-
例子: 如果要将"实际位置值" (
Position actual value
, 对象索引6064h
, 子索引00h
, 数据类型INTEGER32
, 长度 32 位) 映射到 TXPDO1 的第一个位置,需要向1A00h/01h
写入的 32 位映射条目值为:- 对象索引:
6064h
- 子索引:
00h
- 数据大小 (位):
32
(十进制) =20h
(十六进制) - 组合起来的 32 位十六进制值就是
60640020h
。 - SDO 传输注意: 当通过 SDO 报文写入这个
60640020h
值时,由于 CANopen 通常使用小端序 (Little-endian) 传输多字节数据,所以在 SDO 数据段中,这个值会按字节倒序排列为:20 00 64 60
。
- 对象索引:
通过正确配置 1800h
(通讯参数) 和 1A00h
(映射参数) 对象及其子索引,用户可以完全控制驱动器(或其他 CANopen 设备)通过 TXPDO1 发送什么数据以及何时、如何发送这些数据。
TPDO1 配置实例:一步步指南
本章节将通过一个具体的 SDO 指令序列,演示如何配置一个典型的 TXPDO1,使其能够发送两个对象的数据:例如伺服驱动器的当前位置 (6064h
) 和当前速度 (6069h
)。
准备工作
配置 TPDO 参数通常需要在 CANopen 节点(例如伺服驱动器)处于 NMT (Network Management) Pre-operational 状态下进行。在此状态下,节点可以进行对象字典的读写操作,但不能进行 PDO 通信。
完成所有 SDO 配置后,需要将节点切换到 NMT Operational 状态,节点才会根据新的配置开始发送 TPDO 报文。
以下配置示例假设:
- 目标节点 ID 为
1
。 - SDO 客户端(例如主站或配置工具)的 COB-ID 为
600h + Node ID
,因此用于向节点 1 发送 SDO 请求的 COB-ID 为601h
。 - 节点 1 的 SDO 服务器响应 COB-ID 为
580h + Node ID
,即581h
。 - TPDO1 的默认 COB-ID 将被配置为
180h + Node ID
或280h + Node ID
(这里我们以280h + Node ID
为例,即281h
)。
配置步骤
以下是配置 TXPDO1 映射和通讯参数的典型 SDO 报文序列。所有多字节数值在 SDO 报文数据段中均以低字节在前 (Little-endian) 的方式排列。
1. 禁用 TXPDO1 的发送
在修改 TPDO 参数之前,通常先禁用它。这是通过设置其 COB-ID (1800h/01h
) 的 Bit 31 为 1 来实现的。
-
操作描述: 向对象
1800h
的子索引01h
(COB-ID) 写入 TXPDO1 的目标 COB-ID (例如281h
,即00000281h
) 并将 Bit 31 置 1。因此写入的值为80000281h
。 -
SDO 命令: 写 4 字节数据 (例如 SDO command specifier
22h
,尽管23h
更标准表示4字节,但文档中常用22h
,具体以CANopen规范或设备手册为准,这里沿用所提供文档的示例)。 -
报文 Bytes (COB-ID + SDO 数据段):
COB-ID: 601h (Request to Node 1) Data: 22 00 18 01 81 02 00 80
601
: COB-ID (SDO 请求发往节点 1)22
: SDO 命令 (写 4 字节,根据示例)00 18
: 索引1800h
(低字节00
在前, 高字节18
在后)01
: 子索引01h
81 02 00 80
: 数据80000281h
(低字节81
在前, ..., 高字节80
在后)
2. 清除 TXPDO1 当前的映射条目
根据 CiA301规范,修改映射前应先将映射对象个数 (1A00h/00h
) 设置为 0。
-
操作描述: 将对象
1A00h
的子索引00h
(Number of mapped objects) 设为 0。 -
SDO 命令: 写 1 字节数据 (SDO command specifier
2Fh
)。 -
报文 Bytes:
COB-ID: 601h Data: 2F 00 1A 00 00 00 00 00
601
: COB-ID2F
: SDO 命令 (写 1 字节)00 1A
: 索引1A00h
(低字节00
在前)00
: 子索引00h
00
: 数据00h
(其余字节为填充,根据SDO协议,对于 expedited transfer,可能不需要额外填充)
3. 配置 TXPDO1 的第一个映射条目 (当前位置 6064h
)
-
操作描述: 向对象
1A00h
的子索引01h
写入第一个映射条目。假设我们要映射当前位置对象6064h/00h
,数据类型INT32
(32 位)。映射条目值为60640020h
。 -
SDO 命令: 写 4 字节数据 (SDO command specifier
22h
,示例用法)。 -
报文 Bytes:
COB-ID: 601h Data: 22 00 1A 01 20 00 64 60
601
: COB-ID22
: SDO 命令 (写 4 字节)00 1A
: 索引1A00h
01
: 子索引01h
20 00 64 60
: 数据60640020h
(低字节20
在前)
4. 配置 TXPDO1 的第二个映射条目 (当前速度 6069h
)
-
操作描述: 向对象
1A00h
的子索引02h
写入第二个映射条目。假设我们要映射当前速度对象6069h/00h
,数据类型INT32
(32 位)。映射条目值为60690020h
。 -
SDO 命令: 写 4 字节数据 (SDO command specifier
22h
,示例用法)。 -
报文 Bytes:
COB-ID: 601h Data: 22 00 1A 02 20 00 69 60
601
: COB-ID22
: SDO 命令 (写 4 字节)00 1A
: 索引1A00h
02
: 子索引02h
20 00 69 60
: 数据60690020h
(低字节20
在前)
5. 设置 TXPDO1 的映射对象个数为 2
在配置完所有映射条目后,更新映射对象个数 (1A00h/00h
) 为实际映射的数量。
-
操作描述: 将对象
1A00h
的子索引00h
设为2
(因为我们映射了两个对象)。 -
SDO 命令: 写 1 字节数据 (SDO command specifier
2Fh
)。 -
报文 Bytes:
COB-ID: 601h Data: 2F 00 1A 00 02 00 00 00
601
: COB-ID2F
: SDO 命令 (写 1 字节)00 1A
: 索引1A00h
00
: 子索引00h
02
: 数据02h
6. 配置 TXPDO1 的传输类型
-
操作描述: 配置传输类型 (
1800h/02h
)。通常设置为异步事件驱动,例如传输类型255
(FFh
),表示数据变化时发送,并受抑制时间限制。 -
SDO 命令: 写 1 字节数据 (SDO command specifier
2Fh
)。 -
报文 Bytes:
COB-ID: 601h Data: 2F 00 18 02 FF 00 00 00
601
: COB-ID2F
: SDO 命令 (写 1 字节)00 18
: 索引1800h
02
: 子索引02h
FF
: 数据FFh
(即 255)
7. 配置 TXPDO1 的抑制时间 (Inhibit Time)
-
操作描述: 设置 PDO 发送的最小间隔 (
1800h/03h
)。单位 100 微秒。例如设置 10ms (10000 微秒),对应写入值为100
(十进制) =0064h
(十六进制)。 -
SDO 命令: 写 2 字节数据 (SDO command specifier
2Bh
)。 -
报文 Bytes:
COB-ID: 601h Data: 2B 00 18 03 64 00 00 00
601
: COB-ID2B
: SDO 命令 (写 2 字节)00 18
: 索引1800h
03
: 子索引03h
64 00
: 数据0064h
(低字节64
在前)
8. 配置 TXPDO1 的事件定时器 (Event Timer)
-
操作描述: (可选) 当传输类型为
255
时,事件定时器 (1800h/05h
) 可用于确保至少周期性地发送 PDO,即使数据没有变化。单位 1 毫秒。例如设置 10ms,对应写入值为10
(十进制) =000Ah
(十六进制)。 -
SDO 命令: 写 2 字节数据 (SDO command specifier
2Bh
)。 -
报文 Bytes:
COB-ID: 601h Data: 2B 00 18 05 0A 00 00 00
601
: COB-ID2B
: SDO 命令 (写 2 字节)00 18
: 索引1800h
05
: 子索引05h
0A 00
: 数据000Ah
(低字节0A
在前)
9. 使能 TXPDO1 的发送
最后,通过设置 COB-ID (1800h/01h
) 的 Bit 31 为 0 来使能 TPDO。
-
操作描述: 向对象
1800h
的子索引01h
(COB-ID) 写入 TXPDO1 的目标 COB-ID (例如281h
,即00000281h
) 并确保 Bit 31 为 0 (使能发送)。写入值为00000281h
。 -
SDO 命令: 写 4 字节数据 (SDO command specifier
22h
,示例用法)。 -
报文 Bytes:
COB-ID: 601h Data: 22 00 18 01 81 02 00 00
601
: COB-ID22
: SDO 命令 (写 4 字节)00 18
: 索引1800h
01
: 子索引01h
81 02 00 00
: 数据00000281h
(低字节81
在前)
预期结果与验证
完成以上 SDO 配置序列后,将驱动器从 NMT Pre-operational 状态切换到 NMT Operational 状态。如果配置成功,您应该能通过 CAN 分析工具捕获到 COB-ID 为 281h
(假设 Node ID 为 1 且默认基址为 280h
) 的 TPDO1 报文。
其数据段应包含 8 个字节:
- 前 4 个字节:当前位置反馈值 (来自对象
6064h
),INT32
类型,低字节在前。 - 后 4 个字节:当前速度反馈值 (来自对象
6069h
),INT32
类型,低字节在前。
当这两个映射的对象 (6064h
或 6069h
) 的值发生变化时,或者当事件定时器超时(如果配置了且数据未变),TPDO1 就会被发送(同时受抑制时间约束)。
故障排除提示
如果在配置过程中遇到问题,并且上述标准 SDO 格式报文未能成功,可能需要查阅特定设备的手册。某些设备可能对特定对象(如 PDO 参数)使用非标准的 SDO 访问方式或自定义的 SDO 字节格式。例如,原始文档中提及的 22 [custom_bytes]
格式,这种格式与 CiA301 标准不完全相符,需要仔细对照设备文档来确定正确的 custom_bytes
。始终优先参考设备制造商提供的官方文档。
总结
CANopen TPDO 的配置是实现设备间高效数据交换的关键环节。其核心在于正确设定通讯参数(主要通过对象 1800h
系列)和映射参数(主要通过对象 1A00h
系列)。通讯参数决定了 TPDO 何时以及如何发送,而映射参数则定义了 TPDO 包含哪些具体的过程数据。
通过 SDO 服务,可以灵活地配置这些参数以满足特定的应用需求。理解每个参数的含义,并遵循正确的配置步骤(如先禁用PDO、清空映射、配置新映射、设置映射数量、配置传输特性,最后再使能PDO),是确保 CANopen 系统稳定可靠运行的基础。
最后,希望有人能对这种需要CANOPEN的项目提供一个SDK,反正在伺服驱动领域对象字典基本都已经有通用标准了,市面上有一些canopen的库我看了不咋地,如果下次我又接手了这种项目,我将自己写一个好用的。