Читаем предыдущую статью. Борьба за реализацию мечты продолжается.

Вячеслав ответил и все в мгновение ока стало ясно. Или, точнее, почти все.

А теперь подробнее...

Действительно, я дал в штангу - промазал с параметрами 2-го фазификатора. Не установил нужные значения. Мой косяк. Сбило то, что, во-первых, результаты совпадали (так уж получилось и теперь понятно почему) и, во-вторых,  сравнивался код. В первую очередь на С++, как первый кандидат на ошибку. А он совпадал.

Сами же параметры скрыты - в свойствах блока и я как-то в суете забыл про них. Что тоже объяснимо (хотя и не оправдывает). Просто на С++ параметры в явном виде в тексте программы, а в SimInTech в неявном - настройках, а я фазификатор размножил копированием. Верхний работал и, вроде, верно, а потому какие могли быть вопросы к скопированному? Это я так  думал. Действительно, к нему вопросов нет (пока), но были (есть?) ко мне. Но я уже покаялся...

Все это безобразие, невнимательность и далее по списку. Но это мой грех, про который я знаю, но преодолеть не в силах :( И потом я не какой-нибудь ChatGPT XXX, который не ошибается. Я же поднял "хайп", народ взбаламутил!? Гнать таких программистов! Заменить на ИИ!... И это уже происходит. И кто-то даже верит, что это поправит дело. Наивный...

Но давайте серьезно. Итак, я установил нужные параметры фазификатору, и результат не заставил себя ждать (см. рис. 1). Но, чтобы он устраивал, так тоже нет. Видна перерегулировка. Опять что-то не так с параметрами? Тьфу-тьфу. Я уже прямо боюсь... :) Но , вроде, с ними разобрались и не должно быть подвоха. Код? Проверено многократно. Глаз "замылился"? Может. Но, если честно, я его/их настолько "замылил", что смотреть на код уже сил просто нет... Тоже обычное дело ;)

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

Так что еще, Вячеслав, нужно "подправить", чтобы к результату (замечу, только выдаваемому проектом/проектами в SimInTech) не было вопросов?         

Рис. 1. Текущий проект после правки параметров.
Рис. 1. Текущий проект после правки параметров.

Кстати, рекомендуемое Вячеславом изменение свойств блока If_TriangleOut_1 (текущее имя субблока в  проекте SimInTech) никак не повлияло на картинку. Ваша фраза "после этого все почти совпадает" как-то совсем не утешает. Почти, не означает точно. А должно быть, повторю, точно.  То, что демонстрирует рис. 2.

Рис. 2. Эталон. SimInTech.
Рис. 2. Эталон. SimInTech.

Идея! А давайте добавим в диаграммы сигнал с выхода субмодели "Нечеткий регулятор"... Получили следующее. Диаграммы расположены в таком порядке - текущий проект, эталонный проект, ВКПа (рис. 3).

Рис. 3. Все проекты. Шаг - 0.1 сек
Рис. 3. Все проекты. Шаг - 0.1 сек

Поскольку я теперь "тертый калач", то предварительно привел к единому значению (0.1) параметры "Минимальный/Максимальный шаг" и дискретный такт ВКПа (было 10 мсек, стало 100). И в ВКПа сразу обращает на себя внимание график h - уровень воды в баке. Он стал походить на вид в SimInTech.

Но смотрим на оранжевый график. Это команда регулятору. Он у всех проектов разный!? "Шо - опять!" (вспомним мультик "Жил-был пес").

Успокоимся, приведем нервы в порядок и ... уменьшим шаг до 0.01. Посмотрим, что выйдет.

Рис. 4. Все проекты. Шаг - 0.01 сек
Рис. 4. Все проекты. Шаг - 0.01 сек

И, на тебе, последние две диаграммы совпали идеально! Нет, ну, просто издевательство?! Это ж надо видеть! Когда "легким движением руки ... шорты превращаются... (ну, вы помните, да?).

Ладно. Пока ждем ответ от Вячеслава, поиграем с задержками. Но только уже так, как это можно только в ВКПа. Будем изменять задержку только у одного блока - "Нечеткий регулятор", а остальные сделаем максимально быстрыми - 2 мсек. Так они в сравнении с ним будут просто мгновенными. Перенесем их в отдельное автоматное пространство, которому установим минимально возможное в текущей ситуации дискретное время - указанные 2 мсек (быстрее - проблема).

Итак, старт: блок один, время 500 мсек. Смотрим...

Рис. 5. ВКПа. 0.5 сек. Нечеткий регулятор.
Рис. 5. ВКПа. 0.5 сек. Нечеткий регулятор.

Видно, что команда регулятору стала ступенчатой, но остальное выглядит очень даже прилично. Да и она, если сгладить, фактически мало отличается от своего идеального вида (см. рис. 4).

А если 2 сек?

Рис. 6. ВКПа. 2 сек. Нечеткий регулятор.
Рис. 6. ВКПа. 2 сек. Нечеткий регулятор.

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

А если обнаглеть и установить 5 сек? Помнится мы рассматривали на Хабре светофор (привет, Юрий Панчул!) и там была такая же длительность такта. Так что тут мы не очень даже согрешим... Бывает, думаю, и не такое.

Рис. 7. ВКПа. 5 сек. Нечеткий регулятор.
Рис. 7. ВКПа. 5 сек. Нечеткий регулятор.

Комментировать даже не хочется - все ясно без слов. Бак это, конечно, вам не светофор и на этом эксперименты с дискретным временем можно завершить.

А что будет в такой ситуации в SimInTech? Правда, шаг дискретизации там можно установить только для всех блоков, но все же? Устанавливаем шаг 0.5 сек.

Рис. 8. SimInTech. Шаг - 0.5 сек
Рис. 8. SimInTech. Шаг - 0.5 сек

Графики грубее, но в целом мало что изменилось. Только результат выдает много быстрее (шаг, ведь, меньше).

А теперь 2 сек?

Рис. 9. SimInTech. Шаг - 2 сек
Рис. 9. SimInTech. Шаг - 2 сек

Жутковато, конечно, выглядит. Почему-то вспомнился Хэллоуин.

А если 5 сек?

Рис. 10. SimInTech. Шаг - 5 сек
Рис. 10. SimInTech. Шаг - 5 сек

Что тут скажешь? Перебор, однако... Хотя если сравнить рис. 10 и рис. 7, то последний  как-то больше походит на управление чем-то.

Что еще? А если мы в ВКПа соберем все объекты в одну кучу, как в SimInTech, и повторим эксперименты с секундами, начиная с 0.5 сек. Сложно, конечно, представить клапан или бак, изменяющий уровень, с дискретностью 5 сек, но все же... Интересно!

Итак, собираем в одно пространство все объекты и начинаем с 0.5 сек.

Рис. 11. ВКПа. 0.5 сек. Все объекты в одном пространстве.
Рис. 11. ВКПа. 0.5 сек. Все объекты в одном пространстве.

Хочется сказать - может, на этом и закончим? Ну, да ладно, - 2 сек.

Рис. 12. ВКПа. 2 сек. Все объекты в одном пространстве.
Рис. 12. ВКПа. 2 сек. Все объекты в одном пространстве.

Узбекский орнамент, однако... Все! Видимо, всему есть предел, а потому хватит издеваться на системами управления! Пусть даже и не очень четкими...

Ну, хорошо. Напоследок - 200 мсек.

Рис. 13. ВКПа. 0.2 сек. Все объекты в одном пространстве.
Рис. 13. ВКПа. 0.2 сек. Все объекты в одном пространстве.

Ничего не напоминает? Если нет - посмотрите на рис. 1.

Подводим итог

Что делать с кодом - не понятно. Что-то в нем такое, что портит праздник души. Или не в коде? Но все сходится на нем. Параметры-то, вроде, мы уже установили. Ждем-с вестей от Вячеслава. Но вестей конкретных. Вестей таких, которые бы объяснили возникший парадокс. Или убрали бы все "непонятки".

В рамках текущей темы мы показали влияние задержек на результат. Увлеченно и во всем их разнообразии. Причем в ситуации, которые у элементов схемы они могут сильно отличаться друг от друга. Наверное, что-то подобное можно сварганить в SimInTech. Ну, например,  разнести отдельные субблоки по проектам, а проекты собрать в пакет (так это, кажется, называется?). Но пока подобное за гранью моей мечты...

