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

Подсистема Двигатель содержит блок 2-D Lookup Table, который интерполирует крутящий момент
двигателя в зависимости от положения дросселя
и скорости вращения двигателя.
Входными сигналами подсистемы являются
Момент на турбинном колесе и степень
открытия дроссельной заслонки Газ, а выходным - Угловая скорость вала двигателя.
Для отображения скоростной характеристики двигателя
зададим следующие переменные:
thvec = [0, 20, 30, 40, 50, 60, 70, 80, 90, 100]; # Степень открытия дроссельной заслонки, %
nevec = [800, 1200, 1600, 2000, 2400, 2800, 3200, 3600, 4000, 4400, 4800]; # Скорость вращения двигателя, об/мин
emap = [-40 -44 -49 -53 -57 -61 -65 -70 -74 -78 -82; # Крутящий момент двигателя, фут-фунт
215 117 85 66 44 29 10 -2 -13 -22 -32;
245 208 178 148 122 104 85 66 48 33 18;
264 260 241 219 193 167 152 133 119 96 85;
264 279 282 275 260 238 223 208 189 171 152;
267 290 293 297 290 275 260 256 234 212 193;
267 297 305 305 305 301 293 282 267 249 226;
267 301 308 312 319 323 319 316 297 279 253;
267 301 312 319 327 327 327 327 312 293 267;
267 301 312 319 327 334 334 334 319 305 275];
emap_SI = emap * 0.7376; # Крутящий момент двигателя, Н*м
Теперь отобразим скоростную характеристику двигателя:
import Pkg
Pkg.add("Plots") # Добавление пакета PLots
using Plots
plt = plot(title="Скоростная характеристика двигателя", xlabel="Угловая скорость, об/мин", ylabel="Крутящий момент, Н*м", legend=:outertopright)
for i in 1:length(thvec)
plot!(nevec, emap_SI[i, :], label="Дроссель $(thvec[i])%", grid=true)
end
display(plt)
Подсистема Коробка переключения передач, в свою очередь, состоит
из двух других подсистем: Гидротрансформатора и Передаточного
числа коробки переключения передач.
Входными сигналами подсистемы являются
Угловая скорость вала двигателя, Номер передачи
и Угловая скорость вала коробки передач, а выходными - Момент на турбинном колесе и Выходной момент.
Модель гидротрансформатора содержит блоки 1-D Lookup
Table
FactorK и TorqueRatio, которые интерполируют значения коэффициента момента
входного звена и коэффициента передачи крутящего момента соответственно в зависимости от кинематического
передаточного отношения Nin/Ne.
Для отображения характеристик гидротрансформатора
зададим следующие переменные:
kfactor = [137.4652089938063, 137.065019156851974, 135.864449645989055, 135.664354727511892, # Коэффициент момента входного звена
137.565256453044867, 140.366585311725089, 145.268910814415392, 152.87251771654735,
162.977311099643742, 164.277928069745201, 166.178829795278233, 167.979684061572641,
170.080680705582751, 172.781962105024377, 175.383196045227407, 179.585189333247655,
183.587087702790825, 189.89007763482121, 197.693779455430274, 215.902417036851546,
244.515990379084855, 301.7431370635518, 330.35671040578524];
speedratio = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.81, 0.82, 0.83, # Кинематическоге передаточное отношение
0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.92, 0.94, 0.98, 1];
torqueratio = [2.232, 2.075, 1.975, 1.846, 1.72, 1.564, 1.409, 1.254, 1.096, # Коэффициент передачи крутящего момента
1.08, 1.061, 1.043, 1.028, 1.012, 1.002, 1.002, 1.001, 0.998,
0.999, 1.001, 1.002, 0.97, 0.9];
Теперь отобразим характеристику гидротрансформатора:
using Plots.PlotMeasures
efficiency = speedratio .* torqueratio # КПД
p1 = plot(speedratio, efficiency,
xlabel="Nin/Ne",
ylabel="КПД",
linewidth=2,
color=:green,
label="КПД",
left_margin=10mm,
top_margin=10mm)
p2 = plot(speedratio, torqueratio,
xlabel="Nin/Ne",
ylabel="Коэффициент трансформации",
linewidth=2,
color=:blue,
label="Коэффициент трансформации")
plot(p1, p2, layout=(2,1), bottom_margin=10mm, size=(500, 800), legend=:outertopright)
Данная подсистема также содержит блок 1-D Lookup Table
Table, который определяет значение Nin/Nout в зависимости от номера передачи Gear.
Gear = [1, 2, 3, 4];
Ratio = [2.393, 1.450, 1.000, 0.677];
Представим эту зависимость в виде таблицы:
println("Gear Ratio")
println("----------------")
for (g, r) in zip(Gear, Ratio)
println(lpad(g, 4), " ", lpad(r, 5))
end

