OBD

目标

本集成手册用于指导客户进行OBD诊断栈集成,文档主要包括的内容为:OBD诊断栈集成指导、基于特定应用的集成示例讲解。

由于各项目的需求不同,集成示例不会针对于特定的项目做详细讲解。

缩写词和术语

缩写词/术语

描述

MCAL

Microcontroller Abstraction Layer微控制器抽象层

CanIf

CAN Interface module CAN接口

ComM

Communication Manager module 通信管理

PduR

PDU Router module PDU路由

Dcm

Diagnostic Communication Manager 诊断通信管理

Dem

Diagnostic Event Manager 诊断事件管理

CanTp

CAN Transport Layer CAN传输层

Rte

Runtime Environment 运行时环境

iRte

i-Soft Runtime Environment 普华基础模块运行时环境

参考文档

[1]参考手册_CanIf.pdf

[2]参考手册_PduR.pdf

[3]参考手册_CanSM.pdf

[4]参考手册_DCM.pdf

[5]参考手册_Dem.pdf

[6]参考手册_CanTp.pdf

[7]参考手册_EcuC.pdf

[8] 集成手册_UDSonCAN.pdf

[9] 集成手册_CAN.pdf

协议栈集成

项目交付的内容为:协议栈源码和ORIENTAIS Studio配置工具。协议栈细分为协议栈的各模块及其对应的配置工具模块。

OBD诊断栈各配置模块的功能介绍,参见表 诊断栈各配置模块介绍。

使用协议栈源码和配置工具,进行协议栈的集成的步骤,参见表 协议栈集成的步骤。

表 诊断栈各配置模块介绍

模块名

功能

Can

CAN驱动配置。(由MCAL具导入)

CanIf

CanIf 模块主要处理上层模块与底层驱动的之间PDU 的传递,为上

层模块提供统一的接口来管理不同的CAN 硬件模块

EcuC

用于辅助配置工具完成配置的模块。主要提供Pdu的定义,其它模块通过关联EcuC中Pdu,相互关联起来。

PduR

PDU Router主要为相关模块提供基于I-PDU的路由服务。在诊断栈中,主要是提供CANTP与DCM之间的路由服务

CanTp

CANTP 模块实现依据ISO15765-2 标准规范中定义的CAN 总线数据在传输层的数据接收发送功能

DCM

依据ISO15765-3和ISO15031-5标准描述,实现诊断请求报文的解析,响应(正响应和负响应)与执行。主要功能有:实现UDS、OBD诊断服务。

DEM

实现诊断故障的存储与管理功能,提供API 接口供其他模块读取

DTC 和对应的冻结帧数据和扩展数据

表 协议栈集成的步骤

步骤

操作

说明

1

ORIENTAIS Stuido配置工具工程搭建和协议栈模块加载

若配置工具已经搭建,则仅需进行协议栈模块的加载操作。

2

模块配置及配置文件生成

NA

3

代码集成

现有工程、协议栈源代码和配置生成文件的集成。

4

验证测试

NA

Note

协议栈集成之前,用户须确保已经有基础工程,且本协议栈相关的其他协议栈能正常工作。

新建ORIENTAIS Stuido配置工程及模块加载

安装ORIENTAIS Studio软件后,双击软件图标打开软件。

image1

图 新建工程

菜单栏File🡪New🡪Project,新建工程。

image2

图 新建工程

在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next。

image3

图 新建工程

在弹出的窗口中输入工程名,选择Finish。

image4

图 新建工程

选择[Bsw_Builder],右键单击,选择New ECU Configuration。

image5

图 新建工程

在弹出的窗口中输入ECU名,然后选择Next。

image6

图 选择芯片平台

在弹出的窗口中勾选需添加的模块,点击Finish。

image7

图 选择模块

新建工程如下所示,步骤0中添加的模块已经被加入到工程中。

image8

图 工程结构示例

模块配置及生产代码

模块配置

模块的具体配置,取决于具体的项目需求。OBD诊断栈各模块配置项的详细介绍,参见表 协议栈各模块配置参考文档。

表 协议栈各模块配置参考文档

模块

参考文档及其章节

Can

MCAL对应的Can配置手册

CanIf

参考手册_CanTp.pdf

PduR

参考手册_PduR.pdf

NvM

参考手册_NvM.pdf

CanTp

参考手册_CanTp.pdf

Dcm

参考手册_Dcm.pdf

Dem

参考手册_Dem.pdf

配置代码生成

在ORIENTAIS Stuido主界面左方,选择对应的协议栈,单击右键弹出Validate All和Generate All菜单。

image9

图 生成配置

