1、CANoe 入门 Step by step 系列(一)基础应用CANoe 是 Vector 公司的针对汽车电子行业的总线分析工具,现在我用 CANoe7.6 版本进行介绍,其他版本功能基本差不多。硬件我使用的是 CAN case XL.1,CANoe 软件的安装很简单,先装驱动,再装软件。安装完成,插上 USB,连接硬件,这样在控制面板中,Vector Hardware 进行查看通过查看信息可知,CANcaseXL 中的两个 piggy,一个是 251(高速 CAN),一个是 7269(LIN),另外常用的还有 1054(低速 CAN,或称容错 CAN),因为 CANcaseXL 中只能支持两
2、路通讯,这样 piggy 可以自由组合2,硬件连接正常,打开 CANoe 软件File-New Configuration 可以选择新建工程的模版,我们这里选择 CAN_500kBaud.tcn,这样新建了波特率为 500K CAN 工程,可以 File-Save Configuration,进行保存3,接下来就要使用 CAN db+ Editor 工具对总线网络节点,消息,信号,进行定义了。点击工具栏的这个图标 ,或 开始菜单中找这个工具启动启动后,File-Create Database,选择 CANTemplate.dbc,选择目录及文件名,进行保存右键 Network nodes-Ne
3、w ,进行网络节点的定义, 这里只需要填写 Name 即可,例如:Node_A然后添加 Node_B,完成后如下图,这样在 Network nodes 目录下面添加出来两个节点节点添加完成后,下一步添加 CAN 消息,右键 Messages-New,这是需要定义名称,ID,DLC 等信息,如下:然后在 Transmitters 页面,点击 Add 按钮,添加 Node_A 为发送节点,意思就是说,此消息是从 Node_A节点发送出来的其实还有一种方法就是,此时暂时不定义发送节点,然后直接以拖曳的方式拖曳到发送节点上,功能上是一样的有了消息,消息里携带的东西自然是信号咯,那么我们开始创建一个信号
4、右键 Signals-New,填写如下信息信号当然要放到消息中咯,切换到 Messages 页面,Add 我们刚刚建立的 Message_A,当然和上面一样,采用拖曳的方式从 Signal 到 Message 中建立关联也是可以的。上面信息中 Intel 模式和 Motorola 格式的区别如下:用 0 和 1 来表示开关信号状态似乎还不是很直观,我们可以使用 on 和 off 来表示就好了,于是 View-Value Tables,右键空白处-New,键入如下信息:定义好了之后,还需要跟信号进行关联。右键需要关联的信号-Edit Signal,Value Table 中关联刚才建立的那个 V
5、alue Talbe 项这样一个信号就完成了,另外还需要加一个类似的信号,可以点击 Signal 根目录,在右边选择 Signal 复制,及粘贴,然后双击复制好的 Signal 后,进行一些编辑,然后用上面方法关联 Message 即可快速建立第二个信号了,是不是很方便继续添加第三个信号,Indicator_A,跟上面一样,但是我这个信号想放在 Message 的第二个字节的位置,怎么办?其实很简单,有两种方法:第一种,右键已经关联好的,即在 Message 目录下的信号,Edit mapped signal,在弹出的对话框中的 Startbit 中填 8,这样就这个信号就跑到该消息的第二个字
6、节中了。第二种方法,右键该消息-Edit Message,在 Layout 页面中,拖动信号的色块进行移动以上 Message_A 消息及消息下所定义已经定义完成如法炮制另外一个消息 Message_B,完成后如下图。下面创建环境变量,右键 Environment variables陆续把其他环境变量加好,Indicator 的 Access 属性为 Write 哦,加完如下:数据库的定义这款基本上就 OK 了。保存后关闭 CANdb+ Editor,回到 CANoe 主程序中。请在 Configuration-Options-Configuration Settings-Channel Us
7、age 设置使用的通讯通道,因为这个只需要 1 路 CAN,其他都设置为 0 就可以。点这个选项页面 可出现 Simulate Setup 界面右键 Databases-Add,把刚刚创建好的 dbc 给加载进来,之后再连线上右键-Insert Network Node结果如下:右键这个 ECU 模块-Configuration,在 Network Node 选择 Node_A,完成,然后添加 Node_B完成后如下图,这样 dbc 与 CANoe 的关联就好了。4,界面设计网络及相应的关系设置好之后,应该设计界面了,一个良好的界面可以直观的显示及控制各种信号。界面设计工具有两种:一种是 Pa
8、nel Designer,新的界面设计工具,另外一种是 Panel Editor 是老的界面设计工具,无论采用何种工具设计的界面,都可以和 CANoe 很好的兼容,没有问题。下面我们先用第一种界面设计工具来完成界面的设计点击工具栏的这个图标 或 File-Open Panel Designer,打开界面编辑器,界面如下:保存一下该界面,起名为 Panel_A,一个空的界面上可以放置右上边若干组件。放置好之后,选中界面上的组件的时候,右下侧回显示当前选中的组件的属性,可以更改相应的大小位置等,但最重要的是 Symbol 属性,这里要说一下,每个界面组件也都需要与 CANoe 关联,否则单纯的界面
9、是没有任何意义的,关联主要是信号和环境变量,在 Symbol 属性的 Symbol Filter 属性中可以进行选择,我们这里关联的是环境变量,所以选择 Environment Variable,然后再点击上面的 Symbol 属性,然后在弹出的页面中选择相应关联的变量完成后可以按同样的方法设计 Panel_B,也可以 Save As 的方法快速建立同样的 Panel 但是与环境变量的关联和界面的文字需要进行微调。这样两个 Panel 都已完成。也已经建立了与 CANoe 之间的关联。5,CAPL 编程所有的前期准备工作和组装工作都已完成,现在需要编写程序使整个系统有机的运行起来。回到 CAN
10、oe 的Simulation Setup 界面,然后点击 Node_A 模块的,像铅笔一样的图标 ,填写程序名称,这里 Node_A,然后打开编程界面,完成以下程序。然后完成 Node_B 程序。小技巧:如果背不出具体的消息名称,信号名称或环境变量,可以右键程序空白处,你会得到意外的惊喜,试试看。OK 大功告成6,运行现在点击工具栏 ,运行程序。注意: 这里表示实际的网络,所有的消息是发送到物理的网络上的,如果只是验证程序,设置成这样就可以了 。完整运行结果如下:就是这样,一步一步的,我们完成了第一个完整的 CANoe 应用工程,虽然这只是入门第一步,但整个CANoe 的开发流程基本涵盖,如果
11、能跑出上面的运行结果,依然能够给我们很多的惊喜。我们需要这样的惊喜,因为这是我们继续前行的动力。CANoe 入门 Step by step 系列(二)CAPL 编程CAPL 就是 Communication Application Programming Laguage 的缩写,CAPL 类似于 C 语言的语法,因此所有的语法请参考 C 语言教程,这里不在这里进行详述,关于 C 语言,毫无疑问的,首先推荐大家看谭浩强老师的书,经典中的经典,看完这本 C 语言应该没问题了。CAPL 在 CANoe 中起到重要的作用,他将所有的部分联系起来(请看下图)现在我们给予上一节的基础上,来着重介绍 CAP
12、L 编程。CAPL 语法是 C 语言的,又有一些 C+的特性,this 指针,事件等,对于事件的理解可以学习任意一种面对对象语言,首推 C#.NET,可以参考我的博客学习,当然这个似乎比 CAPL 本身更加难,事件也更加多,但这并不妨碍对事件的理解,其中的事件类型如下图:下面来几个小例子帮助理解来个 CANoe 版本的 hello world!来兴奋一小下吧。开整在打开 CANoe,新建个工程,在 Simulation Setup 中加个 Network node ,点铅笔,忘了吗,上一节刚讲过,右键 Start-New,键入如下代码编译后,关闭 CAPL Brower。运行 CANoe 工程
13、,结果如下,哇塞成功咯,好有成就感啊。这个例子似乎跟 CAN 通讯没啥太大关系啊,好,我们接下来再做一个例子运行结果如下,按键盘 b 键,将发送一个 CAN 消息,连 dlc 是啥都不知道的同学,推荐先学习一下 CAN 基础知识,推荐瑞萨公司的CAN 入门书,讲的非常的好。运行刚刚的那个例子你会发现,按一下 b,只发送一条消息,但在实际应用中 CAN 消息都是循环连续发送的,我们要对刚刚的程序进行一些修改。完成这样的功能。程序如下:variablesmessage 0x400 msgA = dlc=1;mstimer timerA;int conditionA = 0;on key acond
14、itionA = !conditionA;if(conditionA =1)setTimer(timerA,200);on timer timerAif(conditionA=1)setTimer(timerA,200);msgA.byte(0) = msgA.byte(0)-1;output(msgA);运行结果如下:按 A 键,Timer 启动,发送消息接下来我们一起来看总结一下 CAPL 编程的要点:CAPL 编程的学习,需要通过不断在实践中的积累,此外别无他法。以上真真儿的只是入门,如果你真心看过,不如你真心写过。CANoe 入门 Step by step 系列(三)简单例子的剖析最好
15、的学习方式是什么?模仿。有人会问,那不是山寨么?但是我认为,那是模仿的初级阶段,当把别人最好的设计已经融化到自己的血液里,变成自己的东西,而灵活运用的时候,才是真正高级阶段。正所谓画虎画皮难画骨。但初级阶段仍然是必须经历的过程,他会使你在达到高级阶段的过程中少走很多弯路,下面我们来迈出这一步。先研究一下别人的简单例子。最好的例子莫过于 Vector 本身的 Demo 了,这个在安装完 CANoe 之后就会被自动安装。先看最简单的一个,名字叫 Easy,但并不简单哦,比我们之前介绍的所有的东西都整合再一起了,很简单,但很全面。但是假如你说,这个我自己也可以完全自己写出来(并不是仅仅是看懂哦),那
16、么我可以肯定的说,在工作中,你完全可以胜任一般的任务要求哦,剩下的只是工作量的问题了。但我相信到现在为止,你们很多人,都无法写出这样的程序,所以我建议你们把这个程序好好的研究明白,这点很重要。废话不多说,上图,下面是打开运行后的界面。通过面板可以控制,及显示很多动画效果,做的非常的漂亮。在其余的窗体也将主要的数据以图表等表现方式呈现出来。我们先看一下 DBC 的内容吧Signals:EngineSpeed 车速信息FlashLight 双跳灯HeadLight 大灯OnOff 引擎状态Messages:EngineState 引擎状态:包含的信号有 OnOff,EngineSpeedLight
17、State 灯光状态:包含的信号有 FlashLight,HeadLightNetwork nodes:Display 显示节点,接收所有消息Engine 引擎节点,发送 EngineState 消息Light 灯光节点,发送 LightState 消息Environment variables: 环境变量,一般与界面的组件相关联,这样就实现了图形化界面的控制与显示,下面就是关联的界面组件EnvEngineSpeedDspMeter EnvEngineSpeedDspText EnvEngineSpeedEntry EnvEngineStateDsp EnvEngineStateSwitch
18、EnvHazardLightsSwitch EnvHeadLightSwitch EnvLightDsp 注意一下信号的信息:Definition 页面的, Init.Val 的输入框使能了,之前是灰色的状态,为什么呢?点击一下蓝色的带下划线的连接,弹出窗台如下:意思是说这个值的设置,必须要定义的属性才能有效,之前一直没有提到信号的属性,这次还是第一次遇到哦。个人理解信号属性是表明信号的特点的一系列参数,当然消息和节点也都有对应的属性。为了更加详细的了解这个属性,我们求助于帮助。哦,明白了,原来是用来初始化数据的哦。其实在 Definition 表示的是物理值,都要转换成 Raw 值保存到GenSigStartValue 属性中。在属性的创建我们之前也没有提到过,这里讲一下,请在 CANdb+ Editor 菜单中,View-Attribute Definitions右键,New ,填写好信息即可。属性背后跟行为是密切相关的,甚至跟底层 dll,其他的一些属性请参考 Help文档,当然重要的属性我们也会跟大家在后面提到。dbc 还有一些细节,就是接受的消息的定义,之间也没介绍过,例如 Display 节点只接收消息,那么你就应该在节点的属性上进行配置,方法是右击节点然后点 Edit Node,在 Mapped Rx Sig.中就可以定义接收的信号了,Add