乐于分享
好东西不私藏

不用手写UDS代码了!Excel配置一键生成诊断服务

不用手写UDS代码了!Excel配置一键生成诊断服务

正文

去4S店修车时,师傅用电脑连接你的车,读取故障码、看数据流、刷软件…

这就是UDS诊断。

上篇讲了DBC生成器,今天讲另一个神器:UDS诊断配置生成器。

同样是填Excel表,自动生成全套诊断代码。


项目地址

GitHub:

https://github.com/xiaozhaodebug/STM32_AUTOSAR

UDS生成器位置:

tools/code_generators/uds_generator/├── uds_generator.py          # Python生成器├── generate_uds.sh           # 一键脚本├── UDS_Config_Template.xlsx  # 配置模板└── generated/                # 生成代码示例    ├── UdsConfig_Generated.h    ├── UdsConfig_Generated.c    └── INTEGRATION.md

支持的UDS服务

服务ID
名称
功能说明
配置支持
0x10
DiagnosticSessionControl
会话控制
Session参数、P2/S3时间
0x11
ECUReset
ECU复位
会话支持配置
0x19
ReadDTCInformation
读故障码
DTC列表、快照、扩展数据
0x22
ReadDataByIdentifier
读取DID
DID定义、数据类型、权限
0x27
SecurityAccess
安全访问
安全级别、算法、延时
0x2E
WriteDataByIdentifier
写入DID
读写权限配置
0x31
RoutineControl
例行程序
例程ID、启动/停止/结果
0x3E
TesterPresent
诊断仪在线
会话保持配置

快速开始

方式一:一键脚本(推荐)

cd STM32_AUTOSAR/tools/code_generators/uds_generator# 第1步:创建示例配置./generate_uds.sh --example# 生成 UDS_Config_Example.xlsx# 第2步:编辑配置表# 用Excel打开 UDS_Config_Example.xlsx 修改配置# 第3步:生成代码./generate_uds.sh UDS_Config_Example.xlsx# 第4步:集成到工程cp generated/* ../../../AUTOSAR/UdsConfig/

生成的文件:

  • UdsConfig_Generated.h – 头文件(宏定义、函数声明)
  • UdsConfig_Generated.c – 实现文件(数据表、函数实现)
  • INTEGRATION.md – 集成指南

方式二:手动分步

Step 1:创建配置模板

cd STM32_AUTOSAR/tools/code_generators/uds_generatorpython3 uds_generator.py --example

Step 2:编辑Excel配置

打开 UDS_Config_Example.xlsx,包含6个工作表:

1. SessionConfig – 会话配置(0x10服务)
SessionType
Name
P2_max
P2*_max
S3_client
S3_server
SupportServices
0x01
DefaultSession
50
5000
5000
10,11,19,22,3E
0x02
ProgrammingSession
50
5000
2000
5000
10,11,27,31,34,35,36,37
0x03
ExtendedSession
50
5000
2000
5000
10,11,19,22,2E,27,31,3E

参数说明:

  • P2_max:服务器响应超时时间(典型50ms)
  • P2*_max:服务器扩展响应超时(典型5000ms)
  • S3_client:客户端保持会话间隔(典型2000ms)
  • S3_server:服务器会话超时(典型5000ms)
2. DIDConfig – 数据标识符(0x22/0x2E服务)
DID(Hex)
Name
DataLength
ReadOnly
SecurityLevel
SessionMask
DataType
0xF190
VIN
17
Yes
0x01
0x07
ASCII
0xF197
ECU_Name
16
Yes
0x01
0x07
ASCII
0xF100
SystemState
4
No
0x03
0x06
HEX
0x0100
VehicleSpeed
2
No
0x01
0x07
UINT16

参数说明:

  • ReadOnly:Yes=只读,No=可读写
  • SecurityLevel:所需安全级别(0=不需要)
  • SessionMask:支持的会话(位掩码,0x07=支持所有会话)
  • DataType:ASCII/HEX/UINT8/UINT16/UINT32
3. SecurityConfig – 安全访问(0x27服务)
Level
Name
SeedLength
KeyLength
MaxAttempts
DelayTime
Algorithm
1
Level1_Unlock
4
4
3
10000
XOR_Seed
2
Level2_Unlock
4
4
3
10000
AES128

