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

Моделирование движения электромобиля по циклу WLTC

В данном примере будет продемонстрировано моделирование движения электромобиля по ездовому циклу WLTC. Параметры автомобиля, электрической и механической систем повторяют характеристики электромобиля подобного Nissan Leaf.

Описание параметров и структуры модели

Движение электромобиля и его инерционность описываются блоком Электромобиль. На левый порт этого блока приходит результирующее усилие от двух пар колёс, соединённых с редукторами и электродвигателями, преобразующими и создающими крутящий момент. В блоке также рассчитывается сила сопротивления воздуха.

Основные параметры модели:

Название блока Основной параметр
Электромобиль Масса 1000 кг
Батарея Напряжение 390 В
Электродвигатели Постоянная крутящего момента 4 Нм/А
Колёса Радиус 0,32 м
Дифференциалы Передаточное отношение 0,5
Коэффициент сопротивления воздуха 0.28

Схема модели:

electrocar_disc_brake_drive_mod_1_1739965487918.png

Блок Электромобиль

Схема подсистемы Электромобиль:

electrocar_disc_brake_drive_mod_1_1740063224412_2.png

Сила сопротивления воздуха в данной подсистеме определяется по формуле:

$$F_d = \frac{1}{2} C_x \rho S v^2,$$

где: $Cx$ - коэффициент лобового сопротивления, $\rho$ - плотность воздуха, $кг/м^3$, $S$ - площадь миделя (наибольшая площадь поперечного сечения объекта, перпендикулярная направлению движения), $м^2$, $v$ - скорость электромобиля.

Основные параметры, определяемые в подсистеме Электромобиль:

image_2.png

Схема подсистемы Водитель:

electrocar_disc_brake_drive_mod_1_1740063684238.png

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

Схема подсистемы Тормозная система:

electrocar_disc_brake_drive_mod_1_1740068897907.png

Подсистема состоит из 4-х тормозных дисков. Входной сигнал, поступающий на порт P, определяет давление в тормозной системе, порт S передаёт тормозной момент на каждое из колёс.

Блок WLTC

Блок WLTC представляет собой блок From Workspace в который, из обратных вызовов модели, поступают данные о ездовом цикле WLTC, преобразованные из формата XLSX.

Определение функции для загрузки и запуска модели:

