文章目录
【05】Canoe零基础手把手教学 — 最简单的仿真 — 开关和灯
一、新建工程
二、创建DBC文件
点击
Tools
-> 点击CANdb++ Editor
->File
->Create Database
->CANoe Template.dbc
得到如下图所示窗口(你们新建的应该右边是全空的):
右键单击左边的
Signals
->New
,按照下图所示创建一个信号Light
:
再右键单击左边的
Signals
->New
,按照下图所示创建一个信号Swtich
:
在进行后续操作之前,我觉得有必要简单解释一下dbc文件的层级关系:
- 首先左边的
Network nodes
和ECUs
可以简单理解为等价的,1个node
就是1个ECU
- 然后
Messages
就是报文,很好理解,1个ECU
里面可以包含有很多个报文,比如一个门模块的ECU
可以有门的开关、门锁状态
的报文和门的类型(比如电吸门)
的报文等等
最后是Signals
,同样,1个Message
可以包含多个Signals
,比如上面门模块的一个报文里面可以同时包含门的开关
和门锁状态
这2个Signal
为了进一步理解,我再用更具体的例子来解释说明:
- 现在有一个
Message
叫Door_status
,Door_status
这个Message
里面包含2个Signal
,一个叫open_close
一个叫lock_unlock
- 用层级来表示就是:
- ECU_A
- Message1
- Signal1
- Signal2
- Message2
- Message3
…
我们再右键点击
Messages
,New
,新建一个报文Light_msg
:
同理再新建一个报文
Switch_msg
:
然后,把
Light
信号按住鼠标左键拖拽到Light_msg
里面,把Swith
信号拖拽到Switch_msg
里面,得到如下图:
再右键点击
Network nodes
,New
新建2个node
,Light_node
、Switch_node
,直接点确定即可,如上图
报文,信号都创建好了,现在捋一捋逻辑:
- 首先我们有2个ECU,一个是
Light_node
,一个是Switch_node
,即一个灯,一个开关
Light_node
里面有1个报文Light_msg
,Switch_node
里面有1个报文Switch_msg
Light_msg
报文里面有1个信号Light
,Switch_msg
报文里面有1个信号Switch
Light
和Switch
都是无符号整数,最小值是0代表关,最大值是1代表开
问题来了,信号要有发送方和接收方,所以我们要把发送、接收关系配置好:
- 双击
Light_node
- >Mapped Rx Sig
(Rx表示接收)->Add: individual signals
->Switch
->OK
- 解释一下是什么意思,灯要打开,需要接收到开关给的
Switch
信号
- 同样,双击
Switch_node
- >Mapped Rx Sig
(Rx表示接收)->Add: individual signals
->Light
->OK
- 开关也要接收灯给的信号,知道灯到底有没有打开,好方便进行后续的操作
报文、信号、ECU已经全部配置完毕,下面进行报文属性的配置:
- 点击左上角
File
->Import Attribute Definitions
->easy.dbc
->打开
esay.dbc
一般在如下路径:C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 18.3.118\CAN\Easy\CANdb\easy.dbc
- 可以复制放到自己的工程文件下
esay.dbc
文件导入成功后,就可以双击Light_msg
和Switch_msg
调整报文属性了:
下面再解释一下每条参数的意思:
GenMsgCycleTime
= 200; // 每200毫秒发送一次GenMsgFastOnStart
= 0; // 定义消息是否在启动时快速发送,0否,1是GenMsgCycleTimeFast
= 100; // 快速发送时每100毫秒发送一次,通常与GenMsgFastOnStart结合使用,用于在启动时快速发消息GenMsgDelayTime
= 1; // 发送前延迟1毫秒GenMsgILSupport
= Yes; // 定义消息是否支持中断线(Interrupt Line)GenMsgNrOfRepetition
= 0; // 定义快速发送模式下的重复次数,快速发送0次GenMsgSendType
= 0; // 0周期性发送,1事件触发发送,2手动发送(由于没有CANdelaStudio)GenMsgStartDelayTime
= 0; // 定义消息开始发送前的延迟时间,开始发送前延迟0毫秒
最后再检查一下一致性,左上角
File
->Consistency Check
,没问题,可以进行下一步了
三、导入DBC文件
点击
Simulation
,点击Simulation Setup
,在左边找到Databases
,右键Import Wizard
->Select...
-> 选中上一步中创建的dbc
文件,把2个node都加进去,下一页
->完成
。
四、系统变量的配置
完成上述步骤后,可以开始配置系统变量了:
点击Environment
->System Variables
-> 空白处鼠标右键New
-> 创建aLight
、aSwitch
两个系统变量,加a是为了防止和CAPL关键字或者和其他信号什么的重名
到这里,准备工作就差不多做完了,下面进行最后一步,CAPL脚本编写
五、最简单的CAPL脚本
单击
Simulation
->Simulation Setup
-> 点击Light_node
上的铅笔图标
,如下图
创建一个
Light.can
文件,代码如下:
/*@!Encoding:65001*/
includes
{
}
variables
{
}
on message Switch_node::Switch_msg
{
@Light_node::aLight = @Switch_node::aSwitch;
$Light_msg::Light = $Switch_msg::`Switch;
}
同理,点击
Switch_node
上的铅笔图标
创建Switch.can
文件,代码如下:
/*@!Encoding:65001*/
includes
{
}
variables
{
}
on sysvar Switch_node::aSwitch
{
$Switch_msg::`Switch.raw = @Switch_node::aSwitch;
}
OK,全部保存好,CAPL脚本后面会专门介绍,目前先不做过多解释,照抄就行。
六、创建Panel
单击
Tools
->Panel Designer
,因为大家可能使用的Canoe版本不同,界面分布有些不一样,所以我对下面的操作步骤,稍微进行分解一下:
- 首先找到
Toolbox
后点击,我用的Canoe18SP3这里是右下角,然后找到Vector Standard Controls
下面的Graphical
,然后把Graphical
的LED Control
和Switch / Indicator
拖拽到中间框里去(大小自由调整)
- 然后找到
Symbol Exploer
里面的System variables
下面我们定义好的系统变量aLight
和aSwitch
,把这2个系统变量分别拖拽给对应的开关和灯泡。- 这一步就相当于把开关、灯泡的开和关跟对应的系统变量的值0和1关联上了,关就是0,开就是1
单击开图案,找到
Properties
(我这里是右下角),点击A/Z↓
,找到Mouse Activation...
,把Left Right
设置成Left
,同时可以看到下面的Value已经显示aSwitch
了。
Left Right
意思是鼠标右键是开,鼠标左键是关,Left
意思是鼠标左键点一下是开,再点一下是关
最后点击
Panel
,把名字改一下,保存就OK了,如下图:
七、运行
点击左上角闪电图标,点击开关就可以看到灯泡亮和灭了
点击Stop,可以在
Trace
窗口展开看信号值Switch
是0的时候Light
是0,Switch
变1的时候,Light
也变1了。
八、总结
这就是最简单的Canoe仿真了,大家多操作几次就可以掌握了。