选择Validate All对本协议栈各配置选项进行校验,没有错误提示信息即校验通过。若有错误信息,请按照错误提示修改。

选择Generate All,生成配置文件。右下角的Console窗口输出生成的配置文件信息。

image10

图 生成配置结果

将ORIENTAIS Studio切换到Resource模式,即可查看生成的配置文件。

image11

图 生成配置工程结构

功能集成

代码集成

诊断栈代码包括两部分:项目提供的诊断栈源码和ORIENTAIS Studio配置生成代码。诊断栈集成包括诊断栈源码(CANIF,CANSM,PDUR,CANTP,COMM,DCM,DEM等)、定时器源码和部分其他模块源码。

用户须将诊断栈源码和章节(配置代码生成)生成的源代码添加到集成开发工具的对应文件夹。

Note

诊断栈集成之前,用户须确保已经有通信基础工程,且本诊断栈相关的其他功能栈能正常工作。

集成注意事项

对于集成过程中,协议栈特殊要求和用户经常出现的问题,归类总结形成表 协议栈协议栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。

表 协议栈协议栈集成约束清单

编号

类别

约束限制

1

堆栈

用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。

2

头文件

添加协议栈代码之后,用户需更新集成开发工具中的头文件路径。

调用协议栈API的源文件,需要包含协议栈的头文件。

3

初始化

OBD诊断栈的初始化顺序为:Dem_PreInit,CanTp_Init, Dcm_Init,Dem_Init。

4

周期函数

CanTp_MainFunction,Dcm_MainFunction和Dem_MainFunction需要被周期性任务函数调用。

集成示例

本章节通过OBD诊断栈为例,向用户展示OBD诊断栈的集成过程。用户可以据此熟悉OBD诊断栈配置工具的配置过程,以及如何应用配置工具生成的配置文件。示例是基于具有正常工作的CAN通信工程之上。

本章节先完成基本OBD配置,使得工程可以编译通过,并实现基础OBD诊断通讯,然后根据具体需求服务进行添加或修改。

Note

本示例不代表用户的实际配置情况,用户需要根据自己的实际需求,决定各个参数的配置。

集成目标

通过搭建基础工程,实现OBD诊断基本请求应答功能。使用标准帧CAN0x7df作为请求,标准帧0x709作为响应,同时实现OBD服务01,02,03,07,09的功能。示例网络层时间参数如表

网络层定时参数(仅 OBD 排放相关诊断要求)

表 网络层定时参数(仅 OBD 排放相关诊断要求)

定时参数

描述

超时时间(ms)

性能要求时间(ms)

N_As

发送方 CAN 报文确认超时

25

N_Ar

接收方 CAN 报文确认超时

25

N_Bs

流控帧传输超时

75

N_Br

流控帧接收端发送等待时间

<10

N_Cs

连续帧发送时间间隔

ST*min

N_Cr

连续帧传输超时

150 ms

模块的配置

新建配置工程及模块加载操作,请参考本文档章节(模块配置及生产代码)。生成代码过程请参考章节(模块配置及生产代码)。

Can模块与CanIf模块配置

在CAN模块与CANIF模块中实现用于OBD通信的CAN报文,具体配置方法请参考文档《集成手册_CAN》。

表 OBD协议CAN需求

报文ID

发送/接收

报文长度

0x7df

接收

8字节

0x708

接收

8字节

0x709

发送

8字节

EcuC模块配置

请参考《集成手册_UDSonCAN.pdf》中的EcuC模块配置。

CanTp模块配置

请参考《集成手册_UDSonCAN.pdf》中的CanTp模块配置。

PduR模块配置

请参考《集成手册_UDSonCAN.pdf》中的PduR模块配置。

DCM模块配置

  1. 双击DCM模块,打开DCM模块配置界面。

    image12

    图 DCMGeneral

  2. DCMGeneral标签页中的参数保持默认即可。

DSD配置
  1. 新建DcmDsdSidTab,配置DcmDsdSidTabId需与其他服务列表(如UDS)不一同的值。

    image13

    图 DcmDsdSidTab

勾选DcmDsdServiceUsed使能服务;

配置需要的OBD服务DcmDsdSidTabServiceId。

image14

图 DsdService

