ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase05
作者:车端域控测试工程师
更新日期:2025年02月15日
关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023
TC10-005测试用例
用例ID | 测试场景 | 验证要点 | 参考条款 | 预期结果 |
---|---|---|---|---|
TC10-005 | 默认会话切换至扩展会话 | 发送0x10 0x03请求扩展会话 | §7.4.1 | 收到0x50 0x03响应 |
cap
/*-------------------------------------------------------------------
测试用例 TC10-005:默认会话切换至扩展会话
标准依据:ISO 14229-1 §7.4.1
验证目标:成功切换至扩展会话模式
预期响应:0x50 0x03(肯定响应)
-------------------------------------------------------------------*/
variables {
message 0x7E0 DiagReq = {dlc=8}; // 诊断请求报文
message 0x7E8 DiagRes; // 诊断响应报文
msTimer sessionTimer; // 会话计时器
byte currentSession; // 当前会话状态
}
testcase TC10_005_DefaultToExtendedSession()
{
//==================== 预置条件设置 ====================
sysSetVariable("Diag::Session", 0x01); // 强制默认会话
currentSession = 0x01;
// 验证初始状态
if(sysGetVariable("Diag::Session") != 0x01) {
testStepAbort("初始化失败:ECU未处于默认会话");
return;
}
//==================== 测试步骤执行 ====================
// 步骤1:发送扩展会话请求
DiagReq.byte(0) = 0x10; // 诊断会话控制服务
DiagReq.byte(1) = 0x03; // 子功能:扩展会话
DiagReq.dlc = 2;
output(DiagReq); // 发送请求
//==================== 响应验证 ====================
testWaitForMessage(0x7E8, 1000); // 1秒响应超时
// 情况1:通信超时
if(TestGetLastError() == teTimeout) {
testStepFail("错误:ECU未在1秒内响应");
return;
}
// 情况2:收到肯定响应
if(DiagRes.byte(0) == 0x50 && DiagRes.byte(1) == 0x03) {
testStepPass("成功进入扩展会话");
write("当前会话状态:0x%02X", sysGetVariable("Diag::Session"));
// 验证系统变量同步更新
if(sysGetVariable("Diag::Session") == 0x03) {
testStepPass("会话状态同步验证通过");
} else {
testStepFail("会话状态未更新(当前:0x%02X)",
sysGetVariable("Diag::Session"));
}
}
// 情况3:收到否定响应
else if(DiagRes.byte(0) == 0x7F) {
testStepFail("收到否定响应 NRC=0x%02X", DiagRes.byte(2));
}
// 情况4:无效响应
else {
testStepFail("收到未知响应:0x%02X %02X",
DiagRes.byte(0), DiagRes.byte(1));
}
//==================== 后置清理 ====================
// 恢复默认会话
DiagReq.byte(1) = 0x01; // 默认会话子功能
output(DiagReq);
testWaitForMessage(0x7E8, 500); // 等待会话恢复确认
}
/*------------------------- 执行日志示例 -------------------------
[2025-02-15 14:35:12] TC10-005 测试启动
[2025-02-15 14:35:12] 当前会话状态:0x01
[2025-02-15 14:35:12] 发送请求: 10 03 @ 7E0
[2025-02-15 14:35:12] 收到响应: 50 03 @ 7E8
[2025-02-15 14:35:12] 系统会话状态已更新:0x03
[2025-02-15 14:35:12] 测试通过:成功进入扩展会话
[2025-02-15 14:35:13] 恢复默认会话成功
----------------------------------------------------------------*/
代码执行流程图
测试系统 ECU 强制设置默认会话(0x01) 确认会话状态 发送10 03请求 响应50 03 验证会话状态更新 发送恢复默认会话请求 确认响应 测试系统 ECU
关键实现说明
- 双重状态验证机制
cap
// 报文响应验证
if(DiagRes.byte(0) == 0x50 && DiagRes.byte(1) == 0x03)
// 系统变量验证
if(sysGetVariable("Diag::Session") == 0x03)
- 动态总线适配
cap
// 自动检测总线类型设置DLC
DiagReq.dlc = (this.msgChannel == CAN_CHANNEL_HSCAN) ? 3 : 2;
- 实时会话监控
cap
on sysvar Diag::Session {
currentSession = @this;
write("实时会话状态:0x%02X", currentSession);
}
增强型错误处理
- 连续状态监测
cap
// 添加会话状态变化监控
on sysvar Diag::Session changed {
testReportPicture("会话状态变更",
"时间:%t 状态:0x%02X",
timeNow(), @this);
}
- 电压波动测试
cap
// 模拟电压波动场景
sysSetVariable("PowerVoltage", 13.5);
testWaitForTimeout(1000);
sysSetVariable("PowerVoltage", 10.5);
- 异常报文注入
cap
// 在测试过程中注入错误报文
message 0x123干扰报文 = {0xAA, 0xBB, 0xCC};
output(干扰报文);
操作指南:
- 使用CANoe的
Graphics
窗口监控Diag::Session
变量 - 在
Diagnostic Console
中手动验证会话状态 - 建议测试步骤:
- 冷启动立即测试
- 热复位后测试
- 连续执行10次切换操作测试稳定性
- 使用
testReportMerge
合并多轮测试结果
将本代码集成到CANoe Test Module时需注意:
- 确认ECU诊断数据库已加载
0x10
服务定义 - 在
Test Setup
中设置Diag::Session
变量的读写权限 - 建议配合使用
IL
层日志记录详细通信过程
遇到测试失败时可参考以下排查步骤:
- 检查ECU的诊断地址配置
- 验证ECU软件版本是否支持扩展会话
- 使用
Bus Statistics
分析总线负载情况 - 检查测试序列中是否存在会话冲突操作