CAPL(Communication Access Programming Laguage)语言是类C语言,语法其实与C语言很相似,但同时又包含了一些C++的特性,如this指针、事件等;
应用于Vector CAN工具节点的编程,是基于事件建模的语言;
可以使用write()函数进行调试,用于将调试信息输出到CANoe的write窗口上;
通过output()函数进行指定报文的发送;
通常是通过环境变量事件与CANoe面板进行关联,实现交互;
提供调用dll文件的方法(操作见"关于CAPL中对dll的调用操作"一文);这样保证了对由其他语言封装好的程序模块的调用;
如下,一个完整的CAPL程序的结构包含了头文件、全局变量、事件函数、自定义函数;当然不是每个因素都要有,视具体程序功能确定。
CAPL是基于事件建模的语言,从1.2小节对CAPL的程序结构的介绍也可以看出,关于CAPL的运用主要就是在于熟悉其事件的使用;其常用的事件如下:
在CAPL的系统事件中,有preStart、start、preStop、stopMeasurement这4种。我们可以根据需要在相应的系统事件函数接口中定义想要进行的操作;当工程运行时,下述系统事件的发生顺序依次是
preStart–>start–>preStop–>stopMeasurement
关于系统事件的定义格式如下:
on preStart /*系统事件,初始化时执行*/
{
resetCan(); /*CAPL接口函数,用于复位CAN控制器*/
}
on start /*系统事件,工程开始时执行*/
{
write(“Just A Try”); /*write()函数将字符串信息在”write”窗口输出*/
}
on preStop /*系统事件,工程预备停止时执行;发生在stopMeasurement事件前面*/
{
write("The Project Will Stop!”);
}
on stopMeasurement /*系统事件,工程停止时执行*/
{
write("The End!\n");
}
当硬件对CAN控制器检测到相应动作发生时执行;以BusOff事件为例,格式如下:
on busOff /*CAN控制器事件:硬件检测到BusOff时执行*/
{
write("BusOff Error!");
}
通过”on message”定义消息事件,该事件会在指定的报文消息被接收时被调用。关于消息事件的定义格式示例如下:
on message 123 /*接收到123(10进制)这个ID的报文时执行*/
on message 0x441 /*接收到0x441(16进制)这个ID的报文时执行*/
on message BCM /*接收到BCM(工程dbc文件中的报文名)这个报文时执行*/
on message* /*接收到任意报文时都执行(注意*与message之间没有空格)*/
on message 0x300-0x444 /*接收到这个范围内的ID报文时执行*/
{
write(“Received %x”,this.id); /*打印接收到的报文id*/
write(“Received Message %d in total!”,count);
}
以上是关于消息事件的定义格式,关于消息的索引及发送操作我们通过下例介绍:
假设VoiceStatus是我们工程dbc文件中定义的一个报文,该报文包括了VoiceType和VoiceOperation这两个信号;其中,VoiceType这个变量占据第1个字节;VoiceOperation占据第2、3个字节;则关于消息的索引,通过报文的信号(msg.VoiceType这样)去操作如下:
void TxMsg_VoiceStatus(void)
{
message VoiceStatus msg; /*将工程中dbc中定义的VoiceStatus这条报文取名为msg*/
msg.VoiceType = @VoiceType; /*对应赋值给到报文的信号,通过报文别名"msg."调出*/
msg.VoiceOperation = @VoiceOperation;
output(msg); /*通过output指令发送该报文*/
}
也可以直接通过后接数据类型(msg.byte(0)这样)去操作,此时操作如下:
void TxMsg_VoiceStatus(void)
{
message VoiceStatus msg; /*将工程中dbc中定义的VoiceStatus这条报文取名为msg*/
msg.byte(0) = @VoiceType; /*报文第1个数据字节*/
msg.word(1) = @VoiceOperation; ; /*报文从第1个字节开始的一个字(2个字节)*/
output(msg); /*通过output指令发送该报文*/
}
通过”on key”定义键盘事件,该事件会在我们按下指定按键时执行;关于键盘事件的定义格式示例如下:
on key ‘a’ /*在小写输入法下,按下键盘的’A’键时执行*/
on key ‘A’ /*在大写输入法下,按下键盘的’A’键时执行*/
on key ‘ ’ /*按下键盘的空格键时执行,注意单引号中间是有空格的*/
on key 0x20 /*按下键盘的空格键时执行*/
on key F2 /*按下键盘的’F2’键时执行*/
on key CtrlF3 /*同时按下键盘的’Ctrl’键和’F3’键时执行*/
on key* /*按下键盘的任意键时都会执行(注意*与key之间没有空格) */
{
write(“The Key Is Press”);
}
通过”on timer”定义时间事件;该事件会在设定的时间到达时执行。关于时间事件的定义格式及使用示例如下:
variables
{
msTimer Timer1; /*在variables中声明一个以ms为单位的定时器变量Timer1*/
}
on start
{
setTimer(Timer1,100); /*将Timer1的定时时间设定为100ms,并启动它*/
}
on timer Timer1 /*定义的Timer1时间事件,每100ms执行一次*/
{
setTimer(Timer1,100); /*启动下一个周期循环*/
}
on key ‘a‘ /*键盘事件,按下键盘’A’键时执行*/
{
cancelTimer(Timer1); /*停止Timer1这个100ms执行一次的定时器*/
}
通过”on errorFrame ”定义错误帧事件;该事件会在硬件检测到错误帧时执行。关于错误帧事件的定义格式示例如下:
on errorFrame /*错误帧事件:硬件检测到错误帧时执行*/
{
write("The error has occur");
}
通过”on envVar”定义环境变量事件;该事件会在指定的环境变量值有新的输入时执行(环境变量常常用于关联上一个面板控件,当我们对控件进行操作时,对应改变关联上的环境变量值;而此时我们在CAPL中关于该环境变量的事件就会被调用;以此完成交互操作)。关于环境变量事件的定义格式示例如下:
on envVar BCM_HightBeamAlarm /*环境变量事件:指定的环境变量值有输入时执行*/
{
byte num=0;
num = getValue(this); /*可以使用getValue(环境变量名/this关键字)获取指定的环境变量的值*/
if(num == 1)
{
write("The envVar is %d",@BCM_HightBeamAlarm);
}
else
{
putValue(this,1);/*使用putValue(环境变量名/this关键字,设定的值)改变指定的环境变量的值;直接赋值的话,格式是@BCM_HightBeamAlarm = 1; */
write("Change envVar to %d",@BCM_HightBeamAlarm);
}
}
关于在CAPL中对环境变量的操作中,getValue()与putValue()是常用的接口函数。其函数格式如下,具体介绍及示例也可以通过神键"F1"召唤帮助文档,在"CAPL"相关章节中进行学习。
Ps:关于环境变量的定义是在dbc文件中完成的;CANoe工程导入该dbc文件即可使用其定义的环境变量了。环境变量的创建如下:
通过”on sysvar”定义系统变量事件;该事件会在指定的系统变量值有新的输入时执行,其格式及使用方法与前一小节的环境变量基本一致;差别只在于环境变量是在dbc文件中定义的;而系统变量的定义如下:
点击工具栏的”Environment”下的”System Variables”;此时界面如下,右键空白处,选择”New”进行新建;在弹出的窗口对新建的系统变量进行参数设置。
关于系统变量事件的定义格式示例如下:
on sysvar SysVar1 /*系统变量事件:指定的系统变量值有新的输入时执行*/
{
write("The SysVar1 is %d",@SysVar1);
}
文章浏览阅读1.3w次。转载自 http://www.miui.com/thread-2003672-1-1.html 当手机在刷错包或者误修改删除系统文件后会出现无法开机或者是移动定制(联通合约机)版想刷标准版,这时就会用到线刷,首先就是安装线刷驱动。 在XP和win7上线刷是比较方便的,用那个驱动自动安装版,直接就可以安装好,完成线刷。不过现在也有好多机友换成了win8/8.1系统,再使用这个_mt65驱动
文章浏览阅读1k次。SonarQube是一个代码质量管理平台,可以扫描监测代码并给出质量评价及修改建议,通过插件机制支持25+中开发语言,可以很容易与gradle\maven\jenkins等工具进行集成,是非常流行的代码质量管控平台。通CheckStyle、findbugs等工具定位不同,SonarQube定位于平台,有完善的管理机制及强大的管理页面,并通过插件支持checkstyle及findbugs等既有的流..._sonar的客户端区别
文章浏览阅读3.4k次,点赞2次,收藏27次。神经图灵机是LSTM、GRU的改进版本,本质上依然包含一个外部记忆结构、可对记忆进行读写操作,主要针对读写操作进行了改进,或者说提出了一种新的读写操作思路。神经图灵机之所以叫这个名字是因为它通过深度学习模型模拟了图灵机,但是我觉得如果先去介绍图灵机的概念,就会搞得很混乱,所以这里主要从神经图灵机改进了LSTM的哪些方面入手进行讲解,同时,由于模型的结构比较复杂,为了让思路更清晰,这次也会分开几..._神经图灵机方法改进
文章浏览阅读2.8k次。一、模型迭代方法机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种:1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难;2、模型融合的方法,将旧模..._模型迭代
文章浏览阅读2.3k次。1、前言上传图片一般采用异步上传的方式,但是异步上传带来不好的地方,就如果图片有改变或者删除,图片服务器端就会造成浪费。所以有时候就会和参数同步提交。笔者喜欢base64图片一起上传,但是图片过多时就会出现数据丢失等异常。因为tomcat的post请求默认是2M的长度限制。2、解决办法有两种:① 修改tomcat的servel.xml的配置文件,设置 maxPostSize=..._base64可以装换zip吗
文章浏览阅读1k次,点赞17次,收藏22次。Opencv自然场景文本识别系统(源码&教程)_opencv自然场景实时识别文字
文章浏览阅读1.3k次。拷贝虚拟机文件时间比较长,因为虚拟机 flat 文件很大,所以要等。脚本完成后,以复制虚拟机文件夹。将以下脚本内容写入文件。_exsi6.7快速克隆centos
文章浏览阅读2k次。本文主要实现基于二度好友的推荐。数学公式参考于:http://blog.csdn.net/qq_14950717/article/details/52197565测试数据为自己随手画的关系图把图片整理成文本信息如下:a b c d e f yb c a f gc a b dd c a e h q re f h d af e a b gg h f bh e g i di j m n ..._本关任务:使用 spark core 知识完成 " 好友推荐 " 的程序。
文章浏览阅读367次。南京大学高级程序设计期末复习总结,c++面向对象编程_南京大学高级程序设计
文章浏览阅读3.1k次,点赞2次,收藏12次。实现朴素贝叶斯分类器,并且根据李航《统计机器学习》第四章提供的数据训练与测试,结果与书中一致分别实现了朴素贝叶斯以及带有laplace平滑的朴素贝叶斯%书中例题实现朴素贝叶斯%特征1的取值集合A1=[1;2;3];%特征2的取值集合A2=[4;5;6];%S M LAValues={A1;A2};%Y的取值集合YValue=[-1;1];%数据集和T=[ 1,4,-1;..._朴素贝叶斯 matlab训练和测试输出
文章浏览阅读1.6k次。Markdown 文本换行_markdowntext 换行
文章浏览阅读6.7w次,点赞2次,收藏37次。win10 2016长期服务版激活错误解决方法:打开“注册表编辑器”;(Windows + R然后输入Regedit)修改SkipRearm的值为1:(在HKEY_LOCAL_MACHINE–》SOFTWARE–》Microsoft–》Windows NT–》CurrentVersion–》SoftwareProtectionPlatform里面,将SkipRearm的值修改为1)重..._错误: 0xc0000022 在运行 microsoft windows 非核心版本的计算机上,运行“slui.ex