CANopenEditor 从新建工程到导出 EDS / OD.c / OD.h

在这里插入图片描述

从新建工程开始

先新建空工程

执行:

1
File -> New

此时左侧显示 New Product,Object Dictionary 里还没有完整的 CiA 301 通信对象。不要直接在空工程里逐个手写 0x10000x10180x12000x18000x1A00 等标准对象,容易漏子索引、数据类型、访问权限和 CANopenNode 导出属性。

插入 DS301 profile

执行:

1
Insert Profile -> DS301_profile.xpd

在这里插入图片描述

这里的含义是:

项目 含义
DS301_profile.xpd CiA 301 通信对象 profile,提供标准通信对象候选项
DS301_profile_old.xpd 旧版本 profile,除非兼容旧工程,否则不优先使用
DS401_profile.xpd I/O 类设备 profile,只有做对应设备类型时再插入
DSP302-NMTMaster.xpd NMT Master 相关 profile,只有设备要作为管理节点时再插入

这一步仍然是“从新建开始”:工程先通过 File -> New 创建,再把 profile 中的标准对象插入当前空工程;不要用 File -> Open 打开现成模板工程。

File 菜单功能

在这里插入图片描述

菜单项 作用 建议用法
New 新建空工程 第一入口
Open 打开已有工程文件 只用于继续编辑已有 .xdd / .xpd
Save Project 保存当前工程 修改后及时保存
Save Project As… 另存为新工程 新产品第一次保存时使用
Open Network XML 打开网络级 XML 多节点、多网络工程才用
Save Network XML 保存网络级 XML 多节点、多网络工程才用
Recent Files 最近文件 快速打开历史工程
Export… 导出 EDS / XDD / 文档等 导出给主站或配置工具的 EDS
Export CanOpenNode… 导出 CANopenNode C 文件 生成 OD.c / OD.h
Save All 保存全部打开文件 修改多个 profile / 工程时使用
Close file 关闭当前文件 切换工程时使用
Quit 退出工具 退出前先保存

Reports 菜单功能

在这里插入图片描述

菜单项 作用 使用场景
Documentation 生成对象字典相关文档 需要把当前 OD 配置导出给同事检查时使用
Network PDO 生成网络 PDO 视图/报告 检查多个节点的 PDO COB-ID 和映射关系时使用

普通单节点学习工程可以先不用 Reports。配置完成后,再用 Documentation 导出说明文档,或用 Network PDO 检查 PDO 通道是否冲突。

Preferences 里选择导出器

执行:

1
Tools -> Preferences

在这里插入图片描述

重点字段:

字段 作用 建议
Selected exporter 选择 CANopenNode C 文件导出格式 新工程优先选 CANOPENNODE_V4
Show Generic Warnings 显示通用警告 保持勾选
Show Rename Warnings 显示重命名警告 保持勾选
Show Build Warnings 显示生成警告 保持勾选
Show String Warnings 显示字符串警告 保持勾选
Show Struct Warnings 显示结构体警告 保持勾选

不建议关闭这些警告。关闭后可能会漏掉对象未启用、名称冲突、字符串长度不足、结构体生成异常等问题。

Device Info 页面怎么填

在这里插入图片描述

Device Info 区域

字段 作用 建议配置 不建议配置
Product name 产品名称,写入设备描述文件 填清晰的产品名,例如 Demo IO Slave 不要长期保持 New Product
Product ID 产品编号 / 产品代码 使用公司内部产品码,通常与 0x1018:02 逻辑一致 不要每次随意改
Vendor name 厂商名称 填公司或项目名称 不要空着交付给主站侧
Vendor ID 厂商 ID 有正式 CiA Vendor-ID 时填正式值;学习阶段可填测试值 量产设备不要使用 0x00000000

File Info 区域

字段 作用 建议配置 不建议配置
File version EDS/XDD 文件版本 每次发布递增 不要与固件版本混用
Description 文件说明 写设备用途和关键能力 不要写过长实现细节
Creation Date/Time 创建时间 工具自动生成 不要手动伪造
Created By 创建者 可填团队或人员 不影响 OD 生成
Modification Date/Time 修改时间 工具自动维护 不建议手动改
Modified by 修改者 可填维护者 不影响 OD 生成

