用软包电芯构建电池包的详细模型
此示例说明了如何在 Simscape™ Battery™ 中基于软包电池电芯为各种电池设计和配置创建和构建 Simscape™ 系统模型。通过 buildBattery
函数,可以为这些 Simscape Battery 对象自动生成 Simscape 模型:
此函数会在工作文件夹中创建一个库,其中包含一个电池包的系统模型模块。您可以在仿真中将此系统模型用作参考。这些模型的运行时间参数(如电池电芯阻抗或电池开路电压)在模型创建后定义,因此不包含在电池包构建器类中。要定义运行时参数,您可以在生成的 Simscape 模型模块封装中指定这些参数,或使用 buildBattery
函数的 MaskParameters
参量。
在本例的前半部分,您首先定义软包电池电芯和模块模型的关键属性。然后,您将此软包电池电芯作为并联组件中的基本重复单元使用。在业内,该组件也被称为“子模组”、“超级电芯”、“P 组”或简称为“电芯”。然后,您可以使用该并联组件来定义电池模组,该模组随后用来创建模组组件,最后再创建电池包。这些大型电池系统都将电池电芯用作基本的重复单元。在整个工作流中,您可以使用 BatteryChart
对象可视化这些电池系统的几何形状和相对位置。
在示例的后半部分,您在生成最终的 Simscape 电池模型之前,修改了 Module
、ModuleAssemblies
和 Pack
对象的建模方法和模型分辨率。您可以沿 X
轴或 Y
轴对序列中的任何电池对象进行几何聚集或堆叠。这些轴与 Coordinate Systems in Vehicle Dynamics Blockset (Vehicle Dynamics Blockset) 的轴完全一致。
在 MATLAB 中创建并可视化电池对象
要创建电池包,必须首先设计和创建电池包的基本元素。
下图显示了以自下而上的方式创建电池包对象的整个过程:
电池包由多个模组组件组成。这些模组组件又由多个串联或并联的电池模组组成。电池模组由多个并联组件组成,这些组件又由多个电池电芯以特定的拓扑结构或几何排列方式并联连接而成。
创建并可视化电池 Cell
对象
电池电芯是一种电化学储能装置,利用存储的化学能提供电能。电化学电池电芯是制造大型电池系统的基本构建模块。为了获得所需的能量和电压水平,通常以电气方式将多个电池电芯并联和/或串联。
为了反映现实世界中的行为,Simscape Battery Cell
对象是创建电池包系统模型的基础元素。您可以无需任何输入即可创建所有电池类。要创建电池电芯,请使用 batteryCell
函数。
foundationCell = batteryCell();
为了满足电池包装和空间要求,您可以将电池电芯以三种主要几何排列方式进行排列:圆柱形、软包或棱柱形。要可视化单个电池电芯,必须先定义其几何形状。
使用 batteryPouchGeometry
函数定义软包几何形状。
cellGeometry = batteryPouchGeometry();
PouchGeometry
对象具有下面六个属性:
Length
- 软包几何形状的长度,指定为simscape.Value
对象,该对象表示一个以长度为单位的标量。Thickness
- 软包几何形状的厚度,指定为simscape.Value
对象,该对象表示一个以长度为单位的标量。Height
- 软包几何形状的高度,指定为simscape.Value
对象,该对象表示一个以长度为单位的标量。TabLocation
- 软包电池电芯选项卡的位置,指定为Standard
或Opposed
。TabWidth
- 软包电池电芯选项卡的宽度,指定为simscape.Value
对象,该对象表示一个以长度为单位的标量。TabHeight
- 软包电池电芯的选项卡高度,指定为simscape.Value
对象,该对象表示一个以长度为单位的标量。
为软包几何形状的 Length
、Height
、 TabWidth
和 TabLocation
属性指定自定义值。
cellGeometry.Length = simscape.Value(0.36,"m"); cellGeometry.Height = simscape.Value(0.13,"m"); cellGeometry.TabWidth = simscape.Value(0.05,"m"); cellGeometry.TabLocation = "Opposed";
有关电池电芯可能的几何排列的更多信息,请参阅 CylindricalGeometry
和 PrismaticGeometry
文档页。
现在,您可以通过访问 foundationCell
对象的 Geometry 属性将此几何形状对象链接到电池电芯。
foundationCell.Geometry = cellGeometry;
使用 Mass
属性指定电池电芯质量的自定义值。
foundationCell.Mass = simscape.Value(0.8,"kg");
disp(foundationCell)
Cell with properties: Geometry: [1×1 simscape.battery.builder.PouchGeometry] CellModelOptions: [1×1 simscape.battery.builder.CellModelBlock] Mass: 0.8000 (kg) Capacity: 5 (A*hr) Energy: 50 (W*hr) Show all properties
要在构建系统模型之前可视化电池电芯并查看其模型分辨率,请在要可视化电芯的位置创建图形,然后使用 batteryChart
函数。
f = figure("Color", "white"); cellChart = batteryChart(f,foundationCell); title(cellChart,"Pouch Cell")
默认情况下,Battery (Table-Based) 模块是用于在 Simscape 中表示和仿真电池电芯的电气和热模型。当扩展到更大的电池系统(如并联组件或模组)时,该模型也会根据模型分辨率进行相应扩展。要显示有关电芯模型模块的信息,请使用 batterycell
对象的 CellModelOptions
属性。
disp(foundationCell.CellModelOptions.CellModelBlockPath);
batt_lib/Cells/Battery (Table-Based)
通过 Cell
对象,还可以使用简单的一维模型仿真电池电芯的热效应。要仿真电池电芯的热效应,请在 Cell
对象的 CellModelOptions
属性的 BlockParameters
属性中,将 thermal_port 参数设置为 "model"
。
foundationCell.CellModelOptions.BlockParameters.thermal_port = "model";
您可以使用 CellModelOptions
属性修改 Battery (Table-Based) 模块的所有条件参数。
disp(foundationCell.CellModelOptions.BlockParameters);
SOC_port: no T_dependence: no prm_age_OCV: OCV prm_age_capacity: disabled prm_age_modeling: equation prm_age_resistance: disabled prm_dir: noCurrentDirectionality prm_dyn: off prm_fade: disabled prm_leak: disabled thermal_port: model
创建并可视化电池 ParallelAssembly
对象
并联组件包括多个电池电芯,这些电池电芯在特定的拓扑配置或几何排列下电连接成并联。您可以使用 NumParallelCells
属性指定并联连接的电芯数量。
在此示例中,您使用四个软包电芯创建了一个并联组件,这些电芯以单堆叠拓扑结构堆叠,电芯之间的间隙为 0.001 米。
parallelAssembly = batteryParallelAssembly(foundationCell,... 4,Topology="SingleStack", ... InterCellGap=simscape.Value(0.001,"m"));
Topology
属性是电芯格式的函数。对于软包电芯,唯一可用的拓扑结构为 "SingleStack"
。默认情况下,ParallelAssembly
对象沿 Y
轴堆叠电芯。
可视化电池并联组件。在您想要可视化电池并联组件的位置创建 figure
,并使用 batteryChart
函数。
f = figure("Color","white"); parallelAssemblyChart = batteryChart(f,parallelAssembly); title(parallelAssemblyChart,"Parallel Assembly Chart")
创建并联组件后,您可以修改其内部的所有公共属性。
您可以通过访问 PackagingVolume
和 CumulativeMass
属性来检查任何电池的电芯包装体积和质量。
disp(parallelAssembly.PackagingVolume)
0.0023 (m^3)
disp(parallelAssembly.CumulativeMass)
3.2000 (kg)
创建并可视化电池 Module
对象
电池模组由多个串联的并联组件组成。您可以使用 NumSeriesAssemblies
属性指定串联连接的并联组件的数量。您可以使用 StackingAxis
属性沿笛卡尔坐标系的 X
或 Y
轴堆叠或几何组件电池。
在此示例中,您使用 14 个并联组件创建了一个电池模组,每个组件之间的间隙为 0.008 米。
module = batteryModule(... parallelAssembly,14, ... InterParallelAssemblyGap=simscape.Value(0.008,"m"));
可视化电池 Module
对象。在您想要可视化电池模组的位置创建 figure
,并使用 batteryChart
函数。
f = figure("Color","white"); moduleChart = batteryChart(f,module); title(moduleChart,"Module Chart")
显示电池模组的总包装体积和累积质量。
disp(module.PackagingVolume)
0.0385 (m^3)
disp(module.CumulativeMass)
44.8000 (kg)
创建模组后,您可以修改该模组内部的所有公共属性。
创建并可视化电池 ModuleAssembly
对象
电池模组组件由串联或并联的多个电池模组组成。您可以使用 Module
属性定义模组的数量和类型。如果模组组件包含许多相同的模组,请使用 repmat
函数。否则使用不同模组的数组。
在此示例中,您使用两个相同的 Module
对象创建一个电池模组组件,每个模组之间的间隙为 0.1 米。默认情况下,以电气方式串联 ModuleAssembly
对象。
moduleAssembly = batteryModuleAssembly(... repmat(module,1,2), ... InterModuleGap=simscape.Value(0.1,"m"));
可视化电池 ModuleAssembly
对象。在您想要可视化电池模组组件的位置创建 figure
,并使用 batteryChart
函数。
f = figure("Color","white"); moduleChart = batteryChart(f,moduleAssembly); title(moduleChart,"Module Assembly Chart")
所有电池对象(包括模组)都有一个 Name
属性。ModuleAssembly
对象会自动为其所有模组分配一个唯一名称。要显示 ModuleAssembly
对象中每个模组的名称,请使用 Name
属性。
disp(moduleAssembly.Module(1).Name);
Module1
disp(moduleAssembly.Module(2).Name);
Module2
您可以修改 Name
属性,以重命名模组组件内的任何模组。为电池模组组件中的两个模组指定一个新名称。
moduleAssembly.Module(1).Name = "MyModuleA"; moduleAssembly.Module(2).Name = "MyModuleB"; disp(moduleAssembly.Module(1).Name);
MyModuleA
disp(moduleAssembly.Module(2).Name);
MyModuleB
通过 ModuleAssembly
电池对象,还可以沿 Z 轴堆叠模组。要沿 Z 轴堆叠模组,请使用 NumLevels
属性。NumLevels
属性定义模组组件的层数、级数或楼层数。ModuleAssembly
对象根据组件中的层数和模组数以对称方式堆叠模组。
例如,创建一个新的 ModuleAssembly
对象,该对象由四个相同的模组组成,这些模组沿 Z 轴在两个层上堆叠。
zStackedModuleAssembly = batteryModuleAssembly(... repmat(module,1,4), ... NumLevel=2,... InterModuleGap=simscape.Value(0.1,"m"));
将 ModuleAssembly
对象 zStackedModuleAssembly
可视化。
f = figure("Color","white"); moduleAssemblyChart = batteryChart(f,zStackedModuleAssembly); title(moduleAssemblyChart,"Module Assembly Chart")
创建并可视化电池 Pack
对象
现在,您已经拥有创建电池包的所有基本元素。电池包由串联或并联的多个模组组件组成。您可以使用 ModuleAssembly
属性定义模组组件的数量和类型。如果电池包由多个相同的模组组件组成,则使用 repmat
函数。否则,请使用不同模组组件的数组。
在此示例中,您将创建一个由四个模组组件组成的电池包。第一个模组组件是沿 Z 轴堆叠的模组组件 zStackedModuleAssembly
。其他三个模组组件是您在上一步中创建的三个相同的模组组件。
pack = batteryPack(... [zStackedModuleAssembly,repmat(moduleAssembly,1,3)], ... StackingAxis="X",... InterModuleAssemblyGap=simscape.Value(0.005,"m"));
可视化电池 Pack
对象。在您想要可视化电池包的位置创建 figure
,并使用 batteryChart
函数。
f = figure("Color","white"); packChart = batteryChart(f,pack); title(packChart,"Pack Chart")
Pack
对象在创建时会自动为其所有模组组件分配一个唯一的名称。要显示 Pack
对象中每个模组组件的名称,请使用 Name
属性。
disp(pack.ModuleAssembly(1).Name);
ModuleAssembly1
disp(pack.ModuleAssembly(2).Name);
ModuleAssembly2
disp(pack.ModuleAssembly(3).Name);
ModuleAssembly3
disp(pack.ModuleAssembly(4).Name);
ModuleAssembly4
您可以通过指定 BalancingStrategy
属性,使用 Pack
对象为电池包内的所有模组定义通用的电芯平衡策略。
pack.BalancingStrategy = "Passive";
在此级别修改此属性会自动修改电池包中所有底层模组组件内的相同属性。检查电池包内模组的平衡策略。
disp(pack.ModuleAssembly(1).Module(1).BalancingStrategy);
Passive
disp(pack.ModuleAssembly(2).Module(1).BalancingStrategy);
Passive
disp(pack.ModuleAssembly(3).Module(1).BalancingStrategy);
Passive
disp(pack.ModuleAssembly(4).Module(1).BalancingStrategy);
Passive
更新电池包中每个模组的 BalancingStrategy
属性,以反映您对 Pack
对象的 BalancingStrategy
属性应用的更改。
使用 PackagingVolume
和 CumulativeMass
属性显示电池包的累积包质量和包装体积。
disp(pack.PackagingVolume)
0.4792 (m^3)
disp(pack.CumulativeMass)
448.0000 (kg)
修改电池对象的模型分辨率
ParallelAssembly
和 Module
对象具有 ModelResolution
属性,可用于设置仿真中使用的生成的 Simscape 模型的保真度。您可以将 ModelResolution
属性指定以下任何一种:
Lumped
- 保真度最低。电池对象只使用一个电气模型。要获得最短的编译时间和运行时间,请使用该值。Detailed
- 保真度最高。电池对象针对每个电池电芯使用一个电气模型和一个热模型。Grouped
- 自定义仿真策略,仅适用于Module
对象。
您可以使用 BatteryChart
对象的 SimulationStrategyVisible
属性查看仿真策略。
修改 ParallelAssembly
对象的模型分辨率
ParallelAssembly
对象在创建时使用单个电池 Cell
对象作为基础重复单元。创建一个新的 ParallelAssembly
对象,其中包含您在本示例开头创建的电池电芯。默认情况下,ParallelAssembly
对象的 ModelResoultion
属性设置为 "Lumped"
。
lumpedParallelAssembly = batteryParallelAssembly(... foundationCell,4,... Topology="SingleStack", ... InterCellGap=simscape.Value(0.001,"m"));
通过将名称-值参量 SimulationStrategyVisible
指定为 "on"
,可视化 ParallelAssembly
对象并检查模型分辨率。
f = figure("Color","white"); paralllelAssemblyChartLumped = batteryChart(f,lumpedParallelAssembly,SimulationStrategyVisible="on");
只需一个电芯模型模块即可表示橙色框内的所有电芯组件。
如果将并联组件的 ModelResolution
属性设置为 "Detailed"
,则 ParallelAssembly
对象将实例化与 NumParallelCells
属性的值相等的电芯模型模块,并在 Simscape 中将它们并联连接。
将上一个 ParallelAssembly
对象的模型分辨率更改为 Detailed"
,并使用 batteryChart
函数和指定名称-值参量 SimulationStrategyVisible
对 "on"
进行可视化。
detailedPset = lumpedParallelAssembly; detailedPset.ModelResolution = "Detailed"; f = figure("Color","white"); paralllelAssemblyChartDetailed = batteryChart(f,detailedPset,SimulationStrategyVisible="on");
与 NumParallelCells
属性值相等的电芯模型块数代表每个电芯组件。
修改 Module
对象的模型分辨率
集总模组分辨率
默认情况下,模组和并联组件的模型分辨率设置为 "Lumped"
。这意味着在 Simscape 中生成的电池模型仅使用一个电气模型来对系统中的所有电池电芯进行电气仿真。
查看集总模组分辨率在 Module
对象中的工作原理。创建一个包含 14 个并联组件的 Module
对象。
lumpedModule = batteryModule(... parallelAssembly,14, ... InterParallelAssemblyGap=simscape.Value(0.008,"m"), ... ModelResolution="Lumped");
通过将名称-值参量 SimulationStrategyVisible
指定为 "on"
,可视化 Module
对象并检查模型分辨率。
f = figure("Color","white"); lumpedModuleChart = batteryChart(f,lumpedModule,SimulationStrategyVisible="on");
一个电芯模型可仿真橙色虚线框内的所有电芯。
详细模组分辨率
现在,将之前 Module
对象的模型分辨率更改为 "Detailed"
,并使用 batteryChart
函数和指定名称-值参量 SimulationStrategyVisible
对 "on"
进行可视化。
detailedModule = lumpedModule; detailedModule.ParallelAssembly.ModelResolution = "Detailed"; detailedModule.ModelResolution = "Detailed";
对于软包模组,不建议使用 detailed
模型分辨率,因为电芯数量较多,且模型总数必须保持在 30 到 50 之间。
f = figure("Color","white"); detailedModuleChart = batteryChart(f,detailedModule,SimulationStrategyVisible="on");
与 NumParallelCells
属性值相等的电芯模型块数代表每个电芯组件。
分组模组分辨率
对于电池模组,您也可以将 ModelResolution
属性设置为 "Grouped"
。这种仿真策略提高了模型的性能。
module.ModelResolution = "Grouped";
当您将模组的 ModelResolution
属性设置为 Grouped
时,可以使用 SeriesGrouping
和 ParallelGrouping
属性定义一个附加的仿真策略:
SeriesGrouping
- 模组串联连接的自定义建模策略,指定为严格为正的双精度值数组。该属性的数组长度指定了所需的单个电气模型的数量。该数组的每个元素值都指定了指定电气模型中集总的并联组件数。数组中元素的总和必须等于NumSeriesAssemblies
属性的值。
module.SeriesGrouping = [1,12,1]; f = figure("Color","white"); groupedModuleChart = batteryChart(f,module,SimulationStrategyVisible="on");
ParallelGrouping
- 为 SeriesGrouping 属性中定义的每个并联组件的模组自定义建模策略,指定为严格为正的双精度数组。该属性的数组长度必须等于 SeriesGrouping 属性的数组长度。该数组的每个元素都指定了 SeriesGrouping 属性数组中每个元素的独立电气模型的数量。该数组元素的值只能等于 1 或 NumParallelCells 属性的值。例如,如果模组由四个并联组件 (NumSeriesAssemblies
= 4)、每个并联组件 48 个软包电芯 (NumParallelCells
= 48) 和三个单独的电气模型组成,其中第一个模型由两个原始并联组件组成 (SeriesGrouping
= [2 1 1]),则将此属性设置为[1 1 48]
,则该模组将被离散为 50 个单独的电气模型,其中第四个并联组件的每个电芯都有一个电气模型。
为 ModuleAssembly
对象分配模型分辨率
ModuleAssembly
对象继承其电池模组的模型分辨率。
使用之前创建的 Module
对象创建一个 ModuleAssembly
对象。
module.ModelResolution = "Lumped"; lumpedModuleAssembly = batteryModuleAssembly(... repmat(module,1,2), ... InterModuleGap=simscape.Value(0.1,"m"));
然后,通过将名称-值参量 SimulationStrategyVisible
指定为 "on"
,可视化 ModuleAssembly
对象并检查模型分辨率。
f = figure("Color","white"); moduleAssemblyChart = batteryChart(f,lumpedModuleAssembly,SimulationStrategyVisible="on"); title(moduleAssemblyChart,"Module Assembly Grouped Simulation Strategy Chart")
ModuleAssembly
对象的 ModelResolution
属性自动设置为 "Lumped"
,因为其模组的 ModelResolution
属性设置为 "Lumped"
。
为 Pack
对象分配模型分辨率
Pack
对象继承其电池模组组件的模型分辨率。
使用 lumpedModuleAssembly
对象创建一个 Pack
对象。
lumpedPack = batteryPack(... repmat(lumpedModuleAssembly,1,4), ... StackingAxis="X",... InterModuleAssemblyGap=simscape.Value(0.01,"m"));
然后,通过将名称-值参量 SimulationStrategyVisible
指定为 "on"
,可视化 Pack
对象并检查模型分辨率。
f = figure("Color","white"); lumpedPackChart = batteryChart(f,lumpedPack,SimulationStrategyVisible="on"); title(lumpedPackChart,"Pack Lumped Simulation Strategy Chart")
Pack
对象的 ModelResolution
属性自动设置为 "Lumped"
,因为其模组组件的 ModelResolution
属性设置为 "Lumped"
。
为电池对象构建 Simscape 模型
创建电池对象后,您需要将它们转换为 Simscape 模型,才能在模块图中使用它们。然后,您可以将这些模型作为参考,用于系统集成和需求评估、冷却系统设计、控制策略开发、硬件在环等许多应用。
要创建一个包含此示例中所有电池对象的 Simscape Battery 模型库,请使用 buildBattery
函数。
buildBattery(lumpedPack,LibraryName="pouchPackExample",Verbose="off");
此函数在工作目录中创建 pouchPackExample_lib
和 pouchPackExample
SLX 库文件。pouchPackExample_lib
库包含模组和并联组件子库。
要访问 Module
和 ParallelAssembly
对象的 Simscape 模型,请打开 pouchPackExample_lib
SLX 文件,双击子库,然后将 Simscape 模块拖到模型中。
pouchPackExample
库包含 ModuleAssembly
和 Pack
对象的 Simscape 模型。
您的 ModuleAssembly
和 Pack
对象的 Simscape 模型是子系统。打开 packLibrary
SLX 文件并双击子系统,即可查看这些子系统的内部情况。