Документация 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]:

Ток нагрузке на временном промежутке от 0 до 500 секунд:

In [ ]:
plot(simulation_time[1:50000], i[1:50000])
plot!(title = "Ток, А", ylabel = "Ток, А", xlabel="Время, c")
Out[0]:

В процессе симуляции батарея не только разряжается, но и заряжается, если ток нагрузки имеет обратное направление. Такое поведение встречается при функционировании СНЭ при сглаживании колебаний нагрузки или же при разгоне-торможении электромобиля.

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

In [ ]:
plot(simulation_time[1:50000], v[1:50000])
plot!(title = "Напряжение, В", ylabel = "Напряжение, В", xlabel="Время, c")
Out[0]:

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

In [ ]:
plot(simulation_time[1:50000], temperature[1:50000])
plot!(title = "Tемпература,°C", ylabel = "Tемпература,°C", xlabel="Время, c")
Out[0]:

Выводы:

В данном примере были использованы инструменты для командного управления моделью аккумуляторной батареи с длительностью моделирования в 1 час. Профиль нагрузки батареи был импортирован в Рабочую область из mat-файла. Результаты симуляций были импортированы в скрипт и визуализированы для заданного временного промежутка с помощью интерактивных графиков библиотеки Plots.

Блоки, использованные в примере