3. 整车匹配基础

VCU在车上不是孤岛。它要跟BMS、MCU、OBC、仪表盘聊天。聊天的媒介就是CAN总线,聊天的语言就是UDS诊断协议。这一块要是搞不透,车跑起来你连它哪儿疼都不知道。

我刚开始做VCU标定时,最怕的就是CAN报文看不懂。明明发了指令,电机就是没反应。后来才发现,是ID过滤配错了。嗯,这种坑踩过一次就记住了。

3.1 CAN协议基础:物理层的那些事

CAN总线是差分信号传输。两条线:CAN_H和CAN_L。显性电平(逻辑0)时,CAN_H比CAN_L高2V左右;隐性电平(逻辑1)时,两线电压差接近0。

说白了,就是靠电压差来传0和1。抗干扰能力强,适合车里这种电磁环境恶劣的地方。

参数 典型值 说明
波特率 250 kbps / 500 kbps 动力CAN常用500k,车身CAN常用250k
帧类型 数据帧 / 远程帧 / 错误帧 / 过载帧 VCU最常用数据帧
ID长度 11位(标准帧) / 29位(扩展帧) 动力系统多用扩展帧
数据长度 0~8字节 CAN 2.0A/B标准
个人习惯:我一般把动力CAN设500k,车身CAN设250k。别混用,否则总线负载率算不准,丢帧了你还不知道。

3.2 CAN报文解析:从二进制到物理值

拿到一帧CAN报文,你怎么知道它代表什么?

举个例子。报文ID是0x18FF50E1,数据段是8个字节:01 2C 00 00 00 00 00 00。这代表什么?

你得看DBC文件。DBC就是CAN报文的“字典”。它告诉你:

  • 哪个ID对应哪个信号
  • 信号在数据段里的起始位和长度
  • 缩放因子和偏移量
  • 单位

比如上面那组数据,DBC里可能定义:

BO_ 512 VCU_Status: 8 VCU
 SG_ VCU_Mode : 0|8@1+ (1,0) [0|3] ""  ECU
 SG_ TargetTorque : 8|16@1+ (0.1,0) [0|3000] "Nm"  ECU

解析过程:

  • 起始位0,长度8位 → 取第一个字节 01 → 十进制1 → VCU_Mode = 1(表示Ready模式)
  • 起始位8,长度16位 → 取第2~3字节 2C 00 → 小端模式 = 0x002C = 44 → 乘以因子0.1 → 4.4 Nm

你看,就这么简单。但实际项目里,DBC文件可能有上千个信号。我建议你先把动力相关的信号挑出来,其他的慢慢啃。

我曾经踩过的坑:有一次DBC里信号起始位写错了,我解析出来的扭矩值一直是负数。查了两天才发现是DBC定义的问题。所以拿到DBC后,先用CAN工具回放一遍,确认解析正确再往下走。

3.3 UDS诊断协议:让VCU开口说话

UDS(ISO 14229)是统一诊断服务。说白了,就是让VCU告诉你它现在什么状态,或者你告诉VCU去做什么。

UDS基于请求-响应模型。诊断仪发请求,VCU回响应。常用的服务就三个:

服务ID 名称 作用 我常用的场景
0x22 ReadDataByIdentifier 读数据 读电池SOC、电机温度、故障码
0x2E WriteDataByIdentifier 写数据 写标定参数、清除学习值
0x31 RoutineControl 执行例程 执行自学习、执行传感器校准

0x22服务:读数据

请求格式:22 + DID(2字节)

响应格式:62 + DID + 数据

举个例子,读VCU的软件版本号:

请求:22 F1 90
响应:62 F1 90 01 02 03 04

DID = 0xF190,数据 = 01 02 03 04,表示版本号V1.2.3.4。

0x2E服务:写数据

请求格式:2E + DID + 数据

响应格式:6E + DID + 数据

注意:写数据前通常需要安全访问(0x27服务)。否则VCU会拒绝写入。

我建议:标定阶段用0x2E写参数时,先读一遍原始值,记下来。万一写错了,还能恢复。别问我为什么知道要这么做...

0x31服务:例程控制

请求格式:31 + 子功能 + RID(2字节) + 数据

子功能:01=启动,02=停止,03=查询结果

比如执行电机转子位置自学习:

请求:31 01 02 01
响应:71 01 02 01

RID = 0x0201,启动自学习。VCU执行完后会返回结果。

3.4 CCP/XCP标定协议:在线调参的利器

标定协议是干啥用的?你想想看,VCU里有个扭矩滤波系数,你想从0.1调到0.05。总不能每次改完都刷一遍固件吧?太慢了。

CCP(CAN Calibration Protocol)和XCP(Universal Calibration Protocol)就是干这个的。它们让你在VCU运行时,直接修改RAM里的参数。

对比项 CCP XCP
传输层 CAN CAN / Ethernet / FlexRay
数据包 固定8字节 可变长度
地址宽度 32位 32/64位
DAQ模式 支持 支持,更灵活
我推荐 老项目用CCP 新项目用XCP on CAN

CCP的核心命令就几个:

  • CONNECT:建立连接
  • SET_MTA:设置内存地址
  • DOWNLOAD:写数据到RAM
  • UPLOAD:从RAM读数据
  • START_STOP:启动/停止DAQ采集

XCP比CCP多了个“动态DAQ列表”的功能。你可以随时增删要采集的信号,不用重新编译A2L文件。我个人更喜欢XCP,尤其是做电机标定时,经常要换着看不同的信号。

核心要点:
  • CAN是物理层,UDS是应用层,CCP/XCP是标定层
  • UDS用于诊断和下线检测,CCP/XCP用于研发标定
  • DBC文件是CAN解析的钥匙,A2L文件是CCP/XCP的钥匙
  • 标定前先确认安全访问,否则写不进去

3.5 知识体系总览

下面这张图把CAN通信、UDS诊断和CCP/XCP标定的关系串起来了。你看一遍就能明白它们各自的位置。

VCU通信与诊断知识体系 VCU 整车控制器 CAN 通信协议 UDS 诊断协议 CCP/XCP 标定协议 CAN 核心要素 波特率 / 帧类型 / ID DBC 文件解析 总线负载率计算 UDS 核心服务 0x22 读数据 0x2E 写数据 0x31 例程控制 CCP/XCP 核心功能 CONNECT / SET_MTA DOWNLOAD / UPLOAD DAQ 数据采集 实车通信 / 报文监控 CANalyzer / PCAN 工具 下线检测 / 故障诊断 诊断仪 / UDS 刷写 在线标定 / 参数优化 INCA / CANape 工具 三者关系 CAN 是传输通道,UDS 是诊断语言,CCP/XCP 是标定工具 三者协同工作,才能完成 VCU 的实车开发与标定

这张图把CAN、UDS、CCP/XCP的关系讲清楚了。CAN是管道,UDS是对话规则,CCP/XCP是调参工具。三者缺一不可。

实际项目中,我一般先用CAN工具抓报文,确认通信正常。然后用UDS读一遍关键数据,确认VCU状态。最后用CCP/XCP做在线标定,调参数直到性能达标。这套流程走下来,VCU的通信和诊断基本就稳了。