【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析④】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase04
作者:车端域控测试工程师
更新日期:2025年02月15日
关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023
TC10-004测试用例
用例ID | 测试场景 | 验证要点 | 参考条款 | 预期结果 |
---|---|---|---|---|
TC10-004 | 非法子功能码检测 | 发送0x10 0x04(无效子功能) | §7.3.2 | 返回NRC=0x12(子功能不支持) |
/*-------------------------------------------------------------------
测试用例 TC10-004:非法子功能码检测
标准依据:ISO 14229-1 §7.3.2
验证目标:发送无效子功能码时返回NRC=0x12
预期响应:7F 10 12(subFunctionNotSupported)
-------------------------------------------------------------------*/
variables {
message 0x7E0 DiagReq = {dlc=8}; // 诊断请求报文
message 0x7E8 DiagRes; // 诊断响应报文
msTimer responseTimer; // 响应计时器
byte currentSession; // 当前会话状态
}
testcase TC10_004_InvalidSubfunction()
{
//==================== 预置条件设置 ====================
sysSetVariable("Diag::Session", 0x01); // 强制默认会话
currentSession = 0x01;
DiagReq.dlc = 2; // 初始化DLC
//==================== 测试步骤执行 ====================
// 步骤1:发送非法子功能请求
DiagReq.byte(0) = 0x10; // 诊断会话控制服务
DiagReq.byte(1) = 0x04; // 无效子功能码(0x04)
output(DiagReq); // 发送请求
//==================== 响应验证 ====================
testWaitForMessage(0x7E8, 1500); // 1.5秒响应超时
// 情况1:通信超时
if(TestGetLastError() == teTimeout) {
testStepFail("错误:ECU未在1.5秒内响应");
return;
}
// 情况2:否定响应验证
if(DiagRes.byte(0) == 0x7F) {
// 三级响应校验
if(DiagRes.byte(1) != 0x10) { // 服务ID校验
testStepFail("服务ID不匹配,收到0x%02X", DiagRes.byte(1));
return;
}
if(DiagRes.byte(2) == 0x12) { // NRC校验
testStepPass("收到预期NRC 0x12");
write("子功能校验机制生效");
} else {
testStepFail("错误NRC代码:0x%02X", DiagRes.byte(2));
}
}
// 情况3:意外肯定响应
else if(DiagRes.byte(0) == 0x50) {
testStepFail("协议漏洞!收到正响应");
sysSetVariable("Diag::Session", 0x01); // 强制恢复默认会话
}
// 情况4:无效响应格式
else {
testStepFail("收到未知响应:0x%02X %02X %02X",
DiagRes.byte(0), DiagRes.byte(1), DiagRes.byte(2));
}
//==================== 后置清理 ====================
// 发送有效请求恢复会话
DiagReq.byte(1) = 0x01; // 有效子功能码
output(DiagReq);
testWaitForMessage(0x7E8, 1000); // 等待会话确认
}
/*------------------------- 执行日志示例 -------------------------
[2025-02-15 11:16:32] TC10-004 测试启动
[2025-02-15 11:16:32] 当前会话状态:0x01
[2025-02-15 11:16:32] 发送请求: 10 04 @ 7E0
[2025-02-15 11:16:32] 收到响应: 7F 10 12 @ 7E8
[2025-02-15 11:16:32] 测试通过:子功能校验生效
[2025-02-15 11:16:33] 恢复默认会话成功
----------------------------------------------------------------*/
代码执行流程图
关键实现说明
- 三级响应验证体系
if(DiagRes.byte(0) == 0x7F
&& DiagRes.byte(1) == 0x10
&& DiagRes.byte(2) == 0x12) {
// 完整匹配否定响应
}
- 动态DLC适配机制
DiagReq.dlc = (this.msgChannel == CAN_CHANNEL_HSCAN) ? 3 : 2; // 根据总线类型调整
- 会话状态追踪器
on sysvar Diag::Session {
currentSession = @this;
write("会话状态变更记录:0x%02X @ %dms", currentSession, timeNow());
}
测试场景矩阵
测试用例 | 请求报文 | 预期响应 | 通过标准 |
---|---|---|---|
有效子功能(0x01) | 10 01 | 50 01 | 不在此用例范围 |
无效子功能(0x04) | 10 04 | 7F 10 12 | 当前用例验证目标 |
边界值测试(0x00) | 10 00 | 7F 10 12 | 需额外测试用例覆盖 |
超范围值测试(0xFF) | 10 FF | 7F 10 12 | 需额外测试用例覆盖 |
增强型诊断功能
- 自动重试机制
// 添加重试逻辑(最多3次)
for(int i=1; i<=3; i++) {
output(DiagReq);
if(testWaitForMessage(0x7E8, 1000)) break;
write("第%d次重试...", i);
}
- 总线干扰测试
// 注入干扰报文
message 0x555 Disturbance = {0xAA, 0xBB, 0xCC, 0xDD};
output(Disturbance); // 发送干扰帧
- 时序精确测量
// 精确记录响应时间
dword requestTime = timeNow();
testWaitForMessage(0x7E8, 1500);
dword responseTime = timeNow() - requestTime;
write("响应延迟:%dms", responseTime);
操作注意事项:
- 测试前确认ECU诊断数据库已加载最新版本
- 使用CANoe的
Trace
窗口过滤7E0
和7E8
报文 - 建议执行以下扩展测试:
- 连续发送10次非法请求测试稳定性
- 在不同总线负载条件下(20%, 50%, 80%)重复测试
- 组合测试:先发送有效请求再发送无效请求
将代码集成到CANoe Test Module时需注意:
- 在
PreTest
中执行环境检查:if(sysGetVariable("Diag::Session") != 0x01) { testReportWarning("预检查失败:ECU未处于默认会话"); }
- 建议配合使用
testReportPicture
记录关键测试步骤 - 完整测试需要包含至少10次边界值测试循环