Это тематическое исследование объясняет, как можно использовать массивы компонента, чтобы смоделировать блок батарей, состоящий из нескольких подключенных последовательно ячеек. Это также показывает, как можно ввести отказ в одну из ячеек, чтобы видеть удар на производительность батареи и температуры ячейки. И количество ячеек и положение неработающей ячейки являются параметрами компонента верхнего уровня, модифицируемыми пользователем блока.
Тематическое исследование основано на Пакете литий-ионного аккумулятора С Отказом Используя пример Массивов. Чтобы открыть модель в качестве примера, введите ssc_lithium_battery_arrays
в командном окне MATLAB®.
Блок Battery Pack является составным компонентом, моделируя массив элементов батареи. Исходные файлы для этого примера находятся в следующей папке пакета:
matlabroot/toolbox/physmod/simscape/simscapedemos/+BatteryPack
где matlabroot
корневой каталог MATLAB на вашей машине, как возвращено путем ввода
matlabroot
в окне Команды MATLAB.
+BatteryPack
пакет содержит следующие файлы:
battery_cell.ssc
— Файл компонента, представляющий отдельный элемент батареи. Источник для этого компонента сгенерирован с помощью subsystem2ssc
от подсистемы Lithium Cell 1RC в Элементе батареи Lithium - Один пример Эквивалентной схемы Ветви RC.
battery_pack.ssc
— Составьте компонент, который моделирует блок батарей как массив battery_cell
компоненты.
component battery_pack % Battery Pack % This block models a scalable battery pack with faults using arrays. % Copyright 2019 The MathWorks, Inc. parameters Ncells = 20; % Number of series-connected cells cell_mass = {1, 'kg'}; % Cell mass cell_area = {0.1019, 'm^2'}; % Cell area h_conv = {5, 'W/(m^2 * K)'}; % Heat transfer coefficient cell_Cp_heat = {810.5328, 'J/(kg*K)'}; %Cell specific heat Qe_init = {15.6845, 'hr*A'}; %Initial cell charge deficit T_init = {293.15, 'K'}; % Initial cell temperature SOC_LUT = [0; .1; .25; .5; .75; .9; 1]; %SOC table breakpoints (Mx1 array) Temperature_LUT = {[278.15, 293.15, 313.15], 'K'}; %Temperature table breakpoints (1xN array) Capacity_LUT = {[28.0081, 27.625, 27.6392], 'hr*A'}; %Capacity (1xN table) Em_LUT = {[3.4966, 3.5057, 3.5148; 3.5519, 3.566, 3.5653; 3.6183, 3.6337, 3.6402; 3.7066, 3.7127, 3.7213; 3.9131, 3.9259, 3.9376; 4.0748, 4.0777, 4.0821; 4.1923, 4.1928, 4.193], 'V'}; %Em open-circuit voltage, Em (MxN table) R0_LUT = {[.0117, .0085, .009; .011, .0085, .009; .0114, .0087, .0092; .0107, .0082, .0088; .0107, .0083, .0091; .0113, .0085, .0089; .0116, .0085, .0089], 'Ohm'}; %R0 terminal resistance (MxN table) R1_LUT = {[.0109, .0029, .0013; .0069, .0024, .0012; .0047, .0026, .0013; .0034, .0016, .001; .0033, .0023, .0014; .0033, .0018, .0011; .0028, .0017, .0011], 'Ohm'}; %R1 cell resistance (MxN table) C1_LUT = {[1913.6, 12447, 30609; 4625.7, 18872, 32995; 23306, 40764, 47535; 10736, 18721, 26325; 18036, 33630, 48274; 12251, 18360, 26839; 9022.9, 23394, 30606], 'F'}; %C1 capacitance (MxN table) % Fault cell fault_cell_position = 10; %Fault cell position fault_cell_Capacity_LUT = {[28.0081, 27.625, 27.6392]*0.95, 'hr*A'}; %Fault cell capacity (1xN table) fault_cell_Em_LUT = {[3.4966, 3.5057, 3.5148; 3.5519, 3.566, 3.5653; 3.6183, 3.6337, 3.6402; 3.7066, 3.7127, 3.7213; 3.9131, 3.9259, 3.9376; 4.0748, 4.0777, 4.0821; 4.1923, 4.1928, 4.193]*0.90, 'V'}; %Fault cell Em open-circuit voltage, Em (MxN table) fault_cell_R0_LUT = {[.0117, .0085, .009; .011, .0085, .009; .0114, .0087, .0092; .0107, .0082, .0088; .0107, .0083, .0091; .0113, .0085, .0089; .0116, .0085, .0089]*5, 'Ohm'}; % Fault cell R0 terminal resistance (MxN table) fault_cell_R1_LUT = {[.0109, .0029, .0013; .0069, .0024, .0012; .0047, .0026, .0013; .0034, .0016, .001; .0033, .0023, .0014; .0033, .0018, .0011; .0028, .0017, .0011]*5, 'Ohm'}; % fault cell R1 cell resistance (MxN table) fault_cell_C1_LUT = {[1913.6, 12447, 30609; 4625.7, 18872, 32995; 23306, 40764, 47535; 10736, 18721, 26325; 18036, 33630, 48274; 12251, 18360, 26839; 9022.9, 23394, 30606]*0.95, 'F'}; % Fault cell C1 capacitance (MxN table) end nodes p = foundation.electrical.electrical; % +:top n = foundation.electrical.electrical; % -:bottom H = foundation.thermal.thermal; % H:bottom end variables(Access=protected) T = {ones(1,Ncells),'K'}; SOC = ones(1,Ncells); end outputs m = {ones(1,Ncells),'K'}; % m:top end for i =1:Ncells components(ExternalAccess=none) battery_cell(i) = BatteryPack.battery_cell(cell_mass=cell_mass,cell_Cp_heat=cell_Cp_heat,... C1_LUT=(if i==fault_cell_position,fault_cell_C1_LUT;else C1_LUT; end),... SOC_LUT=SOC_LUT,Temperature_LUT=Temperature_LUT,... Capacity_LUT=(if i==fault_cell_position,fault_cell_Capacity_LUT;else Capacity_LUT; end),... Em_LUT=(if i==fault_cell_position,fault_cell_Em_LUT;else Em_LUT; end),Qe_init=Qe_init,... R0_LUT=(if i==fault_cell_position,fault_cell_R0_LUT;else R0_LUT; end),... R1_LUT=(if i==fault_cell_position,fault_cell_R1_LUT;else R1_LUT; end),T_init.value=T_init); convection(i) = foundation.thermal.elements.convection(area=cell_area,heat_tr_coeff=h_conv); end connections connect(battery_cell(i).H,convection(i).B); connect(H,convection(i).A); end end connections connect(battery_cell(1).p,p); connect(battery_cell(Ncells).n,n); end equations assert(mod(Ncells, 1) == 0 && Ncells > 0, 'Number of series-connected cells must be a positive integer'); assert(mod(fault_cell_position, 1) == 0 && fault_cell_position > 0 && fault_cell_position <= Ncells , 'Fault cell position must be a positive integer less than or equal to Number of series-connected cells'); T == [battery_cell.T_init]; SOC == [battery_cell.SOC]; m == T; end for i=1:Ncells-1 components(ExternalAccess=none) conduction(i) = foundation.thermal.elements.conduction(area={1e-3,'m^2'},... th_cond={200,'W/(m*K)'}); end connections connect(battery_cell(i+1).p,battery_cell(i).n); connect(battery_cell(i).H,conduction(i).A); connect(battery_cell(i+1).H,conduction(i).B); end end end
Это схематичное представляет эквивалентную схему для составного компонента.
Составной компонент имеет два электрических узла, p
и n
, и один тепловой узел, H
:
nodes p = foundation.electrical.electrical; % +:top n = foundation.electrical.electrical; % -:bottom H = foundation.thermal.thermal; % H:bottom end
Компонент также имеет выход, m
, выводить температурные данные:
outputs m = {ones(1,Ncells),'K'}; % m:top end
Отказ представлен путем изменения параметров для одного из элементов батареи, сокращения и способности и напряжения разомкнутой цепи, и увеличения значений сопротивления.
Чтобы составлять отказ, верхний уровень составляет композит параметры, компонента разделены на две группы: типовые параметры и характерные для неработающей ячейки. Например, клеточная масса является тем же самым для всех ячеек. Однако емкость неработающей ячейки отличается от всех других ячеек, поэтому этому нужен отдельный fault_cell_Capacity_LUT
параметр, вместо типового Capacity_LUT
.
parameters Ncells = 20; % Number of series-connected cells cell_mass = {1, 'kg'}; % Cell mass cell_area = {0.1019, 'm^2'}; % Cell area h_conv = {5, 'W/(m^2 * K)'}; % Heat transfer coefficient cell_Cp_heat = {810.5328, 'J/(kg*K)'}; %Cell specific heat Qe_init = {15.6845, 'hr*A'}; %Initial cell charge deficit T_init = {293.15, 'K'}; % Initial cell temperature SOC_LUT = [0; .1; .25; .5; .75; .9; 1]; %SOC table breakpoints (Mx1 array) Temperature_LUT = {[278.15, 293.15, 313.15], 'K'}; %Temperature table breakpoints (1xN array) Capacity_LUT = {[28.0081, 27.625, 27.6392], 'hr*A'}; %Capacity (1xN table) Em_LUT = {[3.4966, ... 4.1928, 4.193], 'V'}; %Em open-circuit voltage, Em (MxN table) R0_LUT = {[.0117, ... .0085, .0089], 'Ohm'}; %R0 terminal resistance (MxN table) R1_LUT = {[.0109, ... .0017, .0011], 'Ohm'}; %R1 cell resistance (MxN table) C1_LUT = {[1913.6, ... 23394, 30606], 'F'}; %C1 capacitance (MxN table) % Fault cell fault_cell_position = 10; %Fault cell position fault_cell_Capacity_LUT = {[28.0081, 27.625, 27.6392]*0.95, 'hr*A'}; %Fault cell capacity (1xN table) fault_cell_Em_LUT = {[3.4966, ... 4.1928, 4.193]*0.90, 'V'}; %Fault cell Em open-circuit voltage, Em (MxN table) fault_cell_R0_LUT = {[.0117, ... .0085, .0089]*5, 'Ohm'}; % Fault cell R0 terminal resistance (MxN table) fault_cell_R1_LUT = {[.0109, ... .0017, .0011]*5, 'Ohm'}; % fault cell R1 cell resistance (MxN table) fault_cell_C1_LUT = {[1913.6, ... 23394, 30606]*0.95, 'F'}; % Fault cell C1 capacitance (MxN table) end
Оба количество ячеек, Ncells
, и положение неработающей ячейки, fault_cell_position
, параметры верхнего уровня составного компонента, что означает, что они будут модифицируемыми пользователем блока.
Объявите массив ячеек с числом элементов, заданным Ncells
параметр.
for i =1:Ncells components(ExternalAccess=none) battery_cell(i) = BatteryPack.battery_cell(cell_mass=cell_mass,cell_Cp_heat=cell_Cp_heat,... C1_LUT=(if i==fault_cell_position,fault_cell_C1_LUT;else C1_LUT; end),... SOC_LUT=SOC_LUT,Temperature_LUT=Temperature_LUT,... Capacity_LUT=(if i==fault_cell_position,fault_cell_Capacity_LUT;else Capacity_LUT; end),... Em_LUT=(if i==fault_cell_position,fault_cell_Em_LUT;else Em_LUT; end),Qe_init=Qe_init,... R0_LUT=(if i==fault_cell_position,fault_cell_R0_LUT;else R0_LUT; end),... R1_LUT=(if i==fault_cell_position,fault_cell_R1_LUT;else R1_LUT; end),T_init.value=T_init); end end
Для каждого члена сопоставьте его параметры параметрами верхнего уровня составного компонента. Для значения итератора, которое соответствует неработающему положению ячейки, задайте неработающие параметры ячейки вместо соответствующих типовых единиц по мере необходимости. Например, все ячейки имеют ту же клеточную массу:
cell_mass=cell_mass
Однако емкость неработающей ячейки отличается от всех других ячеек, поэтому, для значения итератора, которое соответствует неработающему положению ячейки, присвойте Capacity_LUT
параметр ячейки к fault_cell_Capacity_LUT
параметр составного компонента, и для всех других ячеек присваивает его Capacity_LUT
:
Capacity_LUT=(if i==fault_cell_position,fault_cell_Capacity_LUT;else Capacity_LUT; end)
Массив N
ячейки требуют N
идентичные конвекции и N-1
идентичные проводимости. Это тепловые компоненты от библиотеки Foundation.
for i =1:Ncells components(ExternalAccess=none) convection(i) = foundation.thermal.elements.convection(area=cell_area,heat_tr_coeff=h_conv); end end
for i=1:Ncells-1 components(ExternalAccess=none) conduction(i) = foundation.thermal.elements.conduction(area={1e-3,'m^2'},... th_cond={200,'W/(m*K)'}); end end
Используйте for
цикл, чтобы соединить все электрические узлы ячеек последовательно, путем соединения отрицательного порта каждой ячейки (кроме последней) к положительному порту следующей ячейки:
for i=1:Ncells-1 connections connect(battery_cell(i+1).p,battery_cell(i).n); end end
Затем соедините эту внутреннюю цепь с двумя электрическими узлами составного компонента:
connections connect(battery_cell(1).p,p); connect(battery_cell(Ncells).n,n); end
Используйте другой for
цикл, чтобы соединить тепловой узел H
из каждой из ячеек к узлу B
из его соответствующего компонента конвекции, и также соединять узлы A
из всех компонентов конвекции к тепловому узлу H
из составного компонента:
for i=1:Ncells connections connect(battery_cell(i).H,convection(i).B); connect(H,convection(i).A); end end
Наконец, включите тепловые элементы проводимости путем соединения узла A
к узлу H
из предыдущей ячейки и узла B
к узлу H
из следующей ячейки:
for i=1:Ncells-1 connections connect(battery_cell(i).H,conduction(i).A); connect(battery_cell(i+1).H,conduction(i).B); end end
Выходной порт физического сигнала, m
, выводит температурные данные для блока батарей как многомерный физический сигнал, состоявший из температурных данных для каждой ячейки. Размер вектора определяется Ncells
значение параметров.
outputs m = {ones(1,Ncells),'K'}; % m:top end
Чтобы получить температурные данные из массива компонентов, используйте equations
раздел. Объявите переменную T
как защищено, потому что общедоступные переменные не могут параметры ссылки, и затем использовать эту переменную, чтобы извлечь температурные значения из ячеек члена.
variables(Access=protected) T = {ones(1,Ncells),'K'}; end equations T == [battery_cell.T_init]; m == T; end
Индексируя в переменные компонента члена, battery_cell.T_init
, возвращает список, разделенный запятыми. Можно затем конкатенировать список, разделенный запятыми в числовой массив, [battery_cell.T_init]
, и используйте его в уравнениях компонента. Для получения дополнительной информации смотрите, Как Использовать Списки, разделенные запятыми (MATLAB).
Блок Battery Pack, сгенерированный от этого составного компонента, имеет два электрических порта, + и -, тепловой порт, H, и выходной порт физического сигнала, m. Параметры, модифицируемые через интерфейс блока, включают количество ячеек в блоке батарей и положении неработающей ячейки. Пользователь блока может изменить параметры неработающей ячейки, чтобы видеть удар отказа на производительности батареи и температурах ячейки.