目录
创建一个仿真工程
添加CAN数据库
新建CAN数据库
添加报文和信号
添加数据库到工程中
定义系统变量
创建仿真面板
创建网络节点
工程运行测试
该文目标:
编写一个仿真工程,该工程将模拟两个功能单一的ECU之间的通信
dbc得作用:数据库文件在仿真工程中可以供CAPL和Panel面板调用,并在Trace、Graphics等分析窗口中将相关信息解析出来,将十六进制的数据转换为数据库中对应的报文和信号等,具有较强的可读性
创建一个含有报文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);
}