在上一篇分享里面,简单提到了创建仿真工程需要以下几个步骤:
- 选择工程模板
- 添加数据库文件
- 定义系统变量
- 创建仿真面板
- 创建网络节点
- 添加CAPL代码
- 工程调试
上一篇文章中介绍完了选择工程模板、添加数据库文件和定义系统变量三个步骤,今天接着分享一下创建仿真面板过程。因为也是一边学习一边总结,所以难免会有疏漏之处,如果有问题或者不同见解,欢迎大家一起来讨论呀~
创建仿真面板
打开Tools选项卡下面的Panel Designer,可以开始制作面板,
其主界面为:
在File中点击New,可创建新的面板。Panel Designer主要包含三个功能区:
- File用于对文件的新建、保存、另存、导入等功能的设置;
- Home用于提供面板设计的常用操作,包括对于控件的复制、剪切和粘贴,以及位置和尺寸等;
- Panel提供修改面板的属性,包括背景颜色/图片、面板尺寸等。
我们创建一个面板,一般会先设置面板的名字、颜色、高和宽等。
设置好面板属性之后,我们可以在里面添加控件了,所谓的控件其实就是面板里面不同的显示或者部件元素,CANoe包含了多种多样的控件类型,以支持不同的使用情景:
其实这么多,可以大致分为两种类型的控件,一类是Windows界面常见控件,比如Button、Check Box、Combo Box、Radio Button、Static Text等;另外一种就是CANoe特有的控件,比如Analog Gauge、Hex/Text Editor、Input/Output Box、Meter、Switch/Indicator 等,能够使得创建的面板支持仿真、测量等相关功能。我们用的比较多的就是
- Switch/Indicator(开关/指示灯控件)
- LED Control(显示控件,显示熄灭和点亮两种状态)
- Input/Output Box(一般用于需要文字提示的输入或者输出需求)
- Analog Gauge(模拟汽车仪表表盘)
- Meter(用于为定制的表盘配备指针,使得仪表具有更加逼真的效果)
- Combo Box(主要用于一些需要下拉菜单的输入需求)
我们不仅要根据不同的使用需求选择控件外,还要根据不同的控件配置不同的属性,在Panel Designer窗口的右侧有Properties选项,可以查看控件属性,包括Appearance, General, layout, Settings, Symbol。当然,每个控件的属性都不太一样,但以上提到的基本上属于每个控件都有的属性。我们在设置的时候,比较关注的是,background,背景颜色;Display Only,只作显示不响应鼠标点击,如果想要控件响应鼠标点击,需要将该项设置为false;Is Visible at runtime,运行时是否可见,一般设置为true(笔者有一次误操作设置的为false,导致一个控件怎么也显示不出来,反复查看CAPL代码,怎么也没查出来错,最后一个个确认面板属性,才发现是这里出了错);Mouse Activation type,鼠标激活类型,一般是需要左键增加右键减小时,设置为leftright,如果是只响应鼠标左键的点击状态,则设置为left;Symbol中设置控件数值关联的信号或者变量,这个属性至关重要,这里设置好了,后面我们为创建的面板写的CAPL程序才能发挥作用。
这里设置好了,我们想要面板真正的达到控制信号或者报文收发的目的,我们需要为创建的面板编写CAPL代码,可以这么理解,CAPL是面板的灵魂,没有它,面板就犹如一木偶,也就只能看看了。CAPL是专门用于CANoe开发环境的设计语言,属于一种类C语言,市面上关于它的介绍比较少,下次我会再简单分享下我对CAPL的学习总结。
下面我以创建一个用于控制点火和引擎速度的面板,给大家演示一下面板的窗帘过程。先来说一下,面板的创建一般包含:
- 面板属性设置
- 控件选择与布局
- CAPL编写
- 调试
我们可以设置控制面板点火钥匙开关的属性如下:
选择一个Track Bar作为档位控件,其属性如下:
再选择一个Track Bar作为速度控件,其属性如下:
设置好以后,我们可以为其写一段CAPL,以实现面板的控制作用。其实每个控件最后都是要作用到信号上面的,所以我们需要将控件和信号关联起来,对于控制面板,我们一般让控件直接关联的是系统变量,再将系统变量在CAPL中与信号关键起来。所以整个CAPL的编写思路是,点火钥匙控件控制点火信号的发送,档位控件控制发出档位信号,速度控件控制发出速度信号。放点火钥匙为run时,档位调节为drive,速度可调节。
完成该面板,需要在两个节点上添加CAPL代码;因为不同的节点负责不同消息的发送。在本例中节点BCM负责发送点火状态相关的报文,节点GateWay负责发送挡位以及车速相关的报文,代码分别如下:
BCM节点的代码:
/*@!Encoding:936*/
includes
{
}
variables
{
message Ignition_Info Msg_0x155;
msTimer msTPower;
}
on preStart
{
ILControlInit();
ILControlStop();
}
on sysvar sysvar::Power::KeyState
{
Msg_0x155.KeyState = @this;
setTimer(msTPower,100);
}
on timer msTPower
{
output(Msg_0x155);
setTimer(msTPower,100);
}
GateWay节点代码:
includes
{
}
variables
{
message VehicleData Msg_A8;
message Ignition_Info Msg_155;
message Gear_Info Msg_2CB;
msTimer msTspeed;
msTimer msTGear;
}
on preStart
{
ILControlInit();
ILControlStop();
}
on sysvar sysvar::Engine::Gear
{
Msg_2CB.Gear = @this;
setTimer(msTGear,100);
}
on sysvar sysvar::Engine::VehicleSpeed
{
if((@sysvar::Engine::Gear == 2 )&& (@sysvar::Power::KeyState == 2))
{
Msg_A8.VehicleSpeed = @this;
}
else
{
Msg_A8.VehicleSpeed = 0;
}
setTimer(msTspeed,100);
}
on timer msTspeed
{
output(Msg_A8);
setTimer(msTspeed,100);
}
on timer msTGear
{
output(Msg_2CB);
setTimer(msTGear,100);
}
最后我们运行CANoe,对面板进行操作,查看trace中的报文数据是否变更。也就是进行最后的工程调试。做好的面板如下:
运行效果:
可惜电脑没办法安装录屏软件,不然可以给大家看下这个动画。这次演示的例子比较简单,没有做显示面板,所以最终的控制效果需要通过Trace来体现。不过显示面板和控制面板的制作过程都是一样的。今天的分享就到这里了,如果大家有什么制作面板的更好的主意,欢迎一起交流呀~