Моделирование гидропривода

Основное назначение данного текста – показать как создавать модели в SimInTech, зная математические уравнения физических процессов. В качестве примера использовались уравнения физических процессов в гидроприводе.

За основу, с любезного разрешения автора, было взято вот это методическое пособие: Андреев М.А. Математическое моделирование гидропривода: Учебное пособие. — на правах рукописи, 2017. — 61 с.

Оригинал расположен здесь: https://vk.com/doc2869_441829149

С автором оригинального руководства можно связаться по контактам

ВКонтакте: https://vk.com/max.andreev

Facebook: https://www.facebook.com/max.andreev

Telegram: https://t.me/MaximAndreev

Предисловие от Максима Андреева:

С SimInTech я столкнулся будучи студентом ещё в те времена, когда она называлась «МВТУ» (Моделирование В Технических Устройствах). Так что, свои первые неловкие попытки моделировать гидропривод я предпринимал именно в ней. Скажу честно, что после того как у меня появилась возможность работать в MATLAB Simulink, я постарался забыть об этом опыте как о страшном сне (впрочем, после пары лет работы в программе SimulationX я и об опыте моделирования в Simulink (включая Simscape) предпочитаю лишний раз не вспоминать).

Тем не менее, мои глубинные патриотические чувства не может не трогать тот факт, что команда разработчиков в последние годы активно принялась за совершенствование этого важного для отечественной инженерной отрасли наследия советских инженеров и существенно продвинулась в этом деле (об этом говорит хотя бы то, что модели, созданные в SimInTech, используются для моделирования работы АЭС, в т.ч. и в Германии). Поэтому, когда ко мне обратились за разрешением адаптировать текст моего учебного пособия для SimInTech, я конечно же согласился.

Введение

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

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

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

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

От записи уравнений к результату

В освоении любого незнакомого ранее ремесла, очень важно взять посильную тренировочную задачу.

В нашем случае задача будет предельно проста:

Имеется цилиндрический плунжер диаметром 10 мм, с приведенной массой 100 кг, он работает на пружину жесткостью 200 Н/мм и демпфер с коэффициентом вязкого трения — 1000 Н/(м/с). Нужно посмотреть как он будет перемещаться, если мы ступенькой подадим в полость с начальным объемом 20 см3 давление 200 бар. Чтобы плунжер не превратился в пулю, поставим между источником давления и камерой дроссель диаметром 0,2 мм.

Рисунок 1. Гидравлическая схема для моделирования.

С чего же начать? Многим может показаться, что нужно начать с выбора софта, в котором можно моделировать такую систему. Это не так. На самом деле, начать нужно с листа бумаги и карандаша. Если при помощи этих инструментов внимательно записать уравнения, то потом можно будет решить их в любом софте.

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

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

Первое правило: «Дроби задачи на подзадачи!»

В нашем случае можно выделить несколько физических процессов, поддающихся математическому описанию:
  • прохождение рабочей жидкости через дроссель (дросселирование);
  • её сжатие в рабочей полости плунжера;
  • перемещение массы с учетом взаимодействия с пружиной и демпфером.
Второе правило: «Начинай с конца!»

Что мы хотим получить в итоге? Наверное, график зависимости перемещения плунжера x от времени t. Так давайте и начнем описание с уравнения движения этого плунжера:

где m - масса плунжера, Ap – площадь плунжера, Сpr – жесткость пружины, btr – коэффициент вязкого трения, p – давление в камере.

Здесь нет ничего нового для тех, кто учился хотя бы до 6-го класса школы. Разве что производные заменены точками для удобства. Единственное на что необходимо обратить внимание, это на выбор положительного направления перемещения и на знаки действующих сил.

На рисунке видно, что в качестве положительного направления я выбрал перемещение плунжера вправо. Тогда сила со стороны жидкости в уравнении будет со знаком «плюс», сила со стороны пружины и демпфера со знаком «минус». Вот и всё.

К черту формулы! Даешь моделирование!

Поскольку мы моделируем в SimInTech, то что бы не откладывать в долгий ящик, мы можем начинать создавать модель, в полном соответствии с правилом 1, решаем задачу по частям сначала – плунжер с пружиной.

Открываем SimInTech и создаем новый проект общего вида (Главное меню Файл → Новый проект → Схема модели общего вида).

Сначала запишем в качестве констант исходные данные, которые нам нужны для расчета. На схемном окне проекта вызовем редактор скрипта, здесь мы запишем все константы из исходных данных (см. Рисунок 2).

Рисунок 2. Задание глобальных параметров расчета

Константы задаются через запятую, после последней ставится точка запятой. (см. Рисунок 2). Для того, чтобы не путаться в дальнейшем, все константы заданы в стандартных единицах измерений.

Так же выполним расчет площади проходного сечения. Площадь мы рассчитываем в секции инициализации, которая выполняется только один раз при старте расчета.

Константы и переменные, заданные в данном окне, доступны в любой части проекта.

Разместим на схеме блоки "Ступенька" из закладки «Источники», "Язык программирования" из закладки «Динамические» и "Временной график" из закладки «Данные». Схема должна получится сходной с рисунком (Рисунок 3).

Рисунок 3. Схема модели плунжера

С помощью блока ступенька будем моделировать входное воздействие, для модели плунжера это давление.
На 1 секунде расчета значение будет меняться с 0 до 200 бар. Для этого в свойствах блока зададим значения, указанные на рисунке (Рисунок 4).

Рисунок 4. Настройки параметров ступеньки

Если сейчас запустить модель на расчет (кнопка «Пуск»), то график отразит ступеньку исходных данных, блок «Язык программирования», по умолчанию просто передает сигнал без изменений:

