【CANoe之CAPL基础学习_函数用法3】
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);
long timerToElpase(msTimer);
(2)获取等待某个事件的时间,需要使用函数TestGetLastWaitElapsedTimeNS(),其原型如下:
float TestGetLastWaitElapsedTimeNS();
(3)获取当前的仿真时间点:
float timeNowFloat();
(4)等待指定报文:
long TestWaitForMessage(dbMessage aMessage,dword aTimeout);
long TestWaitForMessage(dword aMessageId,dword aTimeout);
若在aTimeout时间内等到了指定ID的报文,函数返回1,否则返回0。
(5)获取报文的数据,等到了报文之后,如果想知道报文的具体内容可以使用函数:
message msg;
long result;
result=TestGetWaitEventMsgData(msg);0
3、多总线测试
- 函数使用介绍
设置总线背景,一般都总线测试都会有两路及以上的CAN,这时若要通过CAPL脚本获取某个CAN通道上的报文时,就需要先设置好总线背景,即将总线设置为值监听某一路的CAN通道。下面是一个例子:
void BusContextConfiguration(char yBus[])
{
yBusContext=GetBusNameContext(yBus);//这里的yBusContext为全局变量
SetBusContext(yBusContext);
}
//使用:
BusContextConfiguration("CAN1");//将总线监听设为CAN1
此时等待某一路的CAN报文可是这样实现:
res=testWaitForMessage(CAN1::NM_IPU,600);//等待CAN1上的名称为NM_IPU的报文,等待事件为600ms
4、定时器函数
- 函数使用介绍
CAPL中的定时器使用很频繁,不如当你测试时需要向纵向定时发送某条CAN报文时就需要用到定时器;
定时器的声明:
msTimer myTimer1;//声明了一个ms定时器,定时单位是毫秒
timer myTimer2;//声明了一个以秒为单位的定时器;
设置定时器:
setTimer(myTimer1,500);//设置定时器myTimer1为一个500ms定时器;
setTimerCyclic(myTimer2,1);//设置定时器myTimer2为一个1s为周期的循环定时器;
设置定时器定时事件,即当定时器计时时间到时将要执行的操作:
on timer myTimer1
{
.......
}
5、信息的操作和发送
- 函数使用介绍
message 0x7ff Msg;//声明一个message,ID=0x7ff
Msg.dlc=8;//设置其DLC=8;
Msg.id=0x100;//更改其ID=0x100;
Msg.byte(0)=55;//设置数据场的第一个字节为55
output(Msg);//发送Msg
6、节点上下线操作
- 函数使用介绍
节点时在dbc文件中定义的节点,如VCU,BMS,MCU等,有时需要将它们离线,离线后不再向总线上发送报文,在线时,可以向总线上发送报文。
节点上线:
void testSetEcuOnline(dbNode aNode);
void testSetEcuOnline(char aNodeName[]);
节点下线:
void testSetEcuOffline(dbNode aNode);
void testSetEcuOffline(char aNodeName[]);
7、检查错误帧
- 函数使用介绍
进行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");