AUTOSAR 通信服务-Dcm概念及DSL详解

发布于 2023-6-9 11:29
浏览
0收藏

前言

AUTOSAR Dcm模块的分享分为Dcm模块概念详解和Dcm模块配置及代码分析,具体的项目实战请关注本号的后续文章,本篇为Dcm模块简介及DSL子模块详解篇。

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区

正文

1. Introduction and functional overview

诊断通信管理(Diagnostic Communication Manager, DCM)模块作为AutoSar诊断模块的重要组成部分,主要负责诊断数据流和管理诊断状态,包括诊断会话、安全状态及诊断服务分配等。

主要功能贯穿汽车的开发生产及售后等过程,如开发过程中EMC、DV等实验均可使用诊断服务实现,生产过程中的软件下载更新、ECU产线EOL、汽车产线EOL等、售后过程中读取DTC、控制输出调试功能等。

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区

DCM模块相关的标准主要包括三部分:ISO 14229(UDS,DCM遵循的主要标准)、ISO 15031(ISO 15031 (1-7))及SAEJ1939(OBD,与OBD相关的$01 -$0A服务)。


从网络分层角度看,DCM模块属于上层模块,主要为应用层提供服务。主要包括5-7层,包括会话层服务及应用层等,会话层包括服务定时及服务分配等,应用层为具体的服务功能实现。

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区

在AUTOSAR架构中,Dcm(Diagnostic Communication Manager)模块位于通信服务层。Dcm模块是独立于具体的网络的(不依赖于具体的CAN,Lin,Eth,Flexray等网络来实现)。PduR模块为Dcm模块提供独立于具体网络的接口。Dcm模块从PduR模块接收诊断信息,Dcm模块在内部处理和检查诊断消息。作为处理所请求的诊断服务的一部分,Dcm将与其他BSW模块或SW-Components(通过RTE)交互,以获取所请求的数据或执行所请求的命令。诊断服务处理与特定的服务请求强绑定(不同的诊断请求依赖于不同的一个或几个模块来实现)。通常,Dcm将汇集收集到的信息,并通过PduR模块发送回消息。

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区

2. Dependencies to other modules

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区

Dcm和Dem的交互:DEM模块提供了检索与故障内存相关的所有信息的功能,以便Dcm模块能够通过从故障内存中读取数据重新响应测试人员的请求,通俗的讲就是Dcm能够读取Dem记录的DTC信息。


Dcm和PduR的交互:PduR模块接收和发送诊断数据。PduR为Dcm模块提供一个与具体通信协议无关的接口。


Dcm和ComM模块的交互:Dcm模块可以指示状态“活动”和“非活动”用于诊断通信。Dcm模块提供了处理通信需求“完全/静默/无通信”的功能。此外,Dcm模块提供了在ComM模块要求时启用和禁用诊断通信的功能。


SWC通过和RTE接口和Dcm交互:Dcm模块在完成诊断功能的时候需要通过RTE接口来读写/函数调用其他SWC的数据/服务。


BswM和Dcm模块的交互:如果Dcm的初始化是从引导加载程序跳转的结果,则Dcm通知BswM应用程序已更新。Dcm也向BswM指示通信模式的改变。

3. Functional specification

3.1 Dcm子模块功能概述

诊断通信管理(DCM)主要包括三个子模块:诊断服务层(Diagnostic Service Layer,DSL)、诊断服务调度(Diagnostic Service Dispatcher, DSD)、诊断服务处理(Diagnostic Service Processing, DSP)


Diagnostic Service Layer:确定诊断数据请求和响应的数据流;监控和确保诊断请求和响应的时序,管理诊断状态(特别是诊断会话和安全状态)


Diagnostic Service Dispatcher:接收到的诊断请求转发给数据处理器;当数据处理器触发时,通过PDUR传输诊断响应。


Diagnostic Service Processing:处理实际的诊断请求。

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区

3.2 诊断会话层(DSL)

DSL模块主要用于诊断请求的处理及诊断时序的控制等,具体存在几个功能如下:

3.2.1 DSL功能概述

1)处理诊断请求:

收到请求时,PDUR会将数据诊断请求数据从下层的Buffer中Copy到诊断的接收Buffer中,DSD会从此Buffer中取出数据进行处理。


维持诊断功能在线(保活逻辑)。


2)处理诊断响应:

收到发送数据时,PDUR会将数据诊断请求数据从DSL的发送Buffer中Copy到PDUR的发送Buffer中,具体后续处理由CAN的协议栈进行处理。


保证诊断时序。


支持周期性传输数据。


支持事件型响应(ResponseOnEvent)。


支持分段响应(segmented response)。


支持由应用触发的挂起响应(ResponsePending)。


3)管理安全等级:

用于获取或者设置安全等级


4)会话状态处理:

管理会话状态(session state)。


非默认会话的激活状态跟踪。


允许修改时序(应用可以通过诊断命令动态修改时序,也就是修改时序参数)。


5)诊断协议处理:

处理不同的诊断协议。


管理资源。


6)通信模式处理:

处理通信请求(Full-/Silent-/No Communication)。


标识诊断功能是否激活(active/inactive)。


打开/关闭(Enabling/disabling)所有类型的诊断传输。

3.2.2 将请求从PduR模块转发到DSD子模块

带有诊断属性的PDU到达PduR模块后,PduR调用Dcm_StartOfReception,通知Dcm模块接收的数据大小,并提供第一帧或单帧的数据,如果数据规模溢出缓冲区大小,或者请求的服务不可用允许Dcm拒绝接收诊断数据。PduR模块之后调用Dcm_CopyRxData函数请求Dcm模块拷贝数据到Dcm buffer。

如果DCM模块接收诊断请求(Dcm_StartOfReception,函数返回成功),PduR模块就会调用Dcm_TpRxIndication通知到Dcm模块诊断请求接收完成。

3.2.3 维持诊断功能在线(保活逻辑)

DSL子模块需要实现诊断会话在线功能,测试者通过物理寻址方式发送0x3E 80诊断请求,DSL接收到0x3E 80的请求后需要维持当前的诊断会话不退出(通过重置超时计数器S3Server)。

3.2.4 将DSD子模块的响应转发到PduR模块

DSD模块准完成诊断响应后会向DSL模块请求发送诊断响应报文。PduR模块接收到请求后调用调用PduR_DcmTransmit()函数发送数据,数据发送后,PduR模块调用Dcm_TxConfirmation()函数通知Dcm模块数据发送结果。

3.2.5 通用连接处理

以CAN网络上的通用诊断连接处理为例。CAN网络上的每个ECU节点内部都会记忆两个诊断请求ID,物理寻址请求ID和功能寻址请求ID。


示例:Tester为连接到CAN网络上发送诊断请求的上位机,可发送任意诊断报文。ECU_A本地配置的物理寻址ID为0x728,功能寻址ID为0x7DF。ECU_B本地配置的物理寻址ID为0x72E,功能寻址ID为0x7DF。


物理寻址:1:1的单播诊断请求

Tester发送物理寻址ID为0x728的诊断请求时只有ECU_A会响应。

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区


Tester发送物理寻址ID为0x72E的诊断请求时只有ECU_B会响应。

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区

功能寻址:1:n的广播诊断请求

Tester发送功能寻址ID为0x7DF的诊断请求时ECU_A和ECU_B都会响应。

AUTOSAR 通信服务-Dcm概念及DSL详解-汽车开发者社区

3.2.6 发送Busy响应来保证诊断时序

上位机发送诊断请求后会要求ECU在一个最大响应时间(一般是50ms)内发出响应报文,但是对于一些请求的处理,ECU内部会耗时比较长(比如0x2E写NVM的请求),来不及在规定时间发出响应。这个时候ECU可以发送0x78(Pending)的否定响应吗来通知上位机ECU内部繁忙(Busy),需要上位机等待(Pending,一版Pending时间可以设置为1秒)。上位机收到0x78(Pending)的否定响应码后就会等待,直到ECU发出积极响应或者Pending时间超时。这个发送Bussy响应来保证诊断时序的功能由DSL模块实现。

3.2.7 支持周期传输

UDS提供的“ReadDataByPeriodicIdentifier (0x2A)”服务,用于向由一个或多个periodicDataIdentifiers标识的ECU请求定期传输数据记录值。实际项目中没有用到过。

3.2.8 支持ROE传输。

通过UDS Service ResponseOnEvent (0x86),测试人员可以请求ECU启动或停止传输由指定事件发起的响应。当注册一个事件进行传输时,测试者也指定相应的服务来响应(例如:UDS service ReadDataByIdentifier 0x22)。实际项目中没有用到过。

3.2.9支持分段响应

如果启用(DcmPagedBufferEnabled=TRUE), Dcm module将提供一种机制来发送比配置的和allocated诊断缓冲区更大的响应。也就是分段响应机制。实际项目中没有用到过。

3.2.10 支持由应用程序触发的响应

在某些情况下,例如在例程执行的情况下,应用程序需要立即请求一个NRC 0x78(响应等待),该请求应立即发送,而不是仅仅在到达响应时间之前(P2ServerMax分别为P2*ServerMax)。


当Dcm模块调用一个操作并得到一个错误状态DCM_E_FORCE_RCRRP时,DSL子模块将触发NRC 0x78(响应等待)的负响应传输。这个响应需要从一个单独的缓冲区发送,以避免覆盖正在进行的请求处理。

3.2.11 管理安全等级

安全等级理解:DCM模块的每个诊断服务可以配置安全访问等级,一般有无需通过安全访问、需要通过安全等级1访问、需要通过安全等级2访问三种等级。比如对于0x2E下的服务都设定为需要过安全访问等级1后,我们在请求0x2E的服务时需要通过特定的安全校验后才能通过安全访问等级1,这样才能得到0x2E服务的积极响应。


DLS子模块应该保存当前激活的安全等级状态。DLS模块提供两个接口用来设置和获取当前安全等级:

获取当前激活的安全等级: Dcm_GetSecurityLevel

设置新的安全等级: DslInternal_SetSecurityLevel()


DCM模块初始化完后,安全等级设置为0x00(DCM_SEC_LEV_LOCKED,使能了安全访问功能)。

如果我们通过安全校验算法后后使得安全等级不为0,当发生以下任意事件后,安全等级状态将回到初始状态0x00(DCM_SEC_LEV_LOCKED):

1)诊断会话(session)从非缺省会话(0x0, default session)切换到非缺省会话,包括从当前非缺省会话切换到本身自己。

2)诊断会话(session)从非缺省会话(0x0, default session)切换到缺省会话。

3.2.12管理会话状态

会话:session,一般有三种,缺省会话(0x00, Default session)、编程会话(0x01, Programming session)、扩展会话(0x02Extended session)。每种会话下可以进行的诊断服务不同,根据实际需求由OEM自己定义。一般来说诊断(UDS)刷写功能需要在编程会话下进行,涉及到NVM关键存储数据的写功能需要在扩展会话下进行。根据实际需求可以自己定义会话,比如定义0x60(EOL session)专门用于EOL工厂下线处理(关于EOL下线,后面将会由文章具体接收,请关注本公众号后续文章)。


DLS子模块应该保存当前激活的会话状态。DLS子模块应该提供两个接口用于获取/设置会话状态:

1)获取当前会话状态:Dcm_GetSesCtrlType()

2)设置会话状态:DslInternal_SetSesCtrlType()


DCM模块初始化完成后,诊断会话进入缺省会话。

3.2.13 跟踪激活的非缺省会话

从缺省会话进入非缺省会话后,S3Server定时器就会开始计时(只要收到诊断请求报文就会清零),如果定时器超时(S3Server),DLS模块就会将会话状态切换到缺省会话状态。

