CANoe仿真CAN总线过程一些小理解

    

说实话,内燃机这行估计这条路会越走越窄。早做两手准备,不失为防患于未然的上上策。
说不清什么时候开始,自己越来越喜欢码字写分享了。因为快乐吗------因为耐不住寂寞。
不过大学之后,就再没看过文学类的书籍。每次跑去图书馆,都是借了一堆专业性书籍,后来落得被图书馆的老师发现了,瞅了我两下,就一边给我加了两本书:《学会提问:批判性思维指南》《老人与海》,
一边说到:你这么爱看书,我推荐你基本书好了,你回去好好看看。
我没有惊讶,反倒是觉得有些兴奋:兴许我遇上了个好老师。虽然后面我发现,除了三毛的书之外,其他的文学作品,我几乎是看不下去的。

关于CANoe这个软件简介:

    CANoe是Vector公司开发的一款can总线开发、测试、分析、仿真软件。

    该软件可以对can通信网络、LIN传输协议、蓝牙、MOST、FlexRAy等进行建模、仿真、测试以及开发。

    在汽车电子上,该软件运用算是比较广泛的。有兴趣的朋友可以去相关网站搜索相关职业了解一下。

    本文主要运用CANoe进行建模和仿真can通信的过程。

 

     

本文接下来,需要用到CAPL语言进行编程,CAPL式canoe基于自己的开发环境配套的程序设计语言,类似于C语言。但是CAPL应该也是面向对象的。不管怎样,我门推荐各位,有时间可以学学编程,C,C++,CSharp,JAVA,Python,这么多,总有一样适合你的。

正题:我这里只给我上面的例子一些配置信息,并对相关要点进行说明。软件学习,网上资料很多,各位有兴趣可以查来看看,两个钟就可以熟悉完软件相关逻辑了。并且我也是靠网上的一些基础教程来熟悉软件界面的。下面的例子就是学习别人的教程仿做的。所以软件,我这里不讲,只讲一些细节。水平有限,可能讲得不对,望见谅。

这是软件的界面:

candb++:这里主要对信号、报文、环境变量、节点等进行关联配置

看到上信号这里,length:指的是位长度,16位就是两字节。factor和offset是用来配置信号和数据关系的。我们知道,电阻式温度传感器传过来的电压信号值经过模数转换后,这个数字量还不能代表我们的温度值,而是这个数字量和我们现实的温度成对应的关系(不精确的说可以认为是线性。),factor和offset:y=ax+b,基于原理是一样的。

byte order是关于信号的解析方式不一样,intel和摩托罗拉,这个一时半会说不清。

value type:signed有符号(就是有正负),unsign(无符号,正数)。

message报文:我们知道,报文承载着信息,也就是信号。ID:在CAN总线部分说过,每个报文都有一个独一无二的ID、ID值越小,优先级越高。DLC:can报文里讲过,在报文中,DLC由4位组成,代表着数据长度(字节)。最高发8字节,即1000;这个ENgine报文承载着连个信号,16位的转速+8位的温度。如下图,他们在8字节的报文中占据了前3字节。

 

节点:我们知道,can总线规则是,有许多的节点通过can收发器发送报文到总线上,其他的节点根据需要进行选择接收can总线上的信息。下面的的节点就是这个意思。那么节点的作用就是发送和接收报文。下面这个节点我们这赋予了他发送报文的任务。发送Engine报文。其他节点同理。

 

剩下的是环境变量:这里我们先不说有什么用。这个环境变量是用来接收界面设计器传递过来的值的,因为界面设计器和candb++数据库是两个不同的模块(或者说是不同的类Class),他们之间需要传递信息就需要通过一些接口或者属性来传递。

我们先看界面设计器。我们设计了一个转速滑动块和一个温度滑动块和一个下拉选择框来模拟传感器和档位的发生的变化。我们知道,在candb++里面我们已经定义了转速、温度和档位三个信号。但是,我们如何将这些滑动框块的数值会即时的传递到传感器上呢?答案就是左下角的属性栏里面,我们将每个模块的数值都绑定并传递到了candb++的相应环境变量中,此时,candb++的环境变量evEngineSpeed等就会随着你动滑动块而自动改变数值。

 

接下来,candb++数据库里面有了传感器(滑动块)的数值(在环境变量里面),有了信号,但是我们还没有把环境变量和信号联系起来。相当于说,这个信号是假的,只有当我们把环境变量存储的值给了信号,这个信号有真正的意义。

怎么办?接下来就是要编程了。

点击那个黄色的铅笔,进入capl编辑器。

这里涉及到面向对象编程的一些知识,也就是类,也叫Class。

variable{}函数里面可以定义一些全局变量。mstimer、message应该是type、类型、或者结构?这里不容易解释。Engine 是一个抽象类,msg1则是一个Engine类的实例。

上面我们说到,界面设计器的滑动块和candb++的环境变量联系在一起了,但是candb++的环境变量和信号没有联系在一起。这里揭晓答案,最下面一个图片,写了这样一个事件(在环境变量值发生变化的时候触发该事件,也就是你动一下滑动块就会触发一下),触发事件就会执行:给实例msg1的属性EngineSpeed 赋值 为 环境变量evEngineSpeed的值(通过this,事件机制和this比较难理解,如果没有编程基础的话。我这里不详细解释)。

on envVar evEngineSpeed

{

    //evEngineSpeed速度环境变量变化时,触发事件。

    msg1.EngineSpeed = getvalue(this);

}

至此,信号已经有了可以随着滑动块变化而变化的值了,是一个真正的信号了,并且报文也承载好了信号,剩下的工作就是发送报文。

在哪里发送?在定时器里面,可以看到我们在全局变量里面定义了一个T50ms的定时器,并在on start(“编写的程序一启动就会执行该事件”)事件里面初始化为2ms触发一次;并在事件里面ouput(msg1):发送msg1报文,这个报文是Engine报文,承载了转速和温度两个信号。

 

 

最后上一个效果图。CANoe软件自带的demo是非常好的学习资料。

 

 

至此,完美收官,需要源程序的可以后台留言关键字(CANoe)。最后,希望能给大家带来一些灵感。

同样的,希望大家有兴趣的多多关注和分享。

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值