从圆柱形电芯构建电池包的详细模型
此示例说明了如何在 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 对象
电池电芯是一种电化学储能装置,利用存储的化学能提供电能。电化学电池电芯是制造大型电池系统的基本构建模块。为了获得所需的能量和电压水平,通常以电气方式将多个电池电芯并联和/或串联。
为了满足电池包装和空间要求,您可以将电池电芯以三种主要几何排列方式进行排列:圆柱形、软包或棱柱形。要可视化单个电池电芯,必须先定义其几何形状。
使用 batteryCylindricalGeometry 函数定义圆柱体几何形状。
cylindricalGeometry = batteryCylindricalGeometry();
CylindricalGeometry 对象具有下面两个属性:
- Radius- 圆柱几何形状的半径,指定为- simscape.Value对象,该对象表示一个以长度为单位的标量。
- Height- 圆柱几何形状的高度,指定为- simscape.Value对象,该对象表示一个以长度为单位的标量。
为圆柱几何形状的 Radius 和 Height 属性指定自定义值。
cylindricalGeometry.Radius = simscape.Value(0.0105,"m"); cylindricalGeometry.Height = simscape.Value(0.07,"m");
有关电池电芯可能的几何排列的更多信息,请参阅 PouchGeometry 和 PrismaticGeometry 文档页。
为了反映现实世界中的行为,Simscape Battery™ Cell 对象是创建电池包系统模型的基础元素。要创建具有指定圆柱几何形状的电池电芯,请使用 batteryCell 函数,并将 cylindricalGeometry 对象指定为第一个参量。
cylindricalCell = batteryCell(cylindricalGeometry);
使用 Mass 属性指定电池电芯质量的自定义值。
cylindricalCell.Mass = simscape.Value(0.07,"kg");
disp(cylindricalCell)  Cell with properties:
            Geometry: [1×1 simscape.battery.builder.CylindricalGeometry]
    CellModelOptions: [1×1 simscape.battery.builder.CellModelBlock]
                Mass: 0.0700 (kg)
            Capacity: 5 (A*hr)
              Energy: 50 (W*hr)
