编程环境capl browser,文件格式.can
目录
1.报文声明
使用关键字message来声明一个报文变量,当使用message声明 报文变量时,默认变量为CAN报文变量。当有数据库支撑的时候,一 个 完 整 的 声 明 应 该 包 括 message ID 或 者 message name ,
当有database支撑,声明报文时要通过ID或Name指定所声明的是数据库中的哪条报文

以标识符“x”结尾的ID表示这是一个扩展帧ID,例如,100x。 而 “*” 则表明这条报文在声明时还不含有CAN ID。

一条CAN报文具有以下属性,用户可以使用“.”访问或修改报文属性

例如,如果需要在CAN1网络上发送一条指定的报文,报文名: magicMessage;报文ID:0x252;包含8个字节0x03 3B 40 00 00 00 00 00;可以定义如下

2.定时器声明
CAPL 提 供 了 两 种 定 时 器 变 量 : T imer 基 于 秒 的 时 间 单 位 ;msTimer基于毫秒的时间单位

3.CAPL程序结构
一个完整的CAPL程序由4部分组成:头文件include files、全局 变量声明、事件处理和自定义函数

3.1头文件
为了增强CAPL代码的复用性,单一的*.can文件已无法满足需求,因此,CAPL提供了*.cin文件(callback interfacefile),用户可以通过该文件搭建自定义的测试框架。
例如,将基本的函数接口按照不同类型
分别定义
在各自的*.cin文件中,然后再在不同的*.can文件中包含所需要的*.cin文件,从而形成二层引用结构。同时也可以在*.cin中包含其他的*.cin文件,然后在*.can文件中包含上层 *.cin文件,进而形成多层的引用结构,从而提高代码复用效率
例如,基本诊断服务定义在BaseServices.cin中,基本函数定义在 CommonFunctions.cin中,测试用例函数定义在TestFunctions.cin 中,将相关的测试用例定义在测试模块文件ECU_01.can中
//在TestFunctions.cin中:
includes
{
#include"CommonFunctions.cin"
#include"BaseServices.cin"
}
//在ECU_01.can中:
includes
{
#include"TestFunctions.cin"
}
这样,在ECU_01.can中可以调用三个*.cin文件中的所有函数。如 果需要编写另一个测试模块ECU_02,只需要在ECU_02.can中包含 TestFunctions.cin即可。
3.2全局变量声明
CAPL跟C语言一样,变量的作用域和生命周期仅限于变量声明的 函数体(即大括号范围)内。CAPL在每个程序的开始部分提供了variables区域给用户声明全局变量。

在此部分声明的全局变量的生命周期从仿真开始持续到仿真结 束,其作用域为整个CAPL文件。而在*.cin文件中声明的全局变量在 包含它的*.can或*.cin中视为可见。
3.3事件处理
CAPL采用了面向事件的机制,通俗来说就是,在什么条件下,在什么时间节点,发生了什么样的报文传递,得到了什么样的报文反馈。而这种面向事件的机制是通过event handler来实现的。
事件分类包括:系统事件,CAN控制器事件,CAN报文事件等
事件起始关键字on *
on后面加某种条件,一旦条件满足则执行下面函数体内的语句。 函数体内的语句是实现接下来需要完成的操作
关键字this
在CAN报文事件中或变量事件中,可以使用关键字this访问数据内容

这里的this即为message 100(ID为100的报文变量)
系统事件
系统事件主要用于处理CANoe测量系统的控制功能,主要有on start、on preStart、on stopMeasurement、on preStop、on key< newKey>以及on timer

常见系统事件CAPL代码举例如下

CAN控制器事件
CAN控制器事件是对硬件接口设备中CAN控制器状态变化事件的响应

例如,下面的代码在侦测到Bus Off状态时,系统会输出信息到 Write窗口,并复位ECU。

CAN报文事件
CAN报文事件指在CAN总线上有指定的或任意报文出现时被调用。 关键字为:on message xxx。例如,下面列出了不同的on message事件

CAN信号事件
CAN信号事件是在CAN总线上出现指定的信号时被调用(需要配合DBC文件使用)。关键字为:on signal xxx或on signal_update xxx。需要注意的是,前者只在指定信号的值发生变化时被调用,后者在每次接收到指定信号时均被调用

注意,STAT1只在最近一次OnOff数值改变时被赋值,而STAT2 会记录当前总线上OnOff的值
定时事件
定时器变量可以用来创建一个定时事件,SetTimer函数用来设定时间间隔。当定时器运行到达设定的时间间隔时,将触发该事件,这时on timer函数中的程序块将被执行。需要提醒的是,周期性触发需要在每次触发结束后使用SetTimer复位(定时器采用倒计时)。若在定时器运行中需要停止计时,可以使用cancelTimer函数来取消计时。定时器事件关键字为on timer xxx。以下代码通过定时器事件实现每100ms发送一次报文0x555。

