如何编写满足时序条件的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
相关产品推荐
相关产品推荐

