在汽车电子开发中,UDS(统一诊断服务)协议是工程师绕不开的话题。相比于常见的读取数据(22服务)和写入数据(2E服务),31服务(Routine Control) 往往显得更为神秘和复杂。它不仅仅是一个简单的读写操作,更像是一个“远程函数调用”,用于执行那些耗时、复杂或涉及多步骤的ECU内部任务(如擦除Flash、执行自检、标定传感器等)。
一、 31服务:不仅仅是读写
在开始配置之前,我们需要明确31服务的核心逻辑。与2F服务(简单的I/O控制)不同,31服务通常涉及一个状态机的管理。
- 核心机制:DCM(诊断通信管理器)模块负责接收请求、校验权限,然后通过回调函数调用应用层(SWC)或底层驱动的具体逻辑。
- 三大子功能:
- 0x01 (Start Routine):启动例程。
- 0x02 (Stop Routine):停止例程(视配置而定)。
- 0x03 (Request Routine Results):获取执行结果。
- 长耗时处理:如果任务执行时间超过P2超时时间,ECU必须回复 NRC 0x78 (Response Pending),告诉Tester“我正在干活,请保持等待”,防止连接断开。
二、 实战演练:ETAS工具链配置全流程
配置31服务的过程,本质上是将协议栈(DCM)与应用层(SWC)“连线”的过程。我们以配置RID(Routine Identifier)为 0xFD00 的例程为例,详细拆解16个关键步骤。
1. DCM模块基础配置
首先,我们需要在DCM模块中“注册”这个服务。
步骤1-2:新建服务
在Dcm > DcmDsd > DcmDsdServiceTable中,找到DcmDsdServices,新建一个服务。- Service ID:填入 49(即0x31的十进制)。
- Function:关联协议栈中的处理函数(如
Dcm_DcmRoutineCont