当前位置:首页 >> 机械/仪表 >>

CANoe 入门三部曲


基础应用
CANoe 是 Vector 公司的针对汽车电子行业的总线分析工具, 现在我用 CANoe7.6 版本进行介 绍,其他版本功能基本差不多。 硬件我使用的是 CAN case XL. 1,CANoe 软件的安装很简单,先装驱动,再装软件。安装完成,插上 USB,连接硬件,这样在 控制面板中,Vector Hardware 进行查看

通过查看

信息可知,CANcaseXL 中的两个 piggy,一个是 251(高速 CAN),一个是 7269 (LIN),另外常用的还有 1054(低速 CAN,或称容错 CAN),因为 CANcaseXL 中只能支 持两路通讯,这样 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->New ,进行网络节点的定义,这里只需要填写 Name 即可,例如: Node_A 然后添加 Node_B,完成后如下图,这样在 Network nodes 目录下面添加出来两个节点

节点添加完成后, 下一步添加 CAN 消息, 右键 Messages->New,这是需要定义名称, ID, DLC 等信息,如下:

然后在 Transmitters 页面,点击 Add 按钮,添加 Node_A 为发送节点,意思就是说,此消息 是从 Node_A 节点发送出来的

其实还有一种方法就是,此时暂时不定义发送节点,然后直接以拖曳的方式拖曳到发送节点上, 功能上是一样的 有了消息,消息里携带的东西自然是信号咯,那么我们开始创建一个信号 右键 Signals->New,填写如下信息

信号当然要放到消息中咯, 切换到 Messages 页面, Add 我们刚刚建立的 Message_A,当然和 上面一样,采用拖曳的方式从 Signal 到 Message 中建立关联也是可以的。

上面信息中 Intel 模式和 Motorola 格式的区别如下:

用 0 和 1 来表示开关信号状态似乎还不是很直观,我们可以使用 on 和 off 来表示就好了,于是 View->Value Tables,右键空白处->New,键入如下信息:

定义好了之后,还需要跟信号进行关联。右键需要关联的信号->Edit Signal,Value Table 中 关联刚才建立的那个 Value Talbe 项

这样一个信号就完成了,另外还需要加一个类似的信号,可以点击 Signal 根目录,在右边选择 Signal 复制,及粘贴,然后双击复制好的 Signal 后,进行一些编辑,然后用上面方法关联 Message 即可快速建立第二个信号了,是不是很方便 继续添加第三个信号,Indicator_A,跟上面一样,但是我这个信号想放在 Message 的第二个 字节的位置,怎么办? 其实很简单,有两种方法:第一种,右键已经关联好的,即在 Message 目录下的信号,Edit mapped signal,在弹出的对话框中的 Startbit 中填 8,这样就这个信号就跑到该消息的第二 个字节中了。第二种方法,右键该消息->Edit Message,在 Layout 页面中,拖动信号的色块 进行移动

以上 Message_A 消息及消息下所定义已经定义完成

如法炮制另外一个消息 Message_B,完成后如下图。

下面创建环境变量,右键 Environment variables

陆续把其他环境变量加好,Indicator 的 Access 属性为 Write 哦,加完如下:

数据库的定义这款基本上就 OK 了。保存后关闭 CANdb++ Editor,回到 CANoe 主程序中。 请在 Configuration->Options->Configuration Settings->Channel Usage 设置使用的 通讯通道,因为这个只需要 1 路 CAN,其他都设置为 0 就可以。

点这个选项页面

可出现 Simulate Setup 界面

右键 Databases->Add,把刚刚创建好的 dbc 给加载进来,之后再连线上右键->Insert Network Node

结果如下:

右键这个 ECU 模块->Configuration,在 Network Node 选择 Node_A,完成,然后添加 Node_B

完成后如下图,这样 dbc 与 CANoe 的关联就好了。

4,界面设计 网络及相应的关系设置好之后, 应该设计界面了, 一个良好的界面可以直观的显示及控制各种信 号。 界面设计工具有两种:一种是 Panel Designer,新的界面设计工具,另外一种是 Panel Editor 是老的界面设计工具, 无论采用何种工具设计的界面, 都可以和 CANoe 很好的兼容, 没有问题。 下面我们先用第一种界面设计工具来完成界面的设计

点击工具栏的这个图标

或 File->Open Panel Designer,打开界面编辑器,界面如下:

保存一下该界面,起名为 Panel_A,一个空的界面上可以放置右上边若干组件。放置好之后,选 中界面上的组件的时候,右下侧回显示当前选中的组件的属性,可以更改相应的大小位置等,但 最重要的是 Symbol 属性,这里要说一下,每个界面组件也都需要与 CANoe 关联,否则单纯 的界面是没有任何意义的,关联主要是信号和环境变量,在 Symbol 属性的 Symbol Filter 属 性中可以进行选择,我们这里关联的是环境变量,所以选择 Environment Variable,然后再 点击上面的 Symbol 属性,然后在弹出的页面中选择相应关联的变量

完成后可以按同样的方法设计 Panel_B,也可以 Save As 的方法快速建立同样的 Panel 但是与 环境变量的关联和界面的文字需要进行微调。 这样两个 Panel 都已完成。 也已经建立了与 CANoe 之间的关联。 5,CAPL 编程 所有的前期准备工作和组装工作都已完成, 现在需要编写程序使整个系统有机的运行起来。 回到

CANoe 的 Simulation Setup 界面,然后点击 Node_A 模块的,像铅笔一样的图标



填写程序名称,这里 Node_A,然后打开编程界面,完成以下程序。然后完成 Node_B 程序。小 技巧:如果背不出具体的消息名称,信号名称或环境变量,可以右键程序空白处,你会得到意外 的惊喜,试试看。

OK 大功告成 6,运行

现在点击工具栏

,运行程序。注意:

这里表示实际的网络,所

有的消息是发送到物理的网络上的,如果只是验证程序,设置成这样就可以了

完整运行结果如下:

就是这样,一步一步的,我们完成了第一个完整的 CANoe 应用工程,虽然这只是入门第一步, 但整个 CANoe 的开发流程基本涵盖, 如果能跑出上面的运行结果, 依然能够给我们很多的惊喜。 我们需要这样的惊喜,因为这是我们继续前行的动力。

CAPL 编程
CAPL 就是 Communication Application Programming Laguage 的缩写,CAPL 类似于 C 语言的语法,因此所有的语法请参考 C 语言教程,这里不在这里进行详述,关于 C 语言,毫无 疑问的, 首先推荐大家看谭浩强老师的书, 经典中的经典, 看完这本 C 语言应该没问题了。 CAPL 在 CANoe 中起到重要的作用,他将所有的部分联系起来(请看下图)现在我们给予上一节的基 础上,来着重介绍 CAPL 编程。

CAPL 语法是 C 语言的,又有一些 C++的特性,this 指针,事件等,对于事件的理解可以学习 任意一种面对对象语言,首推 C#.NET,可以参考我的博客学习,当然这个似乎比 CAPL 本身更 加难,事件也更加多,但这并不妨碍对事件的理解,其中的事件类型如下图:

下面来几个小例子帮助理解 来个 CANoe 版本的 hello world!来兴奋一小下吧。开整~ 在打开 CANoe, 新建个工程, 在 Simulation Setup 中加个 Network node ,点铅笔, 忘了吗, 上一节刚讲过,右键 Start->New,键入如下代码

编译后,关闭 CAPL Brower。运行 CANoe 工程,结果如下,哇塞成功咯,好有成就感啊。

这个例子似乎跟 CAN 通讯没啥太大关系啊,好,我们接下来再做一个例子

运行结果如下,按键盘 b 键,将发送一个 CAN 消息,连 dlc 是啥都不知道的同学,推荐先学习 一下 CAN 基础知识,推荐瑞萨公司的《CAN 入门书》,讲的非常的好。

运行刚刚的那个例子你会发现,按一下 b,只发送一条消息,但在实际应用中 CAN 消息都是循 环连续发送的,我们要对刚刚的程序进行一些修改。完成这样的功能。程序如下: variables { message 0x400 msgA = {dlc=1}; mstimertimerA; intconditionA = 0; } on key 'a' { conditionA = !conditionA; if(conditionA ==1)

{ setTimer(timerA,200); } } on timer timerA { if(conditionA==1) { setTimer(timerA,200); } msgA.byte(0) = msgA.byte(0)-1; output(msgA); } 运行结果如下:按 A 键,Timer 启动,发送消息

接下来我们一起来看总结一下 CAPL 编程的要点:

CAPL 编程的学习,需要通过不断在实践中的积累,此外别无他法。以上真真儿的只是入门,如 果你真心看过,不如你真心写过。

简单例子的剖析
最好的学习方式是什么?模仿。有人会问,那不是山寨么?但是我认为,那是模仿的初级阶段, 当把别人最好的设计已经融化到自己的血液里,变成自己的东西,而灵活运用的时候,才是真正 高级阶段。正所谓画虎画皮难画骨。但初级阶段仍然是必须经历的过程,他会使你在达到高级阶 段的过程中少走很多弯路,下面我们来迈出这一步。先研究一下别人的简单例子。 最好的例子莫过于 Vector 本身的 Demo 了, 这个在安装完 CANoe 之后就会被自动安装。 先看 最简单的一个,名字叫 Easy,但并不简单哦,比我们之前介绍的所有的东西都整合再一起了, 很简单, 但很全面。 但是假如你说, 这个我自己也可以完全自己写出来 (并不是仅仅是看懂哦) , 那么我可以肯定的说,在工作中,你完全可以胜任一般的任务要求哦~,剩下的只是工作量的问 题了。但我相信到现在为止,你们很多人,都无法写出这样的程序,所以我建议你们把这个程序 好好的研究明白,这点很重要。废话不多说,上图,下面是打开运行后的界面。

