В этом примере объясняется, как можно использовать массивы компонентов для моделирования батарейного блока, состоящего из нескольких последовательно соединенных ячеек. Также показано, как можно ввести неисправность в один из элементов, чтобы увидеть влияние на производительность батареи и температуру элемента. И количество ячеек, и положение неисправной ячейки являются параметрами компонента верхнего уровня, изменяемыми пользователем блока.
Пример основан на примере литий-ионного аккумуляторного блока с отказом с использованием массивов. Чтобы открыть пример модели, введите ssc_lithium_battery_arrays в окне команд MATLAB ®.
Блок батарейного блока представляет собой составной компонент, моделирующий массив аккумуляторных элементов. Исходные файлы для этого примера находятся в следующей папке пакета:
matlabroot/toolbox/physmod/simscape/simscapedemos/+BatteryPack
где matlabroot - корневой каталог MATLAB на компьютере, возвращаемый путем ввода
matlabroot
в окне команд MATLAB.
+BatteryPack пакет содержит следующие файлы:
battery_cell.ssc - файл компонента, представляющий отдельный аккумуляторный элемент. Источник для этого компонента создается с помощью subsystem2ssc из подсистемы 1RC литиевых элементов в примере эквивалентной схемы с одним 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]и использовать его в уравнениях компонентов. Дополнительные сведения см. в разделе Использование списков, разделенных запятыми.
Блок батарейного блока, генерируемый из этого составного компонента, имеет два электрических порта, + и -, тепловой порт, H, и порт вывода физического сигнала, м. Параметры, изменяемые через блочный интерфейс, включают в себя количество элементов в батарейном блоке и положение неисправного элемента. Пользователь блока может изменить параметры неисправного элемента, чтобы увидеть влияние отказа на производительность батареи и температуру элемента.
