You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写满足时序条件的CAN信号BM_State监测CAPL测试用例

CAPL测试用例实现方案

核心思路

通过状态机跟踪测试阶段,结合CAN信号回调与定时器实现时序验证,同时记录各关键状态的相对触发时间。

关键变量定义

在CAPL文件的变量段定义全局跟踪变量:

variables
{
  // 测试阶段标记:0=未触发,1=等待BM_State变为7,2=等待BM_State变为9,3=测试完成
  int testStage = 0;
  // BM_V触发阈值的系统时间戳(单位ms)
  dword triggerTime = 0;
  // BM_State=7的相对时间(相对于triggerTime,单位s)
  float timeToState7 = 0;
  // BM_State=9的相对时间(相对于triggerTime,单位s)
  float timeToState9 = 0;
  // 超时控制定时器
  msTimer timeoutTimer;
}

信号回调与状态处理

针对BM_V和BM_State编写信号回调函数,处理阶段切换与时序检查:

on signal BM_V
{
  // 仅在未触发阶段检测阈值
  if (testStage == 0 && this.value > 3.2)
  {
    triggerTime = timeNow();
    testStage = 1;
    write("BM_V超过3.2V,开始监测BM_State,起始时间戳:%d ms", triggerTime);
    // 设置3秒超时,超时则判定测试失败
    setTimer(timeoutTimer, 3000);
  }
}

on signal BM_State
{
  // 阶段1:等待BM_State变为7
  if (testStage == 1 && this.value == 7)
  {
    cancelTimer(timeoutTimer);
    timeToState7 = (timeNow() - triggerTime) / 1000.0;
    write("BM_State变为7,相对于BM_V触发的时间:%.2f s", timeToState7);
    testStage = 2;
    // 设置2秒超时,等待State变为9
    setTimer(timeoutTimer, 2000);
  }
  // 阶段2:等待BM_State变为9
  else if (testStage == 2 && this.value == 9)
  {
    cancelTimer(timeoutTimer);
    timeToState9 = (timeNow() - triggerTime) / 1000.0;
    write("BM_State变为9,相对于BM_V触发的时间:%.2f s", timeToState9);
    testStage = 3;
    testPass();
    write("所有条件满足,测试通过");
  }
}

超时处理逻辑

定时器触发时直接判定测试失败:

on timer timeoutTimer
{
  if (testStage == 1)
  {
    write("超时错误:BM_V触发后3秒内未检测到BM_State=7,测试失败");
  }
  else if (testStage == 2)
  {
    write("超时错误:BM_State=7后2秒内未检测到BM_State=9,测试失败");
  }
  testFail();
  testStage = 3;
}

注意事项

  • 确保BM_V和BM_State已正确导入CANoe/CANalyzer的数据库(.dbc文件)
  • 测试总时长自然控制在5秒内,满足题目7秒的上限要求
  • 若需重复测试,可在on start或手动触发函数中重置testStage等变量

内容的提问来源于stack exchange,提问作者K.Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:42:38