CAPL 入门简介

目录

  • 1. 简介
  • 2. CAPL 在CANOE的应用
  • 3. CAPL文件构成
    • 3.1 can 文件
    • 3.2 cin 文件
  • 4. 事件
  • 5. 输出CAN 报文
  • 6. CAPL- TP帧
    • 6.1 加载Tp 库
    • 6.2 如何使用osek_tp 库
      • 6.2.1 创建Tp 连接
      • 6.2.2 实现回调函数
  • 7. 加载Cdd
  • 8. 系统变量
    • 8.1 创建系统变量
    • 8.2 导出系统变量
    • 8.3 导入系统变量
    • 8.4 CAPL 操作 系统变量
  • 9. 环境变量
  • 10. Panel

1. 简介

CAPL (Communication Access Programming Language) ,基于CANOE的脚本编程语言,基于CAPL通过结合Panle 以及Test Unit 可实现自定义的对总线报文的分析以及控制。
CAPL 入门简介_第1张图片

2. CAPL 在CANOE的应用

在CANoe 中通过Simulation/Measurement 插入带CAPL脚本的可编程节点,即可完成对改网络通道的控制
CAPL 入门简介_第2张图片

3. CAPL文件构成

CAPL 有两类文件,一个是.can 文件 一个是.cin 文件。分别可理解为C语言中源文件和头文件
CAPL 入门简介_第3张图片

3.1 can 文件

can 文件是CAPL 编程的入口,通过在总线中插入可编程网络节点,对总线报文进行控制或者响应

3.2 cin 文件

cin 文件可以理解为类似与C语言中的头文件,can 文件通过include 指令包含。包含以后,can 文件即可调用cin 文件中的函数。同时cin 文件也可以包含其他的cin 文件
在cin 文件中,可以定义变量函数等。
CAPL 入门简介_第4张图片
在添加cin 时,可通过 选中can/cin 文件中的Inlucdes, 右键单击 Add lnclude . 添加。 或者直接在can/cin 文件中 includes 中添加
CAPL 入门简介_第5张图片
CAPL 入门简介_第6张图片

4. 事件

CAPL 是基于事件驱动的,通过不同的事件触发不同的函数,实现总体功能。一般常用的有

  1. start 事件, 点击CanOe 软件 Start 按钮时触发
    在这里插入图片描述
    start 事件 触发函数示例如下,当Start 触发时,write 窗口打印 “CAPL Start Now!!! ”
on start
{
    write("CAPL Start Now!!!");
    /* do someting */
}
  1. 报文接收事件
    message 触发 根据报文ID指定,当总线上接收到对应的报文ID 时, 对应函数就触发。如下所示
on message 0x7DF
{
	write("receive 0x7DF");
}

这里0x7DF 也可以用常量代码,例如

const long GT_CAN_ID = 0x123;
on message GT_CAN_ID
{
    write("receive GT_CAN");
}
  1. 定时器溢出事件
    timer 的触发需要首先设置timer, CAPL 提供了两种设置timer 的方式
  2. timer 精度为s
  3. mstimer 精度为ms
    使用timer 之前,需要首先声明timer 变量 例如
timer secondsTimer;
mstimer millTimer;
setTimer (secondsTimer, 5);
setTimer (millTimer, 50);

通setTimer 函数,设置timer 溢出的时间,这里secondsTimer 将在5 S后溢出, millTimer 将在50ms 后溢出

Note: 一次setTimer 只能让timer 溢出一次,如果需要周期性溢出,那么需要在 timer 触发后重新调用setTimer, 如下所示

on timer secondsTimer
{
    /* do something */
    setTimer(secondsTimer, 5); /* 重新设置secondsTimer 溢出时间为5s*/
}

on timer millTimer
{
    /*do something */
    setTimer(millTimer, 50); /*  重新设置millTimer 溢出时间为50ms*/
}
  1. 按键事件
    按键触发通过检测键盘输入按键,指定按键被按下时,即触发按键事件, 可通过函数 on key 进行捕获调用,如下所示
on key 'A'
{
	write("A pressed Now!!!");
}

5. 输出CAN 报文

CAPL 通过output 函数输出CAN报文,入参为messge 类型参数, 函数原型如下

void output(message msg)

在调用output 发送报文之前,需要定位报文的ID以及 数据 dlc 等

variables
{
  message 0x566 NM_TDA4;
}

void Send_Test_NM_TDA4(void)
{
	NM_TDA4.dlc = 0x8;
	NM_TDA4.byte(0) = 0x66;
	NM_TDA4.byte(1) = 0x1;
	NM_TDA4.byte(2) = 0x2;
	NM_TDA4.byte(3) = 0x3;
	NM_TDA4.byte(4) = 0x4;
	NM_TDA4.byte(5) = 0x5;
	NM_TDA4.byte(6) = 0x6;
	NM_TDA4.byte(7) = 0x7;
	output (NM_TDA4);
}

CAPL 入门简介_第7张图片

6. CAPL- TP帧

当需要使用CanOe 发送或者接收TP帧时,这时候就需要实现CanTp 对应控制逻辑。Vector 提供了标准156765-2 网络标准的api,只需要在CAPL 中引用即可。

6.1 加载Tp 库

在include s 中加载osek_tp.dll 即可,如下所示

includes
{
 #pragma library("..\dll\osek_tp.dll")
}