键盘事件
在测量的过程中,通常需要由用户来触发某些事件来模拟实际测试环境的人工操作,例如,开始记录log、改变信号或变量的值、停止测量等。利用CAPL提供的键盘事件可以方便地完成这些操作。键盘事件的关键字为
on key xxx。

错误帧事件
当总线上出现错误帧或者过载帧时,错误帧处理机制将被调用。关键字为on errorFrame
下面的代码将输出总线错误码,同时将错误帧的信息输出到Write窗口中。


环境变量事件
环境变量事件是对环境变量发生变化的响应,关键字为on enVar xxx,例如:

可以使用getValue()和putValue()读写环境变量的值,例如:

系统变量事件
与环境变量事件类似,系统变量事件是对系统变量发生变化的响应,关键字为on sysVar xxx或on sysVar_update xxx,例如:(IO为DI_0的命名空间,调用系统变量需要从命名空间中引用)

诊断事件
诊断事件是在诊断请求或诊断响应发生时产生,常用诊断事件如表


3.4自定义函数
CAPL函数的语法跟C语言很类似,但也包含一些C语言所不具备的功能
大部分CAPL支持的数据类型都可以直接声明为函数参数, 例如,整型、浮点型、枚举、结构、定时器以及它们的引用。但有一些类型不能被直接声明,而需要加上*号(注意该符号并不是C语言中 指针的意思)。 例 如 : signal * s 、 envvarInt * ev 、 sysvarFloat * sv 、 diagRequest * dr、diagResponse * dr、int matrix[][],以及所有来自于database的变量,均需要加上*号声明。
需要注意的是message类型比较特殊,如果该变量是用户自定义的,那么在函数参数声明时,message和message*均可以,但如果该变量来自database,那么只有message *可用。下面的例子是以database中的信号为例。
foo(signal * s) //没有返回类型默认返回void
{
//将作为参数传递进来的信号的名字打印到wirte输出
write("Signal name:%s",s.name);
}
4.常用函数库简介
4.1通用函数
通用函数主要包括与当前计算机系统、文件操作、测量过程控制等相关的函数
write函数
write函数对调试用 处最大,因为它可以按格式输出各种变量的信息
函数原型:

其输出格式如下:

为了便于读者理解,下面举个例子来说明如何使用write函数

4.2 计算函数

4.3 字符串函数
4.4CAN总线函数
CAN总线函数包括报文事件、控制器事件和统计相关等函数。

注:报文事件、CAN控制器事件此处省略,请参看3.3节。
4.5LIN总线函数
4.6 诊断函数
5.CAPL使用总线数据库(访问DBC中的报文)
CAPL能够很好地支持总线数据库,它不仅能访问数据库中的message的名称、类型、标识符等属性参数,还能识别组成message的各个组件的描述。用户可以将已创建的database文件导入工程文件中,这样CAPL就可以直接引用database中所包含的message,而不需 要逐个数据地去定义所需要的message。例如:

6.CAPL中访问信号、系统变量和环境变量
6.1CAPL中访问信号
signal在CAPL中代表的是总线信号交互层的表示,它不同于message。message是CAPL的数据类型,而signal不是。因此,不能在CAPL中定义一个类型为signal的变量。
当用户需要访问信号缓冲区并期望读到最后接收到的信号值时,可以使用$符号,例如:

在一个仿真工程中,信号的定义可能会出现歧义,主要原因是含有多个总线网络,不同数据库中出现相同名称的信号名。为了区别不 同的信号,CAPL中引用信号时候需要增加其通道(Channel)、网络(Network)、 节点(Node)和报文(Message)的信息。通过作用域确定具体是哪个信号,以避免歧义。
完整的语法格式如下。
通道::网络::节点::报文::信号

用户可以使用上面的全部或部分的元素,只要能准确表示出信号的唯一性即可。例如:

6.2CAPL中访问系统变量
用户可以在CAPL中可以使用@符号直接访问系统变量而不需要通过函数调用(例如使用SysGetVariableInt 、SysGetVariableFloat等获取变量值,使用SysSetVariableInt 、SysSetVariableFloat等函数修改变量值),以下是需要采取的语法格式:

需要注意的是,对于array或struct类的变量,直接访问方式只能访问其中单个元素,例如:

比 较 通 用 的 访 问 操 作 方 式 是 使 用 以 sysGetVariable 开 头 和 sysSetVariable开头的访问函数。例如:

6.3CAPL中访问环境变量
与系统变量类似,用户可以不使用函数调用通过同样的格式访问环境变量。使用@符号例如:

比 较 通 用 的 访 问 操 作 方 式 是 使 用 函 数 getValue() 和 putValue(),例如: