CANopenEditor 从新建工程到导出 EDS / OD.c / OD.h
从新建工程开始
先新建空工程
执行:
1 | File -> New |
此时左侧显示 New Product,Object Dictionary 里还没有完整的 CiA 301 通信对象。不要直接在空工程里逐个手写 0x1000、0x1018、0x1200、0x1800、0x1A00 等标准对象,容易漏子索引、数据类型、访问权限和 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 是什么
DCF 是 Device 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_1 和 CANopen_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 | 0x2100:00 status_value UNSIGNED16 ro TPDO |
Object settings 每个字段的作用
| 字段 | 可选项 / 格式 | 作用 | 建议配置 | 不允许或不建议配置 |
|---|---|---|---|---|
| Index | 0x0000~0xFFFF |
对象字典索引 | 标准对象按 CiA 301;自定义对象用 0x2000~0x5FFF |
不要占用保留区;不要和标准对象冲突 |
| Sub Index | 0x00~0xFF |
子索引 | VAR 通常只有 0x00;ARRAY/RECORD 需要多个子索引 |
不要遗漏 0x00 最大子索引 |
| Name | 字符串 | 对象名,影响生成代码命名 | 使用英文、无歧义、少空格 | 不要用重复名、特殊符号、中文变量名 |
| Denotation | 字符串 | 标识/简称 | 可空 | 不要依赖它生成关键逻辑 |
| Description | 字符串 | 描述对象用途 | 对应用对象写清单位和方向 | 不要把实现代码细节写进去 |
| Object Type | VAR / ARRAY / RECORD / 其他类型定义项 |
决定对象结构 | 单变量用 VAR;同类型数组用 ARRAY;多字段记录用 RECORD |
不要把多字段对象硬做成多个无关 VAR,也不要把单变量做成 RECORD |
| Data Type | BOOLEAN、INTEGER8/16/32、UNSIGNED8/16/32、VISIBLE_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 | 字符串,例如 NMT、SDO_SRV、RPDO、TPDO |
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 | 少数双向变量,谨慎使用 |
为什么有灰色对象或灰色字段
灰色一般表示:
- profile 里有这个标准对象,但当前没有启用;
- 当前对象由其他页面或 profile 管理;
- 当前字段由对象类型、功能勾选或子对象数量联动;
- 该字段只在 DCF / 网络配置场景可编辑;
- 当前对象没有勾选 Enabled,不会导出到 CANopenNode 文件。
判断一个对象是否真正导出,不要只看颜色,按下面顺序检查:
1 | 对象是否插入当前 OD |
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 | 设备类型 | UNSIGNED32、ro,按设备类别填写 |
不要设为 rw;不要填随机值 |
0x1001 |
Error register | 标准错误寄存器 | UNSIGNED8、ro、可 TPDO 映射 |
不要让主站通过 SDO 写 |
0x1002 |
Manufacturer status register | 厂商状态寄存器 | 有厂商状态定义时启用,UNSIGNED32、ro |
没定义状态位时不要启用凑数 |
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_STRING、const/ro |
不要放运行时变化值 |
0x1009 |
Manufacturer hardware version | 硬件版本 | VISIBLE_STRING、const/ro |
不要每次上电变化 |
0x100A |
Manufacturer software version | 软件版本 | VISIBLE_STRING、const/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 |
底部 0xC0000180、0xC0000280 这类值表示 PDO 当前禁用,因为 bit31 为 1。
常见位含义:
| 位 | 含义 | 典型表现 |
|---|---|---|
| bit31 | PDO valid/invalid 控制位 | 1 表示 invalid,PDO 禁用 |
| bit30 | RTR 控制位 | 1 通常表示不允许 RTR |
| bit29 | 11-bit / 29-bit CAN-ID 控制 | 普通 CANopen 多用 11-bit |
| bit0 |
CAN-ID | 具体报文标识符 |
Communication parameters 怎么填
| 字段 | 作用 | 初学建议 |
|---|---|---|
| Communication | 当前 TPDO 通信参数对象 | TPDO1 为 0x1800 |
| Mapping | 当前 TPDO 映射参数对象 | TPDO1 为 0x1A00 |
| COB | TPDO 使用的 COB-ID / CAN-ID 信息 | 取消 invalid 后确认最终 CAN-ID 不冲突 |
| Type | 传输类型 | 调试可用 254 或 255;同步应用再用 1~240 |
| Inhibit | 抑制时间,限制最小发送间隔 | 调试可先 0,稳定后再设置 |
| Event Timer | 事件定时器,周期触发发送 | 调试可设 100 或 1000 ms,按工具单位确认 |
| Sync start | 同步起始值 | 非同步 PDO 保持 0 |
| Invalid | 是否禁用该 PDO | 要启用 TPDO 时取消勾选 |
不建议:
- 不要让两个 PDO 使用相同 COB-ID。
- 不要把禁用的
0xC000xxxx当成已经启用。 - 不要只改右侧字段但不点 Save。
- 不要把 SDO 通信参数对象映射到 TPDO 数据区。
为什么不能直接选其他 Byte
CANopenEditor 的 PDO 映射不是随便点击 Byte0、Byte3、Byte7 填值。它按映射顺序连续打包:
1 | 0x1A00:01 -> 从 bit 0 开始 |
对象长度决定占用多少 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 | 0x1A00:00 = 1 |
放多个对象:
1 | 0x1A00:00 = 3 |
布局:
| Byte | 内容 |
|---|---|
| Byte0~1 | 0x2100:00 |
| Byte2~3 | 0x2101:00 |
| Byte4~7 | 0x2102:00 |
COB-ID 不是用来选择 Byte
正确关系是:
1 | CAN 帧 COB-ID |
PDO 报文本身不携带对象 Index/SubIndex。接收方必须提前知道该 COB-ID 对应的映射规则。
错误理解:
1 | PDO -> Index -> COB -> Byte |
正确理解:
1 | COB-ID -> PDO 通道 -> Mapping 对象 -> Byte 布局 |
不要把这些对象映射到 TPDO
PDO Mapping 页面下拉框里可能出现 0x1200、0x1280 等对象。这些是 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 | 254 或 255 |
| Inhibit | 调试可先 0 |
| Event Timer | 调试可先 100 或 1000 |
| Sync start | 0 |
| Invalid | 取消勾选 |
然后点 Save。
第三步:配置 TPDO1 映射
按顺序选择:
1 | 0x2100/00/status_value 16 bit |
总长度:
1 | 16 + 16 + 32 = 64 bit = 8 byte |
等价对象字典:
1 | 0x1A00:00 = 3 |
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 | 0x1600:00 = 3 |
总长度:
1 | 16 + 32 + 8 = 56 bit |
剩余 8 bit 可以留空,也可以用 Dummy 填充到 64 bit,取决于主站配置和固件接收处理。
Modules 页面干什么
Modules 页面用于描述模块化 CANopen 设备,不是用来配置 C 代码模块,也不是用来配置 PDO。
典型使用场景:
1 | 一个远程 I/O 耦合器 |
这种设备的对象字典可能会随模块组合变化,所以需要在 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 检查:
0x1000、0x1001、0x1018是否存在;0x1200是否存在;- 启用的
0x1400/0x1600、0x1800/0x1A00是否存在; - 厂商自定义对象是否存在;
- PDO 映射总长度是否不超过 64 bit。
导出 CANopenNode 的 OD.c / OD.h
先确认导出器:
1 | Tools -> Preferences -> Selected exporter -> CANOPENNODE_V4 |
然后执行:
1 | File -> Export CanOpenNode... |
输出通常包括:
1 | OD.c |
如果工程设置了对象字典后缀,也可能生成带后缀的文件名。导出后要检查固件工程:
OD.c已加入编译;- include path 能找到
OD.h; - 工程引用的 OD 名称与导出文件一致;
OD_CNT_*宏符合启用对象数量;- 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 | 设置为 t、r 或 tr |
| 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_disabled、CO_countLabel、CO_storageGroup等 CANopenNode 导出属性。 - CiA 301 V4.2.0:定义
0x1000~0x1FFF通信对象、SDO 参数、PDO 通信参数、PDO 映射参数、Identity、heartbeat、EMCY 等对象范围和用途。



















