纯电动汽车VCU上下电控制策略建模与CI/CD自动化测试
工具一览
| 分类 | 工具/技术栈 | 主要用途描述 |
|---|---|---|
| 策略建模 | Simulink/Stateflow | 负责 VCU 上下电控制逻辑建模与有限状态机设计 |
| 测试框架 | pytest | 用于编写和执行自动化测试脚本及断言校验 |
| CAN通信 | python-can, vector virtual can | 用于通过 Python 操作 CAN 总线,实现仿真与报文收发 |
| 版本/代码托管 | Gitea, Jenkins | 内部 Git 托管平台,管理控制策略与测试脚本源码 |
| 容器与CI/CD | Docker | 构建标准化测试环境,结合 CI/CD 自动化执行测试流水线 |
上下电状态机建模
信号说明
| 输入信号 | 信号功能说明 | 输出信号 | 信号功能说明 |
|---|---|---|---|
| Key_Sts | 钥匙/点火开关状态 | VCU_State | 系统主状态机枚举值 |
| Brake_Pedal | 刹车踏板开度信号 | HV_Req | BMS 高压接触器闭合请求 |
| BMS_HV_Ready | BMS 高压就绪反馈 | Torque_Enable | 驱动电机扭矩使能标志 |
| HVIL_Fault | 高压回路互锁故障标志 |
VCU 上下电控制策略状态机图
stateDiagram-v2
direction TB
[*] --> OFF: 上电初始化
OFF --> STANDBY: 钥匙识别(50ms) & 无互锁故障
STANDBY --> Precharge: 钥匙打至 ON & 踩下刹车(>10%)
Precharge --> READY: BMS 高压就绪反馈
READY --> Postcharge: 钥匙关闭 (OFF)
Precharge --> Postcharge: 预充中断 (钥匙关闭)
Postcharge --> OFF: BMS 高压断开 & 泄放完成
STANDBY --> OFF: 钥匙关闭 (OFF)
STANDBY --> FAULT: 高压互锁故障 (HVIL)
Precharge --> FAULT: 预充超时 (>50ms)
READY --> FAULT: 高压互锁故障 (HVIL)
FAULT --> OFF: 钥匙关闭 (OFF)
转移条件说明
上电过程:
-
车辆进入待机状态
OFF -> STANDBY需满足 2 个条件,此时 VCU_State 由 0 -> 1:- 车内识别到钥匙且持续 50ms (
duration(Key_Sts == 1, 50ms)) - 无高压回路互锁故障 (
HVIL_Fault == 0)
- 车内识别到钥匙且持续 50ms (
-
进入高压预充状态
STANDBY -> Precharge需要满足 3 个条件,此时 VCU_State 由 1 -> 2,并请求 BMS 高压闭合 (HV_Req = 1):- 钥匙处于启动状态 (
Key_Sts == 2) - 无高压回路互锁故障 (
HVIL_Fault == 0) - 刹车踏板行程 > 10% (
Brake_Pedal > 10)
- 钥匙处于启动状态 (
-
进入可行驶状态
Precharge -> READY需要 BMS 高压就绪,此时 VCU_State 由 2 -> 3,发送转矩使能信号 (Torque_Enable = 1):BMS_HV_Ready == 1
下电过程:
- 高压下电泄放
READY -> Postcharge:钥匙状态为离车状态 (Key_Sts == 0),系统发出 BMS 下电请求 (HV_Req = 0),转矩使能关闭 (Torque_Enable = 0),VCU_State 由 3 -> 4。 - 进入关闭状态
Postcharge -> OFF:需要等待 BMS 高压断开信号为 0 且泄放时限为 50ms (BMS_HV_Ready == 0 || after(50ms)),VCU_State 由 4 -> 0。
错误状态处理:
- 处于
STANDBY状态时,若有高压回路互锁故障,直接跳转到FAULT状态,VCU_State 由 1 -> 5。 - 处于
Precharge状态时,若预充充能时间超过 50ms 未就绪,直接跳转到FAULT状态,VCU_State 由 2 -> 5。 - 处于
READY状态时,若出现高压回路互锁故障,直接跳转到FAULT状态,VCU_State 由 3 -> 5。 - 处于
FAULT状态时,钥匙置为离车状态 (Key_Sts == 0),跳转回OFF状态,VCU_State 由 5 -> 0。
其他状态转移:
- 处于
STANDBY状态时,钥匙为离车状态 (Key_Sts == 0),直接跳转到OFF状态,VCU_State 由 1 -> 0。 - 处于
Precharge状态时,钥匙为离车状态 (Key_Sts == 0),因已发送过高压请求,需进入Postcharge(高压下电/残压泄放)状态,VCU_State 由 2 -> 4(随后泄放完成再由Postcharge -> OFF由 4 -> 0)。
状态机周围接线
graph LR
%% 全局样式定义
classDef canNode fill:#f8f9fa,stroke:#495057,stroke-width:1.5px,rx:4,ry:4;
classDef dbcNode fill:#ffffff,stroke:#228be6,stroke-width:1.5px,rx:6,ry:6;
classDef coreNode fill:#fff9db,stroke:#fab005,stroke-width:2px,rx:12,ry:12;
classDef cfgNode fill:#e9ecef,stroke:#868e96,stroke-width:1px,stroke-dasharray: 4 4,rx:4,ry:4;
%% 1. 硬件/底层接口层 (Rx)
subgraph Sub_Rx ["CAN 接收接口"]
V1["<b>Vector Virtual 1</b><br/>Channel 1<br/><small>标准ID/扩展ID: 所有</small>"]:::canNode
V2["<b>Vector Virtual 1</b><br/>Channel 1<br/><small>标准ID/扩展ID: 所有</small>"]:::canNode
end
%% 2. 报文解析层 (DBC Unpack)
subgraph Sub_Unpack ["信号解析 (DBC Unpack)"]
DBC_258["<b>vcu.dbc</b><br/>报文: BMS_Message<br/>ID: 258"]:::dbcNode
DBC_256["<b>vcu.dbc</b><br/>报文: Input_Message<br/>ID: 256"]:::dbcNode
end
%% 3. 控制逻辑核心层 (Stateflow)
Core["<b>VCU 核心控制状态机</b><br/><i>(Stateflow Logic)</i>"]:::coreNode
%% 4. 报文打包层 (DBC Pack)
subgraph Sub_Pack ["信号打包 (DBC Pack)"]
DBC_257["<b>vcu.dbc</b><br/>报文: Output_Message<br/>ID: 257"]:::dbcNode
end
%% 5. 硬件/底层接口层 (Tx)
subgraph Sub_Tx ["CAN 发送接口"]
V3["<b>Vector Virtual 1</b><br/>Channel 1<br/><small>周期: 0.01s</small>"]:::canNode
end
%% 总线全局配置 (独立置于下方)
BusConfig[" <b>总线配置</b><br/>Vector Virtual 1 (Ch1)<br/>波特率: 500 Kbps"]:::cfgNode
%% ---------------- 数据流连接 ----------------
%% 输入链路 1
V1 -->|CAN Msg| DBC_258
DBC_258 -->|BMS_HV_Ready| Core
%% 输入链路 2
V2 -->|CAN Msg| DBC_256
DBC_256 -->|Brake_Pedal| Core
DBC_256 -->|HVIL_Fault| Core
DBC_256 -->|Key_Sts| Core
%% 输出链路
Core -->|HV_Req| DBC_257
Core -->|Torque_Enable| DBC_257
Core -->|VCU_State| DBC_257
DBC_257 -->|CAN Msg| V3
通信协议矩阵 (DBC 定义)
基于 vcu.dbc,系统定义了三条核心报文:
-
Input_Message(ID: 0x100, 8 bytes): 控制器输入-
Key_Sts: 0=KEY_OFF, 1=KEY_STANDBY, 2=KEY_ON -
Brake_Pedal: 刹车踏板开度 (0~100%) -
HVIL_Fault: 高压互锁故障标志 (0=正常, 1=故障)
-
-
BMS_Message(ID: 0x102, 8 bytes): 电池管理系统状态BMS_HV_Ready: 电池高压就绪信号 (0=未就绪, 1=就绪)
-
Output_Message(ID: 0x101, 8 bytes): VCU 状态输出-
VCU_State: 0=OFF, 1=STANDBY, 2=PreCharge, 3=READY, 4=postCharge, 5=FAULT -
HV_Req: 高压使能请求 (0=关断, 1=请求使能) -
Torque_Enable: 扭矩使能输出 (0=禁止, 1=使能)
-