当前位置:   article > 正文

CAPL基础

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中的变量是强类型的,定义变量时必须指定该变量的数据类型,⽽且⽆法更改

  1. // 数据类型 变量名;
  2. int age;
  3. // 数据类型 变量名 = 值;
  4. float tall = 1.81;

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

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

  1. const float YZL = 3.1415926;
  2. write("圆周率为:%lf", YZL);
  3. 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

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

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

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

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

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

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

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

12. 运算符

13. 流程控制结构

分⽀结构

循环结构

14. 14.⾃定义函数

⼆、CAPL中常⽤的内置函数

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

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

2. 总线控制的相关函数

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

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

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

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

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

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

 5. ⽂件读写的相关函数

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

6.数学类的函数

_round —— 四舍五⼊

_ceil —— 向上取整

_floor —— 向下取整

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

sin —— 求正弦值

cos —— 求余弦值

7.其它的常⽤函数

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

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

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

  1. char buffer[100]; // 写⼊到buffer字符串中
  2. int age = 23;
  3. char name[10] = "Jack";
  4. 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.信号名

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

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

on signal 事件

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

on signal_update 事件

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

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

四、访问信号的值

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

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

 ⽤法

获取信号的物理量(值)

 $信号名 $信号名.phys

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/816016
推荐阅读
相关标签
  

闽ICP备14008679号