CAPL基础

 ⼀、CAPL语⾔的概述和基础

1. CAPL的概述

CAPL(Communication Access Programming Language)—— 通信访问编程语⾔

专为CANoe⼯具链定制,是⼀种类C语法的语⾔,是⼀种事件驱动的语⾔

2. CAPL的作⽤

ECU的仿真实现(报⽂的收发、数据处理)

实现总线⽇志记录的控制

实现总线数据的⾃动化分析

实现ECU功能的⾃动化测试

实现ECU报⽂发送周期的⾃动化测试

实现诊断测试的⾃动化

3. 代码的框架结构

4. 简单的数据类型

数值类型:

整型、浮点型 整型 ⽆符号: byte 、 word 、 dword 、 gword

有符号: int 、 long 、 int64

浮点型 float double

字符类型

char :使⽤单引号括起来的单个字符,可以使⽤转义字符

  字符类型可以跟整型直接相互做算术运算

  每⼀个字符可以看成其对应码值的整数

5. 变量

先声明变量,才能使⽤

在CAPL中,有全局变量和局部变量之分 定义在variables的代码块中的变量称为全局变量,可以被这个⽂件中的所有其它代码块中的语 句使⽤。

      variables代码块中只能⽤来定义全局变量,不能写其它语句

定义在其它代码块中的变量是局部变量,局部变量必须声明在代码块的最开始。

CAPL中的变量是强类型的,定义变量时必须指定该变量的数据类型,⽽且⽆法更改

// 数据类型 变量名;
int age;
// 数据类型 变量名 = 值;
float tall = 1.81;

在声明变量的时候,变量前使⽤const关键字,该变量就变成了常量,⼀但赋值,就⽆法改变。

   ⼀般声明常量的时候,习惯全⼤写

const float YZL = 3.1415926;
write("圆周率为:%lf", YZL);
YZL = 3.14 // 会报错

6. 输出函数write和不同类型的数据的占位符

7. 复合数据类型 —— 数组

由⼀组简单数据类型组成的数据

    int arr[3] = {1, 2, 3}; —— 声明、开辟空间、初始化

    int arr2[5]; —— 声明了int类型的数组arr2、开辟了5个位置的空间

    char arr3[10]; —— 声明了char类型的数组arr3、开辟了10个位置的空间

数组有⼀维的,也有⼆维的

     int scores[3][5];

可以使⽤字符串常量 "任意⽂本" 给字符数组变量赋值,但注意此时的字符数组的⻓度应该⼤于或 等于字符串常量中的字符个数(如果是中⽂,个数要乘以2) + 1

char name[5] = "Jack";
char name2[5] = {'J', 'a', 'c', 'k', '\0'};
char name3[7] = "蝙蝠侠";

使⽤ elCount 内置函数,来获取数组的⻓度

write("参加考试的⼩组数量:%d", elCount(scores));

8. 复合数据类型 —— 枚举

9. 复合数据类型 —— 结构

10. 特殊数据类型 —— 报⽂

11. 特殊数据类型 —— 定时器

12. 运算符

13. 流程控制结构

分⽀结构

循环结构

14. 14.⾃定义函数

⼆、CAPL中常⽤的内置函数

1. 输出到Write窗⼝的相关函数

write —— 输出任意⽂本信息到Write窗⼝的CAPL标签⻚上
writeLineEx —— 输出任意⽂本信息到Write窗⼝中的指定标签⻚上,并指定消息状态
writeLineEx(4, 1, "Hello") —— 输出到Test标签⻚(4)上,消息状态为:普通
(1)
writeLineEx(4, 2, "Hello") —— 输出到Test标签⻚(4)上,消息状态为:警告
(2)
setWriteDbgLevel —— 设置调试信息(输出到System标签⻚上的)的输出优先级
setWriteDbgLevel(3); 将调试信息输出的优先级设置为 3
writeDbgLevel —— 输出调试信息到Write窗⼝的System标签也上,只输出满⾜优先级的
writeDbgLevel(1, "Hello"); 以1这个优先级输出调试信息 "Hello"

