CAPL 入门简介

CAPL是CANOE的脚本语言,用于总线报文的控制和分析。它基于事件驱动,如start、message、timer和key事件。CAPL文件包括.can和.cin文件,用于编程和函数定义。此外,CAPL支持输出CAN报文、加载CDD进行诊断通信,以及通过系统变量和环境变量进行数据交互。用户还可以自定义Panel界面进行可视化控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 简介

CAPL (Communication Access Programming Language) ,基于CANOE的脚本编程语言,基于CAPL通过结合Panle 以及Test Unit 可实现自定义的对总线报文的分析以及控制。
在这里插入图片描述

2. CAPL 在CANOE的应用

在CANoe 中通过Simulation/Measurement 插入带CAPL脚本的可编程节点,即可完成对改网络通道的控制
在这里插入图片描述

3. CAPL文件构成

CAPL 有两类文件,一个是.can 文件 一个是.cin 文件。分别可理解为C语言中源文件和头文件
在这里插入图片描述

3.1 can 文件

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

3.2 cin 文件

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

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);
}

在这里插入图片描述

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, 如下图所示。
在这里插入图片描述
加载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<g_ReceLength; byteCnt++)
  {
    write("Received Data[%d] is %x", byteCnt, g_ReceiveBuff[byteCnt]);
  }
  gReceUpdateFlag = 1;
}

7. 加载Cdd

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

8. 系统变量

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

在这里插入图片描述

8.1 创建系统变量

CanOE 选择 Environment 菜单,点击 System Variables
在这里插入图片描述
在User-Defined 单击右键 选择New

在这里插入图片描述
可以选择既有的Namespace , 也可以新建Namespace, 添加系统变量名称后,选择数据类型即完成系统变量的添加。

8.2 导出系统变量

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

在这里插入图片描述
也可以 直接导出 系统变量
在User-Defined中, 选中需要导出Namespace. 点击Export Selection, 可以选择保存为vsysvar 或者xm

在这里插入图片描述

8.3 导入系统变量

导出的系统变量,是为了方便可以给其他工程共用,因此需要在其他工程中导入
在这里插入图片描述

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脚本即可访问环境变量。
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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脚本中检测到数字变化,并打印log

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值