Project Info 区域

字段 作用 说明
Project file (version) 当前工程文件 保存 .xdd 后显示路径/版本
XDD v1.1 file - stripped 裁剪后的 XDD 通常由工具生成,不手工改
EDS file 导出的 EDS 路径 File -> Export… 后出现
DCF file 设备配置文件路径 给具体节点配置实际参数时使用
CANopenNode file (ver) 导出的 CANopenNode 文件路径/版本 File -> Export CanOpenNode… 后出现
Documentation file 导出的说明文档路径 Reports -> Documentation 后出现

DCF 是什么

DCFDevice Configuration File

区别:

文件 用途
EDS 描述设备“支持什么对象、默认值是什么”
DCF 描述某个具体节点“实际配置成什么值”

例如同一型号设备有 3 台:

节点 Node-ID TPDO1 COB-ID 心跳时间
设备 A 1 0x181 1000 ms
设备 B 2 0x182 1000 ms
设备 C 3 0x183 500 ms

这类“具体节点实际值”适合放在 DCF 或网络配置里。学习生成 OD.c / OD.h 时,可以暂时不使用 DCF。

Baudrates 区域

字段 作用 建议
10 kbps ~ 1000 kbps 声明设备支持的 CAN bit rate 勾选固件实际支持的速率
auto 声明支持自动波特率 固件没有实现自动检测时不要勾选

只勾选固件实际能配置和验证过的速率。EDS 写支持但固件不支持,会造成主站配置后无法通信。

General and Master Features 区域

字段 作用 建议
Granularity PDO 映射粒度,常见为 8 bit 普通经典 CANopen 保持 8
RPDO count 当前 RPDO 数量 由对象字典 / PDO 页面联动,不手填
TPDO count 当前 TPDO 数量 由对象字典 / PDO 页面联动,不手填
LSS Slave 设备支持被 LSS 配置 Node-ID / bit rate 固件实现 LSS slave 时再勾选
LSS Master 设备支持作为 LSS 配置主节点 普通从站不要勾选
Node guarding Slave 支持被主站 Node guarding 新项目通常优先用 heartbeat
Node guarding Master 支持监控其他节点 只有设备作为管理节点时勾选
No of monitored node 被监控节点数量 未启用相关 master 功能时灰色是正常的

No of monitored node 灰色通常不是异常。它不是普通手填对象字段,而是受 Node guarding Master 或监控节点配置联动。普通从站不需要改。若要做节点监控,应先明确使用 heartbeat consumer 还是 node guarding master,再去对象字典中配置对应对象。

Device commissioning 区域

字段 作用 建议
Concrete node ID 具体节点 ID 做 DCF / 网络配置时填写,普通 EDS 可先保持 0
Node name 具体节点名称 多节点网络中用于区分设备
Baudrate 具体节点 bit rate DCF 实际配置值
Net number 网络编号 多条 CANopen 网络时用于区分
Net name 网络名称 多条 CANopen 网络时用于标识
CANopen Manager 标识该节点是否为管理节点 普通从站不要勾选
LSS Serial no LSS 识别用序列号 不使用 LSS 时可先不管

“多网络配置”指一个工程同时描述多条 CANopen 总线,例如 CANopen_NET_1CANopen_NET_2。普通单 CAN 总线工程不需要配置 Net number / Net name

Object Dictionary 页面怎么看

对象字典按索引范围分区:

区域 索引范围 作用
Communication Specific Parameters 0x1000~0x1FFF CANopen 通信对象,例如 SDO、PDO、heartbeat、identity
Manufacturer Specific Parameters 0x2000~0x5FFF 厂商自定义对象,建议放应用过程变量
Device Profile Specific Parameters 0x6000~0x9FFF 设备 profile 规定的对象

普通自定义变量优先放到 0x2000~0x5FFF,例如:

1
2
3
4
0x2100:00  status_value      UNSIGNED16  ro  TPDO
0x2101:00 command_value UNSIGNED16 rw RPDO
0x2102:00 measured_value INTEGER32 ro TPDO
0x2103:00 setpoint_value INTEGER32 rw RPDO

Object settings 每个字段的作用

在这里插入图片描述

