Тематическое исследование — блок батарей с отказом Используя массивы

Обзор модели

Это тематическое исследование объясняет, как можно использовать массивы компонента, чтобы смоделировать блок батарей, состоящий из нескольких подключенных последовательно ячеек. Это также показывает, как можно ввести отказ в одну из ячеек, чтобы видеть удар на производительность батареи и температуры ячейки. И количество ячеек и положение неработающей ячейки являются параметрами компонента верхнего уровня, модифицируемыми пользователем блока.

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

Похожие темы