Lely dcf-tools 与 master.yml 配置教程:从 EDS 生成可用的主站 DCF
@[toc]
适用版本:原生 Lely CANopen 2.4.0
dcfgen。本文使用上游master/options/<slave>结构,不适用于 ROS 2 或其他 downstream 项目自定义的defaults/nodesYAML 格式。
本文解决什么问题
Lely 主站通常不是直接读取从机 EDS 后运行,而是先在开发机上通过 dcfgen 合并主站策略、从机 EDS 和 PDO/SDO 配置,生成 master.dcf 以及按需生成的 concise DCF 二进制文件。
本文给出一条可复现的配置路径:
- 在 Ubuntu 开发机安装与目标 Lely 源码匹配的
dcf-tools; - 准备从机 EDS 和
master.yml; - 逐项理解
options、master和从机 section; - 生成并检查
master.dcf; - 使用一份完整的
demo.yml作为字段字典,其中非必需字段全部保留为注释。
本文示例环境:
1 | 开发机:Ubuntu 20.04 |
1. 先理解生成链路
1 | flowchart LR |
三类文件的职责不同:
| 文件 | 生成条件 | 用途 |
|---|---|---|
master.dcf |
始终生成 | 主站运行时设备描述、NMT 策略、PDO 和远端对象配置 |
master.bin |
主站自身存在 concise SDO 数据时 | 主站对象的简明 DCF 数据 |
<slave-name>.bin |
对从机产生配置期 SDO 下载时 | NMT boot/configuration 阶段写入从机 |
关键结论:master.yml 不只是静态描述。只要 heartbeat、PDO、error behavior 或 sdo 等配置与 EDS 默认值不同,就可能生成从机 .bin,并在自动 boot 时修改设备。
2. 安装与源码版本匹配的 dcf-tools
2.1 固定源码版本
不要在生成环境中无条件 git pull。先记录当前 Lely commit:
1 | export WORK_ROOT=/home/embedsky/share/lely-imx8p |
建议让目标板上的 Lely C/C++ 库与开发机上的 dcf-tools 来自同一 commit,至少应保存完整 SHA 以便复现。
2.2 创建独立 Python 环境
1 | sudo apt update |
这里安装的是开发机工具,不是 AArch64 运行库。目标板可以继续使用 --disable-python --disable-cython 构建;目标板不需要 Python、pip 或 dcf-tools。
2.3 验证命令来源
1 | command -v dcfchk |
三个命令都应来自项目 venv。dcfgen --help 至少应包含 -d、-r、-S 和 -v。
3. 准备目录和输入文件
推荐目录:
1 | ${TESTER_ROOT}/config/ |
.bin 是否生成由配置内容决定,不应在脚本中假定它始终存在。
3.1 原始 EDS 与兼容副本
原始 EDS 应保留为证据文件,不直接修改。若 dcfchk 或 dcfgen 对某些厂商字段、identity 一致性或旧格式存在兼容问题,应生成一份专用副本,例如:
1 | project.eds # 原始文件,只读保存 |
当前工程曾遇到两类问题:
DeviceInfo.NG_Slave不被当前工具识别;DeviceInfo.RevisionNumber与0x1018:03不一致。
处理原则是只规范化副本,并在每次生成前校验原始 EDS 的 SHA256。
4. master.yml 的顶层结构
原生 Lely 2.4.0 识别三类顶层 section:
1 | options: |
规则如下:
mastersection 必须存在;options可选;- 其余非点开头的顶层名称都被当作从机;
- 从机 section 名决定生成文件名,例如
mcu_node_1.bin; - Node-ID 为 255 的从机会被忽略并产生警告;
- 不要使用 ROS 2/downstream 风格的
defaults:和nodes:,原生工具会把它们误当成从机。
5. YAML 写法规则
5.1 布尔值不要加引号
1 | boot: false |
错误写法:
1 | boot: "false" |
当前源码通过 Python bool() 转换配置值,非空字符串会被当成 true。
5.2 数字和键的写法
1 | vendor_id: 0x00000000 |
十六进制整数和 PDO 编号键均不要加引号。cob_id: auto 是工具识别的特殊字符串。
5.3 区分 dcf 与 dcf_path
dcf:dcfgen在生成阶段加载的 EDS/DCF 输入路径;dcf_path:目标运行环境中 concise DCF 文件的路径前缀。
dcf 的相对路径按运行 dcfgen 时的当前目录解析,不会自动按 YAML 所在目录解析。因此应固定在 config/ 目录执行生成命令。
6. 从最小配置开始
一份能够描述一个主站和一个从机的最小工程配置如下:
1 | master: |
这份配置可用于理解字段,但不能直接代表“安全的手工测试策略”。Lely 的部分 NMT 默认值会自动启动或 boot 从机。测试程序需要显式控制 NMT/SDO/PDO 时,应继续配置第 8 节中的手工控制策略。
7. 配置 options:建立全局默认值
options 全部为可选项:
| 字段 | 类型 | 默认值 | 作用 |
|---|---|---|---|
dcf_path |
string | "" |
目标系统上生成 .bin 的运行时路径前缀 |
heartbeat_multiplier |
float | 3.0 |
heartbeat producer 周期到 consumer timeout 的倍数 |
retry_factor |
int | 3 |
NMT boot retry factor,进入对象 0x1F81 高位字段 |
示例:
1 | options: |
cob_id = 0x680 是工具内部的自动分配游标,不是 YAML 可配置字段。
8. 配置 master:主站身份、通信和 NMT 策略
8.1 主站字段总览
| 字段 | 默认值 | 单位/对象 | 说明 |
|---|---|---|---|
node_id |
255 |
Node-ID | 主站节点号;工程中应显式设置 |
baudrate |
1000 |
kbit/s | CAN bit rate |
vendor_id |
0 |
0x1018:01 |
Vendor-ID |
product_code |
0 |
0x1018:02 |
Product code |
revision_number |
0 |
0x1018:03 |
Revision number |
serial_number |
0 |
0x1018:04 |
Serial number |
sync_period |
0 |
0x1006, μs |
周期 SYNC;0 禁用 |
sync_window |
0 |
0x1007, μs |
SYNC window;0 禁用 |
sync_overflow |
0 |
0x1019 |
SYNC counter overflow;0 禁用 |
time_cob_id |
0x100 |
0x1012 |
TIME COB-ID |
emcy_inhibit_time |
0 |
0x1015, 100 μs |
EMCY 抑制时间 |
heartbeat_multiplier |
继承 options |
倍数 | 主站监控从机时的 timeout 倍数 |
heartbeat_consumer |
true |
0x1016 |
为已配置从机生成 heartbeat consumer |
heartbeat_producer |
0 |
0x1017, ms |
主站 heartbeat producer 周期 |
error_behavior |
{1: 0} |
0x1029 |
主站错误行为 |
nmt_inhibit_time |
0 |
0x102A, 100 μs |
NMT 命令最小间隔 |
start |
true |
0x1F80 bit2 |
主站是否自动进入 Operational |
start_nodes |
true |
0x1F80 bit3 |
是否自动启动从机 |
start_all_nodes |
false |
0x1F80 bit1 |
是否广播启动全部节点 |
reset_all_nodes |
false |
0x1F80 bit4 |
mandatory 从机失败时 reset all |
stop_all_nodes |
false |
0x1F80 bit6 |
mandatory 从机失败时 stop all |
boot_time |
0 |
0x1F89, ms |
mandatory 从机 boot timeout |
8.2 手工测试场景的 NMT 策略
当测试程序要逐条执行 NMT、SDO 和 PDO 用例时,不应让主站在启动阶段抢先改变节点状态:
1 | master: |
对应的 0x1F80 计算如下:
1 | 初值 bit0 = 1 |
上述配置应得到:
1 | 0x1F80 = 0x0000000D |
8.3 自动化生产系统的策略
只有在主站负责整个网络的自动启动、身份校验和配置下发时,才启用:
1 | master: |
这类配置必须与从机 boot/mandatory/reset_communication、identity、heartbeat 周期和 concise DCF 文件部署保持一致。
9. 配置从机 section
9.1 从机字段总览
| 字段 | 默认/来源 | 作用 |
|---|---|---|
dcf |
必填 | 生成阶段加载的 EDS/DCF |
node_id |
255 或 DCF 环境 | 解析 $NODEID 并决定节点号 |
dcf_path |
继承 options |
该节点 concise DCF 的运行时目录 |
revision_number |
EDS | 期望 0x1018:03 |
serial_number |
EDS | 期望 0x1018:04 |
time_cob_id |
EDS 0x1012 |
期望配置的 TIME COB-ID |
heartbeat_multiplier |
继承 options |
该从机 heartbeat timeout 倍数 |
heartbeat_consumer |
false |
是否让从机监控主站 heartbeat |
heartbeat_producer |
EDS 0x1017 |
从机 heartbeat producer 周期,ms |
retry_factor |
继承 options |
NMT boot retry factor |
guard_time |
EDS 0x100C |
Node guarding 时间,ms |
life_time_factor |
EDS 0x100D |
Node guarding lifetime factor |
error_behavior |
EDS 0x1029 |
从机错误行为 |
rpdo |
EDS | 覆盖从机 RPDO,并生成主站对应 remote mapping |
tpdo |
EDS | 覆盖从机 TPDO,并生成主站对应 remote mapping |
boot |
true |
是否由主站自动 boot/configure |
mandatory |
false |
是否为 mandatory slave |
reset_communication |
true |
boot 时是否允许 NMT Reset Communication |
software_file |
"" |
0x1F58 firmware file |
software_version |
0 |
0x1F55 expected version |
configuration_file |
自动路径 | 0x1F22 concise DCF 文件 |
restore_configuration |
0 |
0x1011 restore sub-index |
sdo |
空列表 | 追加配置期 SDO 下载 |
9.2 手工测试场景的从机策略
1 | mcu_node_1: |
0x1F81 assignment 的主要位规则:
1 | bit0 = 节点存在 |
9.3 heartbeat 与 node guarding 不要同时启用
当以下三个条件同时成立时,当前源码会报警并清零 guarding:
1 | guard_time != 0 |
同一节点应选择 heartbeat 或 node guarding 作为主要错误控制机制,不要同时保持两者活动。
10. 配置 PDO
10.1 RPDO 示例
1 | mcu_node_1: |
10.2 TPDO 示例
1 | mcu_node_1: |
字段说明:
| 字段 | 说明 |
|---|---|
enabled |
是否启用该 PDO;必须使用未加引号的布尔值 |
cob_id |
显式 COB-ID 或 auto |
transmission |
PDO transmission type |
inhibit_time |
TPDO inhibit time,单位 100 μs |
event_timer |
TPDO event timer,单位 ms |
event_deadline |
主站 RPDO reception deadline,单位 ms;当前 2.4.0 源码存在已知问题 |
sync_start |
TPDO SYNC start value |
mapping |
映射对象列表,每项包含 index/sub_index |
使用限制:
- PDO 编号必须已存在于 EDS;
- 映射对象必须存在且允许 PDO mapping;
- Classic CAN 单个 PDO 总映射不应超过 64 bit;
-r是dcfgen命令行选项,不是 YAML 字段;- 测试 EDS 默认映射时,不要在 YAML 中重复覆盖 PDO,否则会产生配置期 SDO 写入。
11. 配置启动阶段 SDO 下载
1 | mcu_node_1: |
| 字段 | 必填 | 默认值 | 作用 |
|---|---|---|---|
index |
是 | 无 | OD index |
sub_index |
否 | 0 |
OD sub-index |
value |
否 | 0 |
写入值 |
dcfgen 会按 EDS 数据类型编码 value。该列表适合持久化启动配置,不适合测试过程中的临时写入,因为它会改变 boot 行为并可能生成 <slave-name>.bin。临时测试值应由测试程序在运行时写入,并在用例结束后清理。
12. 当前工程推荐的 master.yml
下面配置用于“所有协议动作由测试程序显式控制”的场景:
1 | options: |
生成时 -v 输出不应出现非预期的从机 SDO 写请求。
13. 完整 demo.yml:全部字段与注释
下面模板保留了原生 Lely 2.4.0 dcfgen 支持的全部配置字段。只有项目建立主从关系所需的基线字段处于启用状态;其余字段全部以注释形式保留,并在相邻注释中说明作用、单位和风险。
这是一份字段模板,不是生产参数清单。取消注释前应核对 EDS 默认值、节点能力、CAN-ID 冲突、运行时文件路径和自动 boot 的副作用。
1 | # Lely dcfgen 2.4.0 完整配置模板。 |
14. 生成 DCF
在 config/ 目录运行:
1 | cd "$TESTER_ROOT/config" |
参数含义:
| 参数 | 作用 |
|---|---|
-d generated |
指定输出目录 |
-r |
在主站 DCF 中生成 remote PDO 对象和参数映射 |
-v |
打印生成的配置期 SDO 请求 |
-S |
lint 失败时继续;正式生成不建议使用 |
15. 生成后检查
15.1 文件完整性
1 | cd "$TESTER_ROOT/config/generated" |
15.2 语义检查
手工测试配置至少应确认:
1 | 主站 Node-ID = 127 |
15.3 检查意外的 .bin
若生成了 mcu_node_1.bin,先查看 dcfgen -v 输出,重点检查:
- heartbeat producer/consumer;
- PDO 通信参数和 mapping;
- node guarding;
- error behavior;
sdo列表;- identity、software/configuration 管理字段。
任何与 EDS 默认值不同的配置都可能被转换为启动阶段 SDO 下载。
16. Lely 2.4.0 源码注意事项
以下字段在当前源码中存在实现风险,模板中已保持注释:
16.1 configuration_file
当前解析代码会把 configuration_file 的值写入与预期不一致的属性。建议使用自动生成的 <dcf_path>/<section-name>.bin 路径;确需自定义时,应先修复源码并增加生成结果测试。
16.2 event_deadline
当前处理 RPDO event_deadline 的代码引用了错误的变量。仅启用该字段可能导致异常或错误编码。启用前应修复源码,并验证对象 0x140x:05 的 verbose SDO 和 concise DCF 内容。
16.3 从机 time_cob_id
当前源码在相关路径中出现 time_cob_id 与 time_cobid 两种属性名。建议保持 EDS 中 0x1012 的默认值,除非已完成本地修复和回归测试。
16.4 不支持的常见 downstream 字段
以下字段不是原生 Lely 2.4.0 dcfgen schema:
1 | boot_timeout |
不要直接从 ROS 2 或第三方文档复制这些字段到原生 master.yml。
17. 常见问题
17.1 dcfgen: command not found
1 | source "$TESTER_ROOT/.venv-dcf-tools/bin/activate" |
17.2 调用了错误版本
1 | type -a dcfgen |
确认命令和 Python package 都来自项目 venv。
17.3 找不到 EDS
原因通常是从错误目录执行。固定从 config/ 目录运行:
1 | cd "$TESTER_ROOT/config" |
17.4 RevisionNumber 不一致
使兼容副本的 DeviceInfo.RevisionNumber 与 0x1018:03 一致,同时保留原始 EDS 和转换记录。
17.5 主站自动启动或复位从机
检查并显式设置:
1 | master: |
17.6 false 仍被当成 true
确认没有使用 quoted boolean:
1 | boot: false # 正确 |
18. 推荐维护流程
EDS 或 YAML 变化时:
1 | 校验原始 EDS SHA256 |
Lely commit 变化时:
1 | 重建或重装 dcf-tools venv |
19. 参考资料
源码位置:
1 | python/dcf-tools/setup.py |
官方文档:








