基于图莫斯的CAN UDS升级上位机-LabVIEW版本(十六):从刷写到诊断的功能扩展
2026/7/31 9:14:37 网站建设 项目流程

1. 引言

在前面的系列文章中,我们完成了基于图莫斯CAN工具的LabVIEW UDS升级上位机开发,实现了ECU固件刷写的完整流程。然而,UDS协议的能力远不止于刷写——它涵盖了六大功能单元、共26种诊断服务,是汽车电子领域最全面的诊断通信协议。

刷写功能只是UDS应用的一个子集。在实际的ECU开发、产线测试和售后诊断场景中,我们还需要:

  • 读取DTC(故障码):快速定位ECU故障

  • 读取DID(数据标识符):获取软件版本、硬件版本、VIN码等信息

  • 清除DTC:故障修复后清除历史故障码

  • 安全访问:解锁受保护的诊断服务

  • 例程控制:执行ECU内部预定义操作(如传感器自学习、标定等)

好消息是,我们已经封装好的通信基座和UDS服务子VI可以直接复用,只需在此基础上扩展新的诊断服务即可。本文将展示如何利用现有架构,快速构建一个功能完整的UDS诊断上位机。


2. 已封装子VI的复用价值

在刷写上位机中,我们已经完成了以下核心基础设施:

2.1 通信基座:TOOMOSS_SendAndWaitResp.vi

这是所有UDS服务的“发动机”。它封装了:

  • CAN_UDS_Request(发送UDS请求)

  • CAN_UDS_Response(接收UDS响应)

  • 超时处理与错误返回

任何新的UDS服务,只需构造对应的请求数据,调用此基座即可完成收发,无需重复编写CAN通信逻辑。

2.2 设备管理层:TOOMOSS_OpenDev(CAN).vi

提供设备句柄管理,所有诊断服务共用同一个设备句柄,无需重复打开设备。

2.3 已有的UDS服务子VI

子VI服务用途
TOOMOSS_SID10_RequestSession.vi0x10会话切换
TOOMOSS_SID27_SecurityAccess.vi0x27安全访问
TOOMOSS_SID2E_WriteDataByID.vi0x2E写入数据
TOOMOSS_SID31_RoutineControl.vi0x31例程控制
TOOMOSS_SID11_EcuReset.vi0x11ECU复位
TOOMOSS_SID28_CommunicationControl.vi0x28通信控制
TOOMOSS_SID85_ControlDTCSetting.vi0x85DTC控制

这些子VI可以直接在诊断上位机中复用,无需任何修改。


3. 需要新增的诊断服务

要构建完整的诊断上位机,还需要补充以下UDS服务:

3.1 0x22 ReadDataByIdentifier(按标识符读数据)

功能:根据DID(Data Identifier)读取ECU中存储的数据。DID是2字节的标识符,每个DID对应ECU中的特定数据。

典型应用

  • 0xF190:读取VIN码

  • 0xF188:读取软件版本号

  • 0xF187:读取硬件版本号

请求格式

Byte 0: SID = 0x22 Byte 1: DID_High Byte 2: DID_Low

肯定响应格式

Byte 0: SID = 0x62 (0x22 + 0x40) Byte 1: DID_High Byte 2: DID_Low Byte 3~N: dataRecord(读取到的数据)

示例:请求读取DID=0xF187

  • 发送:22 F1 87

  • 响应:62 F1 87 48 32 30 31(数据为"H201"等ASCII字符)

3.2 0x19 ReadDTCInformation(读取DTC信息)

功能:读取ECU中存储的诊断故障码(DTC)。这是UDS中最复杂但最重要的诊断服务之一,包含28个子功能。

常用子功能

子功能名称用途
0x01reportNumberOfDTCByStatusMask读取符合特定条件的DTC数量
0x02reportDTCByStatusMask读取符合特定条件的DTC列表
0x06reportDTCExtDataRecordByDTCNumber读取指定DTC的快照/环境数据

DTC状态掩码(1字节):

  • bit 0:testFailed(当前是否失败)

  • bit 4:confirmedDTC(是否已被确认/存储)

  • bit 6:warningIndicatorRequested(是否触发警告灯)

示例

  • 读取所有已确认的DTC数量:19 01 08

  • 读取所有激活状态的DTC列表:19 02 01

  • 读取指定DTC的完整环境数据:19 06 XX XX XX FF

具体的设计在下一篇“基于图莫斯的CAN UDS诊断上位机-LabVIEW版本(十七):TOOMOSS_SID19_ReadDTCInformation.vi-读取DTC信息”文章介绍。

3.3 0x14 ClearDiagnosticInformation(清除DTC)

功能:清除ECU中存储的DTC。

请求格式

Byte 0: SID = 0x14 Byte 1: groupOfDTC_High Byte 2: groupOfDTC_Mid Byte 3: groupOfDTC_Low

特殊值FF FF FF表示清除所有DTC

肯定响应0x54

示例:清除所有DTC

  • 发送:14 FF FF FF

  • 响应:54

3.4 0x3E TesterPresent(待机握手)

功能:维持非默认会话状态,防止ECU因超时而自动退回默认会话。

请求格式

Byte 0: SID = 0x3E Byte 1: subFunction (0x00 = 需要响应, 0x80 = 不需要响应)

