主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

可视化电池仿真输出数据

自 R2023b 起

此示例说明了如何使用包含 Simscape™ Battery™ 生成的模块的 Simulink™ 模型的输出中的动态电池图可视化电池仿真数据。在实际的电池应用中,电池电芯会根据冷却系统的设计以及电流收集器、母线和其他连接器的电气设计产生温度和荷电状态差异。

您可以使用 batterySimulationLog 对象选择要随时间绘制的电池变量或状态。然后,您可以将此对象作为输入传递给 batterySimulationChart 对象。此操作将变量随时间变化的值覆盖,并将其映射到 batteryChart 对象上。

在 MATLAB 中创建电池包对象

要创建电池 Pack 对象,必须先设计并创建电池包的基本元素。

创建 Cell 对象并定义可视化变量

首先创建并定义电池电芯的几何形状。CylindricalGeometry 对象定义了电池电芯的圆柱形几何排列。要创建一个 CylindricalGeometry 对象,请使用 batteryCylindricalGeometry 函数。要创建一个电芯对象,请使用 batteryCell 函数,并将 CylindricalGeometry 对象指定为第一个参量。

cylindricalGeometry = batteryCylindricalGeometry();
cylindricalCell = batteryCell(cylindricalGeometry);

Pack 对象的基本电芯模型模块更改为使用 Battery Equivalent Circuit 模块。在 batterycell 对象中指定 CellModelOptions 属性的 CellModelBlockPath 属性。

cylindricalCell.CellModelOptions.CellModelBlockPath = "batt_lib/Cells/Battery Equivalent Circuit";

您可以使用 Cell 对象通过简单的一维模型仿真电池电芯的热效应。要仿真电池电芯的热效应,请在 Cell 对象的 CellModelOptions 对象的 BlockParameters 属性中,将 ThermalModel 属性设置为 "LumpedThermalMass"。只有先在电芯级别定义热模型,才能定义电池并联组件和模组的热边界条件。

cylindricalCell.CellModelOptions.BlockParameters.ThermalModel = "LumpedThermalMass";

创建 ParallelAssembly 对象

并联组件包括多个电池电芯,这些电池电芯在特定的拓扑配置或几何排列下电连接成并联。在此示例中,您将创建一个由八个圆柱形电芯组成的并联组件。

要创建 ParallelAssembly 对象,请使用 batteryParallelAssembly 函数。将 Cell 对象指定为第一个参量,并将并联的电芯数指定为第二个参量。

parallelAssembly = batteryParallelAssembly(cylindricalCell,8, ...
    Rows=1, ...
    Topology="Square");

创建 Module 对象

电池模组由多个串联的并联组件组成。在此示例中,您将创建三个电池模组,每个模组包含两个并联组件。前两个模组具有分组模型分辨率。第三个模组具有集总模型分辨率。

要创建此 Module 对象,请使用 batteryModule 函数。将 ParallelAssembly 对象指定为第一个参量,并将串联的并联组件数指定为第二个参量。要定义其他属性,请使用名称-值参量 InterParallelAssemblyGapStackingAxis

groupedModule1 = batteryModule(parallelAssembly,2, ...
    SeriesGrouping=[1 1], ...
    ParallelGrouping=[8 1], ...
    InterParallelAssemblyGap=simscape.Value(0.005,"m"), ...
    StackingAxis="X");

groupedModule2 = batteryModule(parallelAssembly,2, ...
    SeriesGrouping=[1 1], ...
    ParallelGrouping=[1 8], ...
    InterParallelAssemblyGap=simscape.Value(0.005,"m"), ...
    StackingAxis="X");

lumpedModule = batteryModule(parallelAssembly,2, ...
    InterParallelAssemblyGap=simscape.Value(0.005,"m"), ...
    StackingAxis="X");

创建 ModuleAssembly 对象

电池模组组件由串联或并联的多个电池模组组成。在此示例中,您将创建一个由五个模组组成的电池模组组件,每个模组组件之间的间隙为 0.001 米。默认情况下,以电气方式串联 ModuleAssembly 对象。

要创建 ModuleAssembly 对象,请使用 batteryModuleAssembly 函数,并将 Module 对象指定为第一个参量。要定义其他属性,请使用名称-值参量 InterModuleGapStackingAxis

moduleAssembly = batteryModuleAssembly([groupedModule1,repmat(lumpedModule,1,3),groupedModule2], ...
    InterModuleGap = simscape.Value(0.001,"m"), ...
    StackingAxis="X");

创建 Pack 对象

现在,您已经拥有创建电池包的所有基本元素。电池包由多个串联或并联连接的电池模组组件组成。在此示例中,您将创建一个包含一个模组组件的电池包。默认情况下,以电气方式串联 Pack 对象。

要创建 Pack 对象,请使用 batteryPack 函数,并将 ModuleAssembly 对象指定为第一个参量。要定义其他属性,请使用名称-值参量 CoolantThermalPath AmbientThermalPath

pack = batteryPack(moduleAssembly, ...
    AmbientThermalPath="CellBasedThermalResistance", ...
    CoolantThermalPath="CellBasedThermalResistance");

