Запускаем стенд испытаний коробок передач
После просмотра «Форд против Феррари» мы с женой вышли из кинотеатра под первый снег ноябрьским вечером. Глаза у меня горели, руки чесались. И пронеслась мысль: «Вот это да! Вот бы что-то такое поизобретать. Всякое инженерное, чтоб рёв мотора, гарь бензина и масло во все стороны!».
И, вы не поверите, на следующий же день натыкаюсь на объявление в газете: нужен человек для программирования стенда испытаний коробок передач.
Недолго думая, без демонстрации разукрашенных резюме, я позвонил. Буквально на коленке прикинув желания и возможности, мы сразу же договорились о встрече в ангаре-лаборатории.
Меня подвёз владелец фирмы по ремонту больших автокранов и всякой сверхтяжёлой техники. Сам стенд испытаний был уже почти готов:
Работа стенда должна была заключаться в пошаговой отладке коробки переключения передач (далее КПП), чтобы выявлять протечки масла, всякие баги и другие неприятности. Сердцем стенда был ПЛК, с помощью него нужно симулировать работу блока автоматического переключения передач. И ещё асинхронный двигатель с частотным преобразователем — это вместо двигателя внутреннего сгорания.
Ну, что ж, задача ясна (подумал я тогда).
Домой меня подвёз один из сотрудников. На вопрос, где применяются такие краны, он ответил:
— Представь себе промышленный ветрогенератор, как, например, в ростовской области, в Европе… Да у него одна лопасть весит двенадцать тонн, а сам генератор — больше пятидесяти! Манипулятору с таким не справиться.
Ну, и, кроме того, чтобы отремонтировать такой кран, нужен… другой такой же кран, ho-ho-ho!
Вечером вместо совместного с женой просмотра сериалов Интернет открыл для ̶н̶а̶с̶ меня дивный мир коробок передач.
Коробка передач — что ты такое?
Коробки, о которых пойдёт речь, произведены компанией ZF (в оригинале «Zahnradfabrik Friedrichshafen», но сокращено до аббревиатуры ZF в связи с тем, что (как оказалось) для иностранцев название было совершенно непроизносимым). Это немецкий производитель запчастей для автомобилей, тракторов, поездов и даже самолетов. Кстати, праотцом-основателем ZF считается Фердинанд Адольф Август Цеппелин. Да-да, тот самый Цеппелин, создавший в своё время целую отрасль дирижаблестроения.
Первые КПП применяли как раз для дирижаблей, а позже они начали появляться во всевозможных транспортных средствах, в том числе и в автокранах.
Нам этом историческая ремарка заканчивается, и перейдём к делу. Будем рассматривать КПП ZF 4WG210 на стыке программирования и жестокой реальности.
Ожидание:
int gearBox(int engine_speed, int gear)
{
/* Скорость на выходе КПП равна
* произведению скорости двигателя на передачу
*/
return engine_speed * gear;
}
Реальность:
Да, если взглянуть на функцию КПП совсем просто (или даже грубо), то скорость на выходе будет равна скорости двигателя умноженную на выбранную передачу. То есть на нейтральной умножаем на ноль — получаем на выходе ноль, на первой скорость на входе равна скорости на выходе, а на второй поедем в два раза быстрее.
Глянем в мануал: ZF 4WG210 имеет 4 передние передачи и 3 задние. Три задних… Неплохо, да? Читаем дальше: у каждой передачи есть своё передаточное число:
Значит скорость двигателя умножаем не на порядковый номер передачи, а на эту переменную:
typedef enum
{
gear_N, // neutral
gear_F1, // forward
gear_F2,
gear_F3,
gear_F4,
gear_R1, // reverse
gear_R2,
gear_R3,
GEAR_ITEMS
} gear_type;
const float speed_ratio[] = [ 0.000, // N
0.275, // F1
0.479, // F2
0.933, // F3
1.572, // F4
-0.290, // R1
-0.505, // R2
-0.983]; // R3
float gearBox(float engine_speed, gear_type gear)
{
/* Скорость на выходе КПП равна произведению
* скорости двигателя на коэффициент передачи
*/
return engine_speed * speed_ratio[ gear ];
}
Но откуда берутся эти передаточные коэффициенты? От переключения между сцепляющими шестернями (clutches) с разным радиусом:
На нашей КПП для включения определённой передачи нужно задействовать две шестерни из шести (engaged cluthes):
Бывают коробки с различным количеством передач и комбинаций включения.
Из этой и предыдущей таблиц можно получить передаточное число для каждой шестерни:
Добавляем массив с коэффициентами и комбинациями включения сцеплений:
/* K1 K2 K3 K4 KV KR */
const float clutch_ratio[] = [ 0.329, 0.574, 1.118, 1.406, 0.835, -0.880 ];
const bool engaged_clutches[][] = {
/* K1 K2 K3 K4 KV KR */
[ false, false, false, false, false, false ], // N
[ true, false, false, false, true, false ], // F1
[ false, true, false, false, true, false ], // F2
[ false, false, true, false, true, false ], // F3
[ false, false, true, true, false, false ], // F4
[ true, false, false, false, false, true ], // R1
[ false, true, false, false, false, true ], // R2
[ false, false, true, false, false, true ], // R3
};
Теперь дополним алгоритм КПП:
float gearBox(float engine_speed, gear_type gear)
{
float output_speed = 0;
// Перебираем все шестерни на включенной передаче
for(int clutch = 0; clutch < CLUTCH_ITEMS; clutch++)
{
// Если шестерня задействована
if(engaged_clutches[ gear ][ clutch ])
{
// Умножаем текущую скорость на коэффициент этой шестерни
output_speed = ( engine_speed *= clutch_ratio[ clutch ] );
}
}
return output_speed;
}
Также некоторые КПП имеют гидротрансформатор (torque_converter
) и возможность его блокировки. Гидротрансформатор — это что-то типа сцепления между валом двигателя (engine_speed
) и внутренним валом коробки (inner_shaft_speed
). Но сцепление это не жёсткое: один вал крутит другой за счёт потока масла между турбинами.
Поэтому такое сцепление предотвращает резкие нагрузки на двигатель, добавляет инерции. Но если всё таки нужно жесткое зацепление валов друг за друга, то как раз можно и применить блокировку. Это позволяет увеличить КПД при передаче крутящего момента.
Не будем подробно выводить формулу гидротрансформатора, просто добавим этот параметр в общих чертах:
float gearBox(float engine_speed, gear_type gear, bool converter_block)
{
float output_speed = 0, inner_shaft_speed = 0;
// Если включена блокировка гидротрансформатора
if(converter_block)
inner_shaft_speed = engine_speed; // Жёсткое зацерление
else
inner_shaft_speed = torque_converter( engine_speed );
// Перебираем все шестерни на включенной передаче
for(int clutch = 0; clutch < CLUTCH_ITEMS; clutch++)
{
// Если шестерня задействована
if(engaged_clutches[ gear ][ clutch ])
{
// Умножаем текущую скорость вала на коэффициент этой шестерни
output_speed = ( inner_shaft_speed *= clutch_ratio[ clutch ] );
}
}
return output_speed;
}
В качестве эмуляции двигателя внутреннего сгорания подключили асинхронный двигатель управляемый частотным преобразователем. У частотного преобразователя есть внешний вход 0…10В для управления скоростью:
// Задаём скорость двигателя
engine_speed = frequency_converter( target_speed );
// Управляем скоростью через КПП
output_speed = gearBox( engine_speed, gear, converter_block);
Ну, вот, разобрались. Здесь мы рассмотрели так сказать математическую модель стенда испытаний. Теперь подключим коробку и двигатель к ПЛК.
Подключаемся
Программа была написана в хорошо известном для АСУ-шников CodeSys на языке ST (очень похож на Pascal). Хотел привести примеры кода, но в итоге всё так разрослось, что проще словами.
Каждой шестерне сцепления соответствует свой клапан переключения передач. Когда двигатель разгоняет вал внутри коробки, он нагнетает давление масла. С помощью этого давления можно управлять клапанами переключения передач.
Клапаны переключения передач
Чтобы открыть клапан нужно подать на него 10 Вольт, чтобы закрыть — 0 Вольт. Каждому клапану соответствует свой датчик давления. Норма — 16Bar при включенном клапане. Датчики мониторятся по току 4…20 мА.
На коробке блок клапанов и датчиков давления выглядит так:
В реальном кране используется такой пульт переключения передач:
Здесь:
↑ — движение вперёд
↓ — движение назад
N — нейтраль
+ — переключение на одну передачу вверх
— — переключение на одну передачу вниз
KD — kickdown control — предохранитель от случайного нажатия.
Нарисуем нечто подобное на панели управления и добавим управление двигателем:
На старте двигатель выключен, коробка на нейтральной передаче, гидротрансформатор разблокирован, тихо играет радио. Пришло время лабораторного халата и защитных очков. Морти, врубай!
Сначала запускаем двигатель. Необходимо набрать оборотов 600–700.
Ждём пока масло разогреется. Хотя бы градусов 40 пойдёт. При этом нагнетается давление для управления клапанами.
Теперь можно нажать на кнопку переключения передачи. Включаем!
Плавно открывается нужная пара клапанов. Для первой передачи это Y3 и Y5. Проверяем, что клапаны включились: давление на них должно быть около 16Bar.
При переключении на следующую передачу сначала происходит переключение на нейтраль: плавно закрываются все открытые клапаны. Проверяем давление — всё должно быть по нулям.
Включаем следующую пару клапанов.
На панели управления сей процесс выглядел так:
Дизайнер за́пил, не судите строго.
При переключении с переднего хода на задний и обратно надо сначала убедиться, что ось центральной передачи полностью остановилась. Вспоминается, как «Разрушители мифов» пробовали включить заднюю передачу на полном ходу на автоматической КПП. Аварии не произошло, ведь на то он и автомат.
Самое интересное
Пока писал статью 4WG210 уже починили и увезли. Но приехала ZF 6WG260. Этот монстр ещё мощнее, и уже с шестью передними передачами.
Ну, что ж, коллеги, а вот и видео испытаний. Звук!
P.S. Матёрые АСУ-шники подумают: «Пфф, нашёл о чём писать… Я таких проектов по два в день делаю». Не спорю: получилось минимум кода, но и максимум удовольствия! Ведь даже в таком простом проекте присутствовала та самая магия превращения виртуального в реальное.