Рисунок 5. График ступеньки

В блоке «Язык программирования» можно записывать уравнения динамики объекта в форме Коши. Прежде чем перейти к записи модели преобразуем уравнение (*), в систему двух уравнений, добавив новую переменную – скорость v(t) = dx(t)/dt.

Таким образом, уравнения движения примут вид:

Из такой системы уже можно создавать модель. Входным параметром модели будет давление p(t), выходным параметром будет перемещение плунжера х(t).

В модели будут две динамические переменные х(t) и v(t), начальные значения этих переменных принимаем равными 0. Такую систему уже можно записывать на языке программирования, как показано на рисунке (Рисунок 6).

Рисунок 6. Модель плунжера с пружиной

Текст, по моему мнению, максимально понятен практически каждому человеку, кто знаком с любым языком программирования.

input P; – вход в блок (давление),

оutput x; – выхода из блока.

init x=0, v=0; – объявление динамических переменных и присвоение им начальных значений;

Дальше идет текст, который выполняется на каждом шаге моделирования.

В принципе текст на языке программирования практически повторяет систему уравнений, где производные dx(t)/dt и dv(t)/dt обозначены как x’ и v’.

Если сейчас запустить процесс моделирования, то скорее всего вы получите график как на рисунке (Рисунок 7). Как говорится упс! У нас получилась полная хрень, ни на что не похожая. Данный график наглядно иллюстрирует необходимость соблюдения правила номер раз. «Дроби задачи на подзадачи!» Поскольку мы решаем уравнение, описывающее движение массы на пружинке, мы приблизительно понимаем, что ожидать. Должен быть колебательный процесс, который из-за наличия силы трения должен затухать. Мы же видим колебания, которые ведут себя очень странно.

Рисунок 7. График перемещения плунжера

Главное здесь не пугаться и не впадать в панику, таких бессмысленных и беспощадных графиков вы еще насмотритесь. Первое, что рекомендуем сделать – изменить шаг интегрирования.

Фактически это:

Третье правило моделирования: При любых непонятных результатах уменьшай шаг интегрирования!

Нажмите кнопку с молотком и отверткой на схемном окне, найдите в параметрах расчета максимальный шаг моделирования и измените его на 0.01 (см. Рисунок 8). Закройте окно настроек нажав кнопку ОК.

Рисунок 8. Настройка шага интегрирования

Если запустить расчет с такими настройками (как показано на рисунке (Рисунок 8)), то результат буде более похож на правду (см. Рисунок 9).

Рисунок 9. Результат при максимальном шаге 0,01.

Результат расчета на рисунке (Рисунок 9) показывает, что у нас в момент возникновения давления на 1 секунде происходит быстрый разгон плунжера, из-за инерции движения, плунжер проскакивает точку равновесия, пружина сжимается и возвращает поршень назад, возникают колебания, а поскольку у нас есть сопротивление трения, то колебания затухающие.

Решение задачи по частям дает возможность нам проверить правильность физического моделирования, путем постановки численного эксперимента.

Например, если уменьшить коэффициент вязкого трения в 10 раз, то колебания должны затухать дольше. Изменим данный параметр в основном скрипте модели (см. Рисунок 2) и при моделировании получим график как на рисунке (Рисунок 10):

Рисунок 10. Результат при Btr = 100

Если увеличить массу плунжера в 10 раз, оставляя все остальные параметры заданными изначально, то колебания будут происходит с меньшей частотой, и время переходного процесса так же увеличится, что мы наблюдаем на рисунке (Рисунок 11).

Рисунок 11. Результат при m = 1000

Еще одним способом проверки правильности модели будет сравнение конечного перемещения, полученного в модели и рассчитанного из условия равновесия системы. В случае равновесия сила, действующая на плунжер (Pst*Ap), уравновешивается силой сжатой пружины (Cpr*x_st).

Pst – давление статическое;

x_st – перемещение поршня (сажание пружины);

Pst*Ap = Cpr*x_st или x_st = Pst*Ap/Cpr.

Расчет конечного положения плунжера можно выполнить прямо в окне блока «Язык программирования» (см. Рисунок 12).

Рисунок 12. Проверка конечного положения плунжера

Запись расчета стационарного положения можно внести прямо в тело блока, и при нажатии на кнопку «калькулятор» будет выведено окно с значениями переменных скрипта, двойной клик по линии связи на выходе из блока покажет значение сигнала на линии связи. Мы убеждаемся, что переходный процесс завершился с таким же значением, как и статический расчет (см. Рисунок 12). Таким образом можно убедиться, что модель выходит на правильные значения положения и при 150 бар и при 250 бар.

Получив и проверив модель плунжера с пружиной, можно переходить к модели камеры.

Модель камеры

Видно, что входным сигналом для модели плунжера является давление в рабочей камере. Неплохо было бы знать это значение давления в рабочей камере. И тут уже появляется что-то новенькое. Оказывается, то что нам рассказывали в школе и на младших курсах про несжимаемость жидкости — враньё. На самом деле она сжимается, особенно в гидроприводе с давлением от 160 бар и выше.

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

где: ṗ — скорость изменения давления; E — приведенный объемный модуль упругости рабочей жидкости; V — объем сжимаемой рабочей жидкости; Q — расход, поступающий в рабочую камеру.

Вывести это выражение нетрудно из формулы для определения объемного модуля упругости:

Если разнести дифференциалы давления и объема по разные стороны знака равенства, а затем продифференцировать обе части по времени.

Логично предположить, что давление будет меняться тем быстрее, чем выше модуль упругости рабочей жидкости E, и тем медленнее, чем больше объем этой жидкости V. Поэтому модуль упругости у нас в числителе, а объем — в знаменателе. В скобки я поместил алгебраическую сумму расходов. В данном случае мы имеем дело с расходом через дроссель Q и с геометрическим расходом от перемещения плунжера. Положительное значение расхода Q при прочих равных будет приводить к росту давления (положительная скорость изменения давления), а положительная скорость перемещения плунжера к падению давления. Поэтому расход через дроссель в уравнении со знаком «плюс», а геометрический расход со знаком «минус».

Объем камеры в свою очередь можно описать формулой:

где V0 — т.н. «мертвый» объем (объем жидкости при нулевом положении x(t) поршня).

На самом деле, влияние изменения объема жидкости очень несущественно, и во избежание лишних ошибок (например, при отрицательных x), лучше принимать просто постоянный объём, равный половине разницы объёмов в конечном и начальном положениях.

Но мы его посчитаем честно.

Ко мне часто приходят студенты, которые не первые сутки бьются над своей моделью, которая выдаёт какой-то бред в виде астрономических значений давления, нереальных перемещений и т.п. Очень часто мне бывает достаточно примерно одной минуты «общения» с моделью, чтобы она заработала. И дело тут не в моей гениальности, а в том, что почему-то около 80% ошибок у начинающих «моделистов» приходятся именно на неправильную расстановку знаков в уравнении баланса расходов (уравнении сжимаемости жидкости). Я не был исключением. Мне, насколько я помню, понадобилась где-то неделя, чтобы найти в своей первой модели гидропривода эту ошибку.

А поскольку у нас модель плунжера в SimInTech уже отлажена, более того, у нас есть возможность проверить положение штока, мы не будем тратить недели на поиск ошибок.

Модель камеры в SimInTech

Вспоминая правило первое, решаем задачу по частям, создаем модель камеры и подключаем ее к уже испытанной и проверенной модели плунжера.Для создания модели камеры нам в общих константах проекта понадобятся две новые величины V0– начальный объем камеры и Е = 13e8 – приведенный объемный модуль упругости, добавим их в нашем главном скрипте программы:

Рисунок 13. Константы в скрипте программы

Прим.: обратите внимание на перенос знака «точка с запятой». Все константы разделены запятыми, секция заканчивается «точкой с запятой».
Входными параметрами для расчета является расход жидкости Q, положение поршня x и скорость перемещения v (смотри формулу *). Поставьте новый блок типа «Язык программирования» на схему и просто перепишите уравнения * и *.

Рисунок 14. Модель камеры цилиндра

Скорость перемещения плунжера необходимо забрать из блока плунжера с пружиной. Для этого меняем текст модели в готовом блоке, добавив еще один выход (см. Рисунок 15).

Рисунок 15. Модель плунжера с добавленных выходом - скоростью

Соединяем схему как показано на рисунке (Рисунок 16), подписываем блоки для удобства.

Рисунок 16. Общая модель цилиндра и камеры

В принципе можно запустить проект на моделирование и получить несуразные астрономические значения перемещения плунжера в тысячи километров.

Но можно включить голову и вспомнить, что на предыдущем этапе мы подавали на вход модели плунжера давления ступенькой с 200е5 Па (200 бар). Теперь нам нужно из этого блока подать такой расход, чтобы в камере сформировалось давление 200 бар.

Если использовать блок ступенька, то в момент его включения начнет подаваться расход, и он будет постоянным в течение всего времени моделирования, а для требуемого повышения давления мы должны подать в камеру расход только на некоторое время, достаточное для создания давления 200 бар, и после этого прекратить подачу.

Поскольку мы сейчас не знаем, сколько нужно закачать жидкости, для создания требуемого давления в 200 бар, мы используем блок "Кусочно-линейная" из закладки «Источники». В качестве параметров зададим «прикидочные» значения, приведенные на рисунке (Рисунок 17).

Рисунок 17. Настройки источника расхода в камеру

В данном блоке задается 3 интервала по 1 секунде. На первом интервале расход 0, на втором интервале расход 1, на следующем и до конца расчета расход 0. Таким образом мы моделируем накачку камеры расходом 1 м3/c в течение одной секунды. Логично, что такой расход создаст невозможное давление, но мы подберем ее на следующей итерации, сейчас мы просто посмотрим, что у нас получается.Чтобы понять, насколько мы не угадали с расходом, включим отображение значений на линиях связей (см. Рисунок 18), что позволит нам видеть, какое давление создано этим объемом жидкости.

Рисунок 18. Результаты расчета первое приближение

Результаты расчета показывают, что мы «не угадали» и давление в камере установило на уровень около 3.84 е11 вместо необходимого 200е5 (200бар).Путем подбора определяем, что для создания давления в 200 бар необходимый расход должен составлять примерно 0.98e-7 в течение 1 секунды. Результаты моделирования – на рисунке (Рисунок 19).

Рисунок 19. Результаты моделирования равномерной подачи в камеру

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

Теперь нам интересно сравнить модель плунжера с пружиной, которую мы создали на первом этапе и ту же модель, но уже подключённую к камере. Поскольку первую модель мы нагружали ударной нагрузкой (ступенькой), то для формирования похожего импульса, необходимо быстро подать в камеру объем, который необходим для создания такого же давления, но за более короткое время. Можно попробовать сократить время импульса, например в 10 раз, и увеличить в 10 раз расход.

Скопируем блок плунжера с пружиной и подадим на него ступеньку 200 бар.

Подадим на вход камеры расход импульсом длительностью 0.1 секунды, подобрав его так, чтобы конечное давление было около 200 бар. Должна получится примерно такая модель как на рисунке (Рисунок 20).

