同时支持 ZLG 与 Vector 两套主流 CAN 硬件诊断上位机 — UDS_Diagnosis 📅 发布时间:2026/9/2 17:01:58 👁 浏览次数: 一、项目背景在汽车电子诊断开发过程中UDSUnified Diagnostic Services统一诊断服务是 ECU 诊断、刷写与标定的核心协议。无论是产线 EOL 测试还是研发阶段的联调都离不开一套稳定、好用的 UDS 诊断工具。为了满足日常诊断调试需求我基于 Python PyQt5 自研了一款同时支持 ZLG 与 Vector 两套主流 CAN 硬件桌面端诊断上位机 ——UDS_Diagnosis。本项目具有以下特点轻量单机即可运行无复杂依赖双硬件后端同时支持 ZLG 与 Vector 两套主流 CAN 硬件一套代码无缝切换无需更换工具即可适配不同测试环境功能聚焦覆盖诊断开发中最常用的 UDS 服务与工程化能力多规格分发独立 exe、绿色免安装版、安装包三种打包形态。二、功能特性2.1 硬件与协议支持类别支持项ZLG 设备USBCANFD-200U / 100U / MINI / 400U / 800U、USBCAN-2E-U 等Vector 设备VN16xx 系列帧类型标准 CAN、CAN-FD含 BRS、CAN-FD无 BRS波特率CAN125K / 250K / 500K / 1MCAN-FD仲裁域与数据域独立配置设备接入采用自动扫描机制启动后自动枚举在线设备实时刷新插拔即识别并对已打开通道做去重与状态管理避免重复打开同一通道。双硬件后端是本工具的核心亮点之一通过统一的CanInterface抽象层ZLG 与 Vector 两套硬件在应用层完全透明上层 UDS / ISO-TP 逻辑无需感知底层差异。无论是产线使用 ZLG 设备还是研发联调使用 Vector VN16xx都能用同一套界面和诊断流程完成工作显著降低环境切换成本。2.2 UDS 诊断服务封装了日常诊断最常用的一整套 UDS 服务诊断会话控制0x10默认会话 / 扩展会话 / 编程会话切换ECU 复位0x11硬复位 / 软复位Tester Present0x3E诊断在线保持读取数据标识符0x22按 DID 读取数据支持常用 DID 快捷指令写入数据标识符0x2E按 DID 写入数据安全访问0x27支持 GenerateKeyEx / compute_key 算法 DLL、AES-CBC 算法例程控制0x31启动 / 停止 / 请求结果清除诊断信息0x14清除 DTC读取 DTC 信息0x19多种子功能按状态掩码读数量 / 读 DTC / 读快照等其中0x19 读取 DTC支持对响应报文进行结构化解析自动翻译状态字节、严重度、故障计数等字段。2.3 工程化能力ISO-TP 多帧传输自动完成单帧 / 首帧 / 连续帧 / 流控帧处理自定义诊断序列支持分组管理、循环发送、抑制响应、发送间隔设置DBC 解析加载 DBC 文件后报文信号实时解析显示报文记录与导出实时追踪收发报文支持 ASC 格式导出多通道多窗口同一设备多个通道、多台设备可并行打开独立监控界面自适应窗口无级缩放Ctrl 滚轮全局缩放字体与控件三、系统架构3.1 分层设计整体采用分层架构自下而上依次为┌─────────────────────────────┐ │ gui 层 │ PyQt5 界面设备连接、报文追踪、UDS 面板、诊断序列 ├─────────────────────────────┤ │ uds 层 │ UDS 客户端与常用诊断服务封装 ├─────────────────────────────┤ │ isotp 层 │ ISO 15765-2 传输协议 ├─────────────────────────────┤ │ can 层 │ 硬件后端抽象ZLG / Vector └─────────────────────────────┘3.2 模块说明模块路径职责CAN 抽象udstool/can/统一 CAN 收发接口CanInterface消息结构CanMessageZLG 后端udstool/can/zlg.py通过 ctypes 调用 zlgcan.dllVector 后端udstool/can/vector.py通过 ctypes 调用 vxlapi.dllISO-TPudstool/isotp/transport.py多帧传输、流控UDS 客户端udstool/uds/client.py常用诊断服务封装DBC 解析udstool/dbc/parser.pyDBC 文件解析与信号提取安全算法udstool/gui/security_dll.pySeedKey 算法 DLL 加载四、核心实现4.1 设备接入ctypes 调用 zlgcan.dllZLG 硬件通过 ctypes 直接调用厂商提供的zlgcan.dll关键帧结构使用ctypes.Structure定义class ZCAN_CAN_FRAME(Structure): _fields_ [ (can_id, c_uint, 29), (err, c_uint, 1), (rtr, c_uint, 1), (eff, c_uint, 1), (can_dlc, c_ubyte), (__pad, c_ubyte), (__res0, c_ubyte), (__res1, c_ubyte), (data, c_ubyte * 8), ]设备打开流程如下def open(self): self._setup_prototypes() self._dev_handle self._dll.ZCAN_OpenDevice(self._dev_type, self._dev_index, 0) self._configure_channel_properties() self._init_channel() self._dll.ZCAN_StartCAN(self._chn_handle) self._start_rx_thread()4.2 ISO-TP 传输ISO-TP 层实现了 ISO 15765-2 的多帧传输发送时按数据长度自动选择帧类型def _send_payload(self, payload, timeout): n len(payload) if n 7: # 单帧 self._tx(bytes([n]) payload) return # 首帧 连续帧 self._tx(bytes([0x10 | (n 8), n 0xFF]) payload[:6]) ...4.3 UDS 客户端UDS 客户端封装了常用服务并处理 0x78响应待定等负响应逻辑class UdsClient: def request(self, data, timeoutNone): resp self._tp.request(bytes(data), timeout) # 响应待定(0x78)处理继续等待 ECU 最终响应 while resp and len(resp) 3 and resp[0] 0x7F and resp[2] 0x78: resp self._tp.receive_response(...) if resp and resp[0] 0x7F: raise UdsError(resp[1], resp[2]) return resp4.4 安全访问算法安全访问0x27支持两种 SeedKey 算法GenerateKeyExVector / CANoe / TSMaster 标准接口compute_key简化接口通过解析 PE 导出表自动识别算法函数并做架构位宽校验class SecurityDll: def __init__(self, path, function_nameNone, variant, key_len8): self._dll ctypes.CDLL(path) exports list_exports(path) self.function_name function_name or self._pick_function(exports) self._setup_prototype()4.5 设备扫描与多通道设备扫描采用「打开设备 → 获取真实硬件信息 → 去重 → 关闭」的策略并对共享句柄、通道去重做了专项处理解决多通道并行打开时的驱动状态冲突。五、使用说明5.1 连接设备启动程序自动弹出设备连接对话框下拉框自动列出在线设备与通道选择设备型号、通信模式标准 CAN / CAN-FD、波特率点击「连接」进入主界面。5.2 发送诊断指令在右侧 UDS 面板选择或输入诊断指令点击发送下方日志区实时显示 Tx / Rx报文追踪面板同步显示 CAN 帧与时间戳。5.3 序列发送切换到序列面板可拖拽诊断指令到序列设置每个步骤的发送次数、间隔、抑制响应点击发送序列按顺序循环执行。5.4 多通道并行通过状态栏「设备连接」菜单可打开新连接每开一个通道即新开一个独立窗口互不干扰。六、打包发布使用 PyInstaller 打包配合 Inno Setup 生成安装程序输出三种规格独立 exe单文件双击即用绿色免安装版解压即用免安装安装包Inno Setup 生成的标准安装程序。七、总结与展望这款工具把 UDS 诊断调试的常用能力集成到一个轻量、开箱即用的桌面程序里显著提升了日常诊断与联调效率。后续计划继续完善刷写流程0x34 / 0x36 / 0x37 下载服务安全算法插件化诊断脚本可视化编排更多 CAN 硬件后端接入欢迎交流指正。