车载测试系列:CAPL编程语言

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了车载测试系列:CAPL编程语言相关的知识,希望对你有一定的参考价值。

CAPL是类似C语言的语法,案例如下:

/*@!Encoding:936*/
includes




variables

//The following three messages are defined for transmission
message EngineStatus EngineStat; //定义一个在DBC中message name为EngineStatus的报文变量EngineStat
message LockingRq LkCtrlRq;
message WindowRq WindowCtrl;
//The following timer is for simulating the cyclic message transmission
msTimer msTimer_EngineStatus; //定义一个ms定时器msTimer_EngineStatus



on start

setTimerCyclic(msTimer_EngineStatus,100);


on timer msTimer_EngineStatus //响应定时器事件msTimer_EngineStatus,将报文发送到总线
EngineStat.Velocity = @sysvar::testNS::Velocity; //获取面板中变量输入的值
EngineStat.IgnitionStatus = @sysvar::testNS::IgnitionStart;
output(EngineStat); //将报文发送到总线中
  • 程序结构

先从宏观的角度来看,这个CAPL程序的结构包含了头文件、全局变量、事件函数,没有自定义函数。

includes 头文件是对其他文件及dll文件的包含说明,variables 是对全局变量的声明定义,on start ,on timer 是工程中用到的各类事件。

  • 全局变量

1、message 报文变量

CAPL提供了各种网络对应的报文类。本文以CAN message为例,报文变量定义格式:message + message ID/message name + variable

使用message关键字来声明一个报文变量,message后是message ID或CANoe工程导入DBC后的message name,然后是在CAPL程序中要使用的报文变量名。

message EngineStatus EngineStat;

如上,定义一个在DBC中message name为EngineStatus的报文变量EngineStat,此外还定义了报文LockingRq和报文WindowRq。

2、msTimer 定时器变量

CAPL提供两种定时器变量:timer:基于秒(s)的定时器 、msTimer:基于毫秒(ms)的定时器。

msTimer msTimer_EngineStatus;
  • 事件函数

CAPL是一种面向过程、由事件驱动的类C语言。

事件驱动针对于顺序执行,其区别如下:

顺序执行:顺序执行流程中,子例程或过程函数按照代码编写顺序逐句执行。

事件驱动:CAPL程序由事件驱动,工程运行过程中发生指定的事件时才会运行相应的事件处理函数。

车载测试系列:CAPL编程语言_全局变量

 

事件起始关键字 on

on后加某种事件,工程运行时条件触发,则执行函数体内的语句。

关键字this

系统变量、环境变量或CAN报文事件中,可以用this关键字访问其指代的数据内容。

on start

setTimerCyclic(msTimer_EngineStatus,100);

如上,on start 函数在工程开始时调用,setTimerCyclic(msTimer_EngineStatus,100) 设置定时器msTimer_EngineStatus为一个100ms为周期的循环定时器;

on timer msTimer_EngineStatus       //响应定时器事件msTimer_EngineStatus,将报文发送到总线
EngineStat.Velocity = @sysvar::testNS::Velocity; //获取面板中变量输入的值
EngineStat.IgnitionStatus = @sysvar::testNS::IgnitionStart;
output(EngineStat); //将报文发送到总线中

如上,定义了一个响应定时器事件,函数中EngineStat.Velocity = @sysvar::testNS::Velocity;表示面板panel中的系统变量Velocity变化后,将其赋值给EngineStat报文的Velocity 信号。最后的output()函数将报文发送到总线中。

整段engine.can的代码,实现了周期(100ms)循环执行msTimer_EngineStatus事件,将EngineStatus报文每100ms发送到总线中。如果面板panel中报文的两个信号有变化的话,会实时更新。

作者: ​​千里和他的软件测试​​


以上是关于车载测试系列:CAPL编程语言的主要内容,如果未能解决你的问题,请参考以下文章

Vector - CAPL - 等待并获取LIN数据

车载测试系列:车载蓝牙测试

车载测试系列:车载蓝牙测试

CANoe入门系列--用CAPL实现简单的开关灯

车载测试系列:汽车ECU通信之时间同步测试验证

车载测试系列:CANoe之Test Module和Test Unit组件