通过面板可以控制,及显示很多动画效果,做的非常的漂亮。在其余的窗体也将主要的数据以图 表等表现方式呈现出来。 我们先看一下 DBC 的内容吧 Signals: EngineSpeed 车速信息 FlashLight 双跳灯

HeadLight 大灯 OnOff 引擎状态 Messages: EngineState 引擎状态:包含的信号有 OnOff,EngineSpeed LightState 灯光状态:包含的信号有 FlashLight,HeadLight Network nodes: Display 显示节点,接收所有消息 Engine 引擎节点,发送 EngineState 消息 Light 灯光节点,发送 LightState 消息 Environment variables: 环境变量,一般与界面的组件相关联,这样就实现了图形化界面的 控制与显示,下面就是关联的界面组件

EnvEngineSpeedDspMeter

EnvEngineSpeedDspText

EnvEngineSpeedEntry

EnvEngineStateDsp

EnvEngineStateSwitch

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…

其实不定义接收消息也是可以的, 但会在 File->Consistency check 的检查中中显示出无接收 节点等的报警。例如前面第一讲例子的 dbc 的检查如下:

再看一下 CAPL 程序。 engine.can 程序如下:

variables { } on envvarEnvEngineStateSwitch //当拨动开关的时候,会更改发动机发出的信号 { $EngineState::OnOff = @this; //注意信号和环境变量直接赋值时的符号,信号用$,环境变 量用@ if(@this) $EngineState::EngineSpeed = @EnvEngineSpeedEntry; else $EngineState::EngineSpeed = 0; }

on envvarEnvEngineSpeedEntry //当移动车速滑条时,会更改发动机发出的信号 { if(@EnvEngineStateSwitch) { $EngineState::EngineSpeed = @this; } } on start //程序开始运行的时候,将调用所有的环境变量的事件 { CallAllOnEnvVar(); // call all envvar procedures of this model and // thus consider the START VALUES of all environment // variables for: // - initialization of all message variables // - starting of any timers // - sending messages (output) with start values } light.can 的程序如下: variables { msTimertFlashLightFrequency; //定义闪灯定时器 constintgFlashLightFrequency = 500; //定义闪灯频率,初始化为 500ms intgHazardLightsStatus = 0; //定义危险灯信号 intgDebugCounterTX = 0; //用于调试,记录 TX 报文个数 intgDebugCounterTXRQ = 0; //用于调试,记录 TXRQ 报文个数 intgDebugCounterRX = 0; //用于调试,记录 RX 报文个数 } on envvarEnvHeadLightSwitch //大灯开关状态更改时,更新灯光消息的信号 { // assign EV value to the message signal $LightState::HeadLight = @this; } on start { CallAllOnEnvVar(); // call all envvar procedures of this model and // thus consider the START VALUES of all environment // variables for: // - initialization of all message variables // - starting of any timers // - sending messages (output) with start values setWriteDbgLevel(0); // set DbgLevel = 1 to get more information in Write-Window }

on message LightState //调试用,打印相关信息 { if (this.dir == TX) { gDebugCounterTX++; if(gDebugCounterTX == 10) { writeDbgLevel(1,"LightState TX received by node %NODE_NAME%"); gDebugCounterTX = 0; } } if(this.dir == TXREQUEST) { gDebugCounterTXRQ++; if(gDebugCounterTXRQ == 10) { writeDbgLevel(1,"LightState TXREQUEST received by node %NODE_NAME%"); gDebugCounterTXRQ = 0; } } if (this.dir == RX) { gDebugCounterRX++; if(gDebugCounterRX == 10) { writeDbgLevel(1,"Error: LightState RX received by node %NODE_NAME%"); gDebugCounterRX = 0; } } } on envVarEnvHazardLightsSwitch //危险警示灯开关变化时,更新灯光消息的闪灯信号 { if (@this) { gHazardLightsStatus = 1; setTimer(tFlashLightFrequency, gFlashLightFrequency); } else { cancelTimer(tFlashLightFrequency); gHazardLightsStatus = 0; }