可视化电池包并检查模型分辨率

要获得仿真所需的 Battery Equivalent Circuit 模块数量,请使用 pack 对象的 NumModels 属性。

disp(pack.NumModels)
    21

要在构建系统模型之前可视化电池包并查看其模型分辨率,请在要可视化电池包的位置创建图形,然后使用 batteryChart 函数。要查看 batterypack 对象的模型分辨率,请将 SimulationStrategyVisible 名称-值参量指定为 "On"

f = figure(Color="w",Position=[0 0 1000 500]);
tl = tiledlayout(1,2,Parent=f,TileSpacing="Compact");
nexttile(tl)
packChart1 = batteryChart( tl,pack);
nexttile(tl)
packChart2 = batteryChart(tl,pack,SimulationStrategyVisible="On");

为电池包对象构建 Simscape 模型

创建电池对象后,需要将其转换为 Simscape 模型,以便在模块图中使用。然后,您可以将这些模型作为参考,用于系统集成和需求评估、冷却系统设计、控制策略开发、硬件在环等许多应用。

要创建一个包含 Pack 对象的 Simscape Battery 模型的库,请使用 buildBattery 函数。要创建一个可以单独定义所有电池参数的脚本,请将函数 buildBattery 的参量 MaskParameters 设置为 "VariableNamesByType"。要将初始目标作为脚本的一部分包括在内,请将 buildBattery 函数的 MaskInitialTargets 参量设置为 VariableNamesByInstance"

在工作文件夹中创建 packVisualization_libpackVisualization SLX 库文件。packVisualization_lib 库包含 Modules 和 ParallelAssemblies 子库。此函数还会创建一个扩展名为 .mpackVisualization_param 脚本,其中包含运行电池仿真所需的所有必要参数。

libraryname = "packVisualization";
buildBattery(pack,LibraryName=libraryname, ...
    MaskParameters="VariableNamesByType", ...
    MaskInitialTargets="VariableNamesByInstance");

创建并仿真电池模型

创建包含所需电池模型的电池库后,必须创建 Simulink 模型。然后,仿真此模型,以获得记录的仿真数据。

创建 Simulink 模型

创建并打开 Simulink 模型。定义模型名称并使用 open_system 函数。

modelname = "packVisualizationModel";
open_system(new_system(modelname));

该示例以编程方式添加了仿真电池模组模型所需的所有模块。要添加这些模块,请将其模块路径定义为工作区中的变量。

batteryBlockPath = strcat(modelname,"/",pack.Name);
electricalRefBlockPath = strcat(modelname,"/","ElectricalReference");
solverConfigBlockPath = strcat(modelname,"/","Solver");
currentSourceBlockPath = strcat(modelname,"/","Controlled Current Source");
ambientTemperatureSourceBlockPath = strcat(modelname,"/","Temperature Source");
coolantTemperatureSourceBlockPath = strcat(modelname,"/","Temperature Source Clnt");

将模块添加到模型中。使用 add_block 函数。

add_block(strcat(libraryname,"/",pack.Name),batteryBlockPath,position=[150,100,300,250]);
add_block("fl_lib/Electrical/Electrical Elements/Electrical Reference",electricalRefBlockPath,position=[165,320,185,340],orientation="down",ShowName="off");
add_block("nesl_utility/Solver Configuration",solverConfigBlockPath,position=[-80,280,-30,320]);
add_block("fl_lib/Thermal/Thermal Sources/Temperature Source",ambientTemperatureSourceBlockPath,position=[205,300,245,340],ShowName="off");
add_block("fl_lib/Thermal/Thermal Sources/Temperature Source",coolantTemperatureSourceBlockPath,position=[255,300,295,340],ShowName="off");

要定义电气负载情况,请添加一个 DC Current Source 模块,并将电流设置为放电方向的 160 安培。

add_block( "fl_lib/Electrical/Electrical Sources/DC Current Source",currentSourceBlockPath,position=[-30,150,0,200],orientation="down",i0=num2str(-160));

获取模块端口的句柄,并连接所有模块。

batteryBlockPortHandles = get_param(batteryBlockPath,"PortHandles");
electricalRefBlockPortHandles = get_param(electricalRefBlockPath,"PortHandles");
solverConfigBlockPortHandles = get_param(solverConfigBlockPath,"PortHandles");
currentSourceBlockPortHandles = get_param(currentSourceBlockPath,"PortHandles");
ambientTemperatureSourceBlockPortHandles = get_param(ambientTemperatureSourceBlockPath,"PortHandles");
coolantTemperatureSourceBlockPortHandles = get_param(coolantTemperatureSourceBlockPath,"PortHandles");

add_line(modelname,batteryBlockPortHandles.RConn(1),currentSourceBlockPortHandles.RConn,autorouting="smart");
add_line(modelname,batteryBlockPortHandles.LConn,currentSourceBlockPortHandles.LConn,autorouting="smart");
add_line(modelname,batteryBlockPortHandles.RConn(1),electricalRefBlockPortHandles.LConn,autorouting="smart");
add_line(modelname,batteryBlockPortHandles.RConn(1),solverConfigBlockPortHandles.RConn,autorouting="smart");
add_line(modelname,batteryBlockPortHandles.RConn(2),ambientTemperatureSourceBlockPortHandles.LConn,autorouting="smart");
add_line(modelname,batteryBlockPortHandles.RConn(3),coolantTemperatureSourceBlockPortHandles.LConn,autorouting="smart");