Show all properties
使用 batteryChart 函数可视化电池电芯。在您想要可视化电池电芯的位置创建图形。
f = figure("Color","white");
然后使用 batteryChart 函数将电池电芯可视化。
cellChart = batteryChart(f,cylindricalCell);
title(cellChart,"Cylindrical Cell")
有关更多信息,请参阅batteryChart文档页。
默认情况下,Battery (Table-Based) 模块是用于在 Simscape 中表示和仿真电池电芯的电气和热模型。当扩展到更大的电池系统(如并联组件或模组)时,该模型也会根据模型分辨率进行相应扩展。要显示有关电芯模型模块的信息,请使用 batterycell 对象的 CellModelOptions 属性。
disp(cylindricalCell.CellModelOptions.CellModelBlockPath);
batt_lib/Cells/Battery (Table-Based)
通过 Cell 对象,还可以使用简单的一维模型仿真电池电芯的热效应。要仿真电池电芯的热效应,请在 Cell 对象的 CellModelOptions 属性的 BlockParameters 属性中,将 thermal_port  参数设置为 "model"。
cylindricalCell.CellModelOptions.BlockParameters.thermal_port = "model";您可以使用 CellModelOptions 属性修改 Battery (Table-Based) 模块的所有条件参数。
disp(cylindricalCell.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 对象
并联组件包括多个电池电芯,这些电池电芯在特定的拓扑配置或几何排列下电连接成并联。要创建并联组件,请使用 batteryParallelAssembly 函数。指定电芯为第一个参量,并指定并联电芯的数量为第二个参量。 
在此示例中,您将使用 48 个圆柱形电芯创建一个并联组件,这些电芯以方形拓扑结构堆叠成四行。
parallelAssembly = batteryParallelAssembly(... cylindricalCell,48,... Topology="Square", ... Rows=4, ... InterCellGap=simscape.Value(0.001,"m"));
Topology 属性是电芯格式的函数。对于圆柱形电芯,可用的拓扑结构为 "Hexagonal" 和 "Square"。默认情况下,ParallelAssembly 对象沿 Y 轴堆叠电芯。 
可视化电池并联组件。在您想要可视化电池并联组件的位置创建图形,然后使用 batteryChart 函数。
f = figure("Color","white"); parallelAssemblyChart = batteryChart(f,parallelAssembly); title(parallelAssemblyChart,"Parallel Assembly Chart")

创建并联组件后,您可以修改其内部的所有公共属性。例如,您可以将并联组件的拓扑设置为更节省空间的六边形配置。将 ParallelAssembly 对象的 Topology 属性设置为 "Hexagonal"。
parallelAssembly.Topology = "Hexagonal";可视化六角形并联组件。
f = figure("Color", "white"); parallelAssemblyChart = batteryChart(f,parallelAssembly); title(parallelAssemblyChart,"Parallel Assembly Chart")

您可以通过访问 PackagingVolume 和 CumulativeMass 属性来检查任何电池的电芯包装体积和质量。
disp(parallelAssembly.PackagingVolume)
0.0015 (m^3)
disp(parallelAssembly.CumulativeMass)
3.3600 (kg)
创建并可视化电池 Module 对象
电池模组由多个串联的并联组件组成。要创建一个模组,请使用 batteryModule 函数。指定并联组件作为第一个参量,并指定串联的并联组件数量作为第二个参量。您可以使用 StackingAxis 名称-值参量沿笛卡尔坐标系的 X 或 Y 轴堆叠或几何组件电池。
在此示例中,您使用四个并联组件创建了一个电池模组,这些组件沿 X 轴堆叠,每个组件之间的间隙为 0.0001 米。
module = batteryModule(... parallelAssembly,4, ... StackingAxis="X",... InterParallelAssemblyGap=simscape.Value(0.0001, "m"));
可视化电池 Module 对象。在您想要可视化电池模组的位置创建图形,然后使用 batteryChart 函数。
f = figure("Color", "white"); modulechart = batteryChart(f, module); title(modulechart, "Module Chart")

显示电池模组的总包装体积和累积质量。
disp(module.PackagingVolume)
0.0058 (m^3)
disp(module.CumulativeMass)
13.4400 (kg)
创建模组后,您可以修改该模组内部的所有公共属性。例如,修改并联组件之间的间隙,并检查此更改导致包装体积如何增加。将 Module 对象的 InterParallelAssemblyGap 属性设置为 0.005 m,并可视化该对象。
module.InterParallelAssemblyGap = simscape.Value(0.005,"m"); f = figure("Color","white"); moduleChart = batteryChart(f,module); title(moduleChart,"Module Chart")

现在检查电池模组的新包装体积。
disp(module.PackagingVolume)
0.0061 (m^3)
由于并联组件之间的间隙增加,包装体积随之增加。
将 InterParallelAssemblyGap 属性重置为其原始值。
module.InterParallelAssemblyGap = simscape.Value(0.001,"m");创建并可视化电池 ModuleAssembly 对象
电池模组组件由串联或并联的多个电池模组组成。要创建模组组件,请使用 batteryModuleAssembly 函数,并将模组指定为第一个参量。如果模组组件包含许多相同的模组,请使用 repmat 函数。否则使用不同模组的数组。
在此示例中,您使用两个相同的 Module 对象沿 Y 轴堆叠,每个模组之间的间隙为 0.005 米,创建了一个电池模组组件。默认情况下,以电气方式串联 ModuleAssembly 对象。
moduleAssembly = batteryModuleAssembly(... repmat(module,1,2), ... StackingAxis="Y",... InterModuleGap=simscape.Value(0.005, "m"), ... CircuitConnection="Series");
可视化电池 ModuleAssembly 对象。在您想要可视化电池模组组件的位置创建图形,然后使用 batteryChart 函数。
f = figure("Color","white"); moduleAssemblyChart = batteryChart(f,moduleAssembly); title(moduleAssemblyChart,"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。它定义了模组组件的层数、级数或楼层数。ModuleAssembly 对象根据组件中的层数和模组数以对称方式堆叠模组。 
例如,创建一个新的模组组件对象,该对象由四个沿 Z 轴在两个级别上堆叠的相同模组组成。
zStackedModuleAssembly = batteryModuleAssembly(... repmat(module,1,4), ... StackingAxis="Y",... NumLevel=2,... InterModuleGap=simscape.Value(0.01,"m"));
将 ModuleAssembly 对象 zStackedModuleAssembly 可视化。
f = figure("Color","white"); moduleAssemblyChart = batteryChart(f,zStackedModuleAssembly); title(moduleAssemblyChart,"Module Assembly Chart")

创建并可视化电池 Pack 对象
现在,您已经拥有创建电池包的所有基本元素。电池包由串联或并联的多个模组组件组成。要创建一个包,请使用 batteryPack 函数,并将模组组件指定为第一个参量。如果电池包由多个相同的模组组件组成,则使用 repmat 函数。否则,请使用不同模组组件的数组。 
在此示例中,您将创建一个由三个模组组件组成的电池包。第一个模组组件是沿 Z 轴堆叠的模组组件 zStackedModuleAssembly。另外两个模组组件是两个相同的模组组件。
pack = batteryPack(... [zStackedModuleAssembly,repmat(moduleAssembly,1,2)], ... StackingAxis="X",... InterModuleAssemblyGap=simscape.Value(0.005, "m"));
可视化电池 Pack 对象。在您想要可视化电池包的位置创建图形,并使用 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
您可以通过指定 BalancingStrategy 属性,使用 Pack 对象为电池包内的所有模组定义通用的电芯平衡策略。 
pack.BalancingStrategy = "Passive";在此级别修改此属性会自动修改电池包中所有底层模组组件内的相同属性。检查电池包内模组的平衡策略。
disp(pack.ModuleAssembly(1).Module(1).BalancingStrategy);
Passive
disp(pack.ModuleAssembly(1).Module(2).BalancingStrategy);
Passive
更新电池包中每个模组的 BalancingStrategy 属性,以反映您对 Pack 对象的 BalancingStrategy 属性应用的更改。 
使用 PackagingVolume 和 CumulativeMass 属性显示电池包的累积包质量和包装体积。
disp(pack.PackagingVolume)
0.0486 (m^3)
disp(pack.CumulativeMass)
107.5200 (kg)
修改电池对象的模型分辨率
ParallelAssembly 和 Module 对象具有一个 ModelResolution 属性,可用于设置仿真中使用的生成的 Simscape 模型的保真度。您可以将 ModelResolution 属性指定以下任何一种:
- Lumped- 保真度最低。电池对象只使用一个电气模型。要获得最短的编译时间和运行时间,请使用该值。
- Detailed- 保真度最高。电池对象针对每个电池电芯使用一个电气模型和一个热模型。
- Grouped- 自定义仿真策略,仅适用于- Module对象。
您可以使用函数 batteryChart 的属性 SimulationStrategyVisible 查看仿真策略。
修改 ParallelAssembly 对象的模型分辨率
ParallelAssembly 对象在创建时使用单个电池 Cell 对象作为基础重复单元。 
创建一个新的 ParallelAssembly 对象,其中包含您在本示例开头创建的电池电芯。默认情况下,ParallelAssembly 对象的 ModelResoultion 属性设置为 "Lumped"。
lumpedParallelAssembly = batteryParallelAssembly(... cylindricalCell,48, ... Rows=4, ... InterCellGap=simscape.Value(0.001,"m"));
通过将 SimulationStrategyVisible 属性设置为 "on",可视化 ParallelAssembly 对象并检查模型分辨率。
f = figure("Color","white"); lumpedParallelAssemblyChart = batteryChart(f,lumpedParallelAssembly,SimulationStrategyVisible="on");

只需一个电芯模型模块即可表示橙色框内的所有电芯组件。
如果将并联组件的 ModelResolution 属性设置为 "Detailed",则 ParallelAssembly 对象将实例化与 NumParallelCells 属性的值相等的电芯模型模块,并在 Simscape 中将它们并联连接。 

将上一个 ParallelAssembly 对象的模型分辨率更改为 Detailed",并使用名称-值参量 SimulationStrategyVisible(指定为 "on")的 BatteryChart 对象将其可视化。
detailedParallelAssembly = lumpedParallelAssembly; detailedParallelAssembly.ModelResolution = "Detailed"; f = figure("Color","white"); detailedParallelAssemblyChart = batteryChart(f,detailedParallelAssembly,SimulationStrategyVisible="on");

与 NumParallelCells 属性值相等的电芯模型块数代表每个电芯组件。
修改 Module 对象的模型分辨率
集总模组分辨率
默认情况下,模组和并联组件的模型分辨率设置为 "Lumped"。这意味着在 Simscape 中生成的电池模型仅使用一个电气模型来对系统中的所有电池电芯进行电气仿真。
查看集总模组分辨率在 Module 对象中的工作原理。创建一个 Module 对象,该对象由四个沿 X 轴堆叠的并联组件组成。 
lumpedModule = batteryModule(... lumpedParallelAssembly,4, ... StackingAxis="X",... InterParallelAssemblyGap=simscape.Value(0.0001,"m"));
通过将 SimulationStrategyVisible 名称-值对指定为 "on",可视化 Module 对象并检查模型分辨率。
f = figure("Color","white"); lumpedModuleChart = batteryChart(f,lumpedModule,SimulationStrategyVisible="on");

一个电芯模型可仿真橙色虚线框内的所有电芯。
将热边界条件添加到您的模组中。要定义环境的热路径,请将 AmbientThermalPath 属性设置为 "CellBasedThermalResistance"。
lumpedModule.AmbientThermalPath = "CellBasedThermalResistance";详细模组分辨率
现在,将之前对象 Module 的模型分辨率更改为 "Detailed",并使用函数 batteryChart 将名称-值对 SimulationStrategyVisible 指定为 "on" 进行可视化。
detailedModule = lumpedModule; detailedModule.ParallelAssembly.ModelResolution = "Detailed"; detailedModule.ModelResolution = "Detailed";
对于圆柱形模组,不建议使用详细的 模型分辨率,因为电芯数量较多,且模型总数应保持在 30 到 50 之间。
f = figure("Color","white"); detailedModuleChart = batteryChart(f,detailedModule,SimulationStrategyVisible="on");

与 NumParallelCells 属性值相等的电芯模型块数代表每个电芯组件。

在详细的电池模组中添加热边界条件。要定义冷却板的位置,请将 CoolingPlate  属性设置为 "Bottom"。
detailedModule.CoolingPlate = "Bottom";分组模组分辨率
对于电池模组,您也可以将 ModelResolution 属性设置为 "Grouped"。这种仿真策略有助于提高模型性能。
module.ModelResolution = "Grouped";当您将模组的 ModelResolution 属性设置为 "Grouped" 时,可以使用 SeriesGrouping 和 ParallelGrouping 属性定义一个附加的仿真策略:
- SeriesGrouping- 模组串联连接的自定义建模策略,指定为严格为正的双精度值数组。该属性的数组长度指定了所需的单个电气模型的数量。该数组的每个元素值都指定了指定电气模型中集总的并联组件数。数组中的元素之和必须等于 NumSeriesAssemblies 属性的值。例如,如果模组由四个并联组件组成 (- NumSeriesAssemblies= 4),并将此属性设置为- [2 1 1],则模组将被离散为三个单独的电气模型,其中第一个模型由两个原始并联组件组成。
module.SeriesGrouping = [1,2,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 对象。
lumpedModuleAssembly = batteryModuleAssembly(... repmat(lumpedModule,1,2), ... StackingAxis="Y",... InterModuleGap=simscape.Value(0.005,"m"));
然后,通过将名称-值对 SimulationStrategyVisible 指定为 "on",可视化 ModuleAssembly 对象并检查模型分辨率。
f = figure("Color","white"); lumpedModuleAssemblyChart = batteryChart(f,lumpedModuleAssembly,SimulationStrategyVisible="on"); title(lumpedModuleAssemblyChart,"Module Assembly Lumped Simulation Strategy Chart")

每个模组的模型分辨率保留为 "Lumped"。
为 Pack 对象分配模型分辨率
创建一个 Pack 对象将保留指定模组组件中的模组分辨率。
创建一个包含 moduleassemblylumped 对象的 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")

包中的每个模组的模型分辨率保留为 "Lumped"。
为电池对象构建 Simscape 模型
创建电池对象后,需要将其转换为 Simscape 模型,以便在模块图中使用。然后,您可以将这些模型作为参考,用于系统集成和需求评估、冷却系统设计、控制策略开发、硬件在环等许多应用。
要创建一个包含此示例中所有电池对象的 Simscape Battery 模型库,请使用 buildBattery 函数。
buildBattery(lumpedPack,LibraryName="cylindricalPackExample",Verbose="off");
此函数在工作目录中创建 cylindricalPackExample_lib 和 cylindricalPackExample SLX 库文件。cylindricalPackExample_lib 库包含模组和并联组件子库。 

要访问 Module 和 ParallelAssembly 对象的 Simscape 模型,请打开 cylindricalPackExample_lib SLX 文件,双击子库,然后将 Simscape 模块拖到模型中。
cylindricalPackExample 库包含 ModuleAssembly 和 Pack 对象的 Simscape 模型。

您的 ModuleAssembly 和 Pack 对象的 Simscape 模型是子系统。打开 packLibrary SLX 文件并双击子系统,即可查看这些子系统的内部情况。
有关更多信息,请参阅buildBattery文档页。