ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase08
作者:车端域控测试工程师
更新日期:2025年02月17日
关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023
TC11-008测试用例
用例ID | 测试场景 | 验证要点 | 参考条款 | 预期结果 |
---|---|---|---|---|
TC11-008 | 多复位请求冲突处理 | 连续发送3次复位请求 | §8.4.1 | 仅首次请求生效,后续返回NRC=0x78 |
以下是为TC11-008设计的增强型CAPL测试用例,包含时序控制与状态跟踪机制,包含执行流程图和工业级异常处理:
cpp
/*----------------------------------------------------------
Title:TC11-008 多复位请求冲突处理验证
作者:车端域控测试工程师
日期:2025-02-17
------------------------------------------------------------*/
variables {
// 通信参数
const long DiagReqID = 0x732; // 诊断请求标识符
const long DiagResID = 0x733; // 诊断响应标识符
const byte ResetSvc = 0x11; // 复位服务ID
const byte ResetSub = 0x01; // 硬件复位子功能
const byte ExpectedNRC = 0x78; // 预期否定响应码
// 测试控制参数
msTimer responseTimer;
int requestCounter = 0;
byte responseStatus[3]; // 存储三次响应状态
}
testcase TC11_008_MultiResetTest()
{
TestModuleTitle("TC11-008 多复位请求冲突验证");
// ███ 阶段1:连续发送三次复位请求 ███
testStep("STEP1 发送三次复位请求(间隔150ms)");
for(requestCounter=0; requestCounter<3; requestCounter++)
{
// 发送复位请求
message DiagReqID [CAN] {
dlc = 2;
byte(0) = ResetSvc;
byte(1) = ResetSub;
}
output(this);
// 启动响应监测窗口
setTimer(responseTimer, 300);
while(getTimer(responseTimer) < 300)
{
if(TestWaitForMessage(DiagResID, 50))
{
// 响应解析逻辑
if(this.byte(0) == 0x51) {
responseStatus[requestCounter] = 1; // 肯定响应
testAddLog("请求%d: 收到肯定响应", requestCounter+1);
break;
}
else if(this.byte(0) == 0x7F &&
this.byte(1) == ResetSvc &&
this.byte(2) == ExpectedNRC)
{
responseStatus[requestCounter] = 2; // 否定响应
testAddLog("请求%d: 收到NRC=0x%02X", requestCounter+1, ExpectedNRC);
break;
}
}
}
// 超时处理
if(responseStatus[requestCounter] == 0) {
responseStatus[requestCounter] = 3; // 响应超时
testAddLog("请求%d: 响应超时", requestCounter+1);
}
// 请求间隔控制
testWait(150);
}
// ███ 阶段2:结果验证 ███
testStep("STEP2 响应结果验证");
// 首次请求验证
if(responseStatus[0] == 1) {
testStepPass("首次请求成功执行");
} else {
testStepFail("首次请求失败(状态码:%d)", responseStatus[0]);
}
// 后续请求验证
for(int i=1; i<3; i++)
{
if(responseStatus[i] == 2) {
testStepPass("请求%d返回NRC=0x78", i+1);
} else {
testStepFail("请求%d异常(状态码:%d)", i+1, responseStatus[i]);
}
}
// 综合判定
if(responseStatus[0]==1 && responseStatus[1]==2 && responseStatus[2]==2) {
testCasePass("多复位冲突处理验证通过");
} else {
testCaseFail("冲突处理机制异常");
}
}
/*----------------------------------------------------------
系统状态监控模块(扩展功能)
----------------------------------------------------------*/
on sysvar ECU::ResetStatus
{
if(@this::ResetStatus == 1) {
testAddLog("ECU复位操作已触发");
testAddCondition("复位持续时间:%dms", sysGetTimer(ECU_RESET_TIMER));
}
}
流程图解(执行逻辑可视化)
Tester ECU 复位请求 肯定响应(0x51) 复位请求 NRC=0x78 复位请求 NRC=0x78 Tester ECU
关键参数说明表
参数名称 | 示例值 | 工程配置要点 |
---|---|---|
请求间隔 | 150ms | 需小于ECU复位执行时间 |
响应超时 | 300ms | 覆盖ECU最大响应时间 |
NRC 0x78 | 请求未响应 | ISO 14229-1标准定义 |
复位子功能 | 0x01 | OEM定义的硬件复位类型 |
响应状态矩阵
请求序号 | 预期状态 | 失败场景示例 |
---|---|---|
1 | 肯定响应(0x51) | ECU未执行复位 |
2 | NRC=0x78 | 返回其他NRC或超时 |
3 | NRC=0x78 | 错误响应或系统崩溃 |
工业级增强功能
-
复位状态跟踪
cpp// 通过系统变量监控实际复位动作 on sysvar ECU::PowerStatus { if(@this::PowerStatus == 0x02) { testAddLog("ECU进入重启流程"); } }
-
压力测试扩展
cppvoid ExecuteStressTest() { // 可扩展: // 1. 连续发送10次复位请求 // 2. 随机间隔测试(50-500ms) // 3. 混合其他服务请求 }
-
时序校验逻辑
cpp// 验证响应时序合规性 if(getTimer(responseTimer) < 200) { testAddCondition("响应时间:%dms", getTimer(responseTimer)); }
专家调试技巧:
在
Graphics
窗口添加观测信号:
iniECU::ResetStatus sysvar::DiagResponseTime
使用
Diagnostic Console
设置过滤条件:
bashfilter.id = 0x733 && (payload[0] == 0x51 || payload[0] == 0x7F)
添加总线监测断点:
cppbreak if (this.id == 0x733 && this.byte(0) == 0x7F)