字段 可选项 / 格式 作用 建议配置 不允许或不建议配置
Index 0x0000~0xFFFF 对象字典索引 标准对象按 CiA 301;自定义对象用 0x2000~0x5FFF 不要占用保留区;不要和标准对象冲突
Sub Index 0x00~0xFF 子索引 VAR 通常只有 0x00ARRAY/RECORD 需要多个子索引 不要遗漏 0x00 最大子索引
Name 字符串 对象名,影响生成代码命名 使用英文、无歧义、少空格 不要用重复名、特殊符号、中文变量名
Denotation 字符串 标识/简称 可空 不要依赖它生成关键逻辑
Description 字符串 描述对象用途 对应用对象写清单位和方向 不要把实现代码细节写进去
Object Type VAR / ARRAY / RECORD / 其他类型定义项 决定对象结构 单变量用 VAR;同类型数组用 ARRAY;多字段记录用 RECORD 不要把多字段对象硬做成多个无关 VAR,也不要把单变量做成 RECORD
Data Type BOOLEANINTEGER8/16/32UNSIGNED8/16/32VISIBLE_STRING 决定数据长度和编码 与固件变量类型严格一致 不要把 16 位变量配置成 32 位;不要把字符串当整数
Access SDO no / ro / wo / rw SDO 访问权限 状态量 ro;命令/配置量 rw;内部量 no 不要把只读状态配成 rw;不要把必须配置的对象设成 no
Access PDO no / t / r / tr PDO 映射方向 发送到总线的状态量用 t;从总线接收的命令量用 r 不要把 SDO 通信参数映射进 PDO;不要把同一控制量随意设 tr
Access SRDO no / tx / rx / trx 安全相关数据对象访问 不使用 SRDO 时保持 no 未实现安全通信时不要启用
Default value 十进制或十六进制 默认值,生成到 OD 数据 配置对象填合理默认值 不要填超出数据类型范围的值
HighLimit 数值 上限 需要 EDS 限制时填写 不要与固件实际范围矛盾
LowLimit 数值 下限 需要 EDS 限制时填写 不要上限小于下限
Actual Value 数值 具体配置值,偏 DCF 做具体节点配置时使用 不要把它当成通用默认值
String Len Min 数值 字符串最小长度 VISIBLE_STRING 需要保留空间时填写 非字符串对象不要乱填
Count Label 字符串,例如 NMTSDO_SRVRPDOTPDO CANopenNode 导出计数宏 通信对象按类型设置;普通自定义对象可留空或统一标签 不要给不同类别乱用同一标签
Storage Group RAM / PERSIST_COMM / 其他工程定义组 决定变量所属存储组 运行时变量用 RAM;需要保存的通信参数用 PERSIST_COMM 不需要掉电保存的实时变量不要放持久组
Enabled 勾选 / 不勾选 是否参与导出 要生成到 EDS / OD.c / OD.h 的对象必须勾选 不要以为列表里存在就一定会导出
Save Changes 按钮 保存当前对象修改 修改字段后点击 不保存就切换页面可能丢修改
Autosave changes 勾选 / 不勾选 自动保存字段变化 熟悉后可打开 初学阶段建议手动保存,便于确认修改点

Object Type 怎么选

Object Type 用途 示例
VAR 单个变量 0x2100:00 status_value
ARRAY 多个同类型子项 多个相同类型的通道值
RECORD 多个不同含义子项 0x1018 Identity、PDO 通信参数
DOMAIN 大块数据 文件、固件块、EDS 存储等
DEFTYPE / DEFSTRUCT 类型定义 profile 内部类型定义,通常不手动新建

Data Type 常用选择

Data Type 长度 C 侧常见类型 用途
BOOLEAN 1 bit / 工具按类型处理 bool_t 开关量
INTEGER8 8 bit int8_t 有符号 8 位量
INTEGER16 16 bit int16_t 有符号 16 位量
INTEGER32 32 bit int32_t 有符号 32 位量
UNSIGNED8 8 bit uint8_t 状态、枚举、小计数
UNSIGNED16 16 bit uint16_t 状态字、配置值
UNSIGNED32 32 bit uint32_t 计数、时间、COB-ID、映射项
VISIBLE_STRING 可变 char[] 设备名、版本号
DOMAIN 可变 自定义缓冲区 大块数据传输