Нужно все же осилить хотя бы одну из "мечт" - намеченную.

Комментарии (3)


  1. AndreyDmitriev
    14.09.2024 06:20

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

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

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

    А вот дальше там два интегратора и обратная связь (кстати, интегратор в клапане мне кажется избыточным, можно обойтись и одним в баке, ну да ладно), и меняя шаг дискретизации мы также можем получить всё что душе угодно. Кстати, насколького я вижу, SimInTech автоматом подгоняет шаг интегрирования к шагу дискретизации, а вот в LabVIEW параметр dt интегратора настраиваемый:

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

    Вообще если вы по-какой-то причине не доверяете SimInTech, так возьмите Simulink, ведь пример SimInTech почти один в один взят вот отсюда:

    Water Level Control in a Tank

    Там вот так всё устроено:

    И да, выходы контроллерва нечёткой логики тоже настроены слегка несимметрично (я имею ввиду close_slow/open_slow):

    Ну и результат:

    Если же начать накручивать параметры в симулинке, то, разумеется, тоже появятся всякие весёлые эффекты.

    Либо вас смущает лёгкая специфика реализации на автоматах, но это вроде вот тут уже обсуждалось: Нечеткая логика и конечные автоматы против ПИД-регулятора. https://habr.com/ru/articles/500268/.


    1. lws0954 Автор
      14.09.2024 06:20

      Как говорят, - хороший вопрос Вы задали ;) А, действительно, зачем это - колготня с задержками. В заключении статьи я сказал, что "мы показали влияние задержек на результат". Ну, и что? Для специалиста это как-бы очевидно. Тоже мне, мол, открыл Америку? ;)

      И тут я сам себе задумался... Действительно, а что я показал и что сказал нового в этом смысле? В смысле задержек, конечно.. Ну, меняется результат... И что?

      А то... что задержки в параллельных средах и последовательных распространяются по-разному. Скажу гениальную вещь! :) В параллельных - параллельно, в последовательных - последовательно. Ит тут уж совсем - нестандартная мысль (заметили, как я себя любимого оцениваю - гениальный, нестандартный и т.д.!)! Можно ли, меняя только задержки/задержку, понять - параллельная система или последовательная? Конечно, по конечному результату... А?

      Это уже вопрос к Вам. Платформы SimInTech, LabView, Matlab последовательные или параллельные? Можно ли, глядя на результаты, выдаваемые здесь решениями, сказать что-то об их параллелизме?

      Вот я, как "колокольчик", занудно везде "звоню", что ВКПа - параллельная платформа. И, действительно, результаты в ней достаточно заметно отличаютс от других платформ. Которые, не скрывая гордости, говорят, что мы, мол последовательные. И что с того? Нафига нам параллелизм ВКПа, если есть удовлетворяющие нас последовательные, SimInTech, LabView и далее по списку.

      Действительно, - нафига? Я "звоню"- потому, мол, что последовательные выдают правильный результат, а последовательные его искажают. И что? А какой он должен быть - правильный? И далее повторяется все по кругу...

      Однако, есть задачи, которые без параллелизма просто не работают. От слова совсем. Это, например, моделирование RS-триггера.Существующее программирование в лице любых платформ с нею не справляется. И чо? Ведь все остальное работает. И даже где-то параллельно. Неверно? А докажи!

      Ну, с триггером все понятно. А с остальным? Итак, повторю вопрос.

      Можно ли по результатам работы обсуждаемой здесь системы управления баком определить как она (модель, конечно) реализована - параллельно или последовательно? Причем, в реальном исполнении ее компоненты параллельны по определению. А тогда как быть с результатами? Результаты реальной параллельной системы и ее модели будут совпадать? Должны совпадать? Если будут отличаться, то насколько допустимо это отличие?....

      Теперь понятно, почему я тормознул с ответом? Вы своим вопросом заставили (в хорошем смысле, конечно) меня задуматься. И, кажется, даже я что-то придумал. Но это надо еще проверить И, может быть, даже будет основой для еще одной статьи ;)...

      Но вопрос к Вам остается. Можно ли и как по результатам работы рассматриваемой нами системы управления баком оценить степень параллелизма SimInTech? Степень адекватности моделирования? Все это относится и к, безуcловно, более близкой и известной Вам LabView.? Может это тоже заставит Вас задуматься? :)


      1. AndreyDmitriev
        14.09.2024 06:20

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

        Но в контексте конкретно данного обсуждения я, кажется, начинаю вас понимать, и вот мне кажется, что вы в какой-то мере подменяете понятия "непрерывности/дискретности" понятиями "параллельно/последовательно". Вероятно вы считаете автоматы клапана и бака некими "параллельными" системами с "мгновенной" реакцией.

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

        Теперь мы слегка изменим наш бачок — добавим сервомотор, и ардуинка теперь будет не просто опрашивать уровень поплавка, но будет управлять мотором, подключённому к клапану. В этом месте мы внесли дискретность в наше устройство, причём не только временнýю, но и по значениям (что поплавок, что серва имеют ограниченный набор допустимых значений). Вот теперь время цикла ардуинки будет очень даже влиять на результат — если я поставлю пять секунд, то мало того, что бачок начнёт наполняться с задержкой, он ещё и запросто может переполниться. Очевидным образом при уменьшении времени дискретизации (увеличении частоты) наша система будет ближе и лучше приближаться к непрерывной (догонит ли Ахиллес черепаху?). Я так понял из вашего отчёта выше, что при 0,01 сек это примерно и произошло и "диаграммы совпали идеально".

        Пока что всё просто, это просто азы САУ. Современные средства симуляции позволяют моделировать оба типа систем, равно как и смешанные, гибридные. Тот скриншот, что я показал в комменте к предыдущему посту — это классический пример симуляции дискретной, или последовательной, если будет угодно. Я подогнал результат под SimInTech, но меняя время дискретизации, я безусловно буду влиять на результат. Там всё исполнение в цикле идёт последовательно — вычисление управляющего воздействия контроллером нечёткой логики -> вычисление значений уровня воды и потока, и на следующей итерации (такте) передача их в контроллер (там сдвиговый регистр), и так далее по кругу, никакой "параллельности" там нет и в помине.

        Однако LabVIEW Control Design and Simulation Module умеет и в непрерывную систему. Я не стал усложнять там коммент, но установка этого модуля добавляет специальный цикл для симуляции, и вот в нём возможно соединить выход напрямую с входом вот таким образом (что в общем противоречит парадигме потоков данных):

        Но это даёт нам ту самую "параллельность" (хотя бы визуальную), когда выход мгновенно распространяется на вход, как если бы наш поплавок был жёстко соединён с клапаном. На самом деле авторы тулкита просто вдохновились Симулинком.

        Для симуляции дискретной системы там свои отдкльные инструменты (поэтому и примеры отдельно для разных типов и инструменты для непрерывных и дискретных систем разные).

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

        Как я уже отметил выше, при уменьшении времени дискретизации наша дискретная система начинает приближаться к непрерывной, но расчёт с использованием очень большого количества шагов непродуктивен с точки зрения разбазаривания вычислительных ресурсов, поэтому тут всё хитрее — используется Рунге-Кутта с переменным шагом, и шаг уменьшается лишь на сильных изменениях. Так что симуляция в общем всегда дискретна, просто шаг очень маленький. При этом я могу задать требуемую точность симуляции, как относительную, так и абсолютную, а LabVIEW сама подгонит необходимый шаг. Документация: https://www.ni.com/docs/en-US/bundle/labview-control-design-and-simulation-module/page/lvsim/sim_configparams.html?srsltid=AfmBOopYUDq60ORMmPloKvwHHDw7du6r_GpWTyGoCd1bOwyr6plxTNRH Дискретный шаг на симуляцию непрерывной системы не влияет, а лишь на количество данных (но в точках отсчёта данные должны быть валидны).

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

        А так, кстати, там вот что доступно:

        (надо будет на досуге разобраться с остальными, а то кроме Рунге-Кутта да Эйлера ничё не знаю). Вот это всё или почти всё есть и в Simulink в той или иной форме. Там, к примеру, также как и в LabVIEW есть как дискретный, так и непрерывный интегратор (https://de.mathworks.com/help/sps/ref/integratordiscreteorcontinuous.html).

        SimInTech если верить документации также умеет симулировать как дискретные так и непрерывные системы, причём их можно комбинировать.

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