基于CANoe的CAN总线设计基础与简例
CANoe概述
CANoe是德国Vecto:公司开发的一套通用的CAN总线系统的开发、测试和分析工具。CANoe的
主要组成部分和各自功能为:
? CANdb++编辑器:用CANdb++编辑器可以创建或编辑数据库文件(*.dbc)。数据库文件中
包括了CANoe所用到的信号的信息,这当中包括了报文和信号的网络节点和符号名称,以及环境变量等信息。
? CAPL浏览器:利用CAPL浏览器可以创建用于测量和模拟面板的CAPL程序。因为数
据库的应用,在编程时可以使用直观的报文和信号的名称,而不必使用二进制代码的报文头和数据。
? CANoe主程序:用于测量和模拟CAN系统。通过File/Database菜单,可以在主程序中
关联一个或多个数据库。
? 面板编辑器:通过面板编辑器可以创建面板。面板的作用是作为用户和在CANoe里的模
拟面板里被模拟的网络节点的I/O接口。除了标准按钮和开关,在面板编辑器中也可使用位图作为显示和控制器件。可以使用任意的位图编辑软件创建合适的位图,然后用十面板编辑器。任何显示和控制兀件都要和数据库中的环境变量关联好,这样CAPL程序可以在CANoe主程序中读写显示和控制兀件。
使用CANoe进行开发的三个阶段
使用CANoe的开发过程可以分为3个阶段:
第一个阶段是利用数字仿真进行网络需求分析和设计阶段。该阶段首先要定义网络里的通讯需求,包括:需要几个节点;在网络中要发送多少个报文;数据从哪个节点传输到哪个节点;每个报文的具体组成;有哪些外部的输入输出。然后,利用网络数据库工具CANdb++建立起CAN通讯数据库。接下来,建立网络拓扑结构,选择总线的波特率,定义节点的网络行为,使用CANoe建立各个网络节点的模型,并通过仿真来预估在设定波特率情况下的总线负载和延迟。通过第一个阶段的仿真可以检验各个节点功能的完善性和网络的合理性,也可以监控网络负载和延迟。第一阶段如图3-3所示。
图3-3完全数字仿真
第二个阶段是节点实现和半物理仿真阶段。第一个阶段结束后,我们能够得到一个完整的系统功能模型。接下来,可以开发真实的控制器节点,并利用总线接口与CANoe上剩余的虚拟节点相连接,来测试真实节点的功能,如通信、纠错。对于并行开发的节点,就可以不受其它节点开发步骤的影响。第二阶段如图3-4所示。
1 / 27
图3-4半物理仿真
第三个阶段是全系统集成阶段。开发的最终阶段将逐步把所有的虚拟节点用真实的节点来替代,此时,CANoe只是观察分析的工具了。在这个过程中,整个系统包括各个功能节点都能详细的检查到。由于利用功能模块取代真实的网络节点能减少错误的发生,因此通过这两种状态的切换能检查其功能的完善性。第三阶段如图3-5所示。
图3-5完全物理网络
3.3面板的设计
面板编辑器用于创建图形面板。在图形面板中可以在模拟测量的过程中方便地改变离散或是连续的环境变量的值。
面板编辑器既可以单独启动也可以从CANoe主程序中启动,从CANoe主程序中启动时,和主程序中关联的数据库会自动关联到面板编辑器中。表3-1为所有控制面板的元件一览。
所有放在面板上的元件称为“控件”。“控件”可分为控制元件和显示元件,控制元件(如开关,按钮等)用于改变环境变量的值,显示元件用于显示环境变量的值(如报警灯等)。
对于不同类型的环境变量有特定的元件可用,如对于离散的变量可用开关和显示灯等,对于连续的变量可用滑块,对于字符串型的环境变量可用文字输入框。除此之外,还可以放入静态的和环境变量无关的元件,如作为背景的位图,用于说明的文字等。
所有的“控件”(显示和控制元件)必须和数据库中的一个环境变量或信号相关联。
3.4 CAPL编程
3.4.1 CAPL简介
CANoe的通用性、易用性很大程度上是因为用户可以对CANoe进行编程。CAPL是CAN Access Programming Language的缩写。CAPL是一种类C语言的程序语言。利用CAPL可以在单个的应用中对CANoe进行编程。在网络节点的开发过程中,往往会出现其他网络节点还不可用的问题,为了模拟系统环境,这些网络节点的数据流要通过CAPL的编程来模拟,CAPL节点作为功能块插入到数据流图中。CAPL的输入是事件发生器,CAPL可以对报文,定时器以及键盘输入做出反应,所以CANoe可以用来监控和检测特殊的问题,如CANoe可以对发布到总线的特定报文做出反应,然后可以调用户自定义的分析和测试函数。CAPL同样也可为控制器的开发模拟总线环境,通过CAPL,对怎样的事件做出怎样的反应可以完全由用户来定义决定。因为CANoe有两个硬件接口,通过CAPL的编程也可以实现网关的功能。
2 / 27
必须要注意的是,在测试设置面板中插入的CAPL块能产生报文,但是不能发布到真实总线中去,如果要向总线发布报文,必须把CAPL块插入到模拟设置面板中。
在CAPL编程中应尽量引用数据库中的报文,这样做对于提高开发效率非常有用,例如,如果要改变某条报文的优先级,只需改变数据库中这条报文的识别码,然后重新编译CAPL程序即可实现,否则要在CAPL中去改变每个用到这条报文的地方,非常繁琐而且容易出错。 3.4.2 CAPL数据类型
一、CAPL数据类型如下表所示
二、数据定义 变量定义 int i;
message 0x123 HiRain; message MotorData Vector; 三、关键字this
this代表触发事件的对象on message 100 { byte byte_0;
byte_0 = this.byte(0);//将ID为100的报文的信号byte的值送变量byte_0,this指ID为100的报文 ... }
on envVar Switch { int val;
val = getvalue(this);得到环境变量Switch的值送val,this指Switch ... }
3.4.3 CAPL Broswer
3 / 27
3.4.3 CAPL事件
1、消息事件
on message123 //对消息123(dec)反应 on message 0x123 //对消息123(hex)反应
on message MotorData //对消息MotorData(符号名字)反应 on message CAN1.123 //对CAN 通道1收到消息123反应 on message* //对所有消息反应
on message 100-200 //对100-200间消息反应 2、键盘事件
on key 0x20 //按空格键反应 on key F1 //按F1键反应
on key Ctrl-F12 //按Ctrl + F12键反应 on key PageUP //按PageUp键反应 on key Home //按Home键反应
4 / 27
on key * //按所有键反应
on key ‘a’//对按键a反应 on key ‘ ‘ //对空格反应 3、时间事件 定时器声明
msTimer myTimer; //将myTimer 申明ms为单位的变量 timer myTimer; //将myTimer 申明s为单位的变量 定时器函数
setTimer(myTimer,20); //将定时值设定为20ms,并启动 cancelTimer(myTimer); //停止定时器myTimer 定时器事件
on timer myTimer //对myTimer 设定的时间到反应 4、环境变量事件 环境变量函数
getValue() //获取环境变量的值 putValue() //设置环境变量的值 环境变量事件 on envVar XXX 5、输出文本 WriteWindow write函数 int h=100;
char ch=‘a’;
char s100[8]=“hundred”;
write(“Hundred as a number:%d,%x”,h,h); write(“Hundred as a string:%s”,s100);
write(“The square root of two is %6.4g”,sqrt(2.0)); 3.4.4 CAPL响应 1、对的报文响应 on message 0x64 {
if(this.byte(2)==0xFF)
write(“Third byte of the message is invalid”); }
on message MotorData {
if(this.temperature.phys>=150)
write(“Warning: critical temperature”); }
2、对键盘响应 on key ‘a’ {
message MotorData mMoDa; mMoDa.temperature.phys=60; mMoDa.speed.phys=4300; output(mMoDa); }
on key ‘b’ {
5 / 27