Access PDO 的方向

Access PDO 含义 出现位置
no 不允许 PDO 映射 配置对象、SDO 参数、内部对象
t 允许映射到 TPDO 设备发送到总线的数据
r 允许映射到 RPDO 设备从总线接收的数据
tr 同时允许 TPDO/RPDO 少数双向变量,谨慎使用

为什么有灰色对象或灰色字段

灰色一般表示:

  1. profile 里有这个标准对象,但当前没有启用;
  2. 当前对象由其他页面或 profile 管理;
  3. 当前字段由对象类型、功能勾选或子对象数量联动;
  4. 该字段只在 DCF / 网络配置场景可编辑;
  5. 当前对象没有勾选 Enabled,不会导出到 CANopenNode 文件。

判断一个对象是否真正导出,不要只看颜色,按下面顺序检查:

1
2
3
4
5
6
7
8
9
对象是否插入当前 OD

Enabled 是否勾选

Access / Data Type / Storage Group 是否正确

导出后 OD.c / OD.h 里是否存在该对象

EDS 重新打开后是否存在该对象

Insert Profile 对象列表怎么选

插入 profile 后会出现对象选择列表。

在这里插入图片描述

含义
Insert 是否把该对象插入当前工程
Original Object profile 中的原始对象
Offset 0 插入到当前工程后的目标索引;Offset 为 0 时通常与原索引一致

不要一次性把所有对象都插入。初学普通从站建议先插入最小集合:

对象 是否建议插入 原因
0x1000 Device type,基础对象
0x1001 Error register,基础错误状态
0x1003 可选 Pre-defined error field,需要错误历史时启用
0x1017 Producer heartbeat time,建议使用 heartbeat
0x1018 Identity,设备身份对象
0x1200 SDO server parameter,通常需要 SDO
0x1400 需要 RPDO 时插入 RPDO1 通信参数
0x1600 需要 RPDO 时插入 RPDO1 映射参数
0x1800 需要 TPDO 时插入 TPDO1 通信参数
0x1A00 需要 TPDO 时插入 TPDO1 映射参数

插入对象列表中每个 index 的作用和配置边界

