开发一个CANoe仿真Demo_FirstDemo

目录

创建一个仿真工程

添加CAN数据库

新建CAN数据库

添加报文和信号

添加数据库到工程中

定义系统变量 

创建仿真面板

创建网络节点

工程运行测试


该文目标:

编写一个仿真工程,该工程将模拟两个功能单一的ECU之间的通信


创建一个仿真工程

  • 创建仿真工程,命名为FirstDemo.cfg
  • 将其保存在文件夹FirstDemo下
  • 在该文件夹下分别创建三个文件夹:CANdb、Panels、Nodes



添加CAN数据库

dbc得作用:数据库文件在仿真工程中可以供CAPL和Panel面板调用,并在Trace、Graphics等分析窗口中将相关信息解析出来,将十六进制的数据转换为数据库中对应的报文和信号等,具有较强的可读性

新建CAN数据库

创建一个含有报文Msg1和信号bsSwitch的数据库

1:打开CANdb++Editor(CAN数据库编辑器)

2:选择CAN Template.dbc作为模板

3:将新建文件命名为FirstDemo.dbc并保存在工程FirstDemo下面的文件夹CANdb

添加报文和信号

在Messages下面创建一条报文Msg1,报文设置如图

在Signals下面创建一个信号bsSwitch,报文设置如图

   

将信号bsSwitch拖曳到报文Msg1下面,这样bsSwitch就变成报文Msg1的一条信号

 至此,数据库已创建完毕,可以保存工程并推出

本数据只包含一条报文和一条信号

添加数据库到工程中

在Simulation Setup窗口中,添加dbc到Databasses中即可


定义系统变量 

单击Environment功能区中的System Variables(系统变量)配置对话框

创建一个系统变量svLight,参数如图

创建另一个系统变量svSwitch,参数如图

 

 

问: 1:为什么要定义两个系统变量???

        2:“系统变量”存在得意义是什么???

答:1:

        一个灯的系统变量(svLight),一个开关的系统变量(svSwitch) ;

        其中sv是指system variables;

        灯的sv可以在Panel中与表示灯的组件相关联,起到控制Panel中灯的开关的作用;

        开关的sv同理;

         2:

        说白了就是

        环境变量(env)在老版CANoe中常用,而系统变量(sys)在CANoe6.0以后常用;

        两者作用相同,优先使用系统变量(sys)

        具体见下文:

        CANoe:环境变量vs系统变量的区别


创建仿真面板

创建开关/指示灯面板(储存在Panels文件夹下) 

(没有环境变量,这里的Panel面板无法和对应的信息关联)

 

 


创建网络节点

在Simulation Setup窗口中添加两个ECU节点(ECU1和ECU2)

作用:当开关按下后,ECU1发送一个CAN报文,ECU2收到报文后,将指示灯亮起

对ECU1的设置:

单击File按钮,为该节点创建一个Switch.can文件,并添加CAPL代码

(这段代码使得节点Switch根据系统变量svSwitch的变化,修改bsSwitch的值,并将新的报文发送到总线上。)
 

/*@!Encoding:936*/
includes
{
  
}

variables
{

}

on prestart 
{
  write("This is my first CANoe Simulation!\n");
}

//以下为处理系统变量svSwitch的响应
on sysvar sysvar::MyNamespace::svSwitch
{
   //声明一个CAN报文,用于报文发送
   message Msg1 msg;

   //读取当前的系统变量svSwitch的值,并赋值给报文顶得信号bsSwitch
   msg.bsSwitch = SysGetVariableInt(sysvar::MyNamespace::svSwitch);

   //将报文输出到总线上
   output(msg);
}

 对ECU2的设置:

 单击File按钮,为该节点创建一个Light.can文件,并添加CAPL代码

(这段代码将在Light节点中处理收到的CAN报文Msg1,根据报文中信号bsSwitch修改系统变量svLight的值,从而屎线LED指示灯的点亮或者熄灭。)

/*@!Encoding:936*/
includes
{
  
}

variables
{
  
}

//以下为接收到Msg1报文的响应
on message Msg1
{
   //读取报文的信号bsSwitch的值,并赋值给系统变量svLight
   sysSetVariableInt(sysvar::MyNamespace::svLight, this.bsSwitch);
}


工程运行测试

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值