exponenta event banner

Пример - Аккумуляторный блок с неисправностью с использованием массивов

Обзор модели

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

Пример основан на примере литий-ионного аккумуляторного блока с отказом с использованием массивов. Чтобы открыть пример модели, введите ssc_lithium_battery_arrays в окне команд MATLAB ®.

Блок батарейного блока представляет собой составной компонент, моделирующий массив аккумуляторных элементов. Исходные файлы для этого примера находятся в следующей папке пакета:

matlabroot/toolbox/physmod/simscape/simscapedemos/+BatteryPack

где matlabroot - корневой каталог MATLAB на компьютере, возвращаемый путем ввода

matlabroot

в окне команд MATLAB.

+BatteryPack пакет содержит следующие файлы:

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

Связанные темы