1.定时器
CAPL中的定时器使用很频繁,不如当你测试时需要向纵向定时发送某条CAN报文时就需要用到定时器;
定时器的声明:
msTimer myTimer1;//声明了一个ms定时器,定时单位是毫秒
timer myTimer2;//声明了一个以秒为单位的定时器;
设置定时器:
setTimer(myTimer1,500);//设置定时器myTimer1为一个500ms定时器;setTimerCyclic(myTimer2,1);//设置定时器myTimer2为一个1s为周期的循环定时器;
设置定时器定时事件,即当定时器计时时间到时将要执行的操作:
on timer myTimer1
{
…….
}
2.信息的操作和发送
message 0x7ff Msg;//声明一个message,ID=0x7ff
Msg.dlc=8;//设置其DLC=8;
Msg.id=0x100;//更改其ID=0x100;
Msg.byte(0)=55;//设置数据场的第一个字节为55
output(Msg);//发送Msg
3. 节点上下线操作
节点时在dbc文件中定义的节点,如VCU,BMS,MCU等,有时需要将它们离线,离线后不再向总线上发送报文,在线时,可以向总线上发送报文。
节点上线:
void testSetEcuOnline(dbNode aNode);
void testSetEcuOnline(char aNodeName[]);
节点下线:
void testSetEcuOffline(dbNode aNode);
void testSetEcuOffline(char aNodeName[]);
1.检查错误帧
进行CAN通讯的测试时,检查错误帧是很常见的,要用CAPL脚本实现自动检测错误帧也不困难,它的核心就是调用错误检查函数ChkStart_ErrorFrameOccured();该函数一旦被调用,CANoe就会从此函数被调用时开始持续检测总线上有没有出现错误帧。
下面是一个小的例子:
dword chechId;
dword numCheckEvents;
checkId=ChkStart_ErrorFrameOccured();
//开始检测错误帧
TestAddCondition(checkId);
//添加检测条件,如果出现了错误帧,则输出报告中会记录下来
TestWaitForTimeout(
5000);
//持续检测5s
checkControl_Stop(checkId);
//停止检测错误帧
numCheckEvents=ChkQuery_NumEvents(checkId);
//对5s内的检测情况进行获取,若函数返回0则没有出现错误帧
if(numCheckEvents>
0)
TestStepFail(
"Error Frames Occured");
2. 添加事件信号
这种事件信号相当于uC-OS中的信号量机制,一般使用在需要等待某个或者是多个条件满足时进行下一步操作的地方。具体做法是:在一个位置添加需要等待的事件,程序中的其他地方,如果某个事件发生了(如周期超界等),提供该事件的供应,则等待的程序段获得了该事件,继续执行下面的操作。主要使用的函数有以下几个:
//供应text事件
longTestSupplyTextEvent(
charaText[] );
//添加text事件
longTestJoinTextEvent(
char[]aText);
//等待text事件,有一个出现则程序执行下一步
long TestWaitForAnyJoinedEvent(dword aTimeout);
//等待text事件,所有等待事件都出现则程序执行下一步
longTestWaitForAllJoinedEvents(dword aTimeout);
以下是一个例子:
TestJoinTextEvent(
"Test finished");
TestJoinTextEvent(
"Error Frame Occured");
TestWaitForAnyJoinedEvents(
20000);
或者:
TestWaitForAllJoinedEvents
(
20000)
;
在系统事件
onerrorFrame
中:
on errorFrame
{
TestSupplyTextEvent(
"Error Frame occured");
}
在系统的
onmessage
中:
onmessage
0x400
{
TestSupplyTextEvent(
"Test Finished")
}
3. 回调函数
CAPL中也有类似于C语言中的回调函数的机制,如检测报文周期和错误帧的函数中就可以使用,当周期超界或者总线出现错误帧就会自动调用回调函数执行一些操作;
如:
ErrChkId=ChkStart_ErrorFramesOccured(
"Callback_ErrorFrameOccured");
//检查错误帧,如果发现错误帧就调用回调函数
回调函数设计如下:
void Callback_errorFrameOccured(dword chk_id)
{
float
t;
t=timeNow()/
100000.0;
//记录出现错误帧的时间
testStep(
"ErrorFrameTimeStamp",
"%.6f s",t);
//打印该事件戳
TestSupplyTextEvent(
"ErrorFrameOccured");
//供应Text事件
}
1、监视总线的情况,这一般会用在查看一段时间内,总线上有没有出现通讯异常的情况。需要使用函数ChkStart_NodeBabbling( ).
如,检测一段时间内总线有没有出现停止通讯的情况:
CheckId
=ChkStart_NodeBabbling(CAN
::PT_MCU,
0);
//立即开始检查总线状态
testWaitForTimeout(
2000);
//延时2s
ChkControl_Stop(CheckId);
//停止检测
QueryNumberEvents
=ChkQuery_NumEvents(CheckId);
//如果在2s内总线停止通讯,则QueryNumberEvents!=0
2、关于获取关键时间点的的总结
(1)CANoe中获取定时器当前计时值的函数为:timerToElapse();该函数原型如下:
long timerToElapse(timer);
longtimerToElpase(msTimer);
(2)获取等待某个事件的时间,需要使用函数TestGetLastWaitElapsedTimeNS(),其原型如下:
floatTestGetLastWaitElapsedTimeNS();
(3)获取当前的仿真时间点:
floattimeNowFloat();
(4)等待指定报文:
long TestWaitForMessage(dbMessage aMessage,dword aTimeout);
longTestWaitForMessage(dword aMessageId,dword aTimeout);
若在aTimeout时间内等到了指定ID的报文,函数返回1,否则返回0;
(5)获取报文的数据,等到了报文之后,如果想知道报文的具体内容可以使用函数:
message msg;
long
result;
result=TestGetWaitEventMsgData(msg);
.....
处理
msg.....
4. 多总线测试
设置总线背景,一般都总线测试都会有两路及以上的CAN,这时若要通过CAPL脚本获取某个CAN通道上的报文时,就需要先设置好总线背景,即将总线设置为值监听某一路的CAN通道。下面是一个例子:
voidBusContextConfiguration(
charyBus[])
{
yBusContext=GetBusNameContext(yBus);
//这里的yBusContext为全局变量
SetBusContext(yBusContext)
;
}
//使用:
BusContextConfiguration(
"CAN1");
//将总线监听设为CAN1
此时等待某一路的CAN报文可是这样实现:
res
=testWaitForMessage(CAN1
::NM_IPU,
600);
//等待CAN1上的名称为NM_IPU的报文,等待事件为600ms
-end-
分享不易,恳请点个【👍】和【在看】
原文始发于微信公众号(汽车ECU开发):CAPL脚本常用语法