ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase12
作者:车端域控测试工程师
更新日期:2025年02月18日
关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023
TC11-012测试用例
用例ID | 测试场景 | 验证要点 | 参考条款 | 预期结果 |
---|---|---|---|---|
TC11-012 | 诊断响应发送顺序验证 | 捕获复位响应报文发送时序 | §8.1.4 | 肯定响应在复位操作前完成发送 |
以下是为TC11-012设计的工业级CAPL测试用例,包含时序精度验证与容错机制,包含多维度验证策略:
cpp
/*----------------------------------------------------------
Title:TC11-012 诊断响应时序验证
作者:车端域控测试工程师
日期:2025-02-18
------------------------------------------------------------*/
variables {
// 诊断通信参数
const long DiagReqID = 0x732; // 诊断请求标识符
const long DiagResID = 0x733; // 诊断响应标识符
const byte ResetSID = 0x11; // ECU复位服务
const byte ResetSubFunc = 0x01; // 硬件复位子功能
// 时序记录参数
dword responseTimestamp = 0; // 响应报文时间戳
dword resetStartTimestamp = 0; // 复位启动时间戳
dword maxResponseDelay = 300; // 最大允许响应延迟(ms)
}
testcase TC11_012_ResponseSequenceTest()
{
TestModuleTitle("TC11-012 诊断响应时序验证");
// ███ 阶段1:发送复位请求 ███
testStep("STEP1 发送硬件复位请求");
message DiagReqID [CAN] {
dlc = 2;
byte(0) = ResetSID;
byte(1) = ResetSubFunc;
}
output(this);
// ███ 阶段2:响应与复位时序捕获 ███
testStep("STEP2 监控关键事件时序");
dword startTime = timeNow(); // 测试启动基准时间
// 等待响应报文
while(timeNow() - startTime < maxResponseDelay)
{
if(TestWaitForMessage(DiagResID, 50))
{
if(this.byte(0) == 0x51) { // 肯定响应判断
responseTimestamp = timeNow();
testAddLog("收到肯定响应 @%dms", responseTimestamp - startTime);
break;
}
}
}
// 等待复位信号(示例通过电源状态检测)
while(timeNow() - startTime < 2000)
{
if(sysGetVariableInt(sysvar::ECU::PowerStatus) == 0) {
resetStartTimestamp = timeNow();
testAddLog("检测到复位启动 @%dms", resetStartTimestamp - startTime);
break;
}
testWait(10);
}
// ███ 阶段3:时序关系验证 ███
testStep("STEP3 时序逻辑分析");
// 响应存在性验证
if(responseTimestamp == 0) {
testCaseFail("未收到诊断响应");
return;
}
// 复位信号验证
if(resetStartTimestamp == 0) {
testCaseFail("未检测到复位操作");
return;
}
// 核心时序验证
if(responseTimestamp < resetStartTimestamp) {
testAddCondition("响应提前量:%dms",
resetStartTimestamp - responseTimestamp);
testCasePass("响应时序符合要求");
} else {
testCaseFail("响应延迟(响应@%dms vs 复位@%dms)",
responseTimestamp - startTime,
resetStartTimestamp - startTime);
}
}
/*----------------------------------------------------------
增强型监控模块(多维度检测)
----------------------------------------------------------*/
on sysvar ECU::PowerStatus
{
// 电源状态变化监控(0:复位中,1:正常运行)
if(@this::PowerStatus == 0) {
testAddLog("ECU进入复位流程");
}
}
on message DiagResID
{
// 实时捕获所有诊断响应
if(this.byte(0) == 0x51) {
testAddLog("捕获响应报文 @%dms", timeNow());
}
}
流程图解(执行逻辑可视化)
Tester ECU 复位请求(0x11 0x01) 0x51肯定响应 响应发送完成 执行硬件复位 检测复位信号 Tester ECU
关键参数说明表
参数名称 | 示例值 | 工程校准要点 |
---|---|---|
最大响应延迟 | 300ms | 基于OEM诊断规范调整 |
复位检测超时 | 2000ms | 覆盖最长复位周期 |
时序精度 | 1ms | 依赖CANoe系统时钟精度 |
电源状态监测 | 0/1 | 需与ECU实际状态映射 |
响应-复位时序矩阵
测试场景 | 预期结果 | 失败模式示例 |
---|---|---|
正常流程 | 响应先于复位 | 复位操作先执行 |
快速复位 | 时序差≥5ms | 响应与复位时间差<2ms |
高压干扰 | 时序关系保持 | 响应丢失或复位未触发 |
工业级增强功能
-
多信号交叉验证
cpp// 添加总线静默检测 on busOff { testAddLog("总线静默开始 @%dms", timeNow()); }
-
压力测试扩展
cppvoid ExecuteStressTest() { // 可扩展: // 1. 叠加90%总线负载 // 2. 电源波动模拟(12V→16V→9V) // 3. 温度冲击测试(-40℃→85℃) }
-
时序精度校准
cpp// 添加示波器同步信号 on message DiagResID { if(this.byte(0) == 0x51) { sysSetVariable(sysvar::Trigger::SyncPulse, 1); } }
测试执行说明
-
环境配置建议
ini[Hardware] CAN1_Baudrate = 500000 PowerSupply_Voltage = 13.5V [Monitoring] ECU_Power_Monitor = Enabled
-
结果判定标准
检查项 合格标准 验证方法 响应存在性 100%捕获肯定响应 报文解析 时序优先级 响应早于复位≥5ms 时间戳比对 执行完整性 复位操作完整执行 电源波形分析
调试技巧:
- 在
Graphics
窗口添加时序观测信号:
系统变量 sysvar::ECU::PowerStatus sysvar::Diag::LastResponseTime
- 使用
Diagnostic Console
设置触发条件:
bash trigger on message DiagResID and sysvar ECU::PowerStatus changes
- 添加断点辅助调试:
``cppbreak when (sysvar::ECU::PowerStatus == 0)
``
关键问题排查指南
异常现象 | 排查方向 | 工具支持 |
---|---|---|
响应丢失 | 1. ECU供电稳定性 2. 总线终端电阻匹配 | 示波器/万用表 |
时序倒置 | 1. 中断优先级配置 2. 看门狗触发机制 | 调试器/代码审查 |
偶发延迟 | 1. 任务调度延迟 2. 内存溢出检测 | 静态代码分析工具 |