参数说明:

  • MaxAttempts:最大尝试次数(超过后锁定)
  • DelayTime:锁定后延时(ms)
  • Algorithm:密钥算法(XOR_Seed/AES128)
4. RoutineConfig – 例行程序(0x31服务)
RID(Hex)
Name
StartRoutine
StopRoutine
GetResult
SecurityLevel
SessionMask
0xFF01
EraseMemory
Yes
No
Yes
0x02
0x02
0xFF02
CheckProgramming
Yes
No
Yes
0x02
0x02
5. DTCConfig – 故障码(0x19服务)
DTC(Hex)
Name
Severity
FaultType
AgingCounter
Snapshot
ExtendedData
0x0100
MAF_Circuit
2
Circuit
40
Yes
Yes
0x0300
Misfire_Detect
3
Plausibility
40
Yes
Yes
6. Communication – 通信配置
Parameter
Value
Unit
Description
RequestID_Functional
0x7DF
Hex
功能请求ID
RequestID_Physical
0x735
Hex
物理请求ID
ResponseID
0x73D
Hex
响应ID
TxPduId
20
Dec
发送PDU ID
RxPduId_Functional
10
Dec
功能接收PDU ID
RxPduId_Physical
11
Dec
物理接收PDU ID

Step 3:生成代码

python3 uds_generator.py UDS_Config_Example.xlsx generated/

输出:

[INFO] 生成 UdsConfig_Generated.h[INFO] 生成 UdsConfig_Generated.c[INFO] 生成 INTEGRATION.md[INFO] 完成!请查看 generated/ 目录

Step 4:集成到项目

将生成的代码复制到项目:

cp generated/* ../../../AUTOSAR/UdsConfig/

在 AUTOSAR_Cfg.h 中包含:

#include"UdsConfig_Generated.h"/* DCM配置使用生成的表 */#define DCM_NUM_DIDS    (sizeof(Uds_DidTable)/sizeof(Uds_DidTable[0]))#define DCM_NUM_DTCS    (sizeof(Uds_DtcTable)/sizeof(Uds_DtcTable[0]))

生成的代码结构

UdsConfig_Generated.h

/* Session Configuration */#define UDS_SESSION_DEFAULTSESSION     0x01U#define UDS_SESSION_PROGRAMMINGSESSION 0x02U#define UDS_SESSION_EXTENDEDSESSION    0x03U/* DID Definitions */#define UDS_DID_VIN                    0xF190U  /* 车辆识别号 */#define UDS_DID_ECU_NAME               0xF197U  /* ECU名称 */#define UDS_DID_SYSTEMSTATE            0xF100U  /* 系统状态 *//* Security Levels */#define UDS_SECURITY_LEVEL1            0x01U#define UDS_SECURITY_LEVEL2            0x02U/* Communication */#define UDS_CAN_REQUEST_FUNC_ID        0x007DFU#define UDS_CAN_REQUEST_PHYS_ID        0x00735U#define UDS_CAN_RESPONSE_ID            0x0073DU/* Function Declarations */voidUds_Init(void);voidUds_Cyclic(void);voidUds_RxIndication(constuint8_t* data, uint16_t len);

UdsConfig_Generated.c

/* DID Data Storage */static uint8 Uds_DidData_VIN[17] = (uint8*)"123456789ABCDEFGH";static uint8 Uds_DidData_ECU_Name[16] = (uint8*)"STM32F407_CAN   ";static uint8 Uds_DidData_SystemState[4] = {0x000x000x000x00};/* DID Configuration Table */staticconst Uds_DidConfigType Uds_DidTable[] = {    { /* 0xF190 - 车辆识别号 */        .did = 0xF190,        .dataPtr = Uds_DidData_VIN,        .dataLen = 17,        .readOnly = True,        .securityLevel = 0x01,        .sessionMask = 0x07    },    { /* 0xF197 - ECU名称 */        .did = 0xF197,        .dataPtr = Uds_DidData_ECU_Name,        .dataLen = 16,        .readOnly = True,        .securityLevel = 0x01,        .sessionMask = 0x07    },/* ... more DIDs ... */};/* Session Configuration Table */staticconst Uds_SessionConfigType Uds_SessionTable[] = {    {        .sessionType = 0x01,        .p2Max = 50,        .p2StarMax = 5000,        .s3Server = 5000,        .supportedServices = {0x100x110x190x220x3E}    },/* ... more sessions ... */};

实战测试

使用项目自带的诊断测试工具

cd STM32_AUTOSAR/tools/diagnostic_tools# 运行诊断测试python3 diag_test.py can0

测试内容:

  1. 0x10 – DiagnosticSessionControl(会话控制)
  2. 0x11 – ECUReset(ECU复位)
  3. 0x22 – ReadDataByIdentifier(读取DID)
    • VIN (0xF190)
    • ECU Name (0xF197)
    • System State (0xF100)
  4. 0x3E – TesterPresent(诊断仪在线)
  5. 0x27 – SecurityAccess(安全访问)

输出示例:

=== DBC Matrix Diagnostic Test ===RX:0x7DF (Functional), 0x735 (Physical)TX:0x73D (Response)[TEST 10x10 - DiagnosticSessionControlSending:1001 (Default Session)Response:500100321388  [OK][TEST 20x22 - ReadDataByIdentifierSending:22 F1 90 (Read VIN)Response:62 F1 90313233...  [OK]

手动用PCAN测试

# 1. 进入扩展会话# 发送: 735#0210030000000000# 响应: 73D#065003003201F400# 2. 读取VIN# 发送: 735#0322F19000000000# 响应: 73D#106214F1904C5356 (第一帧)# 发送: 735#3000000000000000 (流控帧)# 响应: 73D#214E484B31323334 (连续帧)

添加自定义DID实战

场景:添加车速DID(0x0100)

第1步:修改Excel

在DIDConfig工作表添加一行:

DID(Hex)
Name
DataLength
ReadOnly
SecurityLevel
SessionMask
DataType
0x0100
VehicleSpeed
2
No
0x01
0x07
UINT16

第2步:重新生成代码

./generate_uds.sh UDS_Config_Example.xlsx

第3步:实现业务逻辑

在应用层添加车速更新:

/* 在main.c或应用层文件中 */#include"UdsConfig_Generated.h"voidUpdateVehicleSpeed(void){extern uint8 Uds_DidData_VehicleSpeed[2];uint16_t speed = GetActualSpeed();  /* 从传感器读取 */    Uds_DidData_VehicleSpeed[0] = (speed >> 8) & 0xFF;    Uds_DidData_VehicleSpeed[1] = speed & 0xFF;}

第4步:测试

# 读取车速# 发送: 735#0322010000000000# 响应: 73D#04620100XXXX0000 (XXXX为车速值)

常见问题

Q1: ImportError: No module named ‘openpyxl’

pip3 install openpyxl

Q2: 生成的代码编译错误

检查Excel格式:

  • 十六进制值使用0x前缀(如0xF190)
  • 布尔值使用Yes/No
  • 数值列不要包含文本

Q3: DID读取返回否定响应

检查:

  1. SecurityLevel是否匹配当前安全级别
  2. SessionMask是否支持当前会话
  3. DataLength是否与数据匹配

Q4: 安全访问解锁失败

检查:

  1. 是否正确实现了密钥算法
  2. 种子是否正确生成
  3. 是否在延时时间内完成解锁

学习价值

通过这个工具,你能学到:

  1. UDS协议基础

    • 诊断服务的请求/响应格式
    • 会话管理和安全访问
    • DID、RID、DTC的概念
  2. 配置驱动思想

    • Excel配置到自动生成代码
    • 改配置不用改代码
    • 便于维护和移植
  3. 诊断测试方法

    • 使用Python脚本自动化测试
    • 使用PCAN手动测试
    • 诊断故障排查

资源领取

扫码关注,回复【AUTOSAR】领取:

  1. UDS配置Excel模板(带完整示例)
  2. Python诊断测试脚本
  3. UDS协议速查表

关于我

我是小昭debug,在这里,我会持续分享一些嵌入式技术、职业干货,以及关于个人成长的思考,相信我这里的输出绝对都是实在的干货。

如果你平时也遇到过被卡住,或者想和同行一起抱团取暖,欢迎关注我。

后台发送 “2”,即可获取《车载嵌入式软件入门资料》。

添加微信并备注”进群”,我邀你加入高质量的学习交流群,大家一起成长!


关键词标签:UDS 诊断 AUTOSAR DCM DID 汽车电子 代码生成 配置驱动

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 不用手写UDS代码了!Excel配置一键生成诊断服务

猜你喜欢

  • 暂无文章