下图显示了生成的电池模型:

此图显示了 Module Assembly 模块的内部布局:

仿真模型

要可视化 BatterySimulationChart 对象中的电池仿真输出,必须先启用 Simscape 信号记录。要启用记录,请在 Simulink 模型中将 SimscapeLogType 属性设置为 "all"

set_param(modelname,"SimscapeLogType","all")

要运行仿真,必须先运行参数化脚本。

run(strcat(libraryname,"_param.m"));

通过修改 Module 模块的初始目标,将电池温度和荷电状态初始化为不同的值。修改初始荷电状态。

ModuleAssembly1.Module1.socCell = [repmat(0.8, 8, 1);0.7]; % Cell state of charge of module 1
ModuleAssembly1.Module2.socCell = 0.8; % Cell state of charge of module 2
ModuleAssembly1.Module3.socCell = 0.8; % Cell state of charge of module 3
ModuleAssembly1.Module4.socCell = 0.8; % Cell state of charge of module 4
ModuleAssembly1.Module5.socCell = [0.9;repmat(0.8, 8, 1)]; % Cell state of charge of module 5

修改初始温度。

ModuleAssembly1.Module1.batteryTemperature = [repmat(305, 8, 1);302]; % Temperature of module 1, K
ModuleAssembly1.Module2.batteryTemperature = 305; % Temperature of module 2, K
ModuleAssembly1.Module3.batteryTemperature = 306; % Temperature of module 3, K
ModuleAssembly1.Module4.batteryTemperature = 304; % Temperature of module 4, K
ModuleAssembly1.Module5.batteryTemperature = [308; 309; 310; 310; 310; 311; 312; 314; 314]; % Temperature of module 5, K

修改热阻参数。

ModuleType1.CoolantResistance = [12,14,16,18,20,22,24,26,20];
ModuleType2.CoolantResistance = 25;
ModuleType3.CoolantResistance = [22,24,26,28,30,32,34,36,30];

ModuleType1.AmbientResistance = repmat(200,1,9);
ModuleType2.AmbientResistance = 200;
ModuleType3.AmbientResistance = ModuleType1.AmbientResistance;

运行仿真。使用函数 sim,并定义参量 StartTimeStopTime

out = sim(modelname,StartTime="0",StopTime="600");

创建动态电池可视化

要选择在 BatterySimulationChart 中绘制的变量和变量单位,必须先创建一个 BatterySimulationLog 对象。要创建 BatterySimulationLog 对象,请使用 batterySimulationLog 函数。指定用于创建电池模型库的电池对象作为第一个参量,指定来自 Simulink 模型中的该电池模块的仿真输出数据作为第二个参量。

batterySimLog = batterySimulationLog(pack,out.simlog.Pack1);

要显示可绘制的变量,请访问 BatterySimulationLog 对象的 ModelVariables 属性。这些变量与基本电芯模型模块中的公共变量相对应。

disp(batterySimLog.ModelVariables)
    "batteryTemperature"    "batteryVoltage"    "socCell"    "batteryCurrent"    "numCycles"

要选择另一个变量,请指定 SelectedVariable 属性。软件会自动为变量选择默认单位。然后,您就可以在 SelectedVariableUnit 属性中定义一个相称的单位。

batteryCurrentSimLog = batterySimLog;
batteryCurrentSimLog.SelectedVariable = "batteryCurrent";

batteryStateOfChargeSimLog = batterySimLog;
batteryStateOfChargeSimLog.SelectedVariable = "socCell";

要可视化温度变量的值,请使用函数 batterySimulationChart

f = uifigure(Color="w");
g = uigridlayout(f,[1 1]);
packChart = batterySimulationChart(g,batterySimLog);
packChartColorBar = colorbar(packChart);
ylabel(packChartColorBar, strcat("Cell temperature"," (",batterySimLog.SelectedVariableUnit,")"),FontSize=14);

可视化电流和荷电状态。

f = uifigure(Color="w");
g = uigridlayout(f,[1 2]);
packCurrentChart = batterySimulationChart(g,batteryCurrentSimLog);
packCurrentChartColorBar=colorbar(packCurrentChart);
ylabel(packCurrentChartColorBar,strcat("Cell current"," (",batteryCurrentSimLog.SelectedVariableUnit,")"),FontSize=14);
packCurrentChartColorBar = colormap(packCurrentChart);

packStateOfChargeChart = batterySimulationChart(g,batteryStateOfChargeSimLog);
packStateOfChargeChartColorBar = colorbar(packStateOfChargeChart);
ylabel(packStateOfChargeChartColorBar,strcat("Cell state of charge", " (",batteryStateOfChargeSimLog.SelectedVariableUnit,")"),"FontSize",14 );
packStateOfChargeChartColorBar = colormap(packChart);

另请参阅

| | |

主题