赞
踩
⼀、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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。