Пример - Блок батарей с отказом с использованием массивов

Обзор модели

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

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

Похожие темы