【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析④】
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");