Рисунок 20. Сравнение модели плунжера с камерой и без камеры

Если посмотреть на графики, видно, что в течении 0,1 секунды пока идет подача расхода в камеру идет перемещение плунжера, которое потом затухает быстрее, чем без камеры (с мгновенным ростом давления), что похоже на правду.

Видно, что у нас положение плунжера примерно соответствует полученному при отдельном моделировании. Таким образом, мы с помощью SimInTech решили еще одну подзадачу.

Остался последний рывок!

Моделирование дросселя

Ну вот мы и подходим к последнему уравнению, которое описывает расход через дроссель:

где:

f – площадь сечения дросселя;

μ – коэффициент расхода;

pn–давление нагнетания;

p – давление в камере цилиндра.

В этой формуле тоже нет ничего нового для тех, кто хотя бы пол семестра изучал курс гидравлики. Единственная поправка, которую нужно внести — это учёт теоретической возможности обратного тока рабочей жидкости в случае отрицательной разницы давлений (например, когда на поршень действует сила больше, чем может противопоставить сила со стороны рабочей жидкости). Без этого мы рискуем получить отрицательное подкоренное выражение.

По цифрам: коэффициент расхода μ можно взять равным 0.62, а плотность рабочей жидкости ρ = 850 кг/м^3. Добавляем новые константы в общий скрипт, который итого принимает вид, представленный на рисунке (Рисунок 21):

Рисунок 21. Список констант проекта

Расчет проходного сечения дросселя также производим в секции инициализации.После этого нам остается только записать последнее уравнение (*) в новом блоке «Язык программирования», см. Рисунок 22.

Рисунок 22. Программа блока дроссель

Обратите внимание, что первым в описании входов записано pk – давление в камере, соответственно вход с этим именем будет сверху, а давление нагнетания – второе, его вход на блоке будет ниже.

После этого можно соединить на схеме: выход расхода соединить с камерой, а на вход нагнетания подать ступеньку с 0 до 200 бар, как мы делали при создании плунжера с пружинкой. Общая схема получится как на рисунке (Рисунок 23).

Там же приведен и результат расчета переходного процесса при увеличении давления нагнетания скачком с 0 до 200 бар.

Рисунок 23. Схема моделирования и результат расчета

Блоки или язык программирования? Вот в чем вопрос.

Как удобнее создавать модель – из блоков или написанием кода? Раньше я, не задумываясь, ответил бы что, конечно, лучше из блоков. «Язык программирования» надо использовать только тогда, когда требуемых блоков нет.

Но модель, которую мы только что создали, достаточно наглядно и просто собирается в виде языка программирования, практически прямым переписыванием уравнений в форме Коши. То же самое можно было сделать из стандартных блоков SimInTech, как это показано на рисунке (Рисунок 24).

Рисунок 24. Модель в виде схемы

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

Рисунок 25. Отладка программы в блоке «Язык программирования»

Другим преимуществом схемы SimInTech являлась возможность генерировать код Си, с последующим использованием его, как для ускорения расчета, так и для использования модели без SimInTech. Но начиная с версии 2016 года, код, написанный на языке программирования, также автоматически генерируется в Си.

Поэтому старый добрый холивар, что лучше схема или текст программы уже не актуален. Если у вас SimInTech – используете то, что вам больше нравится, и будет вам счастье.

Но если вам нужно, чтобы вашим результатом могли пользоваться другие специалисты, которые не имели счастья программировать или рисовать схемы SimInTech, следует стремиться к тому, чтобы результат был максимально приближен к реальной принципиальной схеме устройства.

От непонятной модели к понятной принципиальной схеме

Чем хороша принципиальная схема? Каждый элемент этой схемы, это устройство, которое описывается паспортными данными завода-изготовителя если конечно производитель их знает и предоставляет (розовая мечта разработчика).

В нашем случае в качестве принципиальной схемы модели должно быть 3 элемента:
  1. Источник давления;
  2. Дроссель;
  3. Гидроцилиндр.
Все остальное на схеме – от лукавого ученого, чтобы запутать инженера.

Другими словами, камера и плунжер с пружиной должны быть объединены в один элемент. Косвенным свидетельством правильности такого объединения является то, что площадь сечения плунжера используется и в уравнениях камеры, и в уравнениях плунжера.

Для того, чтобы превратить расчетную схему в принципиальную, мы воспользуемся блоком «Субмодель».

Поместим 2 блока на схему. Один из них подпишем «Гидроцилиндр», другой «Дроссель».

Выделим субмодель «Гидроцилиндр», и из меню главного окна Правка → Изменить блок, вызовем окно редактирования свойств (см. Рисунок 26):

Рисунок 26. Настройка свойств блока

В закладку «Свойства» нашего блока мы добавляем все, что относится к гидроцилиндру из главного окна программы (см. Рисунок 21). Кнопка добавления находится внизу. Сохраняя имена переменных и их значения. В способе расчета указываем, что это константы.
В закладку «Параметры» добавляем то, что этот блок рассчитывает, и к чему нам возможно придется обратится, в качестве способа расчета указываем это переменные (см. Рисунок 27).

Рисунок 27. Настройка параметров блока

В подготовленную субмодель копируем существующие блоки – «камера» и «плунжер с пружиной». Добавляем блоки "Порт входа", "Порт выхода" и блок "Двунаправленная шина". И собираем схему как показано на рисунке (Рисунок 28).

Рисунок 28. Схема блока «Гидроцилиндр»

Блок «Двунаправленная шина (вход)» позволяет нам упаковать две или больше линий связи с разными направлениями в одну «шину». Это удобно, когда в модели есть однозначно двунаправленная связь.

