【CANoe】小白入门简单工程Demo:light 和 switch

工程步骤

  • 1.所有项目相关的文件都放在一个文件夹
    • database,node,panel,logging,DLL(UDS)..
  • 2.创建数据库,保存在database中,使用xl模板
    • 查看attribute list
    • 创建node, message, signal,并关联
    • signal的注意点
      • 默认signed,要改为unsigned -- 实际少有负数
      • 根据实际设置max,min
    • message的注意点
      • 设置位循环帧,设置地址,DLC
    • node>message>signal
  • 3.关联数据库到仿真节点
  • 4.设置系统变量,环境变量
    • 高版本不用
  • 5.设置面板
  • 6.编辑代码

1.新建CANoe工程

在文件夹新建各个存放文件夹

  • database,node,panel,logging,DLL(UDS)..
    image

新建CANoe工程

  • new-选择CAN 500kBaud/default模板-双击并保存

2.新建DBC数据库

signal, message, node的形象理解

  • node:公交站点
  • message:公交车
  • signal:乘客

新增dbc模板

  • tool-打开CANoedb编辑器,file-new-Vector basic模板(最后一个模板)
    图片
    • 注:这个模板会相对其他模板,在属性部分包含较全的属性,推荐使用
      image

新建信号

  • 乘客:名为switch的信号
  • 左侧大纲选中signal-右击-new,并写入信号的信息
    • 信号名,长度,字节顺序,数据类型,系数Factor,偏移offset,max,min
    • 注:一般信号为非负数,故value type选为unsigned
      图片

新建报文

  • 公交车:名为MyMSG的报文
  • 左侧大纲选中message-右击-new,并写入报文的信息
    图片
  • 设置循环帧:attribute标签
    • 在message的attribute标签中,设置循环时间和循环类型(cycle)如图
      图片
  • signal标签中:可添加相关的signal到本报文中
    • 这一步也可在后续的signal-message关联步骤中再做
  • layout标签:报文布局
    • 本项目中,此message只包含一个signal时的layout
      图片
    • 当一个message中包含多个signal时的layout示例:
      图片

新建节点

  • 左侧大纲选中nodes-右击-new,并写入节点的信息
  • node与报文和信号的关联详见后一部分,也可在node中直接添加
    • TX message标签中:添加需要发送的message包含到节点中
    • mapped RX sig.标签中:添加需要从其他节点接收的信号:
  • 注意:node关联时,仅可以设置发送的message,和接收的signal
    • 如图:发送的signal为仅查看,无法编辑
      图片

报文-信号关联窗口

  • 双击(左)报文下的某个信号,或(右)报文的信号列表中的信号,打开“报文-信号关联窗口”
    • 注:本窗口不同于单独双击信号或报文打开的没有关联的信号窗口或报文窗口
  • 设置报文-信号关联的数值,如startbit等
    image
    image

关联signal, message, node

  • signal关联message:告诉乘客要上的是哪辆公交车
    • signal窗口的message标签:add
      image
  • message设置发送节点:公交车的始发站
    • message一般有一个发送节点,而接受节点可以是多个
    • 注:message只能设置发送节点,接受节点不能添加,仅能查看
      image
  • 在message-signal窗口设置接受节点:乘客到站的站点
    • receiver标签中添加接收节点
    • 注:signal窗口的receiver标签下只能查看,不能添加
      image

创建好的dbc大纲

  • 以下文的light-switch panel为例的dbc
    image

3.关联数据库到仿真节点

  • CAN network下的DataBase选import导入
    • CAN network-CAN-database:右击-import wizard
    • select选择dbc文件
  • 选择所需的ECU节点,并导入dbc和节点
    • 从上一步所选的dbc文件中的ECU节点中选择所需节点,并“>>”移入右侧方框
    • 确认将要import的dbc和节点后-完成
    • 所需的dbc和ECU节点将被一次性导入simulation中
      image
  • 导入完成后,自动生成相应的节点
    • 如图:
      image

4.创建系统变量和环境变量

变量选取

  • 根据panel中的控件添加所需的系统变量
    • eg.后一章节中准备在panel设置一个light,一个switch控件
  • canoe12中无法在dbc中添加环境变量,先跳过

创建系统变量

  • CANoe界面-environment下-系统变量
  • 系统变量窗口的空白处:右键-new-输入参数
    • 初始值/max/min,数据类型等
    • 注:类型没有布尔,可以用int代替,如图
      image
  • panel中以switch和light控件为例,因此:
    • 添加如下两个系统变量
      image

5.CANoe中新建面板Panel

新增panel文件并保存

  • 打开panel编辑器:CANoe tool-panel Designer
    • 注意: panel designer与有道等翻译软件不兼容,不要同时打开!!
  • 保存默认生成的panel文件:重命名,文件位置选择等
    图片

设置控件

  • 将右侧toolbox中的控件拖入panel虚线框中
  • 选中控件-右侧属性properties窗口设置控件属性
  • 属性窗口的symbol:需要重点设置的属性,关联signal或变量
    • 这里关联上一步添加的系统变量值
      image

从panel快速打开panel designer

  • 在panel的空白处双击,可以快速打开panel designer
    图片

panel与capl

  • 下一步通过CAPL更好地控制panel的控件

6.编辑CAPL代码

新建/打开node关联的CAPL代码

  • 点节点左下角的小铅笔图标
  • 注:第一次打开时需要设置文件名和保存位置
    图片

系统变量

  • on sysver 系统变量:监控此系统变量的状态
  • @+系统变量名:指向系统变量的格式
  • thison sysver后的系统变量参数
  • XXX::XXX::XXX:表示 左包含右 的所属关系
    • 注意:高版本中,系统变量的signal写法,需要双冒号后的一撇

需求分析

  • 需要操作switch节点,把switch节点的变量值发送给light节点
  • switch节点:on sysvar XX
    • 将系统变量switch的值赋值给信号switch
    • write输出当前的系统变量switch
  • light节点:on signal xx
    • 监测swit信号,并将信号switch的值赋值给系统变量light

代码示例

  • switch.can
    on sysvar MyNameSpace::`switch
    {
      $MyMSG::`switch = @this;
      write("%d is switch",@this);
    }
    
  • light.can
    on signal MyMSG::`switch
    {
      @MyNameSpace::light = $MyMSG::`switch;
    }
    

代码效果

  • 运行canoe:小闪电运行
  • panel面板中,点swit开,灯亮;点switch关,灯灭
  • 注意:如图开关控件的开合控制 -- 左击关,右击开
    图片
  • trace窗口:可以看到开关时不同值的变化
    图片

常见错误:未连接真实ECU但real bus

  • 未连接真实ECU但real bus的情况下:
    • 运行,trace会显示错误帧,panel中开关无法控制灯亮灭
      图片
      图片
  • 选择:simulate bus后可以解决
    • 运行,trace不显示错误帧,panel中开关可控灯
      图片
      图片
  • 注意:是选择real bus/simulated bus,不是online/offline

其他代码示例:不经过报文,直接关联系统变量

  • 此时在trace中看不到值的变化
    //switch.can 
    //注:light.can中无需设置
    on sysvar MyNameSpace::`switch
    {
      @MyNameSpace::light = @this;
      write("switch is %d",@this);
    }
    

参考链接

学习教程

相关笔记

tbd

posted @ 2025-08-11 00:31  anliux  阅读(159)  评论(0)    收藏  举报