Подсистема Алгоритм переключения передач
содержит блоки Chart
Состояние текущей передачи и Переключение передач из библиотеки Конечных автоматов,
а также подсистему Расчет пороговой скорости движения.
Входными сигналами подсистемы являются степень открытия дроссельной заслонки
Газ и Скорость автомобиля, а выходным - Номер передачи.
Данная диаграмма представлена четырьмя состояниями
в соответствии с количеством передач, переключение
между которыми происходит посредством сигнала gear_state_change.
При переходе в новое состояние значение выходной переменной Gear
обновляется.
Подсистема Расчет пороговой скорости движения
состоит из двух блоков 2-D Lookup Table, которые
определяют текущие верхние up_th и нижние down_th
значения пороговой скорости.
Зададим эти зависимости:
UP_TH_BP = [0,25,35,50,90,100]; # Степень открытия дроссельной заслонки, %
UP_TABLE = [10 30 50 1000000; # Значение верхней пороговой скорости, мили/ч
10 30 50 1000000;
15 30 50 1000000;
23 41 60 1000000;
40 70 100 1000000;
40 70 100 1000000];
UP_TABLE_kmph = UP_TABLE*1.609; # Значение верхней пороговой скорости, км/ч
DOWN_TH_BP = [0,5,40,50,90,100]; # Степень открытия дроссельной заслонки, %
DOWN_TABLE = [0 5 20 35; # Значение нижней пороговой скорости, мили/ч
0 5 20 35;
0 5 25 40;
0 5 30 50;
0 30 50 80;
0 30 50 80];
DOWN_TABLE_kmph = DOWN_TABLE*1.609; # Значение нижней пороговой скорости, км/ч
Построим графики зависимости скорости автомобиля
от степени открытия дроссельной заслонки при всех возможных
переключениях передач:
plt = plot(xlabel="Степень открытия дроссельной заслонки, %",
ylabel="Скорость автомобиля, км/ч",
legend=:outertopright)
for i in 1:(length(Gear)-1)
plot!(UP_TH_BP, UP_TABLE_kmph[:, i],
label="Переключение передачи $(Gear[i])-$(Gear[i+1])",
grid=true,
markershape=:utriangle,
markersize=5,
markerstrokewidth=1.5)
end
for i in 2:(length(Gear))
plot!(DOWN_TH_BP, DOWN_TABLE_kmph[:, i],
label="Переключение передачи $(Gear[i])-$(Gear[i-1])",
grid=true,
markershape=:dtriangle,
markersize=5,
markerstrokewidth=1.5)
end
display(plt)
Данная диаграмма содержит три состояния: исходное
состояние steady_state, повышение передачи upshifting и
понижение передачи downshifting. Переключение между состояниями
зависит от текущей скорости автомобиля VehicleSpeed и пороговых значений скорости
движения up_th и down_th: при превышении верхнего порогового значения выходной
сигнал gear_state_change принимает значение 1, соответствующее
повышению передачи, при снижении скорости ниже нижнего порогового значения
сигнал gear_state_change принимает значение -1, соответствующее
понижению передачи.
Подсистема Автомобиль содержит модель
изменения Скорости автомобиля и Угловой скорости вала коробки передач. Входными сигналами
являются Выходной момент коробки переключения передач
и Тормоз.
Блок Сценарии движения является маскированным
блоком Engee Function.
Блок позволяет выбрать сценарии изменения управляющих сигналов
Газ и Тормоз из предложенных вариантов:
Для выполнения симуляции модели зададим значения остальных переменных:
Iei = 0.021991;
Rfd = 3.23;
Iv = 12.094;
N20 = 0;
rload0 = 40;
rload2 = 0.02;
TWAIT = 2;
Rw = 1;
Далее запустим симуляцию модели:
if "autotrans" in [m.name for m in engee.get_all_models()]
m = engee.open( "autotrans" )
else
m = engee.load( "autotrans.engee" )
end
results = engee.run(m, verbose=true)
t = results["Газ"].time; # Время, с
Throttle = results["Газ"].value; # Степень открытия дроссельной заслонки, %
Ne = results["Угловая скорость вала двигателя"].value; # Угловая скорость вала двигателя, об/мин
VehicleSpeed = results["Скорость автомобиля"].value*1.609; # Скорость автомобиля, км/ч
Наконец, построим графики результата симуляции:
using Plots.PlotMeasures
p1 = plot(t, Ne,
xlabel="Время, с",
ylabel="Угловая скорость вала двигателя, об/мин",
linewidth=2,
color=:green,
label="Угловая скорость вала двигателя")
p2 = plot(t, Throttle,
xlabel="Время, с",
ylabel="Газ, %",
linewidth=2,
color=:blue,
label="Газ")
p3 = plot(t, VehicleSpeed,
xlabel="Время, с",
ylabel="Скорость автомобиля, км/ч",
linewidth=2,
color=:red,
label="Скорость автомобиля")
plot(p1, p2, p3, layout=(3,1), left_margin=10mm, size=(800, 1000), bottom_margin=10mm, legend=:outertopright)