В нашем случае дроссель рассчитывает расход и передает его в камеру по контакту А, но ему для расчета нужно давлении в камере. Поэтому мы забираем расход и отдаем в контакт B. А на схеме у нас одна линия.

Ответная внутренняя часть блока дроссель будет выглядеть как показано на рисунке (Рисунок 29).

Рисунок 29. Схема блока дроссель

Мы скопировали блок дроссель и соединили его с входами и выходами так, чтобы он забирал давление из шины по контакту B, и отдавал расход по контакту А.
В качестве свойств для блока Дроссель нужно задать те свойства из глобального списка, которые относятся к блоку (см. Рисунок 30).

Рисунок 30. Свойства блока дроссель

В качестве параметров блока дроссель задается площадь проходного сечения (см. Рисунок 31).

Рисунок 31. Параметры блока дроссель

Поскольку мы перенесли свойства в блоки, нужно расчет промежуточных переменных также перенести в соответствующие внутренние скрипты блоков. Площадь дросселя мы рассчитываем, не в главном окне программы, а в субмодели дросселя (см. Рисунок 32). То же самое надо сделать для площади сечения плунжера.

Рисунок 32. Расчет площади сечения дросселя в его модели

В итоге, а зачем нужно было так мучатся? Ответ на рисунке (Рисунок 33).

Вместо непонятных линий связи, мы получили принципиальную схему, где есть источник давления, дроссель, и гидроцилиндр (картинки, конечно, я поменял).

Кроме наглядности, данная схема обеспечивает защиту «от дурака» – неверные подключения. Попытка подать на вход в гидроцилиндр простую ступеньку, вызовет ошибку потому, что вход «ждет» двунаправленную шину от дросселя.

Рисунок 33. Расчётная схема, приведенная к принципиальной

Когда мы создавали блоки, мы использовали те же самые имена, что и в главном окне, однако эти имена стали локальными, но и глобальные константы по проекту никуда не делись. Можно, например, в свойствах гидроцилиндра указать диаметр, меньший в два раза, чем исходный, используя глобальную константу d (см. Рисунок 34).

Рисунок 34. Диаметр через объявленную константу d

Тогда при моделировании будет подставлен диаметр в два раз меньший, и перемещении буде в 4 раза меньше (пропорционально квадрату диаметра)

Рисунок 35. Влияние уменьшения диаметра плунжера в 2 раза

Решение задачи прямым программированием в SimInTech

Мы уже рассмотрели три способа создания модели.

На самом деле 2, создание принципиальной схемы, это просто оформительские изыски, при этом внутри блоков принципиальной схемы, могли быть как блоки на языке программирования, так и схемы из стандартных блоков. А можно их и сочетать: например, дроссель сделать на базе блока типа «Язык программирования», а гидроцилиндр собрать из блоков в синей и зеленой рамке на рисунке 23, или наоборот.

Но оба этих варианта для расчета используют готовые методы интегрирования, предоставляемые SimInTech. Но что делать, если мы хотим сами своими руками интегрировать, как настоящие профессионалы? Нам что, нужно бросать SimInTech и брать в руки фортран? Конечно нет!

Не спешите кидаться к учебнику мат. анализа, он нам не пригодится, ведь у нас в арсенале есть большой выбор численных методов решения подобных дифференциальных уравнений. Самый простой из них — метод Эйлера. Суть этого метода заключается в том, что для начала нужно прикинуться валенком и представить, что производная — это не предел отношения приращения функции к приращению её аргумента, а просто отношение разностей (по-научному это называется переходом к конечным разностям). Что это значит? Что, например, первое уравнение системы:

превращается в уравнение:
где vi+1 и vi – скорости в моменты времени ti+1 и ti . Тогда решение становится простым – зная параметр в один момент времени, мы можем посчитать, каким он будет через промежуток времени Δt:
Видно, что в этом уравнении в правой части только известные нам величины. То же самое нужно проделать с остальными уравнениями системы.

Если же объяснять совсем по-простому, то система уравнений в форме Коши, это когда слева стоят производные (скорости изменения величин), а справа формулы для их вычисления. Что бы решить систему методом Эйлера, нам нужно знать начальное состояние Х10 ... XN0 (оно известно).

Из системы в форме Коши мы можем посчитать скорости изменений всех величин V10 ... VN0 в начальный момент времени (системы уравнений).

А теперь, главное предположение, мы выбираем шаг таким маленьким Δt, что все скорости в системе не меняются в течение шага интегрирования. И тогда любая величина на следующем шаге будет равна Х11 = Х10 + V10 × Δt (время на скорость изменения).

Ура! Мы получили новые значения Х11 .. XN1! Повторим шаг. С божьей помощью из уравнений Коши мы получили новые значения скорости; и так мелким шагами, пока не посчитали весь процесс.

Это простой, но работающий способ! Можно будет хоть на калькуляторе посчитать значения ровно для такого количества шагов, на которое хватит терпения. Но лучше, конечно, доверить это рутинное занятие вычислительной машине. Можно написать цикл на C++, в Delphi, а мы сделаем это в SimInTech.

Берем блок "Язык программирования" и создаем константы и переменные, необходимые для расчета, блок не имеет входа, а только выход (Рисунок 36):

Рисунок 36. Объявления констант и переменных

Расчет мы будем производить в секции инициализации, которая выполняется один раз на страте расчета. Здесь пришлось повторить расчет площади сечений для того, чтобы можно было отлаживать скрипт, не запуская главное окно программы. Сначала готовим вектора, где будем хранить результаты и присваиваем значения для нулевого шага (Рисунок 37):