Index 名称 作用 怎么配置 不允许或不建议怎么配置
0x1000 Device type 设备类型 UNSIGNED32ro,按设备类别填写 不要设为 rw;不要填随机值
0x1001 Error register 标准错误寄存器 UNSIGNED8ro、可 TPDO 映射 不要让主站通过 SDO 写
0x1002 Manufacturer status register 厂商状态寄存器 有厂商状态定义时启用,UNSIGNED32ro 没定义状态位时不要启用凑数
0x1003 Pre-defined error field 错误历史 需要 EMCY/error history 时启用,ARRAY 不要把它映射到 PDO;不要手动乱写历史
0x1005 COB-ID SYNC message SYNC COB-ID 需要同步通信时启用,默认常见 0x80 不使用 SYNC 时不要随意启用生产者
0x1006 Communication cycle period SYNC 周期 使用同步周期时配置,单位按规范 异步 PDO 调试阶段可不启用
0x1007 Synchronous window length 同步窗口 严格同步应用才配置 不理解同步窗口时不要启用
0x1008 Manufacturer device name 设备名 VISIBLE_STRINGconst/ro 不要放运行时变化值
0x1009 Manufacturer hardware version 硬件版本 VISIBLE_STRINGconst/ro 不要每次上电变化
0x100A Manufacturer software version 软件版本 VISIBLE_STRINGconst/ro 不要与 EDS file version 混淆
0x100C Guard time Node guarding 时间 只有使用 Node guarding 时配置 新项目若只用 heartbeat,不要启用
0x100D Life time factor Node guarding 生命因子 0x100C 配套 不要单独启用
0x1010 Store parameters 保存参数 支持 SDO 保存参数时启用 固件未实现保存逻辑时不要启用
0x1011 Restore default parameters 恢复默认参数 支持恢复默认参数时启用 固件未实现恢复逻辑时不要启用
0x1012 COB-ID time stamp object TIME 对象 COB-ID 使用 TIME 对象时启用 普通从站不需要
0x1013 High resolution time stamp 高分辨率时间戳 需要时间戳时启用 不要当普通计数器使用
0x1014 COB-ID EMCY EMCY COB-ID 使用 Emergency 时启用,常见为 0x80 + Node-ID 不要与其他 CAN-ID 冲突
0x1015 Inhibit time EMCY EMCY 抑制时间 EMCY 可能频繁触发时配置 不要设过小导致总线刷屏
0x1016 Consumer heartbeat time 消费者心跳超时 设备需要监控其他节点时启用 普通只被监控的从站可不启用
0x1017 Producer heartbeat time 生产者心跳周期 建议启用,例如 1000 ms 不要设为 0 后又期望设备发心跳
0x1018 Identity 设备身份 Vendor-ID/Product code/Revision/Serial 量产设备不要所有序列号相同
0x1019 Synchronous counter overflow value SYNC 计数溢出值 使用带计数 SYNC 时配置 不使用 SYNC 计数时不要启用
0x1020 Verify configuration 配置校验 需要校验配置一致性时启用 固件不检查时不要写成必需能力
0x1021 Store EDS 存储 EDS 设备支持从对象字典读取 EDS 时启用 普通嵌入式从站通常不启用
0x1022 Store format 存储格式 0x1021 配套 不要单独启用
0x1023 OS command OS 命令 有命令通道时启用 普通设备不要开放无实现接口
0x1024 OS command mode OS 命令模式 0x1023 配套 不要单独启用
0x1025 OS debugger interface OS 调试接口 有调试协议时启用 不要在量产设备暴露无保护调试接口
0x1026 OS prompt OS 提示符 与 OS 命令相关 普通从站不启用
0x1027 Module list 模块列表 模块化设备才启用 固定功能设备不要启用
0x1028 Emergency consumer object EMCY 消费对象 需要接收其他节点 EMCY 时启用 普通从站通常不启用
0x1029 Error behavior object 错误行为 定义通信错误后的状态行为 未实现状态处理时不要启用
0x1200 SDO server parameter SDO 服务器参数 普通从站通常启用 1 组 不要映射到 PDO
0x1201 SDO server parameter 第 2 组 SDO server 确实需要多个 SDO server 才启用 不要为了“多通道”随意启用
0x1280 SDO client parameter SDO 客户端参数 设备要主动访问其他节点时启用 普通从站不要启用
0x1400 RPDO communication parameter RPDO1 通信参数 需要接收 PDO 时启用 不要与 TPDO COB-ID 冲突
0x1401 RPDO communication parameter RPDO2 通信参数 RPDO1 不够用再启用 不要空启用
0x1402 RPDO communication parameter RPDO3 通信参数 需要第三组 RPDO 时启用 不要空启用
0x1403 RPDO communication parameter RPDO4 通信参数 需要第四组 RPDO 时启用 不要空启用
0x1404 RPDO communication parameter RPDO5 通信参数 超过 4 组时才启用 不要误以为必须启满
0x1600 RPDO mapping parameter RPDO1 映射参数 0x1400 成对启用 不要映射只读对象
0x1601 RPDO mapping parameter RPDO2 映射参数 0x1401 成对启用 不要超过 64 bit
0x1602 RPDO mapping parameter RPDO3 映射参数 0x1402 成对启用 不要映射 SDO 参数
0x1603 RPDO mapping parameter RPDO4 映射参数 0x1403 成对启用 不要留无效映射项
0x1604 RPDO mapping parameter RPDO5 映射参数 0x1404 成对启用 不要只启映射不启通信参数
0x1800 TPDO communication parameter TPDO1 通信参数 需要发送 PDO 时启用 不要与 RPDO COB-ID 冲突
0x1801 TPDO communication parameter TPDO2 通信参数 TPDO1 不够用再启用 不要空启用
0x1802 TPDO communication parameter TPDO3 通信参数 需要第三组 TPDO 时启用 不要误选为对象数据
0x1803 TPDO communication parameter TPDO4 通信参数 需要第四组 TPDO 时启用 不要空启用
0x1804 TPDO communication parameter TPDO5 通信参数 超过 4 组时才启用 不要误以为必须启满
0x1A00 TPDO mapping parameter TPDO1 映射参数 0x1800 成对启用 不要映射写入型命令量
0x1A01 TPDO mapping parameter TPDO2 映射参数 0x1801 成对启用 不要超过 64 bit
0x1A02 TPDO mapping parameter TPDO3 映射参数 0x1802 成对启用 不要映射 SDO 参数
0x1A03 TPDO mapping parameter TPDO4 映射参数 0x1803 成对启用 不要只启映射不启通信参数