DSL配置
  1. DcmDslBuffer中配置两个buffer分别用于发送和接收,配置Dcm Tx、RxBuffer及其length,需要与EcuC中Dcm对应的Pdu Length的值保持一致。

    image15

    图 DcmDslBuffer

  2. 配置OBD的DSLProtocol,实现CANTp与DCM之间的PDU关联。需要修改项如下,若项目无特殊需求,未提到的配置保持默认值即可。

    DcmDslProtocolID选择DCM_OBD_ON_CAN;

    DcmDslProtocolSIDTable选择DcmDsdServiceTable中的OBD服务表;

    DcmDslProtocolRxBufferRef和DcmDslProtocolTxBufferRef关联接收和发送的buffer配置。

    image16

    图 DSLProtocol

  3. 在上步的DcmDslProtocolRow_OBD中新建配置DcmDslMainConnection,选择Dcm通信的ComMChannel,并新建1个DcmDslProtocolRx,1个DcmDslProtocolTx。

    image17

    图 DcmDslMainConnection

  4. 为每个DcmDslProtocolRx、DcmDslProtocolTx添加Dcm对应的PDU及寻址类型。

    image18

    图 DcmDslProtocolRx

    image19

    图 DcmDslProtocolTx

  5. 右键新建DcmDslCallbackDCMRequestService。

    image20

    图 DcmDslCallbackDCMRequestService

DSP配置

本小节配置目的是完成基本OBD诊断通讯和编译通过,具体服务的功能请见本章节后续小节具体服务的描述。此小节目的是建立最小系统配置,未提到的配置保持默认即可,服务的配置将在本章节具体服务小节中介绍。

image21

图 DSP

添加一个DcmDspPid。选择服务后暂不修改其它内容,内容修改将在章节(Service 0x01)进行。

image22

图 DcmDspPid

image23

图 DcmDspPidService

DEM模块配置

DEMGeneral配置
  1. 如图所示添加配置集。添加Dataelement,GeneralOBD,Indicator。

    image24

    图 DEMGeneral

  2. 在DemGeneral->DemOBDSupport配置为DEM_OBD_MASTER。同时DemGeneral->DemEventMemorySet->DemMILIndicatorRef关联一个DemIndicator。

    DemGeneral->DemEventMemorySet->DemTypeOfDTCSupported选择DEM_DTC_TRANSLATION_ISO15031_6。

    DemGeneral->DemClearDTCLimitation选择DEM_ALL_SUPPORTED_DTCS。

    若无明确需求,其它配置可保持默认即可。

    image25

    image26

    image27

    图 DemGeneral

    新建CSDataElement在DemGeneralOBD中关联。

    image28

    图 DemGeneralOBD

DEMConfig配置

配置DemDTCAttributes,关联DemMemoryDestinationRef到DemPrimaryMemory。关联DemFreezeFrameRecNumClassRef。其它配置先保持默认配置。

  1. 新建DTCAttribute用于OBD的DTC。

    image29

    图6 DTCAttribute

  2. 添加一个DemDTC,设置DemDtcValue,关联DemDTCAttributesRef,并关联DemOBDDTCRef。

    image30

    图 DemDTC

  3. 配置DemEventParameter:

    1. 勾选DemEventAvailable;

    2. 关联DemOperationCycleRef

    3. DemEventKind选择SWC

    4. DemDTCRef关联步骤②配置的DTC

    5. 修改DemEventKind为DEM_EVENT_KIND_SWC

      image31

      图 DemEventParameter

Service 0x01

  1. 在DcmDsp中添加DcmDspPid,根据需求确定PID。在PidIdentifier填写PID,在DcmDspPidService选择01服务,在DcmDspPidSize中填写其数据长度:

    DcmDspPidIdentifier:配置PID

    DcmDspPidService:选择使用此PID的服务

    DcmDspPidSize:设置数据大小

    DcmDspPidUsed:使能此PID

    image32

    图 DcmDspPid

  2. 配置DcmDspPidData建立service1的配置

    image33

    图 DcmDspPidService

  3. DcmDspPidDataUsePort一般选择USE_DATA_SYNCH_FNC或者USE_DATA_SYNCH_CLENT_SERVER,协议栈会从DcmDspPidDataReadFnc中获取数据,并设置DcmDspPidDataType。

    image34

    图 DcmDspPidDataUsePort

  4. 根据DcmDspPidDataReadFnc配置构造获取PID数据的函数。示例如下:

Service 0x02

  1. 添加DemExternalCSDataElementClass用于获取PID数据

    image35

    图 DemExternalCSDataElementClass

  2. 配置DemPidClass中DemPidIdentifier,并关联步骤1中DemExternalCSDataElementClass

    image36

    图 DemPidClass

    image37

    图 DemPidClass

  3. DCM新建配置一个用于Service02的DcmDspPidData

    image38

    图 DcmDspPidData

  4. DcmDspPidData关联步骤2中DemPidClass。

    image39

    图 DcmDspPidData

  5. DemDTCAttributes_OBD中不能有其它协议的FreezeFrame。

    image40

    图 DemDTCAttributes