2. 总线控制的相关函数

stop —— 停⽌程序(停⽌了总线上的测量)

3. ⽇志(Logging)控制的相关函数

先对⽇志模块进⾏配置(开始使⽤CAPL编程的⽅式控制⽇志的开启和停⽌)

setLogFileName —— 设置⽇志模块的⽂件存放位置和名称(含有格式)
可以指定具体为哪个⽇志模块设置
setLogFileName("LoggingAEB", "Logging/{LoggingBlock}_{MeasurementSta
rt}.asc");
startLogging —— 启动⽇志的记录
startLogging() —— 启动所有⽇志模块的记录
startLogging("LoggingName") —— 启动指定⽇志模块的记录
stopLogging —— 停⽌⽇志的记录
stopLogging() —— 停⽌所有⽇志模块的记录
stopLogging("LoggingName") —— 停⽌指定⽇志模块的记录

4. 定时器控制的相关函数 

setTimer(定时器变量, 时⻓) —— 启动⼀个定时器,在指定的“时⻓”后开始执⾏定时器的处
理函数
cancelTimer(定时器变量) —— 取消⼀个定时器

 5. ⽂件读写的相关函数

int fh;
fh = openFileWrite("⽂件的路径", 0); // 覆盖写⼊
if(fh) // 代表⽂件成功打开
{
 filePutString("哥谭市的大头目!\n", 100, fh); // 写⼊字符串
 filePutString("麦当劳的吉祥物!", 100, fh); // 写⼊字符串
 
 fileClose(fh); // 关闭⽂件
}
int fileHandle;
char line[200];
// 步骤1:打开⽂件(以读取⽂本字符的模式)
fileHandle = openFileRead("⽂件路径", 0);
if(fileHandle)
{
 // 步骤2:从⽂件中读取字符串
 while(fileGetString(line, elCount(line), fileHandle))
 {
 write("读取的⼀⾏内容:%s", line); 
 }
 // 步骤3:关闭⽂件
 fileClose(fileHandle);
}

6.数学类的函数

_round —— 四舍五⼊

_ceil —— 向上取整

_floor —— 向下取整

random —— 产⽣指定范围的随机整数

sin —— 求正弦值

cos —— 求余弦值

7.其它的常⽤函数

elCount —— 计算数组、字符串的⻓度(在计算字符串⻓度时要格外注意)

getLocalTimeString —— 获取系统当前的时间字符串

snprintf —— 将格式化的数据写⼊字符串

char buffer[100]; // 写⼊到buffer字符串中
int age = 23;
char name[10] = "Jack";
snprintf(buffer, elCount(buffer), "我叫%s,今年%d岁。", name, age);

三、常⽤的事件

CAPL是事件驱动的语⾔,常⽤的事件如下

在 on key 事件发⽣时

this 可⽤,代表当前按的是哪个键的字符数据

on message 事件

当在总线上发现⼀个指定的报⽂出现时触发该事件

每次总线上探测到这个报⽂,就会触发⼀次。

该事件发⽣时, this 关键字可⽤,代表的就是发现的那个报⽂数据,数据类型是 message 变量。

   可以 this.id 、 this.name 、 this.dir 、 this.dlc 、 this.信号名

经常会关注某个报⽂的变化,因此会在这类事件发⽣时,进⾏业务处理。

// 当总线上发现了ID为0x123的报⽂
on message 0x123 { }
// 当总线上发现了名为EngineState的报⽂(有数据库的⽀持)
on message EngineState { }

on signal 事件

当信号变化时触发 该事件发⽣时, this 关键字可⽤,代表这个信号的当前值,数据类型是 float

on signal_update 事件

当信号更新时(频率就是该信号所属报⽂发出的频率)触发

该事件发⽣时, this 关键字可⽤,代表这个信号的当前值,数据类型是 float

四、访问信号的值

在任意时刻访问当前总线上出现的任意信号的当前值

 语法 —— $信号名 、 $报⽂名::信号名

 ⽤法

获取信号的物理量(值)

 $信号名 $信号名.phys

 获取信号的原始值 $信号名.raw

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值