Документация Engee
Notebook

Разряд-заряд батареи

В данном примере продемонстрирована симуляции модели аккумуляторной батареи номинальным напряжением 300 В и емкостью 100 А∙ч. Этот демо-пример служит отправной точкой, если вы хотите смоделировать:

  • подсистему накопления СНЭ
  • блок управления зарядом аккумуляторной ячейкой (BMS)
  • тяговую литий-ионную батарею электромобиля

В модели используется реалистичный профиль нагрузки звена постоянного тока, который определяется динамическим циклом движения электромобиля. Общее время моделирования составляет 3600 секунд.

Общий вид модели

В основе модели лежит библиотечный блок Battery (https://engee.com/helpcenter/stable/fmod-electricity-sources/battery.html). Кроме электрических портов, у блока Battery есть еще и тепловой порт для моделирования тепловых эффектов. Их важно учитывать при разработке систем управления, т.к. при критическом увеличении температуры может произойти тепловой разгон, самовозгорание или взрыв. Как вы видите, модель состоит из нескольких сетей, находящихся в разных физических областях — тепловой и электрической.

hv_battery.png

Батарея подключена к реалистичному профилю нагрузки звена постоянного тока, который имитируется с помощью блока From Workspace (https://engee.com/helpcenter/stable/base-lib-sources/from-workspace.html). Данный блок передает в модель график нагрузки в виде сигнала i = f(t) к управляемому источнику тока.

Реализация запуска модели с помощью программного управления:

Загрузка нужных библиотек для импорта зависимости тока от времени:

In [ ]:
using DataFrames
using MAT
gr()
Out[0]:
Plots.GRBackend()

Чтение mat-файла и преобразование в WorkspaceArray для использования в блоке From Workspace:

In [ ]:
vars = matread("I_dc_discharge.mat");
data = vars["array"];
t = data[:,1];
current = data[:,2];
df = DataFrame(time=t, value=current);
I_dc = WorkspaceArray(string(rand()), df);
In [ ]:
vars = matread("I_dc_discharge.mat");
data = vars["array"];
t = data[:,1];
current = data[:,2];
df = DataFrame(time=t, value=current);
I_dc = WorkspaceArray(string(rand()), df);

Загрузка модели:

In [ ]:
model_name = "HV_battery"
model_name in [m.name for m in engee.get_all_models()] ? engee.open(model_name) : engee.load( "$(@__DIR__)/$(model_name).engee");

Запуск загруженной модели:

In [ ]:
results = engee.run(model_name)
Out[0]:
Dict{String, DataFrame} with 4 entries:
  "Напряжение, В"          => 360001×2 DataFrame…
  "Температура батареи,°C" => 360001×2 DataFrame…
  "Ток, А"                 => 360001×2 DataFrame…
  "Заряд батареи, %"       => 360001×2 DataFrame

Результаты моделирования

Импорт результатов моделирования:

In [ ]:
simulation_time = results["Напряжение, В"].time;
i = results["Ток, А"].value;
v = results["Напряжение, В"].value;
temperature = results["Температура батареи,°C"].value;
charge = results["Заряд батареи, %"].value;

Заряд батареи на временном промежутке от 0 до 500 секунд:

In [ ]:
plot(simulation_time[1:50000], charge[1:50000])
plot!(title = "Заряд батареи, %", ylabel = "Заряд батареи, %", xlabel="Время, c")
Out[0]: