DCM之诊断会话层(DSL)详解一

简介

[SWS_Dcm_00030] DSL子模块的所有功能区域应符合规范ISO14229-1 [15]和ISO15765-3 [18]的与网络无关的部分。(BSW04003) DSL子模块。 在配置中,可以根据网络设置一些参数。

用例
DSL子模块提供以下功能:

  •   会话处理(根据ISO14229-1 [15]和ISO 15765-3 [18]的要求)
  •   应用层定时处理(根据ISO14229-1 [15]和ISO 15765-3 [18]的要求)
  •   特定的响应行为(按照ISO14229-1 [15]和ISO 15765-3 [18]的要求)

与其他模块的交互
DSL与其他模块具有以下交互:

  • PduR模块:PduR模块提供传入诊断请求的数据。DSL子模块触发诊断响应的输出。
  • DSD子模块:DSL子模块将传入请求通知DSD子模块并提供数据。DSD子模块触发诊断响应的输出。
  • SW-C / DSP子模块。 DSL子模块提供对安全性和会话状态的访问。
  • ComM模块:DSL子模块保证了ComM模块所需的通信行为

功能说明
总览
DSL子模块提供以下功能:
请求处理

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

  -并发“ TesterPresent”(“保持活动逻辑”)。
响应处理
  -将响应从DSD子模块转发到PduR模块。
  -确保对测试人员的响应时间。
  -支持定期传输。
  -支持ResponseOnEvent(ROE)传输。
  -支持分段响应。
  -支持由应用程序触发的ResponsePending响应。
安全等级处理
  -管理安全级别。
会话状态处理
  -管理会话状态。
  -跟踪活动的非默认会话。
  -允许修改时间。
诊断协议处理
  -处理不同的诊断协议。
  -管理资源。
通讯模式处理
  -处理通讯要求(全/无声/无通讯)。
  -指示活动/非活动诊断。
  -启用/禁用各种诊断传输。

将请求从PduR模块转发到DSD子模块
每当在分配给DCM模块的DcmRxPduId上开始接收新的诊断请求内容时,PduR模块就会指示DCM模块。这是通过调用Dcm_StartOfReception()来完成的,Dcm_StartOfReception()通知DCM模块要接收的数据大小,并提供第一帧或单帧的数据,如果数据大小超出其缓冲区大小,则允许DCM拒绝接收,或者如果请求的服务不可用。对Dcm_CopyRxData的进一步调用要求DCM模块将数据从提供的缓冲区复制到DCM缓冲区。如果诊断请求的接收完成(当Dcm_StartOfReception接收时)
如果成功,则PduR模块将调用Dcm_TpRxIndication()向DCM模块给出接收指示.DCM应能够使用通用连接,其中地址信息由Dcm_StartOfReception()通过DcmRxPdu的MetaData提供给DCM。必须存储此寻址信息,并将其用于响应以及检测来自同一测试人员的请求。有关更多详细信息,请参见“通用连接处理”章节。

[SWS_Dcm_00111]仅在使用参数Result = E_OK调用Dcm_TpRxIndication()之后,DSL子模块才将接收到的数据转发到DSD子模块(请参阅SWS_Dcm_00093)。

[SWS_Dcm_00241]一旦收到请求消息(在调用带有参数Result = E_OK的Dcm_TpRxIndication()之后(请参见SWS_Dcm_00093),直到为关联的Tx-DcmPduId调用了Dcm_TpTxConfirmation()(请参见SWS_Dcm_00351),DSL就会被发送。 子模块应阻止相应的DcmPduId。 在处理此请求期间,无法接收到同一DcmDslConnection的其他请求(例如,增强的会话可以由OBD会话终止),直到发送了相应的响应消息并再次释放DcmPduId(并发TesterPresent请求除外)为止 )。

可以在PduR模块的接口描述中找到有关API的更多描述(原型,输入/输出参数)。对于不同的诊断通信应用程序,可以使用不同的DcmPduId。 例如:

  • OBD DcmRxPduId:用于接收OBD请求,
  • OBD DcmTxPduId:用于传输OBD响应,
  • UDS phys DcmRxPduId:用于接收UDS物理寻址的请求。
  • UDS函数DcmRxPduId:用于接收功能已寻址的UDS请求。
  • UDS DcmTxPduId:用于传输UDS响应。

每个DcmRxPduId配置了地址类型(物理/功能寻址)(请参阅配置参数DcmDslProtocolRx)。 可以对每个DcmRxPduId进行配置,因为对于功能和物理接收而言,始终存在不同的DcmRxPduId值,而与传输层的寻址格式(扩展寻址,常规寻址)无关。

并发“ TesterPresent”(“保持活动逻辑”)

 测试人员可能会与物理请求/响应并行发送功能“ TesterPresent”命令。 在ISO14229-1 [15]中,这称为“保持活动逻辑”。 此功能“ TesterPresent”将在单独的DcmRxPduId(UDS func DcmRxPduId)上接收,该DcmRxPduId与物理请求属于同一DcmDslConnection。 在这种情况下,将使用未明确配置的Dcm内部接收缓冲区。 因此,功能性TesterPresent(并且只有功能性TesterPresent没有响应)的处理方式如下:

[SWS_Dcm_00112]当PduR模块使用参数Result = E_OK调用Dcm_TpRxIndication()时(请参见SWS_Dcm_00093),并且如果请求是“ TesterPresent”命令,且“ suppressPosRspMsgIndicationBit”设置为TRUE(SID等于0x3E,子功能等于0x3E) DSL子模块应重置会话超时计时器(S3Server)。
[SWS_Dcm_00113]当PduR模块使用参数Result = E_OK调用Dcm_TpRxIndication()时(请参阅SWS_Dcm_00093),并且如果请求是“ TesterPresent”命令且“ suppressPosRspMsgIndicationBit”设置为TRUE(SID等于0x3E,则子函数等于) DSL子模块不得将此请求转发给DSD子模块以作进一步解释。

 SWS_Dcm_00113的原理:由于绕过了DSL子模块中的功能“ TesterPresent”,因此DCM模块能够无延迟地接收和处理下一个物理请求。

将响应从DSD子模块转发到PduR模块

[SWS_Dcm_00114] DSD子模块应请求DSL子模块传输响应。
[SWS_Dcm_00115]当DcmDslMainConnection的诊断响应准备就绪时,DSL子模块应通过使用相应的调用PduR_DcmTransmit()来触发诊断响应向PduR模块的传输。
DcmDslProtocolTxPduRef参数作为PduId。
[SWS_Dcm_01072]⌈如果是PeriodicTransmission,则Dcm应在对PduR_DcmTransmit()的调用中提供完整的有效载荷数据,并且期望不对Dcm_CopyTxData进行任何调用。
[SWS_Dcm_01073]在进行周期性传输的情况下,将使用Dcm_TxConfirmation()调用Dcm进行周期性传输以指示传输结果使用DcmTxPduId发送响应,该消息在DCM模块配置中链接到DcmRxPduId,即接收请求的ID(请参阅配置参数DcmDslProtocolTx)在PduR_DcmTransmit()内,仅将长度信息以及(对于通用连接而言)寻址信息提供给PduR模块。在DCM模块成功调用PduR_DcmTransmit()之后,PduR模块将调用Dcm_CopyTxData()来请求DCM模块提供要发送的数据,并且在成功发送完完整的PDU或发生错误之后将调用Dcm_TpTxConfirmation()。有关通用连接内地址信息处理的更多详细信息,请参见第7.2.4.5节“通用连接处理”。
[SWS_Dcm_00117]如果在成功发送了完整的DCM PDU后DSL子模块收到确认,或者通过调用Dcm_TpTxConfirmation()发生错误,则DSL子模块应将此确认转发给DSD子模块。

[SWS_Dcm_00118]传输失败时(失败PduR_DcmTransmit()请求)或错误确认(Dcm_TpTxConfirmation()带有错误),DSD子模块不得重复诊断响应发送。
注意:仅当PduR_DcmTransmit成功时才期望Dcm_TpTxConfirmation。有关API的更多描述(原型,输入/输出参数),请参见PduR模块的接口描述。

 通用连接处理

DCM将能够处理由DcmPdus标识且MetaDataLength> = 1的通用连接。这些连接在运行时携带实际的测试仪地址。 根据ISO15765-2 [17],使用常规的固定或混合29位寻址格式的CAN诊断支持通用连接。 根据CAN ID的实际布局,通用连接也可以用于扩展或常规和混合的11位寻址格式。 DCM无法识别CanTp使用的实际寻址格式。
通用连接不需要配置参数DcmDslProtocolRxTesterSourceAddr。多个连接可能引用相同的DcmPdus

[SWS_Dcm_00845]配置工具应通过检查DcmDslConnection(DcmDslProtocolRxPduRef,DcmDslProtocolTxPduRef,DcmDslPeriodicTxPduRef,DcmDslPeriodicTxPduRef,DcmDslRoeTxPduRef)的所有引用PDU的MetaDataLength来验证通用连接是否一致。 仅当DcmDslProtocolRxPduRef也为通用时,TxPdu引用才可能为通用。
[SWS_Dcm_00848]必须存储通过通用连接接收到的诊断请求的源地址。 它在通过Dcm_StartOfReception()提供的元数据的第一个字节中提供。
[SWS_Dcm_00849]存储的源地址应用作通过通用连接发送的响应的目标地址。 它应在提供给PduR_DcmTransmit()的元数据的第二个字节中提供。

通过发送繁忙的响应来保证测试人员的时间安排

[SWS_Dcm_00024]如果应用程序(或DSP子模块)能够执行请求的诊断任务,但需要额外的时间来完成任务并准备响应,则DSL子模块应发送NRC 0x78(响应未决)的否定响应。达到响应时间时(DcmDspSessionP2ServerMax -DcmTimStrP2ServerAdjust分别 SWS_Dcm_00024的DcmDspSessionP2StarServerMax -DcmTimStrP2StarServerAdjust)⌋(BSW04016)比率:DSL子模块保证了对测试器的响应时序。
[SWS_Dcm_00119] DSL子模块应从单独的缓冲区发送SWS_Dcm_00024中要求的否定响应。SWS_Dcm_00119的原理:这是必要的,以避免覆盖正在进行的请求处理,例如应用程序已经在诊断缓冲区中准备了响应内容。一个诊断请求的NRC 0x78(响应未决)的否定响应数受配置参数DcmDslDiagRespMaxNumRespPend限制。这样可以避免应用程序中的死锁。
[SWS_Dcm_00120]如果对请求的诊断任务的否定响应数(请参见SWS_Dcm_00024)达到配置参数DcmDslDiagRespMaxNumRespPend中定义的值,则DCM模块应停止处理活动的诊断请求,并通知应用程序或BSW(如果此诊断任务暗示)通过将活动端口接口的OpStatus参数设置为DCM_CANCEL来调用SW-C接口或BSW接口),并应发送NRC 0x10的否定响应(常规拒绝)

 支持定期传输

UDS服务ReadDataByPeriodicIdentifier(0x2A)允许测试人员从由一个或多个periodicDataIdentifiers标识的ECU请求定期发送数据记录值。
[SWS_Dcm_00122]DCM模块应使用单独的协议和单独的可配置大小的缓冲区来发送周期性传输的响应。DcmDslPeriodicTransmissionConRef配置参数允许将用于接收周期性传输请求的协议链接/将周期性传输响应传输到用于传输周期性传输消息的协议。 请注意,可以将多个DcmTxPduIds分配给定期传输协议.DCM模块根据通信模式遵守一些限制:

[SWS_Dcm_00123]周期性传输通信仅应在完全通信模式下进行。如果不处于完全通信模式,则可能发生周期性传输事件。 因此,存在以下两要求:
[SWS_Dcm_00125] DCM模块应丢弃完全通信模式旁边的定期传输事件,并且不得将其排队等待传输。
[SWS_Dcm_00126]定期传输事件不应激活完全通信模式。

支持ROE传输

使用UDS服务ResponseOnEvent(0x86),测试人员可以请求ECU开始或停止传输由指定事件启动的响应。 在注册要传输的事件后,测试人员还会指定要响应的相应服务(例如:UDS服务ReadDataByIdentifier(0x22))。
[SWS_Dcm_00595]仅当容器DcmDslResponseOnEvent存在时才启用ROE功能。

事件状态图上的响应ResponseOnEvent StateChart

[SWS_Dcm_00871] Dcm应支持多个RoeEvent。 每个RoeEvent都可以具有“ ROE已清除”,“ ROE已停止”和“ ROE已开始”状态。 在以下部分中描述了从状态到状态的转换。 下图的标签表示各部分的编号。

 

 

初始化Dcm(1)
[SWS_Dcm_00872] Dcm在Dcm_Init()期间将每个事件的状态更改为“ ROE已清除”状态。

从“ ROE已清除”过渡到“ ROE已停止”(2)
[SWS_Dcm_00873]通过接收有效的ROE设置请求,请求中寻址的RoeEvent变为“ ROE停止”状态(请参见表2)。
[SWS_Dcm_00874]如果RoeEvent是在StorageState设置为“ storeEvent”的情况下设置的,而没有在StorageState设置为“ storeEvent”的StartResponseOnEvent的情况下发生,并且在重启后已激活的EventWindowTime或clearResponseOnEvent已收到,则Dcm将更改为“ ROE停止” 非易失性信息可用时立即声明。

注意:如果事件在StorageState设置为“ StoreEvent”的情况下初始化一次,它将一直保持初始化状态,直到被ClearResponseOnEvent请求清除为止(另请参见SWS_Dcm_00897)。
[SWS_Dcm_00951]如果是RoeEvent的配置参数DcmDspRoeInitialEventStatus设置为DCM_ROE_STOPPED,Dcm将在初始化时立即切换到“ ROE已停止”状态。
注意:DcmDspRoeInitialEventStatus集通过配置定义RoeEvent的初始化。

从“ ROE停止”过渡到“ ROE已清除”(3)
[SWS_Dcm_00875]通过使用子功能clearResponseOnEvent(0x06)接收到有效的ROE请求,RoeEvents会变为“ ROE已清除”状态。

从“ ROE停止”过渡到“ ROE开始”(4)
[SWS_Dcm_00876]通过使用子功能startResponseOnEvent(0x05)接收到有效的ROE请求,所有已停止的RoeEvent都将变为“ ROE启动”状态。
[SWS_Dcm_00902]离开默认会话时一直处于“ ROE启动”状态的所有RoeEvent应在(重新)输入默认会话时变回“ ROE启动”状态。
[SWS_Dcm_00965]如果收到一个有效的StartResponseOnEvent请求,且astorageState设置为StoreEvent,并且EventWindowTime在上一个电源周期中支持StorageState,则一旦非易失性数据出现,RoeEvent应从“ ROE停止”状态更改为“ ROE启动”状态可用(根据SWS_Dcm_00951,此ROEEvent设置为“ ROE已停止”)。

从“ ROE开始”到“ ROE停止”的过渡(5)
[SWS_Dcm_00877]通过接收带有子功能stopResponseOnEvent(0x00)的有效ROE请求,已停止的RoeEvent会更改为“ ROE已停止”状态。
[SWS_Dcm_00878]当eventWindowTime超时时,已停止的RoeEvent会更改为“ ROE停止”状态。

[SWS_Dcm_00879]通过退出当前会话,所有已启动的RoeEvent应更改为“ ROE已停止”状态。
注意:当当前会话离开时,RoeEvents会停止,如果该会话从非默认会话更改为相同或不同的非默认会话,则RoeEvent将独立运行。通过保留默认会话,当前活动的RoeEvent将停止并存储(以便在会话变回默认会话后立即重新启动(请参见SWS_Dcm_00902)[SWS_Dcm_00952]⌈如果通过子功能接收到ROE请求OnDTCStatusChange和RoeEvent为“ ROE已启动”,OnDTCStatusChange的RoeEvent变为“ ROE已停止”状态,并且ServiceToRespondTo应由新请求设置的DTCStatusMask触发。

“ ROE启动”到“ ROE启动”的过渡(6)
[SWS_Dcm_00880]通过使用子功能StartResponseOnEvent(0x05)接收到有效的ROE请求,Dcm会做出肯定回答,并保持“ ROE启动”状态。 )。

从“ ROE开始”到“ ROE已清除”的过渡(7)

[SWS_Dcm_00884]通过接收带有子功能clearResponseOnEvent(0x06)的有效ROE请求,所有已启动的RoeEvent都将变为“ ROE已清除”状态。

从“ ROE清除”到“ ROE清除”的转换(8)

[SWS_Dcm_00885]如果所有RoeEvents都处于“ ROE清除”状态并且收到了有效的stopResponseOnEvent(0x00)请求,则Dcm将拒绝请求,并带有NRC 0x24的否定响应(requestSequenceError)。
[SWS_Dcm_00886]如果所有RoeEvent均处于“ ROE已清除”状态,并且收到了有效的StartResponseOnEvent(0x05)请求,则Dcm应使用NRC 0x24的否定响应(requestSequenceError)拒绝该请求。
[SWS_Dcm_00887]如果所有RoeEvent都处于“ ROE已清除”状态,并且Dcm肯定收到了有效的clearResponseOnEvent(0x06)请求,则RoeEvent保持“ ROEcleared”状态。)。
[SWS_Dcm_00888]如果无法正确读取非易失性数据,则所有处于“ ROE已清除”状态的RoeEvent都将保持“ ROE已清除”状态。

从“ ROE已清除”到“ ROE已开始”的过渡(9)

[SWS_Dcm_00889]如果EventWindowTime在电源周期内处于活动状态且未超时,则Dcm必须重新激活在默认会话期间在默认会话中处于活动状态的所有RoeEvent。非易失性信息可用时,请重新启动电源。
[SWS_Dcm_00890]如果在存储状态设置为StoreEvent的情况下收到有效的StartResponseOnEvent请求,并且EventWindowTime在先前的电源循环中支持StorageState,则一旦非易失性数据可用,RoeEvent应更改为“ ROE启动”状态。

从“ ROE停止”过渡到“ ROE停止”(10)

[SWS_Dcm_00891]如果RoeEvent处于“ ROE停止”状态且有效Dcm应收到stopResponseOnEvent(0x00)请求,Dcm应对此请求做出积极响应,并保持“ ROE停止”状态。
[SWS_Dcm_00953]如果通过子功能接收到ROE请求OnDTCStatusChange,并且RoeEvent已经“ ROE已停止”。OnDTCStatusChange的RoeEvent将保持“ ROE已停止”状态,但事件逻辑将使用新接收到的DTCStatusMask更新。

ROE子功能
[SWS_Dcm_00892] Dcm应支持下表中标记为支持的所有ROE子功能。

[SWS_Dcm_00893]对于每个设置子功能,Dcm仅应支持一个固定的ServiceToRespondTo。 表2中列出了受支持的ServiceToRespondTo


EventWindowTime和StorageState
在每个ROE请求中,EventWindowTime和StorageState是必需参数。 它们在建立请求和相关控制请求之间可能会矛盾。
[SWS_Dcm_00903] Dcm将根据设置请求评估EventWindowTime。
[SWS_Dcm_00894] Dcm通常应支持表3中定义的EventWindowTimes。

 

 

[SWS_Dcm_00895]配置参数DcmDspRoeEventWindowTime应包含此特定Ecu支持的所有EventWindowTime的列表。
[SWS_Dcm_00896]如果Roe请求包含的事件窗口时间与DcmDspRoeEventWindowTime中配置的事件时间不同,则Dcm将以NRC 0x31(RequestOutOfRange)否定的响应拒绝该请求。
[SWS_Dcm_01076]如果Roe请求具有等于storeEvent的storageState且包含非无限的EventWindowTime,则Dcm应使用NRC 0x31(RequestOutOfRange)()来否定该请求。
[SWS_Dcm_00897]如果将RoeEvent设置为StorageState设置为“ storeEvent”,则初始化将被非易失性存储,以在随后的每个驾驶循环中恢复,直到将其清除为止(请参见SWS_Dcm_00874)。

[SWS_Dcm_00898] Ro如果RoeEvent满足以下所有条件,则RoeEvent应在每个后续电源周期开始时更改为“ ROE启动”状态,直到收到将storageStorageState设置为StoreEvent的stopResponseOnEvent请求为止:

  • RoeEvent在默认会话中启动
  • StartResponseOnEventRequest的storageState设置为“ StoreEvent”
  • 设置请求具有EventWindowTime inifinity,并且storageState设置为“ StoreEvent”。 ⌋()

[SWS_Dcm_00905] if如果满足以下所有条件,则EventWindowTime将在当前电源周期结束时结束:

  • 在安装请求期间,EventWindowTime设置为无穷(0x02)
  • RoeEvent在默认会话中启动
  • 在StartResponseOnEvent请求中未设置storageState⌋()

[SWS_Dcm_00900]⌈如果ResponseEvent在默认会话中以EventWindowTime CurrentAndFollowingCycle开始,则EventWindowTime应在下一个电源周期结束时或以clearResponseOnEvent / stopResponseOnEvent请求结束。
[SWS_Dcm_00901]⌈如果在默认会话中使用EventWindowTime currentCycle启动ResponseOnEvent,则EventWindowTime将在此电源周期结束时或以clearResponseOnEvent / stopResponseOnEvent结束。 ⌋()
[SWS_Dcm_00906]⌈如果在非默认会话中启动ResponseOnEvent,则
如果满足以下条件之一,则EventWindowTime结束:

  1. 关机后再开机
  2. 接收clearResponseOnEvent请求
  3. 接收stopResponseOnEvent请求
  4. 任何会话更改。

[SWS_Dcm_00907]如果EventWindowTime超时且电源循环未结束,则Dcm应发送对设置请求的最终肯定响应。


对于EventWindowTime无限(0x02),ThisCycle(0x03),ThisAndNextCycle(0x04),Dcm将不会发送最终响应,因为这些EventWindow时间将在电源循环结束时结束。 如果会话更改或使用“ stopResponseOnEvent”子功能停止服务,也将没有最终响应。

posted @ 2020-01-03 14:28  Smah  阅读(5724)  评论(0编辑  收藏  举报