TX PDO Mapping 页面干什么

TX PDO Mapping 配置“本节点发送到 CAN 总线的数据”。

在这里插入图片描述

页面分为三部分:

区域 作用
Available Objects for PDO 当前允许映射到 PDO 的对象列表
Communication parameters 当前选中的 TPDO 通信参数
底部字节表 当前 TPDO 的数据布局

TPDO 通道和对象的对应关系

TPDO 通道 通信参数 映射参数 常用预定义 CAN-ID 基址
TPDO1 0x1800 0x1A00 0x180 + Node-ID
TPDO2 0x1801 0x1A01 0x280 + Node-ID
TPDO3 0x1802 0x1A02 0x380 + Node-ID
TPDO4 0x1803 0x1A03 0x480 + Node-ID

底部 0xC00001800xC0000280 这类值表示 PDO 当前禁用,因为 bit31 为 1。

常见位含义:

含义 典型表现
bit31 PDO valid/invalid 控制位 1 表示 invalid,PDO 禁用
bit30 RTR 控制位 1 通常表示不允许 RTR
bit29 11-bit / 29-bit CAN-ID 控制 普通 CANopen 多用 11-bit
bit010 或 bit028 CAN-ID 具体报文标识符

Communication parameters 怎么填

在这里插入图片描述

字段 作用 初学建议
Communication 当前 TPDO 通信参数对象 TPDO1 为 0x1800
Mapping 当前 TPDO 映射参数对象 TPDO1 为 0x1A00
COB TPDO 使用的 COB-ID / CAN-ID 信息 取消 invalid 后确认最终 CAN-ID 不冲突
Type 传输类型 调试可用 254255;同步应用再用 1~240
Inhibit 抑制时间,限制最小发送间隔 调试可先 0,稳定后再设置
Event Timer 事件定时器,周期触发发送 调试可设 1001000 ms,按工具单位确认
Sync start 同步起始值 非同步 PDO 保持 0
Invalid 是否禁用该 PDO 要启用 TPDO 时取消勾选

不建议:

  • 不要让两个 PDO 使用相同 COB-ID。
  • 不要把禁用的 0xC000xxxx 当成已经启用。
  • 不要只改右侧字段但不点 Save
  • 不要把 SDO 通信参数对象映射到 TPDO 数据区。

为什么不能直接选其他 Byte

CANopenEditor 的 PDO 映射不是随便点击 Byte0、Byte3、Byte7 填值。它按映射顺序连续打包:

1
2
3
0x1A00:01 -> 从 bit 0 开始
0x1A00:02 -> 接在上一项后面
0x1A00:03 -> 再继续往后排

对象长度决定占用多少 bit:

数据类型 位数 占用
UNSIGNED8 / INTEGER8 8 bit 1 byte
UNSIGNED16 / INTEGER16 16 bit 2 byte
UNSIGNED32 / INTEGER32 32 bit 4 byte

所以你不能直接跳到 Byte4。必须先放前面的对象,后面的空位才会继续出现。

TPDO 里可以放一个对象,也可以放多个对象

在这里插入图片描述

一个 TPDO 的总长度最大是 64 bit,也就是 8 byte。

只放一个对象:

1
2
0x1A00:00 = 1
0x1A00:01 = 0x21000010 # 0x2100:00, 16 bit

放多个对象:

1
2
3
4
0x1A00:00 = 3
0x1A00:01 = 0x21000010 # 0x2100:00, 16 bit
0x1A00:02 = 0x21010010 # 0x2101:00, 16 bit
0x1A00:03 = 0x21020020 # 0x2102:00, 32 bit

布局:

Byte 内容
Byte0~1 0x2100:00
Byte2~3 0x2101:00
Byte4~7 0x2102:00

