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中报文的两个信号有变化的话,会实时更新。
标签:定时器,编程语言,EngineStatus,报文,车载,CAPL,msTimer,EngineStat,message From: https://www.cnblogs.com/laoluoits/p/16944200.html