Service 0x03 / 07

  1. 在DcmDsdServiceTable中添加03和07服务;

  2. (0x0A服务选用)在DemGeneral中DemEventMemorySet下DemPermanentMemorys添加DemPermanentMemory用于0x0A服务。根据需求将DemGeneral中DemEventMemorySet的DemMaxNumberEventEntryPermanent配置为非0值。

    image41

    图 DcmDsdServiceTable

    image42

    图 DemGeneral

  3. 添加DemOBDDTC并配置DemDtcValue

    image43

    图 DemOBDDTC

  4. (0x0A服务选用)DemMemoryDestinationRef选择DemPermanentMemory。

    image44

    图 DemDTCAttributes

  5. 添加DemDTC并配置,根据需求选择DemDTCAttributes。

    image45

    图 DemDTC_P014300

  6. 添加DemEventParameter,勾选DemEventAvailable;关联DemDTCRef;选择DemOperationCycleRef。

    image46

    图 DemEventParameter

Service 0x09

在DcmDsdServiceTable中添加0x09的OBD服务列表

image47

图 DcmDsdServiceTable

在DSP中添加DcmDspVehInfo,配置DcmDspVehInfoInfoType,此处以INFOTYPE 0x02 (VIN)为例,填写为0x02。

image48

图 DcmDspVehInfo

在DcmDspVehInfo中添加DcmDspVehInfoData,配置获取Vehicle information的函数名称 DcmDspVehInfoDataReadFnc或可直接勾选DcmDspVehInfoDataUsePort,并根据需求配置数据的大小DcmDspVehInfoDataSize为17字节。

image49

图 DcmDspVehInfoData

在Rte_Dcm.c中将数据传入 DcmDspVehInfoDataReadFnc配置的函数.

image50

图 测试示例程序

源代码集成

诊断栈源代码集成步骤如下:

  1. 在MCAL工程的基础上,同步章(Can模块与CanIf模块配置)添加的Can模块配置文件。

  2. 从基线中取出章(代码集成)中相关的源代码添加到工程中。

  3. 将在章(配置代码生成)中ORIENTAS配置生成的诊断相关配置文件添加到工程中。

  4. 添加相关头文件目录。

协议栈调度集成

请参考《集成手册_UDSonCAN.pdf》中的诊断栈调度集成。

Note

工程中涉及故障检测是需要自己实现,以下验证结果是人为添加测试代码调用Dem_SetEventStatus函数。

验证结果

验证Service 0x01

  1. 通过CAN工具向ECU发送01服务请求报文:

CANID:0x7df

请求内容:02 01 00 AA AA AA AA AA

期望结果:收到CANID0x709响应报文06 41 00 80 00 00 00 AA

  1. 通过CAN工具向ECU发送01服务请求报文:

    CANID:0x7df

    请求内容:02 01 01 AA AA AA AA AA

    期望结果:收到CANID0x709响应,内容与章节(Service 0x01)接口填写的数据内容一致,报文为06 41 01 01 02 03 04 AA

    image51

    图 验证结果01

验证Service 0x02

  1. 通过CAN工具向ECU发送02服务请求报文:

    CANID:0x7df

    请求内容:03 02 00 00 AA AA AA AA

    期望结果:收到CANID0x709响应报文07 42 00 00 00 10 00 00

  2. 通过CAN工具向ECU发送02服务请求报文:

    CANID:0x7df

    请求内容:03 02 0C 00 AA AA AA AA

    期望结果:收到CANID0x709响应报文05 42 0C 00 11 22 AA AA

    image52

    图 验证02服务功能

验证0x03 / 07

  1. 通过CAN工具向ECU发送03服务请求报文:

    CANID:0x7df

    请求内容:01 03 AA AA AA AA AA AA

    期望结果:收到CANID0x709响应报文04 43 01 01 43 AA AA AA

  2. 通过CAN工具向ECU发送07服务请求报文:

    CANID:0x7df

    请求内容:01 07 AA AA AA AA AA AA

    期望结果:收到CANID0x709响应报文04 47 01 43 AA AA AA

    image53

    图 03&07验证结果

验证Service 0x09

  1. 通过CAN工具向ECU发送09服务请求报文:

    CANID:0x7df

    请求内容:02 09 00 AA AA AA AA AA

    期望结果:收到CANID0x709响应报文06 49 00 40 00 00 00 AA

  2. 通过CAN工具向ECU发送09服务请求报文:

    CANID:0x7df

    请求内容:02 09 02 AA AA AA AA AA

    期望结果:收到CANID0x709响应,内容与章节(Service 0x09)填写的数据内容一致。

    image54

    图 验证结果09