典型用法:进入扩展会话或编程会话后,周期性发送3E 80(无需响应)保持会话活跃。


4. 诊断功能上位机界面设计

4.1 主界面布局

┌─────────────────────────────────────────────────────────────────────┐ │ CAN UDS 诊断上位机 │ ├─────────────────────────────────────────────────────────────────────┤ │ ┌─ 通信配置 ────────────────────────────────────────────────────┐ │ │ │ 通道: [CAN1▼] 波特率: [500] Kbps │ │ │ │ 物理ID: [0x700] 响应ID: [0x708] 设备: [已打开 ●] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ 诊断服务 ────────────────────────────────────────────────────┐ │ │ │ [读取DTC] [清除DTC] [读取DID] [写入DID] [安全访问] [复位] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ 服务参数 ────────────────────────────────────────────────────┐ │ │ │ DID: [0xF190] 数据: [ ] │ │ │ │ 子功能: [0x02▼] 掩码: [0xFF] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ 响应显示 ────────────────────────────────────────────────────┐ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ │ │ [14:30:25.123] TX: 22 F1 90 │ │ │ │ │ │ [14:30:25.456] RX: 62 F1 90 4C 56 4E 39 30 30 30 30 │ │ │ │ │ │ VIN: LVN90000 │ │ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ 状态栏: [就绪] │ └─────────────────────────────────────────────────────────────────────┘

4.2 功能区域说明

区域内容说明
通信配置通道、波特率、物理ID、响应ID、设备状态与刷写上位机共用
诊断服务功能按钮点击触发对应的UDS服务
服务参数DID、子功能、掩码、数据等根据所选服务动态显示
响应显示收发日志 + 解析结果显示原始报文和解析后的数据
状态栏当前状态、错误信息实时反馈

5. 诊断服务子VI实现

5.1 TOOMOSS_SID22_ReadDataByID.vi

输入参数

控件类型说明
设备句柄U32由OpenDev返回
通道号枚举CAN1/CAN2
物理地址U32请求ID
响应地址U32响应ID
DIDU16数据标识符

输出参数

控件类型说明
响应数据U8数组读取到的数据
数据长度I32数据字节数
返回值I320成功,-1失败
错误信息字符串错误描述

程序框图

典型调用:读取VIN码

  • DID = 0xF190

  • 发送:22 F1 90

  • 响应:62 F1 90 4C 56 4E ...(17字节VIN码)

5.2 TOOMOSS_SID19_ReadDTC.vi

下篇文章详解

5.3 TOOMOSS_SID14_ClearDTC.vi

输入参数

控件类型说明
设备句柄U32由OpenDev返回
通道号枚举CAN1/CAN2
物理地址U32请求ID
响应地址U32响应ID
DTC组U323字节组标识(FF FF FF表示全部)

输出参数

控件类型说明
返回值I320成功,-1失败
错误信息字符串错误描述

程序框图

5.4 TOOMOSS_SID3E_TesterPresent.vi

输入参数

控件类型说明
设备句柄U32由OpenDev返回
通道号枚举CAN1/CAN2
物理地址U32请求ID
响应地址U32响应ID
需要响应布尔True=需要响应(0x00),False=无需响应(0x80)

程序框图


6. 诊断功能主VI流程编排

6.1 状态机设计

IDLE → 选择诊断服务 → 检查设备状态 → 执行服务 → 显示结果 → IDLE

6.2 诊断服务调用示例

读取VIN码流程

  1. 用户选择DID=0xF190

  2. 调用TOOMOSS_SID22_ReadDataByID.vi

  3. 将响应数据(17字节)显示为ASCII字符串

  4. 显示VIN码解析结果

读取DTC流程

  1. 用户选择子功能=0x02(按状态掩码读取DTC列表)

  2. 调用TOOMOSS_SID19_ReadDTC.vi

  3. 解析响应,提取DTC列表

  4. 将3字节DTC转换为标准5字符格式

  5. 在表格中显示DTC及其状态

6.3 与刷写功能的集成

诊断功能与刷写功能可以共享:

  • 通信层:同一个TOOMOSS_SendAndWaitResp.vi

  • 设备管理:同一个设备句柄

  • 日志系统:同一个LogManager.vi

  • 主界面:通过标签页切换“诊断模式”和“刷写模式”


7. 总结

通过本系列文章搭建的UDS通信框架,我们已经具备了快速扩展诊断功能的基础:

已实现(刷写系列)可扩展(诊断系列)
0x10 会话切换0x22 读数据
0x27 安全访问0x19 读DTC
0x2E 写数据0x14 清除DTC
0x31 例程控制0x3E 待机握手
0x34/36/37 下载0x23 读内存
0x11 ECU复位...更多

核心要点

  1. 通信基座复用:所有新服务只需构造请求数据,调用TOOMOSS_SendAndWaitResp.vi即可

  2. 设备管理复用:设备句柄由TOOMOSS_OpenDev(CAN).vi统一管理

  3. 日志系统复用:所有通信自动记录到日志文件

  4. UI框架复用:主VI的While循环+事件结构可直接扩展新的事件分支

这种架构设计的最大价值在于——投入一次基础设施建设,即可持续扩展新的诊断功能,而无需重复编写底层的CAN通信、设备管理和日志记录代码。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询