Рисунок 37. Подготовка первого шага

Дальше непосредственно сам цикл расчета. Обратите внимание, что мы практически переписываем без изменений уравнения в форме Коши, только без штриха, который писали при создании блоков в первой части (Рисунок 38).

Рисунок 38. Цикл расчета шагов по времени

В результате после завершения цикла инициализации у нас появляются два вектора T – вектор времен, Х – вектор положения штока. Задача решена – для любого значения времени у нас есть положение штока.
Теперь обеспечим возможность сравнивать результат ручного расчета методом Эйлера, и другие способы моделирования. Для этого после секции инициализации, на каждом шаге внешнего моделирования будем выдавать на выход блока значения, рассчитанные функцией интерполяции. При этом мы помним, что мы рассчитали скачок с нулевого времени, а во внешней модели для сравнения используется скачок на 1 секунде расчета (см. Рисунок 39).

Рисунок 39. Основной текст программы

Программу можно запускать и отлаживать непосредственно в окне редактирования скрипта, и просматривать все значения переменных (Расчет/Посмотреть все).
Можно также просматривать результаты в виде графиков (Расчет/Построить зависимость, см. Рисунок 40):

Рисунок 40. Отладка программы прямого расчета

Таким образом, SimInTech позволяет внутри каждого блока иметь свое рабочее пространство Matlab.

Теперь можно выводить все варианты на один график и производить всякие сравнения и численные эксперименты.

Выбор допущений

Что самое интересное в процессе написания математической модели гидропривода? Уравнения? Составление блок-схем? Поиск ошибок? Нет! Самое интересное — это когда ты только садишься за схему и пытаешься представить, что же это будет в конечном итоге за модель. В этот момент решается для чего модель будет использоваться, насколько подробно будет описан каждый элемент, где придется влезть в теорию, где удастся использовать эксперимент. Именно эту стадию можно действительно назвать творческой. Всё остальное — так себе, рутина. О творческой составляющей математического моделирования в этой главе и поговорим.

Блок диаграмма математической модели при различных допущениях.

Упражняться будем снова на элементарной модели плунжера:

Где же здесь творчество? — спросите вы. Вместо плунжера сделаем поршень, а вместо пружины — упругий элемент? Ничего подобного! Смотрите сами сколько у нас вариантов: плунжер может быть весомый или невесомый.

Жидкость может быть сжимаемой или не сжимаемой.

Объём камеры может быть изменяемым или постоянным.

Даже дроссель – и тот можно моделировать с учетом трубы, в которую он встроен или без её учета. Комбинация только этих четырех факторов уже даст как минимум 8 вариантов математической модели этой предельно простой схемы.

В этот раз мы подробно остановимся на двух факторах: учете массы плунжера и сжимаемости жидкости. Чего тут учитывать, спросите вы? Масса дана? Дана! Жидкость сжимаема? Сжимаема! Значит надо учитывать и то и то, потому что мы за правду! Так то оно так, да только в этом случае можно до кучи учесть гравитацию Луны и силу ветра в помещении.

На самом деле инерция и сжимаемость жидкости не всегда будут существенно влиять на процесс перемещение плунжера.

Например, при развиваемом усилии более 150 кгс и отсутствии пружины учитывать массу плунжера нужно только если она сопоставима с этим усилием. Учёт массы в 100 г только усложнит наши расчёты, но не прибавит точности. Аналогично, если давление в системе не превышает 2–5 бар, о каком учёте сжимаемости жидкости может идти речь?

Чтобы проиллюстрировать это всё на живых примерах, давайте посмотрим, как можно переписать математическую модель плунжера для различных наборов допущений. Исходная система уравнений с учётом сжимаемости жидкости выглядит следующим образом:
Структурная схема:

Рисунок 41. Структурная схема

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

Рисунок 42. Переходный процесс в плунжере

Перед тем как переходить к моделям с другими допущениями, сначала давайте предположим, что жидкость в системе если и сжимается, то несильно. Тогда давление придется считать исходя из равенства расходов:
Чисто теоретически сюда можно подставить уравнение расхода через дроссель, перенести геометрический расход вправо, возвести всё в квадрат и получить уравнение для определения давления через скорость поршня. Хорошо, когда в системе всего два расхода, потому что в случае наличия ещё одного дросселя (например, на слив) возводить в квадрат пришлось бы уже два раза, при наличии ещё одного — три, и так далее. В итоге, привыкнув однажды к выражению давления через расход рано или поздно можно столкнуться с невозможностью аналитического решения подобной задачи. Поэтому не будем привыкать к хорошему, и даже этот простой пример заставим SimInTech считать численно.
Для этого вместо определения давления интегрированием мы поставим блок численного решения алгебраических уравнений "Нелинейное уравнение F(y) = 0" (Закладка «Операторы»). Суть его работы заключается в том, что он, используя численный итерационный метод, варьирует своё выходное значение до тех пор, пока не найдет ноль функции у себя на входе с заданной точностью. Другими словами, на каждом шаге решения он будет изменять давление, пока сумма расходов не станет равной нулю с заданной точностью. Схемам будет выглядеть примерно так, как показано на рисунке (Рисунок 43):

Рисунок 43. Схема расчета без учета сжимаемости

До 1 секунды процесса у нас вообще везде 0, поэтому, ставим в качестве начальных условий 0. И запускаем на расчет. И снова Упс! Ни хрена не работает! Скорее всего вы получите следующие сообщения:

[Ошибка]: "Ошибка вычисления LU-декомпозиции матрицы"

[Ошибка]: "Ошибка нахождения решения СЛАУ"

Вот так вот, мои маленькие любители моделирования, никто и не обещал, что будет легко.