In [ ]:
function start_model_engee()
    try
        engee.close("electric_vehicle_performance", force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load("$(@__DIR__)/electric_vehicle_performance.engee") # загрузка модели
        end;

    try
        engee.run(m) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load("$(@__DIR__)/electric_vehicle_performance.engee") # загрузка модели
            engee.run(m) # запуск модели
        end
end
Out[0]:
start_model_engee (generic function with 1 method)

Запуск симуляции

In [ ]:
start_model_engee() # запуск симуляции с помощью специальной функции, реализованной выше
Out[0]:
SimulationResult(
    "Крутящий момент электродвигателя" => WorkspaceArray("electric_vehicle_performance/Расчёт мощности/Крутящий момент электродвигателя"),
    "Скорость в км/ч" => WorkspaceArray("electric_vehicle_performance/Электромобиль/Скорость в км/ч"),
    "Мощность электродвигателя, кВт" => WorkspaceArray("electric_vehicle_performance/Расчёт мощности/Мощность электродвигателя, кВт"),
    "WLTC.1" => WorkspaceArray("electric_vehicle_performance/WLTC.1"),
    "Тормозной момент, Н*м" => WorkspaceArray("electric_vehicle_performance/Тормозная система/Тормозной момент, Н*м"),
    "Частота вращения электродвигателя" => WorkspaceArray("electric_vehicle_performance/Расчёт мощности/Частота вращения электродвигателя"),
    "Перемещение в км" => WorkspaceArray("electric_vehicle_performance/Электромобиль/Перемещение в км"),
    "Сила сопротивления воздуха" => WorkspaceArray("electric_vehicle_performance/Электромобиль/Сила сопротивления воздуха"),
    "Заряд батареи" => WorkspaceArray("electric_vehicle_performance/Заряд батареи"),
    "From-2.1" => WorkspaceArray("electric_vehicle_performance/From-2.1"),
    "Сила со стороны трансмиссии" => WorkspaceArray("electric_vehicle_performance/Электромобиль/Сила со стороны трансмиссии")
)

Запись из simout в переменные сигналов, полученных в ходе симуляции (данных много, процесс может занимать около 4-х минут):

In [ ]:
t = simout["electric_vehicle_performance/Электромобиль/Скорость в км/ч"].time[:]; # время
T = simout["electric_vehicle_performance/Расчёт мощности/Крутящий момент электродвигателя"].value[:]; # крутящий момент электродвигателя
speed = simout["electric_vehicle_performance/Электромобиль/Скорость в км/ч"].value[:]; # скорость автомобиля
forces_left = simout["electric_vehicle_performance/Электромобиль/Сила со стороны трансмиссии"].value[:]; # силы, действующие на автомобиль со стороны трансмиссии 
forces_right = simout["electric_vehicle_performance/Электромобиль/Сила сопротивления воздуха"].value[:]; # силы, действующие на автомобиль со стороны окружающей среды
w = simout["electric_vehicle_performance/Расчёт мощности/Частота вращения электродвигателя"].value[:]; # частота вращения электродвигателя
q = simout["electric_vehicle_performance/Заряд батареи"].value[:]; # заряд батареи
P = simout["electric_vehicle_performance/Расчёт мощности/Мощность электродвигателя, кВт"].value[:]; # мощность электродвигателя
WLTC1 = simout["electric_vehicle_performance/WLTC.1"].value[:]; # цикл WLTC
pos = simout["electric_vehicle_performance/Электромобиль/Перемещение в км"].value[:]; # перемещение электромобиля
;

Визуализация результатов моделирования

Запуск библиотеки для построения графиков:

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

Построение графиков сил, действующих на электромобиль и его скорости:

In [ ]:
p1 = plot(t, forces_left, label="Усилие от трансмиссии, Н", linewidth=2)
p2 = plot(t, forces_right, label="Сопротивление воздуха, Н", linewidth=2, linecolor=2)
p3 = plot(t, speed, label="Скорость, км/ч", linewidth=2, linecolor=3)
plot(p1, p2, p3, layout=(3,1))
Out[0]:

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

Построение графиков крутящего момента, частоты вращения и мощности электродвигателя:

In [ ]:
p1 = plot(t, T, label="Крутящий момент, Н*м", linewidth=2)
p2 = plot(t, (w * 9.55), label="Частота вращения, об/мин", linewidth=2, linecolor=2)
p3 = plot(t, (T .* w ./1000), label="Мощность, кВт", linewidth=2, linecolor=3)
plot(p1, p2, p3, layout=(3,1))
Out[0]:

По мере разгона автомобиля уменьшается крутящий момент и увеличивается скорость вращения электродвигателя. Механическая мощность, производимая этим электродвигателем, возрастает, поскольку растёт и сила сопротивления воздуха, в зависимости от скорости.

Мощность электродвигателя рассчитывается по формуле: $$P = \frac {M*w}{1000}, $$

где $M$ - крутящий момент, в $Н \cdot м$, а $w$ - частота вращения, в $\frac {рад}{с}$.

График измеренной и заданной скорости:

In [ ]:
plot(t, speed, label="Измеренная скорость, км/ч", linewidth=2)
plot!(t, WLTC1, label="Заданная скорость, км/ч", linewidth=2)
Out[0]:

По графику видно что электромобиль с небольшими отклонениями придерживается заданной скорости. Уменьшить эти отклонения можно с помощью более тонкой настройки регуляторов в блоке Водитель.

Графики перемещения электромобиля и заряда батареи:

In [ ]:
p1 = plot(t, pos, label="Перемещение электромобиля, км", linewidth=2)
p2 = plot(t, (q * 0.0002777777777778), label="Заряд батареи, А*ч", linewidth=2)
plot(p1, p2, layout=(2,1))
Out[0]:

Анализируя графики заряда батареи и перемещения электромобиля, можно подсчитать, сколько было затрачено энергии на преодоление пути:

In [ ]:
println("Энергия, затраченная на один ездовой цикл: ", round(maximum(q * 0.000277) - minimum(q * 0.000277), digits=3), " А*ч")
Энергия, затраченная на один ездовой цикл: 20.83 А*ч

Путём несложных расчётов можно оценить дальность езды электромобиля на одном полном заряде батареи:

In [ ]:
total_tange = maximum(q * 0.000277) / (maximum(q * 0.000277) - minimum(q * 0.000277)) * maximum(pos)
println("Запас хода электромобиля: ", round(total_tange, digits=3), " км")
println("Удельный расход энергии: ", maximum(q * 0.000277) / total_tange, " А*ч/км")
Запас хода электромобиля: 111.33 км
Удельный расход энергии: 0.9136257264575948 А*ч/км

Вывод:

В данном примере продемонстрировано моделирование движения электромобиля по ездовому циклу WLTC. Проведены расчёты производительности, в частности запаса хода и удельного расхода энергии. Модель может быть уточнена путём дополнительной параметризации блоков и с помощью настройки регуляторов. Также в блок From Workspace могут быть загружены другие ездовые циклы, с помощью которых можно оценить производительность электромобиля в разных условиях.

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