ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase04
作者:车端域控测试工程师
 更新日期:2025年02月17日
 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023
TC11-004测试用例
| 用例ID | 测试场景 | 验证要点 | 参考条款 | 预期结果 | 
|---|---|---|---|---|
| TC11-004 | 无效子功能码检测 | 发送0x11 0xFF(保留值) | §7.1.2 | 返回NRC=0x12(子功能不支持) | 
/*----------------------------------------------------------------*/
/* 测试用例ID      : TC11-004                                     */
/* 测试项名称      : 无效子功能码检测                             */
/* 测试依据        : §7.1.2                                       */
/* 验证目标        : 返回NRC=0x12(子功能不支持)                 */
/* 作者            : 车端域控测试工程师                           */
/* 创建日期        : 2025-02-17                                   */
/* 版本历史        : V1.0 - 初始版本                              */
/*----------------------------------------------------------------*/variables 
{// 诊断协议参数 const long DiagReqID = 0x732;    // 诊断请求ID const long DiagResID = 0x733;    // 诊断响应ID const byte InvalidSubFuncReq[2] = {0x11, 0xFF};  // 无效子功能请求 const byte ExpectedNRC = 0x12;   // 预期否定响应码 // 状态监控 msTimer responseTimer;int serviceValidationPassed = 0;
}testcase TC11_004_InvalidSubfunctionCheck()
{TestModuleTitle("TC11-004 无效子功能码检测");// 阶段1:发送无效子功能请求 testStep("发送0x11服务+0xFF子功能");message DiagReqID [CAN] {dlc = 2;byte(0) = InvalidSubFuncReq[0];  // 服务ID byte(1) = InvalidSubFuncReq[1];  // 子功能码 }output(this);// 阶段2:响应验证 testWaitForTimeout(500);  // 总测试窗口500ms setTimer(responseTimer, 200);  // 设置响应超时 while(1) {if(TestWaitForMessage(DiagResID, 50)) {// 否定响应基础验证 if(this.byte(0) == 0x7F && this.byte(1) == InvalidSubFuncReq[0]) {// NRC专项验证 if(this.byte(2) == ExpectedNRC) {testStepPass("收到预期NRC=0x%02X", ExpectedNRC);serviceValidationPassed = 1;break;}else {testStepFail("收到错误NRC=0x%02X", this.byte(2));}}// 意外肯定响应处理 else if(this.byte(0) == 0x51) {testStepFail("检测到非法服务支持");}}// 超时处理 if(getTimer(responseTimer) >= 200) {testStepFail("响应超时未收到");break;}}// 最终判定 if(serviceValidationPassed) {testCasePass("无效子功能码验证成功");}
}/*--------------------------------------------------------------增强型响应跟踪模块 
--------------------------------------------------------------*/
on message DiagResID 
{// 实时记录所有诊断响应 if(this.byte(0) == 0x7F) {testAddLog("收到否定响应 - SID:0x%02X NRC:0x%02X", this.byte(1), this.byte(2));}
}on timer responseTimer 
{testAddCondition("响应等待时间:%dms", getTimer(responseTimer));
}
 
测试架构深度解析
- 三阶段验证流程
 
-  
关键技术实现
 -  
精准服务识别:
if(this.byte(0) == 0x7F && this.byte(1) == InvalidSubFuncReq[0]) -  
动态超时控制:
setTimer(responseTimer, 200); // 200ms严格响应窗口 while(getTimer(responseTimer) < 200) { ... } -  
多重防护机制:
// 同时检测: // 1. 响应报文结构 // 2. 服务ID匹配 // 3. 特定NRC码 -  
异常处理矩阵
| 异常类型 | 检测方式 | 处理措施 |
|----------------|---------------------------|----------------------------|
| 无效NRC码 | 字节偏移量验证 | 记录具体错误码 |
| 非法服务支持 | 0x51肯定响应检测 | 标记协议违规 |
| 总线静默 | 200ms超时机制 | 终止测试流程 |
| 数据长度异常 | DLC值校验 | 触发格式错误警报 | -  
扩展验证建议
 -  
参数化测试扩展:
struct SubfunctionTestSet {byte serviceID = 0x11;byte invalidSubfunc = 0xFF;byte expectedNRC = 0x12;dword timeout = 200; }; -  
边界值测试扩展:
void ExecuteBoundaryTests() {// 可测试:// 0x00 - 保留值边界 // 0x7F - 最大标准值 // 0x80 - 扩展子功能边界 } -  
服务矩阵验证:
void CheckServiceMatrix(byte serviceID) {// 验证服务支持矩阵的完整性 } 
工程实践指南
-  
环境配置要求
| 配置项 | 规格要求 |
|----------------|-------------------------------|
| 测试工具 | CANoe 15.0+(带Diagnostics) |
| 硬件接口 | VN1630/VN8970 |
| ECU供电 | 可编程电源(9-16V) |
| 协议版本 | UDS 1.4.0 | -  
关键指标分析
| 验证维度 | 合格标准 | 测量方法 |
|----------------|---------------------------|------------------------|
| 响应时间 | ≤150ms | 示波器触发测量 |
| NRC一致性 | 100%返回0x12 | 自动化脚本验证 |
| 错误检测率 | 非法请求拒绝率100% | 压力测试统计 |
| 协议合规性 | 符合ISO14229-1要求 | 协议分析仪检测 | -  
执行注意事项
 
- 测试前确保ECU处于默认会话模式
 - 禁用其他可能修改诊断状态的测试用例
 - 建议在ECU冷启动后立即执行
 - 避免与刷写操作测试并行执行
 
- 关联测试建议
 
- 配合TC07-015(有效子功能边界值测试)
 - 结合TC09-018(非法服务ID检测)
 - 关联TC12-007(诊断服务支持矩阵验证)
 
调试技巧:
- 在
 Write Window设置过滤器:id==733h && byte(0)==7Fh- 使用
 Graphics窗口绘制NRC分布图- 启用
 Diagnostic Event Viewer跟踪服务交互- 添加
 Test Coverage监控点:testAddCoverage("SVC-0x11", "Subfunction validation"); testAddCoverage("NRC-0x12", "Subfunction not supported");