COB-ID 不是用来选择 Byte

正确关系是:

1
2
3
4
5
6
7
CAN 帧 COB-ID

识别这是 TPDO1 / TPDO2 / RPDO1 / RPDO2 哪个 PDO

找到对应的 Mapping 对象,例如 0x1A00

按 Mapping 解释 Data[0..7]

PDO 报文本身不携带对象 Index/SubIndex。接收方必须提前知道该 COB-ID 对应的映射规则。

错误理解:

1
PDO -> Index -> COB -> Byte

正确理解:

1
COB-ID -> PDO 通道 -> Mapping 对象 -> Byte 布局

不要把这些对象映射到 TPDO

PDO Mapping 页面下拉框里可能出现 0x12000x1280 等对象。这些是 SDO 通信参数,不是过程数据。

不建议映射:

对象 原因
0x1200 SDO server 参数,不是过程数据
0x1201 SDO server 参数,不是过程数据
0x1280 SDO client 参数,不是过程数据
0x1800~0x1804 TPDO 通信参数,不是过程数据本体
0x1A00~0x1A03 TPDO 映射参数,不是过程数据本体

推荐映射厂商自定义过程变量,例如:

对象 方向 示例含义
0x2100:00 TPDO 设备状态值
0x2101:00 TPDO 测量值
0x2102:00 TPDO 计数值
0x2200:00 RPDO 控制命令
0x2201:00 RPDO 目标值

配置一个通用 TPDO 示例

目标:TPDO1 周期发送 3 个厂商自定义状态量。

第一步:添加可 TPDO 映射对象

Object Dictionary -> Manufacturer Specific Parameters 中新增:

Index Name Object Type Data Type Access SDO Access PDO Default Storage
0x2100 status_value VAR UNSIGNED16 ro t 0 RAM
0x2101 measured_value VAR UNSIGNED16 ro t 0 RAM
0x2102 counter_value VAR UNSIGNED32 ro t 0 RAM

保存后,回到 TX PDO Mapping,这些对象应出现在 Available Objects for PDO 和下拉框中。

第二步:启用 TPDO1

选择底部第一行 TPDO1,然后设置:

字段
Communication 0x1800
Mapping 0x1A00
COB 按 Node-ID 确认最终值,不与其他 CAN-ID 冲突
Type 254255
Inhibit 调试可先 0
Event Timer 调试可先 1001000
Sync start 0
Invalid 取消勾选

然后点 Save

第三步:配置 TPDO1 映射

按顺序选择:

1
2
3
0x2100/00/status_value      16 bit
0x2101/00/measured_value 16 bit
0x2102/00/counter_value 32 bit

总长度:

1
16 + 16 + 32 = 64 bit = 8 byte

等价对象字典:

1
2
3
4
0x1A00:00 = 3
0x1A00:01 = 0x21000010
0x1A00:02 = 0x21010010
0x1A00:03 = 0x21020020

PDO 数据布局:

Byte 内容
Byte0~1 0x2100:00 status_value
Byte2~3 0x2101:00 measured_value
Byte4~7 0x2102:00 counter_value

RX PDO Mapping 页面怎么用

RX PDO Mapping 配置“本节点从 CAN 总线接收的数据”。

RPDO 对象成对出现:

RPDO 通道 通信参数 映射参数 常用预定义 CAN-ID 基址
RPDO1 0x1400 0x1600 0x200 + Node-ID
RPDO2 0x1401 0x1601 0x300 + Node-ID
RPDO3 0x1402 0x1602 0x400 + Node-ID
RPDO4 0x1403 0x1603 0x500 + Node-ID

通用 RPDO 示例:

Index Name Data Type Access SDO Access PDO
0x2200 control_value UNSIGNED16 rw r
0x2201 target_value INTEGER32 rw r
0x2202 mode_value UNSIGNED8 rw r

RPDO1 映射:

1
2
3
4
0x1600:00 = 3
0x1600:01 = 0x22000010
0x1600:02 = 0x22010020
0x1600:03 = 0x22020008

总长度:

1
16 + 32 + 8 = 56 bit

剩余 8 bit 可以留空,也可以用 Dummy 填充到 64 bit,取决于主站配置和固件接收处理。

