欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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

最编程 2024-03-11 13:39:46
...

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程序由事件驱动,工程运行过程中发生指定的事件时才会运行相应的事件处理函数。

 

事件起始关键字 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中报文的两个信号有变化的话,会实时更新。