[CANopen] 使用 CANopenEditor 工具编辑 CANopen 对象字典
前言
CANopen是一种基于CAN总线的高层通信协议,其核心对象字典(Object Dictionary)定义了设备的全部参数与功能。为满足不同厂商设备在特定场景下的要求,对象字典必须被精确配置,而手动修改这一过程通常较为繁琐。在最新发布的 hpm_sdk v1.10.0 中,支持使用 CANopenEditor 编辑的对象字典,让开发者可以更直观地管理对象字典与网络。本文将介绍如何利用这款新工具编辑对象字典,并一键生成可直接编译的源文件。
1. CANopenEditor 获取
CANopenEditor 工具获取链接:https://github.com/CANopenNode/CANopenEditor
工具包下载地址:https://github.com/CANopenNode/CANopenEditor/releases/tag/v4.2.3
工具使用步骤如下:
- 1. 下载并解压 CANopenEditor-v4.2.3-binary.zip 工具包;
- 2. 运行 CANopenEditor-v4.2.3-binary/net8.0-windows/EDSEditor.exe 以启动编辑器;
- 3. 通过菜单 File -> Open,导入 CANopenEditor-v4.2.3-binary/net8.0-windows/Profiles 下的 DS301_profile.xpd 协议模板即可开始编辑。
导入成功后,如下图所示:
以下是该工具配置菜单栏的介绍:
- 1. Device Info 中存放了该模板字典的基本信息;
- 2. Object Dictionary 是对象字典中具体的内容定义,包含每个对象以及具体的含义,这是对象字典的精髓;
- 3. TX PDO Mapping 和 RX PDO Mapping 显示了前面字典中,配置的 PDO 映射关系;
- 4. Modules 可以忽略。
2. CANopenEditor 配置
进入 Object Dictionary 目录,如下图所示:
这是 CANopenEditor 配置的重点,以下是菜单选项的简单介绍:
- 1. Communication Specific Parameters, 大部分和通信相关的参数以及通用的参数都在这个里面定义;
- 2. Manufacturer Specific Parameters, 存放设备或者功能相关的参数;
- 3. Device Profile Specific Parameters, 存放和行业协议相关参数,比如 DS402/DS401 相关协议在这个部分定义。
2.1 配置标准对象参数
左边 Object Dictionary 目录下,已有部分标准对象参数(置灰的表示已有定义,但是在该模板中未使能),用户可以根据自己的需求,对这些参数进行配置。
以对象 0x1008(Manufacturer device name) 为例,介绍对象的参数含义及配置方法:
如上图,这部分配置由四个部分组成:
- 1. 对象 0x1008 此时置灰,表明该对象未使能,此时导出 map 表,这个对象不会被包含在内;
- 2. 介绍了该对象的名称和属性:Name - Manufacturer device name, Obj Type - VAR(variable 相当于变量,还有 array 相当于数组,record 相当于结构体,这个参数在对象添加时确定,确定后无法修改), Data Type - VISIBLE_STRING, SDO - ro(对于SDO协议的权限是只读), PDO - no(对于PDO协议没有访问权限), SRDO - no, Default Value - 未填写;该部分为只读,在第 4 部分进行配置;
- 3. 对象的名称以及描述在这部分配置;
- 4. 对象的属性,也是对象配置最重要的部分,如第 2 部分中提到的 Data Type, Access SDO/PDO/SRDO, Default Value 就在这部分配置; 同时,还有三个重要参数需要关注, 即 Count Label - 表明这个参数归属哪种协议, Storage Group - PERSIST_COMM(选择性持久化通信参数,介绍该对象的存储属性,是否应该保存到ROM中,相对应的还有 ROM/RAM), Enabled - 勾选即使能该对象;
而此处,我们需要对该对象第 4 部分的部分属性做如下修改:
- 1. Default Value: HPMICRO Canopen Demo
- 2. Access SDO: rw
- 3. Enabled: 勾选
至此,对象 0x1008 已配置完成。
2.2 介绍生成的对象字典文件
在执行完章节 2.1 后,直接生成对象字典文件(具体操作请参考章节 2.4) OD.c/OD.h, 其中对象 0x1008 的属性应该和我们上述设置一一对应,以下依旧以对象 0x1008 为例,简单介绍这两个文件。
2.2.1 OD.c 文件
打开生成的 OD.c,可以看到如下结构体:
- 1. OD_PERSIST_COMM - 主要对象参数的结构体,属性是选择性持久化通信参数,上述定义的对象 0x1008 就定义在这个结构体内;
- 2. OD_RAM - 存储属性为 RAM 的对象;对象定义在 OD_PERSIST_COMM 还是 OD_RAM 即受上述的 Storage Group 参数决定;
- 3. ODObjs - 描述了所有对象的参数类型,访问属性和参数长度;此时对象 0x1008 属性为 SDO 可读写, 缺省值(HPMICRO Canopen Demo)长度为 20 字节;
- 4. OD - sample 中最终会通过这个结构体指针对 map 进行读写;
2.2.2 OD.h 文件
OD.h 中定义了上述 OD.c 中用到的所有的变量和结构体的定义, 比如上述提到的 OD_PERSIST_COMM_t, OD_RAM_t 等;此外,用户还需要关注的是以下宏定义:
这些宏定义描述了 CANopen 中所有协议涉及的对象数量,这个是根据上述 Count Label 统计出的。以宏定义 OD_CNT_NMT 为例,表明 NMT 数量为 1,在 CANopen 协议中,NMT 协议是最基本的协议之一,数量必须大于 1,否则会报错。
综上,我们介绍了如何使能并配置一个对象,同时介绍了 CANopenEditor 的配置和生成 map 表的对应关系。当然,想要配置出和 SDK sample 中同样的 map 表,还需要修改很多参数,用户可以参考 hpm_sdk v1.10.0 中,hpm_sdk/middleware/CANopenNode/port/objdict 路径下的 OD.c 文件,配置基本的参数对象。
2.3 增加一个新的对象参数
经过章节 2.1, 2.2 的配置,设备已具备一个基本的对象字典结构。然而,该默认配置中所有 PDO 的映射参数均为空。这意味着,即使 PDO 的传输条件被满足,从站设备也因缺乏有效的数据映射而不会发送任何 PDO 报文。因此必须在对象字典中定义应用对象,并将其配置到相应的 PDO 映射表中。本章节将详细阐述如何新增一个应用对象条目,设定其 SDO 访问权限,并将其分配为 TPDO 的映射内容,从而使能有效的过程数据通信。
在 Manufacturer Specific Parameters 区域, 左击 Name, 选择 Add,会出现一个 Create new OD Index 的对话框,用户需要设定三个参数:Index, Name, Object Type。
此处设定:
- 1. Index - 2102
- 2. Name - PDO_Para(表明这是给 PDO 使用的一个对象参数)
- 3. Object Type - VAR(表明这是一个变量)
点击 Create, 这个参数就添加好了。但是,用户还需要对这个对象进行属性配置,如 2.1 章节中对第 4 部分对象属性的描述,配置如下:
- 1. Default Value: 0xAA
- 2. Data Type: UNSIGNED32
- 3. Access SDO, PDO: rw(对 PDO, SDO 都分配了读写属性,主站可以通过这两种协议对 0x2102 这个对象的数据进行读写)
- 4. Storage Group: RAM
- 5. Enabled: 勾选
当然,由于这个参数是给 PDO 使用的,因此还需要修改 0x1600(RPDO) 和 0x1A00(TPDO) 的 subindex0 和 subindex1,以 0x1600 为例:
至此,所有配置步骤均已完成。
2.4 输出对象字典文件
生成对象字典文件(OD.c/OD.h), 如下图所示:
步骤如下:
- 单击 File, 选择 Export CanOpenNode..., 修改路径为 hpm_sdk/middleware/CANopenNode/port/objdict/, 替换已有的 OD.c/OD.h。
Notes:
Save Project As.../Export, 会将这次的改动生成一个新的 DS301_profile.xdd,用户下次导入这个文档,就可以直接在这次的基础上进行新的开发和改动。
Save Network XML, 会将这次改动后的对象字典,生成一个 XML 文档,可供后续其他平台的开发。
3. 运行结果分析
编译 hpm_sdk v1.10.0 中的 sample: hpm_sdk/samples/canopen/slave 并烧录到开发板,以 hpm6p00evk 为例(作为从站),主站使用 canbox(便于观察数据包进行分析)。数据交互如下:
- 从站运行成功并结束初始化后,将发送一个 init(0x00) 包,然后从站会自动切换至 pre-optional,并开始发送 pre-optional(0x7F) 包:
- 主站发送 start remote node(00 01) 命令,从站接收成功后,立刻开始发送 PDO(0xAA) 数据包,同时切换到 optional 状态并开始发送 optional(0x05) 包:
- 当收到 TPDO 的数据包后,说明对象 0x2102 的值和 TPDO 的属性配置成功,而配置时,还对 SDO 也做了访问配置,因此可以通过 SDO 去读 0x2102 的值:
- 通过 SDO 改写 0x2102,改写成功后,PDO 将发送新的 0x2102 的值:
- 再次读取 0x2102 的值以做确认:
此时,0x2102 已经被主站改写为 0xBB 并保存在 map 中。
总结
CANopenEditor 工具可替代手动修改,以简化对象字典的配置过程。hpm_sdk v1.10.0 中的 CANopen demo 对象字典即由该工具编辑、生成,可作为用户实现自定义配置的参考基础。