Note: 此处代表的是,对应can 文件所在目前的前级目录中dll文件夹下的osek_tp.dll 文件
因此需要把dll 文件放在指定的目录下,dll 文件在CanOE 的安装目录下,C: Program Files\Vector CANoe 11.0\Exec32

6.2 如何使用osek_tp 库

加载osek_tp 库后,即可看到对应的api, 如下图所示。
CAPL 入门简介_第8张图片
加载dll 库以后,还需要实现一些前置条件,才能完成发送/接收多帧。

6.2.1 创建Tp 连接

variables
{
  const dword lrrDiag_TxId = 0x791;
  const dword lrrDiag_RxId = 0x711;
  const byte tpPaddingByte = 0xCC;
  byte diagDataBuff[4096];
  long receLength;
  long tpHandle;
  byte gReceUpdateFlag = 0;
}
on start
{
  tpHandle = CanTpCreateConnection(0);
  CanTpSetTxIdentifier(tpHandle, lrrDiag_TxId); //设置ID
  CanTpSetRxIdentifier(tpHandle, lrrDiag_RxId);  
  OSEKTL_SetRxId(lrrDiag_RxId);
  CanTpSetPadding(tpHandle, tpPaddingByte);//设置填充位
  gReceUpdateFlag =0;
  
}

经过start 事件后,将TP 发送帧设置为0x791, TP的接收帧设置为0x711. 填充字节设置为0xCC

6.2.2 实现回调函数

void CanTp_ReceptionInd( long connHandle, byte data[])
{
  long byteCnt=0;
  write( "RCR Received %d byte on connection %d: [%02x] ..." 
  , elcount( data), connHandle, data[0]);
  for (byteCnt=0; byteCnt

7. 加载Cdd

CAPL 中也可以通过加载cdd ,调用diag 对象接口来实现诊断帧的发送与接收,当CanOE 工程加载了Cdd 以后,对应Network 中的CAPL就可以识别到Daig 对象的接口
CAPL 入门简介_第9张图片
通过直接调用cdd 文件中定义的诊断服务对象,发送诊断请求, 通过 on diagResponse 时间捕获响应数据
CAPL 入门简介_第10张图片

8. 系统变量

CanOE 提供System Variables 功能,capl 可以访问这些系统变量,也可以创建新的系统变量。在CAPL脚本编辑页面中,右侧Symblos 即可显式当前可用的系统变量。
系统变量存在于Namespace中,同一个Namespace 可以包含多个系统变量

CAPL 入门简介_第11张图片

8.1 创建系统变量

CanOE 选择 Environment 菜单,点击 System Variables
CAPL 入门简介_第12张图片
在User-Defined 单击右键 选择New

CAPL 入门简介_第13张图片
可以选择既有的Namespace , 也可以新建Namespace, 添加系统变量名称后,选择数据类型即完成系统变量的添加。

8.2 导出系统变量

在创建系统变量时,可以选择Location 是Configuration 还是Files , 选择Configuration 即保存在CanOe 工程的cfg 文件中,选择File 则保存在oe 工程目录下的xml 文件中

CAPL 入门简介_第14张图片
也可以 直接导出 系统变量
在User-Defined中, 选中需要导出Namespace. 点击Export Selection, 可以选择保存为vsysvar 或者xm

CAPL 入门简介_第15张图片

8.3 导入系统变量

导出的系统变量,是为了方便可以给其他工程共用,因此需要在其他工程中导入
CAPL 入门简介_第16张图片

8.4 CAPL 操作 系统变量

CAPL 访问系统变量通过 @操作符进行防卫,如下所示

on key 'T'
{
  @SysVar_Namespace::SysVar_Test1 += 1;
}

当系统变量被外部改变时,也可以通过事件感知

on sysvar SysVar_Namespace::SysVar_Test1
{
  write("SysVar_Test1 Val is %d", @this);
}

或者

on sysvar_update SysVar_Namespace::SysVar_Test1
{
  write("SysVar_Test1 Val is %d", @this);
}

第一种, 当系统变量值发生改变时触发
第二种, 当系统变量被写入时触发

9. 环境变量

环境变量由DBC引入,对应通道加载包含环境变量的DBC后,CAPL脚本即可访问环境变量。
CAPL 入门简介_第17张图片

Note: 有些DBC因为新建DBC的模板问题,不会显示Enironment variables。 如果要使用环境变量,可以通过新建DBC,选择模板Vector_IL_Basic Template

CAPL 入门简介_第18张图片

CAPL 可通过右侧Symbol 界面获取到可访问的环境变量,通过@ 操作符访问

CAPL 入门简介_第19张图片

on key 'E'
{
  @EnvKlemme15++;
}

on envVar EnvKlemme15
{
  write("EnvKlemme15 val is %d", @this);
}

10. Panel

CanOe 支持自定义上位机界面,可以在Home 菜单中点击Panel,添加自定义的Panel, 对应的面板描述文件,会通过.xvp 文件保存。
在这里插入图片描述

Panle 中 各种ToolBox, 拖拽部署完毕后,可以通过关联系统变量,完成系统变量的绑定。这样在CAPL脚本中也能 识别到通过面板输入的数据变化
选中需要绑定的Tool, 点击Properties, 选则Variable, 选则Namespce 以及Symbol
CAPL 入门简介_第20张图片
输入框中输入数字,CAPL脚本中检测到数字变化,并打印log

CAPL 入门简介_第21张图片

你可能感兴趣的:(AUTOSAR,CanOE,CAPL,autosar)