CANoe 11.xx 快速入门教学
本教程主要使用1630A为例并且笔者目前也只使用过1630A。本教程主要目的是让读者可以从零开始学会CANoe最基本的使用,并且笔者也是刚刚入门,通过浏览文献、博文、视频还有help文档肚子摸索,故文中不乏很多错误的内容,或者概念的错误理解,如有问题还望指出,互相学习,也因为可能会存在错误,读者如果未来要深入学习或者使用,最好能仔细阅读Help文档,并且找一位老练的工程师答疑。
本文针对CANoe11.xx撰写,后续内容简称CANoe。
阅读本文需要有一定的基础,比如需要对CAN总线比较了解,需要有一定的编程基础,还需要有使用计算机软件的基本常识。
----肥杨同学 2022年8月
CANoe软件包的下载
CANoe的软件包可以在Vector的官网进行下载,笔者使用的设备为1630A,它的License貌似支持到了12.xx,但是在官网下载12.xx发现它的安装包里面不能安装CANoe,但是会安装dbc++等其他软件,故不能使用,所以就安装了11.xx。下面的链接是安装包。安装的过程就暂时省略,因为公司的电脑打开安装包都需要IT的审批很麻烦。
https://www.vector.com/int/en/download/?tx_vecdownload_downloaddetail%5Bdownload%5D=40906
如何安装可以去搜索相关博文。
VN1630A驱动的下载
好像在安装软件的时候有一步可以选安装驱动,这里说一下单独的吧,下面的下载的链接。
https://www.vector.com/int/en/download/?tx_vecdownload_downloaddetail%5Bdownload%5D=46642
安装的时候选择自己手上有的设备就可以了,我的的VN1630A就选VN1630A就可以了,是在打开安装包之后几步选择的。
CANoe的License
CANoe的License刚开始困扰了笔者好多天,最后发现我们用的这一个License是跟着设备的,就是设备本身就是加密狗,只要正确安装设备驱动,并且将设备插到电脑上就可以正常打开软件了,对于License的检查是在下面这个弹窗之后,在点击接受之前就要将设备插上。
当然CANoe 有多种加密方式,它的License也有多种,现在这种是我使用的设备使用的,还有专门的加密狗加密和软件的License授权。后面的几种笔者没接触过。
至此我们应该可以正常打开软件并且开始操作了。
硬件配置相关
硬件的配置主要是要配置一下通道,还有就是要根据你的总线设置一下像波特率等其他参数,
通道数量的设置:
通道数量可以从Hardware-Chanel Usage中进行设置。
通道映射设置:
通道映射可以在Hardware-Chanel Mapping中进行设置,一般新建的工程默认会分配到Virtual CAN Bus xxxx,如果我们要做测试一定要改成我们设备对应的硬件,并且要跟设备的通道对应,比如1630A有四个通道可以用,那么我们一定要确保我们没有选错通道,而在1630A上面只有连个DB9接口,这两个DB9接口可以输出四路信号,那么我们怎么知道引脚定义呢,这个时候就需要用到刚刚安装的设备驱动了,它的名字叫Vector Hardware configuration,我们打开这个软件后可以在左侧的Hardware上面看到我们的设备1630A,点击其左侧的加号后就可以看到** Piggy 和on board CAN 1051cap,这就是这个1630A所能输出的信号有几个就是能输出几路信号,其中Piggy是插在1630A内部插槽里面的,就像显卡一样。我们左键点击一个on board CAN 1051cap就可以看到右侧出现了详细信息,最后一个D-SUB9 Pin Assignment 就是引脚的布置,我们按照这个将线接好就可以了,需要注意的是,之前笔者在使用时发现如果不映射到虚拟通道,而映射到设备上,那么必须在设备端把总线接好,必须要在总线上有其他设备并且该设备需要上电,能够接收CAN信号,否则1630A会亮红灯。如果想要将报文通过设备发送到总线上一定要把通道映射到设备上,不然它只会在你的电脑里面仿真,不会向外发送信号。
上面的左图最下方的小电脑就是表示我们现在用的时虚拟总线,而右侧则是使用设备在输出。
创建一个CAN工程
打开CANoe后在左上角点击File,再点击左侧的NEW,我们的工程只会用到一个CAN通道所以我们选择一个CAN通道波特率是500,如下图所示。
这就进入了我们的工程界面,首先要将新建的工程保存,按Ctrl+S,然后选择一个合适的位置将其保存就可以了,注意如果没有获得正确的CANoe License可以完成上述操作但是不能保存,如果点开File发现保存按钮是灰色的就需要重新确认License是否有问题了。
CANoe的HelloWorld
写到这里发现这篇博文写的不错看这篇吧。
https://blog.csdn.net/weixin_42813521/article/details/121287954?spm=1001.2014.3001.5501
需要注意的是CANoe的自动补全机制很怪,很多时候会乱补,在输入后到弹出自动补全会有个间隔,快点输入不让它自动补全就行了,还有输入sysvar::Mynamespace::xxxxx的时候,输完冒号后会自动补全,这里也要快一点或者删除重新输入就行了。总之代码补全会让你写的跟例程不太一样,你想办法把它输入的和例程一样就可以了。
另外Panel的Switch组件默认是左键开右键关的,不要一直点左键。
CANoe的大体运作方式
刚开始的时候我也不太理解为什么CANoe能卖那么贵,而且它有什么实际的用途,后来发现CANoe确实简化了很多开发和测试的过程,尤其是对测试来说,CANoe相对其他软件来说会更直观,更方便。而实现这些的最主要的就是Panel和CAPL了,它可以通过对一些按钮的操作,来实现发送报文的功能,这也是本教程最终要达到的目标。
要达到这个目标我们需要掌握以下的几个工具,这些工具在上面的HelloWorld差不多都出现过了,它们分别是CANdb++、Panel和CAPL。
下面说说这几个工具之间的关系吧,这也是CANoe前期比较难入门的主要原因。上面的图是我自己的理解,可以参考的看一看。
首先CANdb++是用来写dbc文件的,dbc文件就是CAN总线的Signal Matrix,想要做一个完整的CANoe工程这个东西的必不可少的,它里面记录了CAN总线上面会发送和接收的报文,报文的ID、报文名称,在报文中又有信号,一个报文可以包含若干个信号,在标准的CAN总线中一个报文的数据不超过8字节。这个dbc文件还要确定哪个报文是谁发给谁的,在dbc中有节点的概念,每个节点中有接收的报文,发送的报文,接收的信号和发送的信号,一般的顺序是创建节点,创建报文,再创建信号,然后将信号拖到报文里面,再将报文拖到节点的发送或者接收里面,使用的时候我发现实际上不需要创建节点,只要有报文就可以了,而且CAN总线实际上也没有真正意义上的节点。创建好DBC之后,整个工程的三分之一就完成了。
接下来我们需要创建Panel,Panel就是GUI,测试时候用的图形操作界面,有很多种控件,按钮、LED灯、LCD屏、勾选框、下拉框、仪表等等,我们要根据现有的空间来设计测试的内容,包括信号如何传递,比如我们要控制一个LED等,那么我们就需要一个开关,把开关放上去,然后做一些关联,一按开关就会发信号,这个信号就是DBC中定义的信号,当然信号不能单独发送,需要在报文里发送,这样就可以完成控制了,要是LED灯亮不亮还能有反馈,那么我们还能再设计一个LED灯,用来接收反馈的信号,看下LED灯的反馈信号是否正常。到这里我们就完成了二分之一了。
接下来,就是CANoe的灵魂CAPL了,我觉得CAPL和C++极其相似,就是把C++做了封装,所以如果会C/C++的可能很容易学会,它的难点在于它有很多库函数和关键字需要学习,如果了解了这些,那么它和C/C++几乎没有区别。那么利用它我们能干什么呢?利用它我们可以简单的模拟一个ECU内部的代码,像黑盒一样模拟它的输入输出,完全实现内部的代码不一定可以,可能需要看使用的ECU是什么样的有哪些外部硬件。在我的项目中我只是把ECU作为一个黑盒,我没有管它们内部怎么样,只是在收到信号后把信号做一个简单的转换,然后再发出来,做这个转换是因为有的信号发过去的和反馈的不一样。而我做的这个项目主要就是测试在CAN总线上能否对座椅进行控制,并且看它能否正常反馈。
CAPL和Panel之间理论上应该可以使用信号的方式进行连结,但是我自己在LIN总线的工程上测试,这样做可以,而CAN总线的却不可以,那么我们只能使用标准方法,就是创建系统变量,系统变量可以在Environment选项卡中看到我们点击System Variables,就可以打开创建系统变量的界面,它就是Panel和CAPL沟通的桥梁。在弹出来的窗口左边右键单击选择New,就可以创建一个系统变量,系统变量有自己的命名空间,我一般是一个报文用一个命名空间。
至此一个工程大体的运作方式我们就了解了接下来简单说下各方面的细节。
CANoe的主界面
打开CANoe这个软件后我们可以在主界面右下角看到Trace、Configuration和Analysis,三个选项卡,这三个选项卡是CANoe的主选项卡,其中Analysis我没有用过,最常用的是Configuration,Trace是用于查看报文的。
下面主要说说Configuration:
在configuration窗口中我们最常用的是Simulation Setup,这里面就是CAN网络的主要窗口。对CAN网络模拟的主要架构就要在这里体现,我们可以在这里加入一个ECU,方法是右键点击红蓝两根线,选择Insert Network Node,这样就加入了一个ECU,当我们双击ECU时就会进入CAPL的编辑界面,在里面可以编辑这个ECU都做了什么,而最初始的那个CAN,就是我们的1630A或者说是我们的CANoe,如果是做测试,CAN报文最终肯定是用1630A发送到外面的设备。当我们创建完ECU可以发现新创建的ECU被接在了红色的线上面,那么这两根线有什么区别呢,我最开始是认为它们一个是CANH一个是CANL,后来发现只连一个,就知道事情没有那么简单,后来才发现原来红色的线是仿真线,而蓝色的线是测试线,当然我这里说的测试,是指它实实在在的通过1630A连接到了ECU上面,不过这也是我个人的理解。那么我们如何让它切换到蓝色的线上面呢,我们右键点击创建的ECU,把Block Active取消勾选,它就到蓝色的线上了,并且颜色也会变暗。
除了插入ECU,我们还需要插入一个CAN信号的发生器,在测试中会用到,邮件点击两根线,我们可以看到两个Interactive Generator,一个是CAN Interactive Generator,一个是Interactive Generator Block,其中CAN Interactive Generator 是CAN总线专用的发生器,它需要dbc的支持,而Interactive Generator则不需要dbc的支持,我们可以直接手动编辑报文每个字节的内容。除此之外,我们还可以设置是按键发送,还是循环发送,
CANoe的CANdb++
CANdb++没什么好说的网上有很多教程,通信DBC文件的编写,主要还是需要对CAN总线的报文结构,有了解才可以,我开始的时候也不会用,但是我对CAN总线比较了解,自己研究了一下就弄明白了,所以想要用这个就需要对CAN总线最后了解,然后再找找视频或者文章看一看就OK了。
CANoe的Panel
Panel也是CANoe很重要的一部分,有了这个就可以很容易的修改和发送报文,不需要我们手动算报文的哪个位写什么,而Panel有很多控件需要我们熟悉,先说下界面,先看右下方,有Toolbox和Properties选项卡,Toolbox中罗列了所有的控件,将其中的控件可以通过鼠标拖拽的方式拉到中间的虚线框中,就可以看到它的真身了,然后点击我们要修改的控件,到右下角可点击Properties可以切换到属性界面,就可以修改控件的属性了,属性的Symbol可以选择与该控件关联的信号或者系统变量,选择好信号或者系统变量再选具体是哪一个信号和系统变量,选择完成后其他属性会根据当前的信号做一些改变,具体每个控件的属性内容,建议去help里面查找,并根据自己的使用情况进行更改。
CAPL
CAPL就主要介绍它的一些关键字和常用函数,
双击新建的ECU之后选择CAPL文件.can保存的位置,然后就会弹出CAPL的编辑界面,初始的.can文件有两个模块分别是include 和 variables,include是用来存放CAPL的头文件的,这个东西我也没用过,也不知道怎么写,variables中是用来存放全局变量的,全局变量要在这里定义和初始化。
先说说变量的定义,在CAPL中有一些比较特殊的变量,比如message变量,它本身是一个结构体,这个结构体和我们编写的dbc文件是关联的,也就是我们的dbc文件中有什么报文,这里就能以这个报文实例化一个对象,这个对象中存放的就是报文的一些属性还有信号。假设我们在dbc中定义了一个报文名叫test
那么我们就可以这样定义一个报文对象:message test t1;
这样就定义了一个t1报文它就是用来存放test报文的。此外我们还可以创建匿名的报文但是这个我们用过。具体可以看看help文件。
除了message还有timer定时器对象,timer分为timer和mstimer,一个是以秒为单位的一个是以毫秒为单位的。可以这样创建一个定时器timer t1;
那么定时器如何使用呢?
这就要说到CAPL的一个重要关键字on
了,这个关键字表示这个“函数”或者说“程序块”是作用于什么的,通常有 on message/timer/sysvar/signal/start
它们的作用分别是在收到报文时运行、满足定时器条件时运行、系统变量变化时运行、收到信号时运行和程序开始时运行。
接下来我们演示一下如何使用定时器。
includes
{
}
variables
{
msTimer cycle;
}
on start{
setTimer(cycle,100);
}
on timer cycle{
setTimer(cycle,100);
}
上面的代码可以实现每过100ms运行一次 on timer cycle
中的内容,需要注意的是,定时器不会自动重置,我们必须利用 setTimer(cycle,100);
这个函数将定时器重置。Cycle只是这个定时器的名字,并不代表它是一个循环,如果我们删掉了这条语句这个代码块只会在开始后的100ms运行一次。
我们可以用这个特性来把报文按一定的频率发送。
我们再举一个报文的例子:
on message SeatECU2_DR_SOC1{
//do some thing
}
这里面的 SeatECU2_DR_SOC1
是一个报文的名称,而不是报文对象的名称,这个是值得注意的,这部分代码块会在收到 SeatECU2_DR_SOC1
这个报文后开始运行。当然这个报文是在DBC文件中被定义的。
再举一个系统变量的例子:
on sysvar sysvar::LUMICtrl::Piping_Model{
//do some thing
}
这个重点需要关注的是sysvar::LUMICtrl::Piping_Model
这个是指sysvar系统变量作用域下LUMICtrl命名空间的Piping_Model系统变量。当这个系统变量发生变化时就会触发这个代码块。
上面的是关于on关键字的一些说明,我们的代码大部分都会写到这些代码块中,接下来说一下代码块中用到的函数,我们只说一些常用的函数,或者说是我常用的,想要进一步提升还是需要去看help文件。
函数名 | 作用 |
---|---|
setTimer(cycle,100); | 使cycle这个定时器100个单位时间后触发 |
syssetvariableint(sysvar::aspace::b,0); | 设置系统变量b为0 |
temp=sysGetVariableInt(sysvar::aspace::b); | 将b这个系统变量的值返回(赋给了temp) |
Output(Ctrl); | 发送Ctrl这个报文到总线上 |
这些就是我最常用的函数了,我也就用上面这些函数完成了我的第一个项目,当然还要加上if else等条件语句,这些语句还有基础的变量几乎和C语言是一样的就不多说了,具体可以去看看help文件。
结语
能想到的就这么多了,没有讲的非常详细,可能很多细节还是要去参考其他博文,但是这里面有笔者在学习时网上找不到,但是却很重要的一些知识点。总之希望对你有帮助。