Этот пример объясняет, как можно использовать массивы компонентов для моделирования блока батарей, состоящего из нескольких последовательно соединенных камер. Это также показывает, как можно ввести отказ в одну из камер, чтобы увидеть влияние на эффективность батареи и температуру камеры. И количество камер, и положение неисправной камеры являются параметрами компонента верхнего уровня, изменяемыми пользователем блока.
Тематическое исследование основано на Блоке батарей 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. Параметры, изменяемые через блочный интерфейс, включают количество камер в блок батарей и положение неисправных камер. Пользователь блока может изменять параметры неисправной камеры, чтобы увидеть влияние отказа на эффективность батареи и температуру камеры.
