CANoe 第四期:使用 CANdb++ 制作 DBC 文件

第四期内容,主要讲解如何使用 CANoe 自带的 CANdb++ Editor 工具,根据信号矩阵表来手动创建 DBC 文件。以下是根据文件内容整理的系统性结构:

CANoe 教程第四期:使用 CANdb++ 制作 DBC 文件

一、 课程回顾与本期目标

  • 回顾: 上一期(第三期)学习了加载 DBC 文件后,CANoe 可以方便地解析和显示报文中的信号信息
  • 本期目标: 学习 DBC 文件是如何制作出来的,重点是使用 CANdb++ Editor 工具,依据主机厂提供的信号矩阵表,手动创建包含报文和信号定义的 DBC 文件
  • 示例: 以信号矩阵表中 ID 为 196 (EMS 发出) 的报文及其包含的两个信号(Engine Speed, Engine Speed Error)为例进行创建演示

二、 准备工作与工具介绍

  1. 信号矩阵表: 创建 DBC 的依据,包含了报文 ID、信号名称、起始位、长度、字节序、系数、偏移量、单位、值范围、含义等关键信息 。 (需要理解这些参数,可参考贾老师 CAN 总线通信系列视频第五期 )。
  2. CANdb++ Editor:
    • 安装 CANoe 时会自动附带安装的工具
    • 用于创建、编辑和管理 DBC 文件
    • 启动方式:从 Windows 应用列表的 Vector 文件夹下找到并打开

三、 使用 CANdb++ 创建 DBC 文件步骤

  1. 新建数据库 (DBC 文件):
    • 启动 CANdb++
    • File -> New Database
    • 选择模板 CAN Standard Template,点击 OK
    • 选择保存位置(建议在 CANoe 项目下建一个 can_db 文件夹),命名文件(如 sample.dbc),保存
  2. 创建信号 (Signals): (推荐先创建信号再创建报文 )
    • 在左侧导航栏找到 Signals 节点
    • 右键 Signals -> New,创建第一个信号 (EMS_EngineSpeed)
    • 配置信号属性 (依据信号矩阵表):
      • Name: 信号名称 (如 EMS_EngineSpeed)
      • Comment: 中文注释/描述 (如 “发动机转速”)
      • Length [Bit]: 信号长度,单位是位 (如 16)
      • Byte Order: 字节序 (一般选 Motorola)
      • Value Type: 值类型 (如 Unsigned 无符号)
      • Factor: 系数 (如 0.25)
      • Offset: 偏移量 (如 0)
      • Unit: 单位 (如 rpm)
      • Minimum/Maximum: 最小/最大物理值 (可手动填或点 Calculate Min/Max 后根据矩阵表调整)
      • Value Table: 值表(本次未使用)
      • 点击 Apply (应用) 和 OK
    • 重复上述步骤,创建第二个信号 (EMS_EngineSpeedError),注意其长度为 1 位,无单位,Min=0, Max=1
    • 注意: 此时创建的信号带有小叉图标,表示尚未关联到任何报文 。起始位 (Startbit) 在此时也无法设置,需要在关联报文后设置
  3. 创建报文 (Messages):
    • 在左侧导航栏找到 Messages 节点
    • 右键 Messages -> New,创建报文
    • 配置报文属性 (依据信号矩阵表):
      • Name: 报文名称 (可自定义,如 EMS_0x196)
      • ID: 报文标识符 (如 196,注意是十六进制)
      • DLC (Data Length Code): 数据长度码,表示数据域字节数 (一般为 8)
      • Type: 帧类型 (一般选 CAN Standard 标准帧)
      • Comment: 报文描述 (如 “EMS 周期发出的报文”)
      • 点击 ApplyOK
  4. 关联信号到报文:
    • Signals 节点下,选中已创建的信号 (EMS_EngineSpeed, EMS_EngineSpeedError)
    • 将信号拖拽Messages 节点下对应的报文 (EMS_0x196) 上
  5. 设置信号的起始位 (Startbit):
    • Messages 节点下,展开报文 (EMS_0x196),可以看到其包含的信号
    • 双击报文下的某个信号 (如 EMS_EngineSpeed) 打开编辑窗口
    • Definition 选项卡中,找到 Startbit 字段,填入信号矩阵表规定的起始位 (如 EMS_EngineSpeed 是 24,EMS_EngineSpeedError 是 12)
    • 点击 ApplyOK
    • 为该报文下的所有信号都设置好起始位
  6. 检查布局 (Layout) (可选):
    • 双击报文 (EMS_0x196),切换到 Layout 选项卡
    • 可以可视化地看到信号在 8 个字节(64 位)中的分布情况,高亮区域表示信号占用的位
  7. 保存 DBC 文件: 编辑完成后,记得保存 (File -> Save) 或关闭时提示保存

四、 在 CANoe 中验证创建的 DBC 文件

  1. 打开 CANoe 工程: 打开之前使用的 demo_canoe_project01
  2. 移除旧 DBC (如有): 确保 Databases 节点下没有加载其他的 DBC 文件
  3. 运行工程 (无 DBC): 启动工程,观察 Trace 窗口,报文没有名称,无法展开看信号
  4. 加载新创建的 DBC:
    • 停止工程
    • 右键 Databases -> Add,添加刚刚创建的 sample.dbc 文件
  5. 再次运行工程 (有 DBC):
    • 重新启动工程
    • 观察 Trace 窗口:
      • ID 196 的报文现在显示了名称 (EMS_0x196)
      • 报文可以展开,显示了定义的两个信号 (EMS_EngineSpeed, EMS_EngineSpeedError) 及其物理值、单位、中文名等
      • ID 28B 的报文因为没有在 sample.dbc 中定义,所以仍然是原始状态,无法解析
    • 这证明了自己创建的 DBC 文件是有效的

五、 总结与后续

  • 本期演示了如何使用 CANdb++ 根据信号矩阵表创建基本的 DBC 文件,包含信号和报文定义
  • 强调了 DBC 文件对于在 CANoe 中方便解析信号的重要性