Что делать? SimInTech не работает и нужно переходить на Фортран? Конечно нет! Нам на помощь приходит

Четвёртое правило моделирования: При любых непонятных результатах, когда не помогает уменьшение шага интегрирования, меняй метод интегрирования!

Нажимаем на кнопку с отверткой и молотком «Параметры расчета».

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

Рисунок 44. Настройка методов интегрирования

С таким настройками наша модель завелась и считает, единственно, есть три предупреждения, что заданная точность не обеспечивается. Посмотрим на результат:

Рисунок 45. Расчет без учета сжимаемости

Исчезли колебания, которые были связаны не только с инерцией плунжера, но и со сжимаемостью жидкости.

Но давление ведет себя явно неестественно, прыгает до 200 бар, потом падает обратно, и медленно растет. Что за хрень? Мы же ставили дроссель именно для того, чтобы давление не прыгало как во время взрыва!

Так сработал блок нелинейное уравнение F(y)=0, это блок решил, что в первый момент скачка давление в камере должно равняется давлению нагнетания, потом оно падает как только поршень начинает двигаться.

Что же будет, если отбросить ещё и влияние инерции? В этом случае скорость перемещения поршня v будет полностью определяться расходом, поступающим в полость:
Для того, чтобы узнать расход через дроссель, нужно знать давление p в полости. А его мы получим из уравнения равновесия:
Структурная схема при этом будет выглядеть так:

Рисунок 46. Структурная схема без сжимаемости и инерции

Небольшое пояснение: на схеме появился еще один блок, задержка на шаг интегрирования, дело в том, что у нас сформировалась алгебраическая петля, для ее развязки мы поставили блок "Задержка на шаг интегрирования" с начальным условием. Это позволяет во время моделирования брать значения с предыдущего шага. Кстати, для увеличения скорости расчета можно вернуть обратно метод интегрирования «Адаптивный 1».
Результат моделирования:

Рисунок 47. Результат моделирования без учета инерции и сжимаемости

Логично, что теперь практически пропал и скачок давления в начальный момент времени переходного процесса (t=1), хотя давление и выходит не из нуля. Это связано с тем, что в начальныӗ момент времени из-за перепада давлений в системе сразу же возникает расход через дроссель. Следовательно, скорость в начальный момент времени тоже не будет равна нулю, а значит и сила вязкого трения в уравнении равновесия будет не нулевая. Отсюда и небольшой скачок давления в начале переходного процесса.

Чтобы сравнить результаты, наложим их на одно поле графика:

Интересно также сравнить вычислительную трудоёмкость расчетов при разных допущениях. Мы задаем одинаковую относительную точность 1е-5.

Для варианта с учетом сжимаемости и инерции:
Метод интегрирования Адаптивный 1
Минимальный шаг 1е-12 с
Максимальный шаг 1е-2 с
Коэффициент ускорения расчета 187,5 раз
Число шагов 1810
Для варианта без учета сжимаемости:
Метод интегрирования Адаптивный неявный
Минимальный шаг 1е-12 с
Максимальный шаг 1 с
Коэффициент ускорения расчета 1,1 раз
Число шагов 321700
Для варианта без учета сжимаемости и инерции:
Метод интегрирования Адаптивный 1
Минимальный шаг 1е-12 с
Максимальный шаг 1е-2 с
Коэффициент ускорения расчета 1000 раз
Число шагов 328

Получается, что в нашей задаче без учета сжимаемости рабочей жидкости не обойтись, т. к. колебания системы связаны именно с этим свойством. Экзерсисы с учетом инерции, но без учета сжимаемости в данном случае себя не оправдали. Видно, что при таких допущениях решатель дает слегка рваный график давления (это может быть связано с тем, что порядок расходов — 1e−3, а порядок давлений — 1e+6) и, несмотря на это, большую вычислительную трудоемкость (даже без учета внутренних итераций).

Стоило ли городить огород, если всё равно выяснилось, что мы с самого начала всё верно учли? Конечно же так получилось, потому что я подобрал параметры системы, чтобы не выглядеть дурачком в предыдущих частях. На самом деле не всегда всё так гладко.

Скажу честно, мне не удалось вывести однозначной и простой рекомендации, в каких случаях нужно учитывать сжимаемость жидкости, а в каких — нет. Слишком уж от многих факторов зависит постоянная времени сжимаемого объёма жидкости.

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

Во всех остальных случаях нужно писать несколько разных математических моделей с различными допущениями и смотреть уже по факту.

Использование библиотеки готовых элементов

Конечно, неохота каждый раз переписывать для разных допущений уравнения, а потом переделывать структурные схемы. Для того, чтобы упростить задачу инженерам, многие производители CAE-софта совершенствуют оболочки, где математическая модель создается так же, как если бы мы собирали физическую систему, т. е. при помощи готовых блоков физических элементов.

Как создавать свои готовые блоки SimInTech, по известным уравнениям, мы показали ранее (см. подраздел «От непонятной модели к понятной принципиальной схеме»). Посмотрим, как создавать модели в SimInTech из готовых блоков.

В SimInTech есть библиотека "Гидро- и пневмосистемы". Данная библиотека постоянно дорабатывается и расширяется. В ней уже содержатся готовые элементы, в которых подготовлены порты для соединения элементов в принципиальные гидравлические схемы.

Есть так же библиотека "Механика", где содержатся элементы для моделирования механических систем. Вот давайте и соберем из разных «кубиков» готовую систему. Нам понадобятся следующие блоки:

«ГПС - Источник постоянного давления»

ГПС - Гидравлический турбулентный дроссель постоянного сечения

ГПС - Гидравлическая полость переменного объема

