CAPL测试报文周期

CAPL测试报文周期

/*@!Encoding:936*/
includes
{
  
}
variables
{
  dword gCycCheckId;
  const long KMIN_CYCLE_TIME=40;//定义一般最小周期时间常量 ms
  const long KMAX_CYCLE_TIME=120;//定义一般最大周期时间常量 ms
  const long KTIMEOUT       =5000;//定义测试等待时间常量 ms
  long length = 3; // CanID buffer length
  long testIDArray[3] = {0x100,0x101,0x102}; // 测试 CanID
}

Testcase CheckMsgEngineData(long testID)//创建一个测试用例
{

float  lCycMinCycleTime;//声明最小周期时间
float  lCycMaxCycleTime;//声明最小周期时间
char buffer[100];        //声明一个数组
lCycMinCycleTime=KMIN_CYCLE_TIME;//最小周期时间赋值
lCycMaxCycleTime=KMAX_CYCLE_TIME;//最大周期时间赋值

 write("start checkmsgenginedata");
//测试报告提示信息
 snprintf(buffer,elcount(buffer),"check cycle time of msg  0x%X",testID);
TestCaseTitle("TC-1",buffer);//TestCaseTitle用于设定
//开始观察待测报文
gCycCheckId=ChkStart_MsgAbsCycleTimeViolation(testID,lCycMinCycleTime,lCycMaxCycleTime);//lCycMinCycleTime为最小周期时间,lCycMaxCycleTime为最大时间周期

//函数调用
CheckMsgCyc(lCycMinCycleTime,lCycMaxCycleTime);//周期时间检测结果函数
//testRemoveContion(gCycCheckId);//移除测试条件
}

CheckMsgCyc(float aCycMinCycleTime,float aCycMaxCycleTime)
{
float lQueryResultProbeMin;//声明最小测量时间
float lQueryResultProbeMax;//声明最大测量时间
char lbuffer[100];        //声明一个数组

TestAddCondition(gCycCheckId);//条件设置函数
testWaitForTimeout(KTIMEOUT);//等待指示函数

//统计最小时间
lQueryResultProbeMin=ChkQuery_StatProbeIntervalMin(gCycCheckId);
//统计最大时间
lQueryResultProbeMax=ChkQuery_StatProbeIntervalMax(gCycCheckId);
//统计异常次数
if(ChkQuery_NumEvents(gCycCheckId)>0)
{//打印报告
 snprintf(lbuffer,elcount(lbuffer),"Valid values %.0fms - %.0fms",aCycMinCycleTime,aCycMaxCycleTime);
 TestStepFail(" ",lbuffer);
 snprintf(lbuffer,elcount(lbuffer),"Min cycle time: %dms",lQueryResultProbeMin);
 TestStepFail(" ",lbuffer);
  snprintf(lbuffer,elcount(lbuffer),"Min cycle time: %dms",lQueryResultProbeMax);
 TestStepFail(" ",lbuffer);
}
else
{snprintf(lbuffer,elcount(lbuffer),"Valid values %.0fms - %.0fms",aCycMinCycleTime,aCycMaxCycleTime);
 TestStepPass(" ",lbuffer);
 snprintf(lbuffer,elcount(lbuffer),"Min cycle time: %lfms",lQueryResultProbeMin);
 TestStepPass(" ",lbuffer);
  snprintf(lbuffer,elcount(lbuffer),"Min cycle time: %lfms",lQueryResultProbeMax);
  TestStepPass(" ",lbuffer);
 
}
ChkControl_Destroy(gCycCheckId);//销毁事件

}
void MainTest()
{
  long i = 0;
TestModuleTitle("CycleTest");//用于设定测试模块的标题
  for(i=0;i<length;i++)
  {
    CheckMsgEngineData(testIDArray[i]);
  }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
是的,您可以使用CAPL编写脚本来实现全程检测报文周期的功能。以下是一个示例代码,可以帮助您实现这个功能: ```CAPL variables { int messageCounter = 0; // 报文计数器 float messagePeriod = -1; // 报文周期 float messageFrequency = -1; // 报文频率 dword lastMessageTime = 0; // 上一次接收到报文的时间戳 } on message * // 监听所有CAN报文 { if (this.ext == 0) // 只处理标准帧 { messageCounter++; // 计数器加1 dword currentTime = timeNow(); // 获取当前时间戳 if (lastMessageTime != 0) // 如果不是第一次接收到报文 { float timeDiff = (currentTime - lastMessageTime) / 1000000.0; // 计算时间差,单位为秒 if (messagePeriod < 0) // 如果是第一次计算报文周期 { messagePeriod = timeDiff; } else { messagePeriod = 0.9 * messagePeriod + 0.1 * timeDiff; // 采用滑动平均法计算报文周期 } messageFrequency = 1.0 / messagePeriod; // 计算报文频率 } lastMessageTime = currentTime; // 更新上一次接收到报文的时间戳 } } on timer event 1 // 定时器事件,定时输出报文周期和频率 { write("Message period: %.3f s, frequency: %.3f Hz\n", messagePeriod, messageFrequency); setTimer(1, 1000); // 重新设置定时器,每隔1秒输出一次 } ``` 在上面的代码中,我们使用 `on message *` 监听所有的CAN报文,并通过计数器和时间戳计算出报文周期和频率。每隔1秒,我们使用 `write()` 函数输出报文周期和频率。您可以根据需要修改代码中的参数和输出格式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值