CAPL (Communication Access Programming Language) ,基于CANOE的脚本编程语言,基于CAPL通过结合Panle 以及Test Unit 可实现自定义的对总线报文的分析以及控制。
在CANoe 中通过Simulation/Measurement 插入带CAPL脚本的可编程节点,即可完成对改网络通道的控制
CAPL 有两类文件,一个是.can 文件 一个是.cin 文件。分别可理解为C语言中源文件和头文件
can 文件是CAPL 编程的入口,通过在总线中插入可编程网络节点,对总线报文进行控制或者响应
cin 文件可以理解为类似与C语言中的头文件,can 文件通过include 指令包含。包含以后,can 文件即可调用cin 文件中的函数。同时cin 文件也可以包含其他的cin 文件
在cin 文件中,可以定义变量函数等。
在添加cin 时,可通过 选中can/cin 文件中的Inlucdes, 右键单击 Add lnclude . 添加。 或者直接在can/cin 文件中 includes 中添加
CAPL 是基于事件驱动的,通过不同的事件触发不同的函数,实现总体功能。一般常用的有
on start
{
write("CAPL Start Now!!!");
/* do someting */
}
on message 0x7DF
{
write("receive 0x7DF");
}
这里0x7DF 也可以用常量代码,例如
const long GT_CAN_ID = 0x123;
on message GT_CAN_ID
{
write("receive GT_CAN");
}
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*/
}
on key 'A'
{
write("A pressed Now!!!");
}
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);
}
当需要使用CanOe 发送或者接收TP帧时,这时候就需要实现CanTp 对应控制逻辑。Vector 提供了标准156765-2 网络标准的api,只需要在CAPL 中引用即可。
在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
加载osek_tp 库后,即可看到对应的api, 如下图所示。
加载dll 库以后,还需要实现一些前置条件,才能完成发送/接收多帧。
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
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 对象的接口

通过直接调用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
你可能感兴趣的:(AUTOSAR,CanOE,CAPL,autosar)