Modules 页面干什么

Modules 页面用于描述模块化 CANopen 设备,不是用来配置 C 代码模块,也不是用来配置 PDO。

典型使用场景:

1
2
3
4
5
一个远程 I/O 耦合器
├── 插槽 1:数字输入模块
├── 插槽 2:数字输出模块
├── 插槽 3:模拟输入模块
└── 插槽 4:温度采集模块

这种设备的对象字典可能会随模块组合变化,所以需要在 EDS/XDD 中描述支持哪些模块、每个模块有哪些对象。

字段含义:

字段 作用
Nr Supported Modules 支持的模块数量
List of modules 支持的模块列表
Index 模块编号
Name 模块名称
Version 模块版本
Revision 模块修订
OrderCode 订货号 / 料号
Module comments 模块说明
Module objects 模块关联的对象字典对象

普通固定功能从站可以保持:

1
Nr Supported Modules = 0

不需要配置 Modules 页面。

导出 EDS

执行:

1
File -> Export...

选择 EDS 输出格式,生成:

1
my_device.eds

EDS 交给主站、配置软件或测试工具使用。导出后建议重新用 CANopenEditor 打开 EDS 检查:

  1. 0x10000x10010x1018 是否存在;
  2. 0x1200 是否存在;
  3. 启用的 0x1400/0x16000x1800/0x1A00 是否存在;
  4. 厂商自定义对象是否存在;
  5. PDO 映射总长度是否不超过 64 bit。

导出 CANopenNode 的 OD.c / OD.h

先确认导出器:

1
Tools -> Preferences -> Selected exporter -> CANOPENNODE_V4

然后执行:

1
File -> Export CanOpenNode...

输出通常包括:

1
2
OD.c
OD.h

如果工程设置了对象字典后缀,也可能生成带后缀的文件名。导出后要检查固件工程:

  1. OD.c 已加入编译;
  2. include path 能找到 OD.h
  3. 工程引用的 OD 名称与导出文件一致;
  4. OD_CNT_* 宏符合启用对象数量;
  5. PDO 初始化数量与 0x1400/0x1600/0x1800/0x1A00 一致。

最小可用配置建议

普通从站学习工程可以从下面对象开始:

对象 用途 建议
0x1000 Device type 启用
0x1001 Error register 启用
0x1017 Producer heartbeat time 启用,便于主站监控
0x1018 Identity 启用
0x1200 SDO server parameter 启用
0x2100~0x21FF 厂商自定义状态量 按需添加,TPDO 方向
0x2200~0x22FF 厂商自定义控制量 按需添加,RPDO 方向
0x1800/0x1A00 TPDO1 需要周期发送状态时启用
0x1400/0x1600 RPDO1 需要接收控制命令时启用

常见错误和处理

现象 原因 处理
灰色字段不能改 受功能勾选或对象类型联动 先启用对应功能或对象
导出的 OD.c 没有对象 Enabled 未勾选或对象未插入 勾选 Enabled 后重新导出
PDO 下拉框没有目标对象 对象没有设置 Access PDO 设置为 trtr
TPDO 不发送 Invalid 仍勾选或 Event Timer 为 0 取消 Invalid,设置触发条件
只能选 Byte0,不能选 Byte4 PDO 映射按顺序连续排列 先放前面的对象,后续位置自动出现
主站无法解释 PDO 数据 主站 EDS/DCF 与实际 Mapping 不一致 重新导出 EDS 并同步主站配置
映射超过 64 bit 一个 PDO 超过 8 byte 拆到下一组 PDO
误选 0x1200 / 0x1280 到 PDO 把 SDO 参数当成过程数据 删除映射,改选过程变量

资料依据

  • CANopenEditor 官方仓库说明:支持导入/导出 EDS、XDD,并导出 CANopenNode C 文件。
  • CANopenNode 对象字典文档:说明 XDD/XPD/EDS/DCF 的关系,以及 CO_disabledCO_countLabelCO_storageGroup 等 CANopenNode 导出属性。
  • CiA 301 V4.2.0:定义 0x1000~0x1FFF 通信对象、SDO 参数、PDO 通信参数、PDO 映射参数、Identity、heartbeat、EMCY 等对象范围和用途。