«ГПС - Гидромеханический преобразователь посткупального движения»

Инерция поступательного движения

Фрикционный демпфер поступательного движения

Пружина поступательного движения

Ступенька

"Запись в список сигналов"

Общая схема системы из готовых блоков представлена на рисунке (Рисунок 48):

Рисунок 48. Схема с использованием стандартных элементов

Особенностью данной схемы, является то, что изображенные на ней линии связи имеют различное значение, и если вы попытаетесь соединить полость с пружиной, то SimInTech вам не даст это сделать.

Линии между полостями и дросселем – это каналы течения жидкости, аналогично линия между камерой и преобразователем.

Линии между механическими элементами – это линии механической связи.

Линия между ступенькой и записью – это просто передача числа (одного сигнала).

Для удобства часть рассчитываемых параметров уже выведена в подписи блоков, их можно настраивать, добавляя и удаляя параметры. Для этого проекта мы будем использовать тот же самый набор констант (см. рисунок 20) для задания параметров элементов.

Отдельное пояснение по блоку «Запись в список сигналов». Как уже было сказано выше, блок «ГПС - Источник постоянного давления» не имеет явно входов, куда можно подключить ступеньку, для имитации скачка давления, но мы работаем в SimInTech, где можно все, от слова совсем.

Чтобы поменять давления в камере постоянного давления, мы создадим глобальный сигнал проекта. Пункт главного меню программы «Сервис/Сигналы».

В окне сигналов дадим ему имя, описание и сохраним (см. Рисунок 49).

Рисунок 49. Создание сигнала для давления нагнетания

Теперь кликнем два раза по блоку камера постоянного давления и температуры, в свойствах запишем имя сигнала Pn, и теперь постоянное давление в камере определяется нашей ступенькой (см. Рисунок 50).

Рисунок 50. Задание свойств для источника постоянного давления

Обратите внимание, что теперь у нас задается рабочая среда, которую можно оставить по умолчанию.

Задайте все остальные параметры других блоков из списка констант (см. Рисунок 21).

Если запустить схему на расчет, то прямо на схеме во время расчета будут отображены значения параметров. Если все данные введены правильно, то мы увидим, что конечное значение перемещения, цифра под блоком пружина совпало с предыдущими вариантами (см. Рисунок 51).

Рисунок 51. Результаты расчета на схеме

Но нас интересует график.

Все просто. Как раз два три! Следите за руками!

  1. Выбираем нужный нам блок (Пружина), двойным кликом мыши вызываем окно «Свойства».
  2. Переходим на закладку «Параметры», где причислено, все что можно вытащить из блока «Пружина».
  3. Выбираем «Перемещение» и нажимаем кнопку «График» внизу.
Наш график добавился в менеджер данных, его можно вызвать во врем расчета по кнопке схемного или главного окна программы (см. Рисунок 52).

Рисунок 52. Вызов графиков для стандартных объектов

Таким же образом можно построить график для любых параметров любого блока, можно перетаскивать на один график переменные из разных блоков.

Рисунок 53. График перемещения

Сравним расчет стандартными блоками и нашим первым вариантом решения задачи. Поскольку мы делали одинаковый список глобальных констант, то достаточно скопировать блоки из одного проекта в другой.
У меня при копировании получилась схема как на рисунке (Рисунок 54):

Рисунок 54. Модель для сравнения методов

Единственный вырос который может возникнуть, у неопытного пользователя:

- А зачем константу оправляют на график?

А это SimInTech и константа здесь может быть совсем не константой. Если в блоке «Константа» вместо конкретной цифры записать выражение типа L48.S, где L48 – это уникальное имя блока-пружины на нашей схеме, а S – это имя параметра этого блока (перемещение). Тогда наша константа во время расчета будет принимать значения параметра перемещение пружины, что нам и нужно для сравнения. Отправляем это значение на график и сравниваем (см. Рисунок 55):

Рисунок 55. Результат сравнения методов

Видно, что значения расходятся в конце переходного процесса. Это связано с тем, что свойства рабочего тела в стандартной библиотеке берутся из справочника, а у нас были заданы просто константы.

А давайте заглянем в эти стандартные блоки и попытаемся их изменить!

Изменим камеру с переменным объемом так, чтобы она совпадала по свойствам с данными в условиях задачи.

Кликаем по блоку, выезжает окно с параметрами, но если нажать на правую кнопку мыши, и в меню выбрать Действие/Войти в субмодель (см. Рисунок 56).

Рисунок 56. Заглядываем под капот

И ОMG чудо! Мы оказываемся внутри модели и можем изучить её и даже изменить.

Рисунок 57. Внутреннее устройство модели

Находим блок расчета свойства, это обычный стандартный блок «Язык программирования», находим место где рассчитывается модуль упругости и плотность, и производим диверсию. Вместо честного расчета свойств, подставляем константы из глобальных переменных (см. Рисунок 58).

Рисунок 58. Редактирование расчета свойств

Если теперь запустить на расчёт, мы получим почти полное совпадение с моделью, разработанной вручную.

Рисунок 59. Сравнения моделей после диверсии

Промежуточное резюме. Библиотека гидро-пневмо систем в SimInTech ускоряет работу, обеспечивает большую наглядность модели, и в отличие от других САЕ, не закрывает от пользователя внутреннее содержание модели. Это не черный ящик, это практически Open Source для математического моделирования гидравлики.Можно выбирать пакет и средство моделирования, и потом пытаться реализовать в нём задачу теми средствами, под которые он заточен, а можно использовать SimInTech и получить возможность решать задачи любым удобным способом. SimInTech не ограничивает свободу творчества.