能量管理主要分为两部分功能,第一,根据电池包实时发出的瞬态功率及瞬态功率持续时间,计算每一刻的电池包允许充放电功率;第二,根据电池包允许充放电功率,电机的充放电功率需求,DCDC、压缩机、PTC的功率需求,对电机的充放电功率、DCDC、压缩机、PTC的使用功率进行分配管理。
目录
1.功能描述
1.1输入输出定义
1.1.1 输入
信号名称 | 信号描述 | 信号类型 | 数值 |
BMS_send_10sDchrgPwrMax | 电池包10s最大放电功率(瞬时) | CAN 信号 | 105KW |
BMS_send_10sRgnPwrMax | 电池包10s最大回收功率(瞬时) | CAN 信号 | -50KW |
BMS_send_DurDchrgPwrMax | 电池包持续最大放电功率(持续) | CAN 信号 | 75KW |
BMS_send_DurRgnPwrMax | 电池包持续最大回收功率(持续) | CAN 信号 | -20KW |
IN_st_ErrDgrCfm | 整车故障等级 | 内部信号 | 1~4 |
1.1.2输出
信号名称 | 信号描述 | 信号类型 |
IN_BatDchrgPwrMax | 电池包允许的放电最大功率 | 内部变量 |
IN_BatRgnPwrMax | 电池包允许的回收最大功率 | 内部变量 |
1.1.3标定量
信号名称 | 信号描述 | 当前值 |
Cal_kW_Err0LmtDchrgPwr | 无故障电池放电功率限制 | 105kW |
Cal_kW_Err1LmtDchrgPwr | 一级故障电池放电功率限制 | 105kW |
Cal_kW_Err2LmtDchrgPwr | 二级故障电池放电功率限制 | 30kW |
Cal_kW_Err3LmtDchrgPwr | 三级故障电池放电功率限制 | 10kW |
Cal_kW_Err4LmtDchrgPwr | 四级故障电池放电功率限制 | 0kW |
Cal_kW_BatDchrgPwrLmt | 电池放电功率限制 | 105kW |
Cal_kW_Err0LmtRgnPwr | 无故障电池回收功率限制 | 30kW |
Cal_kW_Err1LmtRgnPwr | 一级故障电池回收功率限制 | 30kW |
Cal_kW_Err2LmtRgnPwr | 二级故障电池回收功率限制 | 10kW |
Cal_kW_Err3LmtRgnPwr | 三级故障电池回收功率限制 | 0kW |
Cal_kW_Err4LmtRgnPwr | 四级故障电池回收功率限制 | 0kW |
Cal_kW_BatRgnPwrLmt | 电池回收功率限制 | 30kW |
2.电池包允许充放电瞬态功率的计算
2.1电池包正常工况的功率限制
2.1.1 功能要求:
电池包从CAN信号发出2个瞬态功率允许值,即10s允许放电功率、10s允许回收功率。
然后,根据电池包的瞬态功率允许值,当实际使用功率维持在允许使用的瞬态功率最大值持续时间快接近上限值时(具体维持峰值的时间占比可通过Cal_fac_BatPmtPwrDampDly标定)开始,即开始控制电池包的瞬态功率允许值缓慢衰减,直至衰减至持续功率为止。
此时,若实际使用功率一直维持使用最大允许值,则瞬态功率最大允许值一直为持续功率;若实际使用功率小于持续功率,则根据功率的使用情况,逐渐放开对电池包的瞬态功率允许值的限制,实际使用功率越大,放开的越少,实际使用功率越小,放开的越多,整个过程瞬态功率允许值平缓过渡,不突变。
2.1.2 功能分析
BMS本身无法控制电池包输入/输出功率。故需要借助VCU进行功率保护
VCU会在电机扭矩被限制、电池功率被限制这些情况下进行功率仲裁
1)触发条件:无故障报警 & 放电情况
2)输入:BMS_send_BatCurr BMS_send_BatBusVl BMS_send_DurDchrgPwrMax BMS_send_DurRgnPwrMax
电池包维持峰值的时间系数Cal_fac_BatPmtPwrDampDly
3)功能描述:
1.瞬态功率的衰减控制
当电池的实际使用功率接近或达到这些瞬态功率允许值的上限时,系统会开始控制这些允许值逐渐衰减,以避免电池过热或损坏。衰减的速率和持续时间可以通过标定参数(如Cal_fac_BatPmtPwrDampDly)来调整.
2.瞬态功率的动态调整
如果实际使用功率一直维持在峰值功率,则在10s电池放电能量耗尽时,实际功率会逐步被限制到持续功率;在实际功率被限制在持续功率一定时间后,VCU又会逐步放开功率限制(最大不超过峰值功率)。之后当10s电池能量再次被耗尽时,又会将可使用功率降至持续功率。这个过程反复循环。
4)控制方法
电池需要限制输出功率的一个因素是发热。虽然现在的EV在控制电池温度方面,通过降温手段,已经取得了一定成效,但是还需要对它进行功率输出限制。设想一个场景,你在高速超车,你踩地板油,但是发现踩了10s你的速度就再也上不去,一方面是电池功率进行了限制,从而导致油门的扭矩输出被限制,还有一方面为油门踏板和当前运动模式标定的因素。
我们可以用面积法对电池放电功率进行计算。在图中,已使用能量是用矩形进行表示的,即电池放电使用最大功率进行工作,但最多就能使用10s,如果我们想更大程度的使用电池放电功率在持续功率之上的工作时间。可以采用积分法,只要总面积不超过10s峰值放电总面积就可以。具体计算思想如下:
首先把这个功率限制的过程分成两个区域
-
功率未限制区域Δ1,也就是使用5s电池放电峰值功率进行功率输出;
-
功率限制区域Δ2,原本电池中的瞬时能量以峰值功率进行消耗,5s就会消耗殆尽,现在我们用10s时间来消耗它。
这样就完成了我们的需求————瞬态功率允许值平缓过渡,不突变。
2.1.3 放电部分逻辑建模
假设我们需要建立5s钟持续功率为峰值功率200KW,之后进入衰减阶段持续10s,这个阶段的衰减斜率为一次函数,再之后进入冷却阶段(持续功率阶段)30s,之后开启下一轮循环。
限制功率 | 维持时间 | |
峰值维持阶段 | 200KW | 5s |
衰减阶段 | y=200-6t | 10s |
冷却阶段 | 140KW | 30s |
2.1.3.1峰值维持阶段
这是一个带有暂停和重置功能的定时器,如果输入信号为1,则进行计数;如果输入信号为0,则暂停计数。这么做是为了解决,如果请求功率在140左右跳变的问题。如果时间没超过5s,输出Y置1,用峰值输出。如果时间超过5s,则输出Y值0,进入衰减模式;如果Reset=1,则清0。设置reset的目的是为了等到冷却阶段结束后,我们需要重新启动定时器。
2.1.3.2.衰减阶段
这部分也是一个定时器,当前面那个定时器到了5s后,这个定时器就开始计时,定时10s,如果未到10S就将功率从200KW,以Y=200-6x这个速率下降,时间到了10s就以持续功率140KW进行限制;
2.1.3.3.冷却阶段
同样这里也设置了一个计数器,计时时间为20s。20s到则Y输出1,接入定时器1,即用于峰值阶段的定时器。
下面为输出结果。
2.1.4 充电部分逻辑建模
充电部分模型几乎与放电部分一致,有一些逻辑部分需要变更一下。
2.2发生故障之后的功率限制
2.2.1 功能要求
整车根据不同故障发生后的处理方式,定义了4个故障等级。
一级故障发生后,仪表对驾驶员进行提示,记录相应的故障码;
二级故障发生后,仪表对驾驶员进行提示,记录相应的故障码,限制电池输出的功率(可标定,见标定量说明表格);
三级故障发生后,仪表对驾驶员进行提示,记录相应的故障码,限制电池输
出的功率(可标定,见标定量说明表格),并开始计时,当时间超过一定值之后,整车驱动扭矩降为0,然后高压下电;
四级故障发生后,仪表对驾驶员进行提示,记录相应的故障码,限制电池输出的功率(可标定,见标定量说明表格),整车驱动扭矩降为0,然后高压下电。
2.2.2 放电部分故障逻辑建模
分别对不同故障情况下做一个模型搭建。这部分很简单。最后用min模块导出。
2.2.3 充电部分故障逻辑建模
2.3 模型测试(仅放电)
功率限制测试,在0~50S请求功率为130KW,在50S之后请求功率为150KW.
与预期一致。
将故障设置为,在0~50s期间为无故障,50s将故障设置为2.
结果通过;
将故障设置为,在0~50s期间为无故障,50s将故障设置为3.
结果通过
将故障设置为,在0~50s期间为无故障,50s将故障设置为4.
结果通过。
3.参数定义
%%定义Parameter
%无故障电池放电功率限制;
Cal_kW_Err0LmtDchrgPwr= mpt.Parameter;
Cal_kW_Err0LmtDchrgPwr.DataType = 'single';
Cal_kW_Err0LmtDchrgPwr.Value = 105;
Cal_kW_Err0LmtDchrgPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err0LmtDchrgPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%一级故障电池放电功率限制
Cal_kW_Err1LmtDchrgPwr= mpt.Parameter;
Cal_kW_Err1LmtDchrgPwr.DataType = 'single';
Cal_kW_Err1LmtDchrgPwr.Value = 105;
Cal_kW_Err1LmtDchrgPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err1LmtDchrgPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%二级故障电池放电功率限制
Cal_kW_Err2LmtDchrgPwr= mpt.Parameter;
Cal_kW_Err2LmtDchrgPwr.DataType = 'single';
Cal_kW_Err2LmtDchrgPwr.Value = 30;
Cal_kW_Err2LmtDchrgPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err2LmtDchrgPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%三级故障电池放电功率限制
Cal_kW_Err3LmtDchrgPwr= mpt.Parameter;
Cal_kW_Err3LmtDchrgPwr.DataType = 'single';
Cal_kW_Err3LmtDchrgPwr.Value = 10;
Cal_kW_Err3LmtDchrgPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err3LmtDchrgPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%四级故障电池放电功率限制
Cal_kW_Err4LmtDchrgPwr= mpt.Parameter;
Cal_kW_Err4LmtDchrgPwr.DataType = 'single';
Cal_kW_Err4LmtDchrgPwr.Value = 0;
Cal_kW_Err4LmtDchrgPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err4LmtDchrgPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%无故障电池回收功率限制;
Cal_kW_Err0LmtRgnPwr= mpt.Parameter;
Cal_kW_Err0LmtRgnPwr.DataType = 'single';
Cal_kW_Err0LmtRgnPwr.Value = -30;
Cal_kW_Err0LmtRgnPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err0LmtRgnPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%一级故障电池回收功率限制
Cal_kW_Err1LmtRgnPwr= mpt.Parameter;
Cal_kW_Err1LmtRgnPwr.DataType = 'single';
Cal_kW_Err1LmtRgnPwr.Value = -30;
Cal_kW_Err1LmtRgnPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err1LmtRgnPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%二级故障电池回收功率限制
Cal_kW_Err2LmtRgnPwr= mpt.Parameter;
Cal_kW_Err2LmtRgnPwr.DataType = 'single';
Cal_kW_Err2LmtRgnPwr.Value = -10;
Cal_kW_Err2LmtRgnPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err2LmtRgnPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%三级故障电池回收功率限制
Cal_kW_Err3LmtRgnPwr= mpt.Parameter;
Cal_kW_Err3LmtRgnPwr.DataType = 'single';
Cal_kW_Err3LmtRgnPwr.Value = 0;
Cal_kW_Err3LmtRgnPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err3LmtRgnPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%四级故障电池回收功率限制
Cal_kW_Err4LmtRgnPwr= mpt.Parameter;
Cal_kW_Err4LmtRgnPwr.DataType = 'single';
Cal_kW_Err4LmtRgnPwr.Value = 0;
Cal_kW_Err4LmtRgnPwr.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_Err4LmtRgnPwr.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%%其他参数
%电机峰值功率
Cal_kW_MtrPwrMax= mpt.Parameter;
Cal_kW_MtrPwrMax.DataType = 'single';
Cal_kW_MtrPwrMax.Value = 81;
Cal_kW_MtrPwrMax.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_kW_MtrPwrMax.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%压缩机最大功率
Cal_W_CCMPwrMax= mpt.Parameter;
Cal_W_CCMPwrMax.DataType = 'single';
Cal_W_CCMPwrMax.Value = 5;
Cal_W_CCMPwrMax.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_W_CCMPwrMax.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%PTC 最大功率
Cal_W_PTCPwrMax= mpt.Parameter;
Cal_W_PTCPwrMax.DataType = 'single';
Cal_W_PTCPwrMax.Value = 5;
Cal_W_PTCPwrMax.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_W_PTCPwrMax.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%电机能量回收效率
Cal_eff_MtrRgn= mpt.Parameter;
Cal_eff_MtrRgn.DataType = 'single';
Cal_eff_MtrRgn.Value = 0.9;
Cal_eff_MtrRgn.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_eff_MtrRgn.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%电机驱动放电效率
Cal_eff_MtrDchrg= mpt.Parameter;
Cal_eff_MtrDchrg.DataType = 'single';
Cal_eff_MtrDchrg.Value = 0.9;
Cal_eff_MtrDchrg.CoderInfo.CustomAttributes.HeaderFile = 'VCU_Energy_Manage.h';
Cal_eff_MtrDchrg.CoderInfo.CustomAttributes.DefinitionFile = 'VCU_Energy_Manage.c';
%% Enum define
%电池包加热制冷恒温
Simulink.defineIntEnumType('ThermAC',...
{'CLOSE','COOL','HEAT'}, ...
[0;1;2], ...
'Description','DIANCHUSHUANG', ...
'DefaultValue','CLOSE',...
'DataScope','Exported', ...
'AddClassNameToEnumNames', true, ...
'StorageType', 'uint8');
%电除霜
Simulink.defineIntEnumType('FrontDefrostSt',...
{'CLOSE','COOL','HEAT'}, ...
[0;1;2], ...
'Description','DIANCHUSHUANG', ...
'DefaultValue','CLOSE',...
'DataScope','Exported', ...
'AddClassNameToEnumNames', true, ...
'StorageType', 'uint8');
4.总结
非量产模型,仅供参考。