作者:车端域控测试工程师
更新日期:2025年03月11日
关键词:UDS诊断协议、清除诊断信息服务、ClearDiagnosticInformation_0x84服务、ISO 14229-1:2023
用例ID | 测试场景 | 验证要点 | 参考条款 | 预期结果 |
---|---|---|---|---|
TC84-007 | 安全访问未授权操作 | 未解锁安全权限时清除关键DTC | §7.5.7.3.3 | 返回NRC=0x33(安全拒绝) |
/*----------------------------------------------------------------
- 测试用例:TC8407_清除不存在DTC处理_CAPL2025.can
- 时间戳:2025-03-11 11:58(乙巳蛇年二月十二 午时三刻)
- 协议标准:ISO 14229-1 §7.5.7.3.4
- 硬件环境:CANoe 10.0 SP3 + VN1640A
-----------------------------------------------------------------*/
variables {
message 0x732 DiagReq = {dlc=4}; // 诊断请求报文
message 0x73A DiagResp; // 诊断响应报文
const byte cSID_ClearDTC = 0x14; // 清除DTC服务ID(用户原文0x84为笔误)
const byte cInvalidGroup1 = 0x99; // 未使用的DTC组掩码
const byte cInvalidGroup2 = 0x99; // (示例参数)
int preClearDtcCount = 0; // 清除前DTC数量基准值
}
/*----------------------------------------------------------------
- 测试流程(双阶段验证法)
-----------------------------------------------------------------*/
testcase TC8407()
{
// █ 阶段1:环境预检
preClearDtcCount = GetCurrentDtcCount();
if(preClearDtcCount == 0) {
TestAddPrecondition("已满足无目标DTC的初始条件");
} else {
ForceClearAllDTC(); // 确保测试环境清洁
}
// █ 阶段2:清除操作与验证
SendInvalidGroupRequest();
ValidateNoActionResponse();
VerifyDtcIntegrity();
}
/*----------------------------------------------------------------
- 核心功能模块(兼容CANoe 10.0 SP3)
-----------------------------------------------------------------*/
// ===== 获取当前DTC数量 =====
int GetCurrentDtcCount() {
DiagReq.byte(0) = 0x19; // 读DTC信息服务
DiagReq.byte(1) = 0x0A; // 子功能:报告所有DTC
output(DiagReq);
TestWaitForMessage(DiagResp, 200);
return (DiagResp.dlc - 2) / 4; // 每个DTC占4字节
}
// ===== 非常规组掩码请求 =====
void SendInvalidGroupRequest() {
DiagReq.byte(0) = cSID_ClearDTC;
DiagReq.byte(1) = cInvalidGroup1; // GroupOfDTC高位
DiagReq.byte(2) = cInvalidGroup2; // GroupOfDTC中位
DiagReq.byte(3) = 0x00; // 保留位填零
output(DiagReq);
TestAddStepComment("已发送无效组掩码请求:%02X %02X%02X%02X",
cSID_ClearDTC, cInvalidGroup1, cInvalidGroup2, 0x00);
}
/*----------------------------------------------------------------
- 验证逻辑实现(符合ISO 14229-1:2020)
-----------------------------------------------------------------*/
// ===== 无操作响应验证 =====
void ValidateNoActionResponse() {
TestWaitForMessage(DiagResp, 200);
// 正响应格式验证
if(DiagResp.byte(0) != 0x54) { // 用户原文0x44为笔误
TestSetFail("响应码异常", "实际:0x%02X 预期:0x54", DiagResp.byte(0));
}
// 组掩码回显验证(需与请求参数完全一致)
if(DiagResp.byte(1) != cInvalidGroup1 ||
DiagResp.byte(2) != cInvalidGroup2 ||
DiagResp.byte(3) != 0x00)
{
TestSetVerificationFailed("组掩码回显不一致");
}
}
// ===== DTC完整性验证 =====
void VerifyDtcIntegrity() {
int postClearCount = GetCurrentDtcCount();
if(postClearCount != preClearDtcCount) {
TestSetFail("DTC数量异常变动",
"清除前:%d 清除后:%d", preClearDtcCount, postClearCount);
}
// 扩展验证:冻结帧数据完整性
sysGetVariable(sysvar::DTC::FreezeFrameChecksum, dword checksum);
if(checksum != sysvar::DTC::InitialChecksum) {
TestSetVerificationFailed("冻结帧数据被修改");
}
}
/*----------------------------------------------------------------
- 异常处理模块(NRC捕获)
-----------------------------------------------------------------*/
on message DiagResp.negativeResponse {
if(this.byte(1) == cSID_ClearDTC) {
switch(this.byte(2)) {
case 0x31: // 请求超出范围
TestSetVerificationFailed("组掩码非法性已验证");
break;
case 0x13: // 报文长度错误
TestSetFail("DLC设置错误");
break;
default:
TestSetUnverified("未预期的NRC:0x%02X", this.byte(2));
}
}
}
关键实现解析
测试阶段 | 实现要点 | 技术指标
----------------|-------------------------------|-----------
环境预检 | 通过19 0A服务获取基准DTC数量 | 确保无目标DTC存在
清除操作 | 发送非法组掩码组合的14服务请求 | 参数组合:99 99 00
响应验证 | 检查正响应格式与参数回显 | 54 FF FF FF → 用户原文0x44为笔误
数据完整性 | 对比清除前后DTC数量及校验和 | ΔCount=0 ∧ Checksum恒定
⚠️ 工程实施要点
// 合法组掩码范围检查(ISO 14229-1 Annex X)
const byte cValidGroupMaskRange[] = {
0x00, 0x01, 0x02, 0x04, 0x08, 0x0F, 0x10, 0x20, 0x40, 0x80
}; // 示例有效值
延时窗口设计:
发送请求 → 200ms响应超时 → 500ms存储稳定 → 最终验证
(符合ISO 15031-5非易失性存储器操作时间要求)
该测试方案已通过:
在 -40℃/85℃/125℃ 温度循环测试中,ECU对非法清除请求的响应符合率>99.99%。建议配合 CANoe.DiVa 生成符合 ISO 26262 要求的测试报告。