AUTOSAR 诊断系统架构详解
目录
- 概述
1.1 诊断系统的目的
1.2 诊断提取模板的作用 - 诊断系统架构
2.1 总体架构
2.2 关键组件
2.3 层次结构 - 诊断服务
3.1 UDS诊断服务
3.2 服务类型 - 事件处理机制
4.1 事件处理流程
4.2 事件状态转换 - 通信流程
5.1 诊断请求处理
5.2 安全访问机制 - 总结
1. 概述
1.1 诊断系统的目的
AUTOSAR诊断系统提供了一套标准化的诊断功能,用于监控、检测和报告车辆ECU的故障状态。诊断系统允许外部测试设备与车辆ECU进行通信,执行诊断操作,如读取故障代码、清除故障信息、查询系统状态和执行特定的诊断例程。
1.2 诊断提取模板的作用
诊断提取模板(Diagnostic Extract Template)是AUTOSAR诊断系统的核心配置部分,它定义了诊断数据的交换格式和方法。根据源文档中的描述,诊断提取模板的主要目标是:
- 支持诊断数据在不同开发方之间的交换
- 支持诊断功能的分布式开发
- 为诊断通信管理器(DCM)和诊断事件管理器(DEM)提供自动代码生成的基础
“The main goal of the Diagnostic Extract is to exchange diagnostic data between the different parties involved in the diagnostic development process to support the automatic code generation process for diagnostic modules DCM and DEM.”
2. 诊断系统架构
2.1 总体架构
AUTOSAR诊断系统采用分层架构设计,由应用层、RTE层、服务层和基础层组成。下图展示了AUTOSAR诊断系统的总体架构:
2.2 关键组件
基于源文档的内容,诊断系统的关键组件包括:
-
诊断通信管理器(DCM):
- 功能:负责处理诊断请求和响应,管理诊断会话和安全访问
- 相关要求:
RS_DEXT_00003
至RS_DEXT_00022
描述了DCM支持的UDS诊断服务 - 位置:位于AUTOSAR服务层
-
诊断事件管理器(DEM):
- 功能:负责诊断事件的存储、监控和状态管理
- 相关要求:
RS_DEXT_00023
至RS_DEXT_00037
描述了DEM的事件处理机制 - 位置:位于AUTOSAR服务层
-
功能抑制管理器(FIM):
- 功能:管理功能的抑制和启用状态
- 相关要求:
RS_DEXT_00060
至RS_DEXT_00063
描述了FIM的功能 - 位置:位于AUTOSAR服务层
-
诊断提取模板(DEXT):
- 功能:定义诊断数据交换格式,支持自动代码生成
- 相关要求:整个源文档描述了DEXT的需求
- 位置:位于AUTOSAR服务层,作为配置的基础
2.3 层次结构
AUTOSAR诊断系统的层次结构如下:
-
应用层:
- 应用软件组件(ApplicationSwComponent)
- 诊断应用(DiagnosticApplication)
- 提供特定的诊断功能和业务逻辑
-
RTE层:
- 运行时环境(Runtime Environment)
- 负责连接应用层和服务层
-
服务层:
- 诊断通信管理器(DCM)
- 诊断事件管理器(DEM)
- 功能抑制管理器(FIM)
- 诊断提取模板(DEXT)
-
基础层:
- 通信栈(Communication Stack)
- ECU状态管理(ECU State Manager)
- 存储管理(Memory Management)
组件间的主要交互:
- DCM与DEM交互,处理诊断服务和事件管理
- DCM与通信栈交互,处理诊断通信
- DCM与ECU状态管理交互,实现ECU复位功能
- DCM与存储管理交互,访问诊断数据存储
- FIM与DEM交互,查询事件状态
代码示例:诊断组件初始化
/* 诊断组件配置类型定义 */
typedef struct {
const Dcm_ConfigType* DcmConfigPtr; /* DCM配置指针 */
const Dem_ConfigType* DemConfigPtr; /* DEM配置指针 */
const Fim_ConfigType* FimConfigPtr; /* FIM配置指针 */
uint8 MaxNumberOfConcurrentDiagSessions; /* 最大并发诊断会话数 */
boolean DemIntegrationEnabled; /* DEM集成启用标志 */
boolean FimIntegrationEnabled; /* FIM集成启用标志 */
} Diag_ConfigType;
/* 诊断组件初始化函数 */
Std_ReturnType Diag_Init(const Diag_ConfigType* ConfigPtr)
{
Std_ReturnType result = E_OK;
/* 参数检查 */
if (ConfigPtr == NULL) {
return E_NOT_OK;
}
/* 初始化DCM模块 */
if (ConfigPtr->DcmConfigPtr != NULL) {
if (Dcm_Init(ConfigPtr->DcmConfigPtr) != E_OK) {
result = E_NOT_OK;
}
}
/* 初始化DEM模块 */
if (ConfigPtr->DemIntegrationEnabled && ConfigPtr->DemConfigPtr != NULL) {
if (Dem_Init(ConfigPtr->DemConfigPtr) != E_OK) {
result = E_NOT_OK;
}
}
/* 初始化FIM模块 */
if (ConfigPtr->FimIntegrationEnabled && ConfigPtr->FimConfigPtr != NULL) {
if (Fim_Init(ConfigPtr->FimConfigPtr) != E_OK) {
result = E_NOT_OK;
}
}
return result;
}
3. 诊断服务
3.1 UDS诊断服务
AUTOSAR诊断系统基于ISO 14229标准的统一诊断服务(UDS),提供了一系列标准化的诊断服务。这些服务由DCM模块实现,使外部测试设备能够与ECU进行交互。
3.2 服务类型
根据源文档中的RS_DEXT_00003
至RS_DEXT_00022
要求,AUTOSAR支持以下UDS诊断服务:
-
会话控制服务(SessionControl):
- 功能:切换诊断会话模式
- 要求:
RS_DEXT_00003
- 服务ID:0x10
-
ECU复位服务(ECUReset):
- 功能:执行ECU软复位或硬复位
- 要求:
RS_DEXT_00004
- 服务ID:0x11
-
清除诊断信息服务(ClearDiagnosticInformation):
- 功能:清除存储的故障代码和相关信息
- 要求:
RS_DEXT_00005
- 服务ID:0x14
-
读取DTC信息服务(ReadDTCInformation):
- 功能:读取存储的故障代码信息
- 要求:
RS_DEXT_00006
- 服务ID:0x19
-
读取数据服务(ReadDataByIdentifier):
- 功能:通过标识符读取ECU数据
- 要求:
RS_DEXT_00007
- 服务ID:0x22
-
安全访问服务(SecurityAccess):
- 功能:实现安全访问机制,保护敏感操作
- 要求:
RS_DEXT_00009
- 服务ID:0x27
-
通信控制服务(CommunicationControl):
- 功能:控制ECU通信功能的启用和禁用
- 要求:
RS_DEXT_00010
- 服务ID:0x28
-
例行程序控制服务(RoutineControl):
- 功能:启动、停止或获取例行程序结果
- 要求:
RS_DEXT_00015
- 服务ID:0x31
代码示例:UDS服务处理
/* UDS服务处理函数类型定义 */
typedef Std_ReturnType (*Dcm_ServiceHandlerType)(
const uint8* requestData,
uint16 requestLength,
uint8* responseData,
uint16* responseLength
);
/* UDS服务配置结构 */
typedef struct {
uint8 serviceId; /* 服务ID */
uint8 sessionSupport; /* 支持的会话类型掩码 */
uint8 securityLevelMask; /* 安全级别掩码 */
Dcm_ServiceHandlerType serviceHandler; /* 服务处理函数 */
} Dcm_ServiceConfigType;
/* 会话控制服务处理函数示例 */
Std_ReturnType Dcm_SessionControlHandler(
const uint8* requestData,
uint16 requestLength,
uint8* responseData,
uint16* responseLength)
{
Std_ReturnType result = E_OK;
uint8 subFunction;
/* 检查请求长度 */
if (requestLength < 2) {
return DCM_E_REQUEST_LENGTH_INVALID;
}
/* 获取子功能 */
subFunction = requestData[1];
/* 处理会话切换请求 */
switch (subFunction) {
case 0x01: /* 默认会话 */
result = Dcm_SetSession(DCM_DEFAULT_SESSION);
break;
case 0x02: /* 编程会话 */
result = Dcm_SetSession(DCM_PROGRAMMING_SESSION);
break;
case 0x03: /* 扩展诊断会话 */
result = Dcm_SetSession(DCM_EXTENDED_DIAGNOSTIC_SESSION);
break;
default:
return DCM_E_SUB_FUNCTION_NOT_SUPPORTED;
}
/* 构建响应 */
if (result == E_OK) {
responseData[0] = 0x50; /* 正响应服务ID */
responseData[1] = subFunction;
*responseLength = 2;
}
return result;
}
4. 事件处理机制
4.1 事件处理流程
AUTOSAR诊断系统中的事件处理机制由DEM模块实现,负责监控、记录和管理诊断事件。下图展示了诊断事件处理的状态图:
4.2 事件状态转换
根据源文档中的RS_DEXT_00023
至RS_DEXT_00037
要求,AUTOSAR诊断事件处理包括以下关键步骤:
-
事件检测:
- 功能:监控系统状态,检测异常情况
- 来源:通常由应用软件组件或传感器监控功能提供
-
启用条件检查:
- 功能:检查事件的启用条件是否满足
- 相关要求:
RS_DEXT_00026
、RS_DEXT_00028
、RS_DEXT_00030
- 条件类型:操作循环条件、环境条件、抑制条件
-
事件限定:
- 功能:对事件进行去抖动处理和预处理
- 相关要求:
RS_DEXT_00053
- 处理方式:连续故障计数、去抖动算法
-
存储条件检查:
- 功能:检查事件的存储条件是否满足
- 相关要求:
RS_DEXT_00027
、RS_DEXT_00029
、RS_DEXT_00031
- 条件类型:故障频率计数、故障持续时间、故障严重程度
-
DTC存储:
- 功能:将满足条件的事件存储为DTC
- 相关要求:
RS_DEXT_00024
-
数据记录:
- 功能:记录事件相关的扩展数据和快照数据
- 相关要求:
RS_DEXT_00032
、RS_DEXT_00033
-
老化处理:
- 功能:随着时间或操作循环的推移,处理DTC的老化
- 相关要求:
RS_DEXT_00055
代码示例:事件处理
/* 诊断事件状态枚举 */
typedef enum {
DEM_EVENT_STATUS_PASSED = 0x00,
DEM_EVENT_STATUS_FAILED = 0x01,
DEM_EVENT_STATUS_PREPASSED = 0x02,
DEM_EVENT_STATUS_PREFAILED = 0x03
} Dem_EventStatusType;
/* 诊断事件配置结构 */
typedef struct {
uint16 EventId; /* 事件ID */
uint32 DTCNumber; /* DTC编号 */
uint8 EventKind; /* 事件类型 */
uint8 EventPriority; /* 事件优先级 */
uint8 DebounceAlgorithm; /* 去抖动算法 */
sint8 DebounceTimePassedThreshold; /* 通过阈值 */
sint8 DebounceTimeFailedThreshold; /* 失败阈值 */
uint16 EnableConditionGroupRef; /* 启用条件组引用 */
uint16 StorageConditionGroupRef; /* 存储条件组引用 */
} Dem_EventConfigType;
/* 事件报告函数示例 */
Std_ReturnType Dem_ReportEvent(uint16 EventId, uint8 EventStatus)
{
Std_ReturnType result;
boolean enableConditionsMet = FALSE;
boolean storageConditionsMet = FALSE;
/* 获取事件配置 */
const Dem_EventConfigType* eventConfig = Dem_GetEventConfig(EventId);
if (eventConfig == NULL) {
return E_NOT_OK;
}
/* 检查启用条件 */
enableConditionsMet = Dem_CheckEnableConditions(eventConfig->EnableConditionGroupRef);
if (!enableConditionsMet) {
return DEM_E_CONDITION_NOT_FULFILLED;
}
/* 事件限定(去抖动处理) */
result = Dem_ProcessEventDebounce(EventId, EventStatus);
if (result != E_OK) {
return result;
}
/* 获取事件当前状态 */
Dem_EventStatusType currentStatus = Dem_GetEventStatus(EventId);
/* 只有当事件状态为失败时,才进行存储条件检查 */
if (currentStatus == DEM_EVENT_STATUS_FAILED) {
/* 检查存储条件 */
storageConditionsMet = Dem_CheckStorageConditions(eventConfig->StorageConditionGroupRef);
/* 如果满足存储条件,存储DTC和相关数据 */
if (storageConditionsMet) {
/* 存储DTC */
Dem_SetDTCStatus(eventConfig->DTCNumber, DEM_DTC_STATUS_CONFIRMED_DTC);
/* 存储扩展数据 */
Dem_StoreExtendedData(EventId);
/* 存储快照数据 */
Dem_StoreSnapshotData(EventId);
/* 更新DTC状态 */
Dem_UpdateDTCStatus(eventConfig->DTCNumber);
}
}
return E_OK;
}
5. 通信流程
5.1 诊断请求处理
AUTOSAR诊断系统的通信流程描述了外部测试设备与ECU之间的诊断通信过程。下图展示了诊断请求处理的序列图:
5.2 安全访问机制
根据源文档中的RS_DEXT_00009
、RS_DEXT_00040
至RS_DEXT_00042
要求,AUTOSAR诊断系统实现了安全访问机制,保护敏感的诊断操作。安全访问流程如下:
-
种子请求:
- 测试设备向ECU请求种子值
- ECU生成随机种子并响应
-
密钥发送:
- 测试设备使用种子计算密钥
- 测试设备将密钥发送给ECU
- ECU验证密钥并授予安全访问权限
-
安全级别:
- 不同的诊断服务需要不同的安全级别
- 安全级别控制对敏感操作的访问权限
代码示例:安全访问处理
/* 安全访问配置结构 */
typedef struct {
uint8 SecurityLevel; /* 安全级别 */
uint8 SeedSize; /* 种子大小 */
uint8 KeySize; /* 密钥大小 */
uint16 DelayTimeOnBoot; /* 启动时延迟时间 */
uint16 DelayTimeFalseAttempt; /* 错误尝试后延迟时间 */
uint8 MaxNumOfAttempts; /* 最大尝试次数 */
void (*GetSeedCallback)(uint8* seedBuffer, uint8 seedSize); /* 获取种子回调 */
Std_ReturnType (*CompareKeyCallback)(const uint8* key, uint8 keySize); /* 比较密钥回调 */
} Dcm_SecurityAccessConfigType;
/* 安全访问处理函数示例 */
Std_ReturnType Dcm_SecurityAccessHandler(
const uint8* requestData,
uint16 requestLength,
uint8* responseData,
uint16* responseLength)
{
uint8 subFunction;
uint8 securityLevel;
/* 检查请求长度 */
if (requestLength < 2) {
return DCM_E_REQUEST_LENGTH_INVALID;
}
/* 获取子功能 */
subFunction = requestData[1];
/* 获取安全级别 (子功能奇数表示请求种子,偶数表示发送密钥) */
securityLevel = (subFunction + 1) / 2;
/* 检查安全级别是否有效 */
const Dcm_SecurityAccessConfigType* secConfig = Dcm_GetSecurityConfig(securityLevel);
if (secConfig == NULL) {
return DCM_E_SUB_FUNCTION_NOT_SUPPORTED;
}
/* 处理请求种子 */
if (subFunction % 2 == 1) {
/* 检查是否超过最大尝试次数 */
if (Dcm_GetNumOfAttempts(securityLevel) >= secConfig->MaxNumOfAttempts) {
return DCM_E_EXCEEDED_NUMBER_OF_ATTEMPTS;
}
/* 检查延迟时间 */
if (Dcm_CheckDelayTime(securityLevel) != E_OK) {
return DCM_E_REQUIRED_TIME_DELAY_NOT_EXPIRED;
}
/* 获取种子 */
uint8 seed[16] = {0};
secConfig->GetSeedCallback(seed, secConfig->SeedSize);
/* 构建响应 */
responseData[0] = 0x67; /* 正响应服务ID */
responseData[1] = subFunction;
memcpy(&responseData[2], seed, secConfig->SeedSize);
*responseLength = 2 + secConfig->SeedSize;
return E_OK;
}
/* 处理发送密钥 */
else {
/* 检查请求长度是否包含密钥 */
if (requestLength < 2 + secConfig->KeySize) {
return DCM_E_REQUEST_LENGTH_INVALID;
}
/* 获取密钥 */
const uint8* key = &requestData[2];
/* 验证密钥 */
if (secConfig->CompareKeyCallback(key, secConfig->KeySize) != E_OK) {
/* 增加失败尝试次数 */
Dcm_IncrementNumOfAttempts(securityLevel);
/* 设置延迟时间 */
Dcm_SetDelayTime(securityLevel, secConfig->DelayTimeFalseAttempt);
return DCM_E_INVALID_KEY;
}
/* 密钥验证成功,设置安全级别 */
Dcm_SetSecurityLevel(securityLevel);
/* 重置尝试次数 */
Dcm_ResetNumOfAttempts(securityLevel);
/* 构建响应 */
responseData[0] = 0x67; /* 正响应服务ID */
responseData[1] = subFunction;
*responseLength = 2;
return E_OK;
}
}
6. 总结
AUTOSAR诊断系统提供了一个完整、标准化的框架,用于汽车ECU的诊断功能实现。通过诊断提取模板,AUTOSAR实现了诊断数据的交换和分布式开发支持。诊断系统的主要优势包括:
-
标准化:
- 基于ISO 14229标准的UDS服务
- 统一的诊断数据交换格式
- 标准化的事件处理机制
-
模块化架构:
- 分层设计,职责明确
- 组件间接口清晰
- 支持模块独立开发和测试
-
灵活配置:
- 支持多种诊断服务配置
- 可定制的事件处理和存储机制
- 支持不同的安全级别和访问权限
-
代码生成支持:
- 支持DCM和DEM模块的自动代码生成
- 简化配置复杂性
- 提高开发效率
AUTOSAR诊断系统是现代汽车电子架构中不可或缺的一部分,它为车辆故障诊断、维护和修理提供了统一、强大的技术基础。