3.2.14 允许修改时序

P2ServerMin, P2ServerMax, P2*ServerMin, P2*ServerMax, S3Server这些参数值将会影响DCM模块的诊断响应时序。


P2ServerMin=0, P2*ServerMin=0, S3Server = 5为固定值。协议参数影响诊断会话层的时序,不会影响到传输层时序。当协议激活时,可以通过以下方法修改其中一些定时参数:

• UDS Service diagnostics sessioncontrol (0x10)

• UDS服务AccessTimingParameter (0x83)


DSL子模块提供了以下功能来修改定时参数:

•提供活动定时参数,

•设置新的定时参数。只允许在发送响应之后激活新的计时值

3.2.15 处理不同的诊断协议

DSL子模块需要处理不同的诊断协议。实际应用中一般都是使用DCM_UDS_ON_CAN协议。

3.2.16 管理资源

由于资源有限,DSL应该考虑以下几点作为设计提示:

1)在Dcm模块中只允许使用和分配一个诊断缓冲区,这个缓冲区随后用于处理诊断请求和响应

2)NRC 0x78 (Response pending)响应的输出是通过一个单独的缓冲区完成的

3)支持分页缓冲处理

3.2.17 通信模式处理

DCM模块和ComM模块的交互由DSL子模块完成。ComM模块把每个通信通道(channel)的当前通信状态(No-com, Full-com, Silent-com)通知给Dcm模块。Dcm模块的诊断功能将会调用ComM模块的接口功能可能会阻止Ecu进入shutdown模式(ActiveDiagnostic ==’DCM_COMM_ACTIVE’时ECU必须保持唤醒状态,也就是不允许 进入shutdown/sleep)。


应用程序可以调用Xxx_SetActiveDiagnostic()接口通知Dcm模块ActiveDiagnostic的当前状态。


No Communication:

ComM模块调用 Dcm_ComM_NoComModeEntered接口通知Dcm模块通信关闭。Dcm模块收到通知后就会Disable所有的诊断接收/传输。


Silent Communication:

ComM模块调用 Dcm_ComM_SilentComModeEntered接口通知Dcm模块通信静默。Dcm模块收到通知后就会Disable所有的诊断传输。


Full Communication:

ComM模块调用  Dcm_ComM_FullComModeEntered接口通知Dcm模块通信静默。Dcm模块收到通知后就会Enable所有的诊断接收/传输。


Diagnostic Activation State:

Dcm将所有网络的内部诊断状态通知ComM模块。网络上的诊断状态有两种选择。在“活动”诊断状态下,Dcm正在处理来自该网络的一个或多个诊断请求,或者Dcm处于非默认会话中。在“非活动”诊断状态下,Dcm处于默认会话,并且没有在该网络上处理诊断请求。


当一个网络没有正在进行的通信时,Dcm会将诊断ac激活状态设置为' inactive '。当网络上有诊断通信时,Dcm将诊断状态设置为“活动”。在任何非默认会话中,诊断状态保持为“活动”状态。通信状态也可以通过API Xxx_SetActiveDiagnostic来控制。


推荐阅读

​Autosar架构下的模块详细设计及代码实现--基于配置的编程方法​

​AUTOSAR 通信服务-CanSM概念详解​

​AUTOSAR BswM(3)代码分析​

​AUTOSAR 通信服务-ComM配置及代码分析​

​AUTOSAR 通信服务-PDU Router​

​AUTOSAR CAN通信协议栈分析(2)-CanIf​

​Can通信协议栈分析(1)-Can Driver​

​Lin通信协议栈分析(2)-LIN Driver​

​C语言编程技巧(1)-表驱动法​

​CANoe工具使用(1)-实现CAN通道的收、发、录、回放报文​

​S32K平台学习(1)-S32K144启动流程分析​


文章转载自公众号:汽车电子嵌入式

分类
收藏
回复
举报
回复
相关推荐