$LightState::FlashLight = gHazardLightsStatus; } on timer tFlashLightFrequency //危险报警灯间隔闪烁的控制 { gHazardLightsStatus = (gHazardLightsStatus == 1 ? 0 : 1); $LightState::FlashLight = gHazardLightsStatus; setTimer(this, gFlashLightFrequency); } on key '0' //按键事件,定义打印调试信息的等级 { setwriteDbgLevel(0); } on key '1' //按键事件,定义打印调试信息的等级 { setwriteDbgLevel(1); } 以上程序,有 C 语言基础的同学应该都可以看得懂,这里不用详细介绍了。 看完程序大家可能有个疑问,没有调用任何发送 CAN 消息的函数(只是更改其中的信号),但 报文却真的发出去了,这是为什么呢? 这是因为周期发送消息的工作, 已经在消息的属性中定义了, 这样消息会自动周期的发送。 如下:

这个在消息的属性查看中的界面, 当然也可以在上面我们介绍的 View->Attribute Definitions, 进行修改和查看,但区别是,这个只是针对个别消息的,View->Attribute Definitions,是针 对所有的情况。还有消息属性中,对此进行归类,以上归类到 Interaction Layer 这个是 CAN 通讯的交互层。上面的各个属性的具体含义,请参考帮助文档,都有详细的说明。 下面说一下界面。

选中一个界面组件,在状态栏中可显示他的类型,关联的对象等信息。右边为属性窗口,定义选 中组件的属性

这个组件类型为:Switch/Indicator 属性栏中: Image 表示该组件使用的图片,因为要表示几种状态,所以做成这样,尺寸 105x34 pix

State Count 表示状态的个数

其他的属性不一一介绍了,自己试一下基本可以知道,实在不行求助帮助文档,这里不一一介绍 了。 到现在整个工程的剖析基本上结束了, 但说过的这些不足以覆盖所有的细节, 但基本脉络已经很 清晰了,剩下的可以自己研究,都不难理解。个人建议,在实际工作中创建自己的工程,当遇到 问题是,参考例子中的实现方式,这样更加帮助理解。进步也最快。


相关文章:
CANoe 入门三部曲
CANoe 入门三部曲_机械/仪表_工程科技_专业资料。生动的CANoe入门讲解。基础应用 CANoe 是 Vector 公司的针对汽车电子行业的总线分析工具, 现在我用 CANoe7.6 ...
CANoe 入门 Step by step系列(1、2、3)
+++ CANoe 入门 Step by step 系列(三)简单例子的剖析最好的学习方式是什么?模仿。有人会问,那不是山寨么?但是我认为,那是模仿的初级阶段,当把别人最好的设...
CANoe 入门 Step by step系列(二)
CANoe 入门 Step by step 系列(二)CAPL 编程 CAPL 就是 Communication Application Programming Laguage 的缩写,CAPL 类似于 C 语言的语法,因此所有的语法请参考 ...
CANoe 入门 Step by step系列(三)
CANoe 入门 Step by step系列(三)_计算机软件及应用_IT/计算机_专业资料。CANoe 入门 Step by step 系列(三)简单例子的剖析 最好的学习方式是什么?模仿。有人...
CANoe入门 Step to Step(三)
CANoe入门 Step to Step(三)_英语考试_外语学习_教育专区。最好的学习方式是什么?模仿。有人会问,那不是山寨么?但是我认为,那是模仿的初级阶段, 当把别人最...
CANoe入门 Step to Step(二)CAPL编程
CANoe入门 Step to Step(二)CAPL编程_计算机硬件及网络_IT/计算机_专业资料。CAPL 就是 Communication Application Programming Laguage 的缩写,CAPL 类似于 C 语言...
CANoe 入门 Step by step系列(一)
CANoe 入门 Step by step系列(一)_计算机软件及应用_IT/计算机_专业资料。...是不是很方便 继续添加第三个信号,Indicator_A,跟上面一样,但是我这个信号想...
CANoe 入门 Step to Step(一)
CANoe 入门 Step to Step(一)_计算机软件及应用_IT/计算机_专业资料。CANoe ...是不是很方便 继续添加第三个信号,Indicator_A,跟上面一样,但是我这个信号想...
CANOE教程
CANOE教程_IT/计算机_专业资料。 今日推荐 89份文档 爆笑大撞脸 超爆笑笑话 有趣及爆笑图片汇集 绝对经典搞笑照片68份文档 新市场营销法则 助推企业成长 ...
CANOE发送CAN_Message手册
CANOE发送CAN_Message手册_信息与通信_工程科技_专业资料。 今日推荐 89...CANoe快速入门 96页 免费 CANOE 培训 9页 免费 CANoe 2页 免费 VectorTrainning...
更多相关标签:
canoe 入门 | canoe快速入门 | canoe | canoe教程 | vector canoe | canoe下载 | canoe软件破解版下载 | canoe安装教程 |