Этот пример объясняет, как можно использовать массивы компонентов для моделирования блока батарей, состоящего из нескольких последовательно соединенных камер. Это также показывает, как можно ввести отказ в одну из камер, чтобы увидеть влияние на эффективность батареи и температуру камеры. И количество камер, и положение неисправной камеры являются параметрами компонента верхнего уровня, изменяемыми пользователем блока.
Тематическое исследование основано на Блоке батарей Lithium-Ion с отказом с использованием Массивов примера. Чтобы открыть модель примера, введите ssc_lithium_battery_arrays
в MATLAB® Командное окно.
Блок Battery Pack является составным компонентом, моделирующим массив элементов батареи. Исходные файлы для этого примера находятся в следующей папке пакета:
matlabroot/toolbox/physmod/simscape/simscapedemos/+BatteryPack
где matlabroot
- корневая директория MATLAB на вашем компьютере, возвращенный путем ввода
matlabroot
в Командном Окне MATLAB.
The +BatteryPack
пакет содержит следующие файлы:
battery_cell.ssc
- Файл компонента, представляющий отдельный элемент батареи. Источник для этого компонента генерируется с помощью subsystem2ssc
из подсистемы Lithium Cell 1RC в примере Lithium Battery Cell - One RC-Branch Equivalent Circuit.
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]
, и используйте его в уравнениях компонента. Дополнительные сведения см. в разделе «Как использовать разделенные списками , разделенными запятыми».
Блок Battery Pack, сгенерированный из этого составного компонента, имеет два электрических порта, + и -, тепловой порт, H и выход физического сигнала, m. Параметры, изменяемые через блочный интерфейс, включают количество камер в блок батарей и положение неисправных камер. Пользователь блока может изменять параметры неисправной камеры, чтобы увидеть влияние отказа на эффективность батареи и температуру камеры.