【车载开发系列】AutoSar当中的诊断会话控制
【车载开发系列】AutoSar当中的诊断会话控制
- 【车载开发系列】AutoSar当中的诊断会话控制
- 一. 什么是诊断会话控制服务
- 二. 会话模式分类
- 三. 会话的接口
- 1)获取当前会话状态
- 2)设置会话状态
- 3)返回默认会话
- 4)会话的变更
- 四. 配置会话层时间参数
- 五. 会话的配置
- 1)DcmDsdService
- 2)DcmDspSession
- 3)DcmDspSessionCallback
一. 什么是诊断会话控制服务
DiagnosticSessionControl,SID是0X10,主要功能是控制服务端的会话模式切换。一般默认上电后是在默认会话模式下,当某一个服务端正在运行时,只会出现一个会话模式,不会同时存在两个会话模式。
二. 会话模式分类
常用的会话模式有如下几种:
1)默认会话
01 Default Session,仅支持信息的读取和查询操作,权限最小。DCM模块初始化完成后,诊断会话进入缺省会话。
当服务端在默认会话模式下收到默认会话的请求时,服务端应当重新初始化默认会话,即之前被临时激活或者改变的数据都应该恢复到刚上电初始化的状态,写入到非易失存储器(断电数据不会消失的存储器)的数据不会重新初始化。
2)编程会话
02 Programming Session 顾名思义这个是用来烧录程序的。一般来说诊断(UDS)刷写功能需要在编程会话下进行。
3)扩展会话
03 Extended Session,主要是用来读写数据,如写入VIN,序列号,读写诊断码等。
涉及到NVM关键存储数据的写功能需要在扩展会话下进行。
4)其他会话
根据实际需求可以自己定义会话,比如定义0x60(EOL session)专门用于EOL工厂下线处理(关于EOL下线)。
三. 会话的接口
DSL子模块应该保存当前激活的会话状态。
为了访问这个变量,DSL 子模块提供了以下接口来获取/设置会话状态:
1)获取当前会话状态
Std_ReturnType Dcm_GetSesCtrlType(Dcm_SesCtrlType* SesCtrlType)
参数:SesCtrlType:获取的会话状态值存放到SesCtrlType指针指向的内存。
返回值:总是返回E_OK
功能描述:获取会话状态值。
2)设置会话状态
DslInternal_SetSesCtrlType()
3)返回默认会话
函数原型:
Std_ReturnType Dcm_ResetToDefaultSession(void)
返回值:总是返回E_OK
功能描述:将当前会话状态切换到default默认状态。
允许应用程序将当前会话重置为默认会话,并通过调用SchM_Switch__DcmDiagnosticSessionControl(RTE_MODE_DcmDiagnostic SessionControl_DCM_DEFAULT_SESSION) (invokes)调用 ModeDeclarationGroupPrototype DcmDiagnosticSessionControl 的模式切换。
比如超出速度限制时自动终止扩展诊断会话时,就调用这个函数。
4)会话的变更
那什么时候会发生会话更改呢?
- 发送诊断请求DiagnosticSessionControl ($10) 服务的时候
- S3定时器发生超时的时候,S3定时器是配置会话层的时间参数,将在下面介绍其定义。
四. 配置会话层时间参数
从缺省会话进入非缺省会话后,S3Server定时器就会开始计时(只要收到诊断请求报文就会清零),如果定时器超时(S3Server),DSL模块就会将会话状态切换到缺省会话状态。
P2ServerMin, P2ServerMax, P2ServerMin, P2ServerMax, S3Server这些参数值将会影响DCM模块的诊断响应时序。P2ServerMin=0, P2*ServerMin=0, S3Server = 5为固定值。协议参数影响诊断会话层的时序,不会影响到传输层时序
Parameters 参数 | Description 描述 | Min. 最小值 | Max. 最大值 |
---|---|---|---|
P2CAN_Server | 服务器从接收到请求报文到开始发送应答报文之间的间隔时间。 | 0 | 50 ms |
P2*CAN_Server | 服务器从发送应答代码为0x78的否定应答报文到开始发送下一个应答报文之间的间隔时间(增强型应答时序) | 0 | 5000ms |
对于增强型应答时序,连续的应答代码为0x78 的否定应答报文之间的传输最小时间间隔应为1/2 P2* CAN_Server_max,最大误差为±20 %。
五. 会话的配置
1)DcmDsdService
/Dcm/DcmConfigSet/DcmDsd/DcmDsdServiceTable/DcmDsdService
的配置项,增加响应的服务,此处是DiagnosticSessionControl ($10)服务。
DcmDsdServiceTables可以包含多个服务表,常用的UDS和OBD服务表,此处新建的是UDS服务表DcmDsdUdsServiceTable。
1、勾选DcmDsdSidTabSubfuncAvail,它表示此服务是否包含子功能
2、通过DcmDsdSubServices可以增加相应的会话层子功能
2)DcmDspSession
容器DcmDspSession: 父容器保存单行来配置特定的会话。
DiagnosticSessionControl ($10)服务的每一个子功能对应一个会话Level。
3)DcmDspSessionCallback
为了获得更好的 DCM 集成灵活性,还可以通过简单的函数调用通知位于 CDD 中的应用程序。
通过配置
/Dcm/DcmConfigSet/DcmDsp/DcmDspSession/DcmDspSessionCallback
和
/Dcm/DcmConfigSet/DcmDsp/DcmDspSession/DcmDspSessionCallback/DcmDspSessionCallbackFnc,它们将指定当DcmDiagnosticSessionControl 切换时由 DCM 调用的回调函数。
函数原型:
void 「DcmDspSessionCallbackFnc」 (Dcm_SesCtrlType previousSesCtrlId, Dcm_SesCtrlType newSesCtrlId)
previousSesCtrlId
指定以前的诊断会话 ID(转换的源状态)newSesCtrlId
指定新的诊断会话 ID(转换的目标状态)
返回值:void
功能说明:将在诊断会话状态转换时调用