Разработка системы управления на базе нечеткой логики с генерацией кода в "DLL"
Лабораторная работа №8 по курсу "Управление в технических системах"
Введение
SimInTech является инструментом для создания математических моделей любых систем, описание которых может быть представлено в виде систем алгебраических и обыкновенных дифференциальных уравнений.
Для упрощения процесса моделирования сложных разветвленных систем SimInTech позволяет использовать графическую анимацию блоков, которые в зависимости от рассчитанных параметров изменяют свое графическое отображение.
Для увеличения скорости расчета и проверки работоспособности разработанных алгоритмов в качестве бортовых алгоритмов управления SimInTech позволяет преобразовывать расчетные схемы моделей алгоритмов управления во внешние динамические библиотеки "DLL" с использованием автоматической генерации кода Си и использовать эти "DLL" вместо исходных схем моделей алгоритмов управления.
В данной лабораторной работе на первом этапе будет проведено исследование работы анимированных блоков на примере блоков библиотеки Нечеткая логика. На втором этапе будет разработана модель системы управления на базе нечеткой логики для поддержания заданного уровня воды в негерметичном баке. На третьем этапе нечеткий регулятор будет преобразован в вид динамической библиотеки "DLL" с использованием автоматической генерации кода.
Цель работы
- Ознакомиться с работой анимированных блоков на примере блоков библиотеки Нечеткая логика
- Приобрести первичные навыки для разработки модели системы управления на базе нечеткой логики
- Изучить работу генератора кода SimInTech
Задачи работы
- Изучить принцип построения системы нечеткого вывода типа Мамдани
- Разработать модель для исследования работы анимированных блоков на базе нечеткой логики
- Исследовать работу анимированных блоков
- Разработать модель системы управления негерметичным баком:
- разработать модель негерметичного бака
- разработать модель клапана
- разработать модель регулятора на базе нечеткой логики
- Построить графики зависимости целевого и фактического уровня воды в баке от времени и график расхода обратного тока от времени
- Сравнить графики целевого и фактического уровня воды в баке
- Преобразовать нечеткий регулятор в вид динамической библиотеки "DLL" с использованием генератора кода
- Сравнить работу модели системы с преобразованным нечетким регулятором с работой исходной модели системы
Основные теоретические сведения
В классической теории автоматического управления управляющее воздействие на систему рассчитывается в зависимости от регулируемой величины, выраженной в численном виде, и система управления производит преобразование входных параметров в управляющие воздействия передаточными функциями.
- ЕСЛИ "входной параметр" = "A", ТО "управляющее воздействие" = "B"
- ЕСЛИ "входной параметр 1" = "А1" И/ИЛИ "входной параметр 2" = "A2", ТО "управляющее воздействие" = "B"
- ЕСЛИ "температура воды" = "горячая", ТО "команда" = "открыть кран холодной воды"
- ЕСЛИ "температура воды" = "холодная", ТО "команда" = "открыть кран горячей воды"
- ЕСЛИ "температура воды" = "холодная" И "кран горячей воды" = "открыт полностью", ТО "команда" = "закрыть кран холодной воды"
- ЕСЛИ "температура воды" = "горячая" И "кран холодной воды" = "открыт полностью", ТО "команда" = "закрыть кран горячей воды"
- ЕСЛИ "уровень" = "высокий", TO "команда клапана" = "закрывать быстро"
- ЕСЛИ "уровень" = "нормальный", TO "команда клапана" = "не изменять"
- ЕСЛИ "уровень" = "низкий", ТО "команда клапана" = "открывать быстро"
- ЕСЛИ "уровень" = "нормальный" И "скорость изменения уровня" = "уменьшается", ТО "команда клапана" = "открывать медленно"
- ЕСЛИ "уровень" = "нормальный" И "скорость изменения уровня" = "увеличивается", ТО "команда клапана" = "закрывать медленно"
В данных примерах управляющее воздействие определяется не в численном виде в зависимости от численного значения температуры воды или значения уровня воды в баке, а в виде логического анализа утверждений.
Для построения алгоритмов управления на базе нечеткой логики данные, передаваемые в блок регулирования, основанного на нечеткой логике, должны быть преобразованы. Для этого необходимо входные параметры и выходные воздействия преобразовать в лингвистические переменные. Каждая лингвистическая переменная характеризуется набором термов.
- лингвистическая переменная "температура воды" может иметь следующие термы: "холодная", "нормальная", "горячая"
- лингвистическая переменная "уровень" – термы: "низкий", "нормальный", "высокий"
- лингвистическая переменная "команда клапана" – "открывать быстро", "открывать медленно", "не изменять", "закрывать быстро", "закрывать медленно"
Каждый терм определяется своей функцией принадлежности μi(x), которая может принимать значения от 0 до 1. Для каждого значения входной переменной x вычисляются значения μi(x) для каждого терма. Эта процедура преобразования точного множества входных величин в нечеткое множество, определяемое с помощью значений функций принадлежности μi(x), называется фазификацией.
После проведения фазификации применяется набор правил. Результатом применения правила является величина, называемая степенью истинности, принимающая значение от 0 до 1. Например, пусть для следующего правила:
ЕСЛИ "уровень" = "низкий", ТО "команда клапана" = "открывать быстро",
входная величина, обозначающая уровень, h, задана в метрах. Если значение уровня является низким (μlow(h) = 1, где μlow(h) – функция принадлежности для терма "низкий"), или уровень не низкий (μlow(h) = 0), то степень истинности правила принимает значение 1 или 0, аналогично классической логике. Нечеткая логика применяется в случае, если функция принадлежности принимает значение от 0 до 1, то есть если 0 < μlow(h) < 1. Так, μlow(h) = 0.5 означает, что уровень не низкий и не высокий, соответственно скорость открытия клапана должна быть между быстрой и медленной. В данном правиле степень истинности заключения "открывать быстро" равна 0.5.
Подобным образом вычисляется степень истинности для каждого правила. Если в правиле условий. Эта процедура называется агрегацией. Вычисленное значение истинности для всех условий каждого правила применяется к заключениям каждого правила. Этот процесс называется активизацией. Агрегация и активизация образуют нечеткий логический вывод.
- μоткрывать быстро = 0.5
- μоткрывать медленно = 0.3
- μне изменять = 0
- μзакрывать быстро = 0
- μзакрывать медленно = 0
Из этого следует, что скорость открытия клапана должна быть между быстрой и медленной.
По полученным степеням истинности для каждого терма выходной переменной рассчитывается ее числовое значение. Эта процедура называется дефазификацией.
- Приведение к нечеткости, или фазификация
- Нечеткий логический вывод: агрегация и активизация
- Аккумуляция
- Приведение к четкости, или дефазификация

Задание 1. Исследование работы анимированных блоков
- ЕСЛИ "уровень" = "высокий", TO "команда клапана" = "закрывать быстро"
- ЕСЛИ "уровень" = "нормальный", TO "команда клапана" = "не изменять"
- ЕСЛИ "уровень" = "низкий", ТО "команда клапана" = "открывать быстро"
Для фазификации и дефазификации необходимо задать функции принадлежности для каждого терма. Пусть уровень воды в баке определяется как расстояние от датчика уровня, расположенного на уровне, который определен как нормальный, до текущего уровня воды с соответствующим знаком: если значение близко к -1, то уровень определяется как "низкий", близко к 0 – "нормальный", близко к 1 – "высокий". Функции принадлежности этих термов будут задаваться как функции принадлежности Гаусса. Пусть команда клапана определяется как скорость открытия/закрытия клапана с соответствующим знаком: если значение близко к -1, то команда определяется как "закрывать быстро", 0 – "не изменять", 1 – "открывать быстро". Функции принадлежности этих термов будут задаваться как треугольные.
Для разработки системы нечеткого вывода необходимо построить нечеткий логический вывод в соответствии с заданным набором правил. Так как в правилах заданы простые условия – нет сложных логических конструкций вида "условие 1" И/ИЛИ "условие 2", то такие нечеткие правила представляются с помощью операции импликации вида Y = X * w, где w – весовой коэффициент, равный в данном случае 1. Соответственно, Y = X, то есть операцию импликации можно опустить и сразу проводить аккумуляцию и дефазификацию.
- разработана модель фазификации входной переменной
- построены графики результатов фазификации
- дополнена модель для аккумуляции и дефазификации выходной переменной
- произведено исследование работы блоков фазификации и дефазификации
Разработка модели фазификации
- В главном окне SimInTech нажать левой кнопкой мыши на кнопку Файл и выбрать пункт Новый проект
- В выпадающем меню выбрать пункт Схема модели общего вида
- Сохранить проект, оставив имя по умолчанию или указать желаемое имя проекта
- 1 блок Линейный источник из вкладки Источники – с помощью данного блока будут формироваться значения входной переменной x
- 1 блок Размножитель из вкладки Векторные – с помощью данного блока скалярный сигнал будет преобразован в вектор необходимой размерности
- 1 блок Фазификация Гаусса из подменю Фазификация вкладки Нечеткая логика – с помощью данного блока будут вычисляться значения функций принадлежности входной переменной x для каждого терма
- 1 блок Фазовый портрет из вкладки Вывод данных – с помощью данного блока будет производиться графическое отображение результатов работы фазификации Гаусса



Свойство "S-функции на границах" необходимо для проверки выхода входной величины за границу диапазона, так как за границами диапазона функция Гаусса убывает, а следовательно значение функции принадлежности уменьшается, что не всегда допустимо. Например, если температура воды достигнет 100°C, то это должно означать, что вода горячая и необходимо открыть кран холодной воды, но если проверка на выход из диапазона не осуществляется, то в данной точке функция Гаусса может иметь значение равное 0, что будет интерпретироваться как температура воды не является горячей, и впоследствии может привести к неправильным результатам.
Для того, чтобы построить сразу три графика функций принадлежности на одной плоскости, на входы блока Фазовый портрет должны подаваться три пары фазовых переменных, то есть две векторные величины, размерностью "3". Для этого необходимо преобразовать скалярный входной сигнал в вектор, состоящий из трех одинаковых элементов, равных входному сигналу, с помощью блока Размножитель. Для этого необходимо открыть окно Свойства блока Размножитель и в поле "Формула" задать значение свойства "Коэффициент размножения" равным "3#1".
- "Максимальный шаг" = "0.1"
- "Конечное время расчета" = "20"
Запуск моделирования и построение графиков
После настройки схемы, для построения графиков результатов фазификации, необходимо запустить процесс моделирования и дождаться окончания расчета.
- Открыть окно Свойства графика блока Фазовый портрет и задать на
вкладке Графики и оси названия графиков в соответствии с заданными термами:
"низкий", "нормальный", "высокий" (Рисунок 5).

Рис. 5. Окно "Свойства графика" блока "Фазовый портрет" с выделенными свойством, которое необходимо изменить. - На вкладке Общие в поле "Заголовок" изменить название графика на "Уровень"
Сохранить изменения и закрыть окно нажатием кнопки Ok.

Получены графики гауссовых функций принадлежности, которые показывают, как линейное изменение входной переменной от -1 до 1 приводит к изменению значений трех термов в диапазоне от 0 до 1. В начале, когда входная величина равна -1, терм "низкий" имеет функцию принадлежности равную 1, функции принадлежности термов "нормальный" и "высокий" равны нулю. По мере роста входной величины, значение функции принадлежности терма "низкий" уменьшается, а терма "нормальный" начинает расти: чем ближе к 0, тем ближе значение функции к 1. При приближении входной величины к 1 функция принадлежности терма "высокий" приближается к 1, а термов "низкий" и "нормальный" стремятся к 0. Таким образом, увеличение входной величины от -1 до 1 представлено в виде наглядного процесса перехода от "низкий", через "нормальный", к "высокий".
Помимо фазификации Гаусса возможно использовать блоки треугольной и трапециевидной фазификации или, если функции принадлежности нельзя представить с помощью этих стандартных функций, есть возможность задать пользовательские функции с помощью языка программирования. Пример реализации двусторонней функции принадлежности Гаусса с помощью блока Язык программирования приведен в Лабораторной работе №1 Московского Политеха "Исследование функций принадлежности нечетких множеств" в разделе "Задание 4. Построение графика двусторонней функции принадлежности Гаусса".
Исследование работы анимированного блока "Фазификация Гаусса"



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


Дополнение модели и исследование работы анимированного блока "Треугольная функция"
Необходимо дополнить модель до системы нечеткого вывода путем добавления блока, выполняющего аккумуляцию и дефазификацию. Для этого необходимо в рабочую область окна проекта добавить блок Треугольная функция из подменю Нечеткий вывод библиотеки Нечеткая логика и соединить линией связи согласно рисунку (Рисунок 12).




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

Для просмотра и изменения текста скрипта анимации блока Треугольная функция необходимо открыть окно Скрипт анимации аналогичными действиями, описанными ранее для блока Фазификация Гаусса.


В данном задании была рассмотрена анимация блоков на примере блоков библиотеки Нечеткая логика. Помимо использования стандартных блоков в SimInTech возможно создание собственных блоков и их также возможно сделать анимированными. Пример создания пользовательского анимационного блока и процедура добавления его в новую библиотеку описан в Лабораторной работе №3 SimInTech "Разработка анимационного блока в SimInTech" (раздел "Разработка библиотеки блоков").
Ознакомление с работой анимированных блоков завершено. Далее, с применением данных блоков, будет разработана модель системы управления негерметичным баком на основе нечеткой логики.
Задание 2. Разработка системы управления негерметичным баком на базе нечеткой логики
В данном задании рассматривается модель системы управления негерметичным баком, которая должна поддерживать уровень воды в баке на заданном уровне.
Описание модели негерметичного бака

- "V" – объем бака, м3
- "ht" – высота бака, м
- "area" – площадь сечения бака
- "outarea" – площадь выходного отверстия
- "overs" – положение сенсора переполнения от верхнего среза, м
- "h" – уровень воды в баке, м
- "rate" – расход, поступающий в бак, м3/с
- "outrate" – расход утечки, м3/с
Уравнения динамики негерметичного бака:
где g = 9.81 м/с2 – ускорение свободного падения.
Описание модели клапана
- "0" – клапан закрыт – расход равен нулю
- "1" – клапан открыт – расход равен номинальному, заданному как константа
Выходное значение – расход воды, поступающий в бак, "rate", рассчитывается как произведение номинального расхода на значение положения клапана.
Описание модели нечеткого регулятора

Регулятор представляет собой систему нечеткого вывода, которая включает следующие компоненты: фазификатор, механизм вывода, дефазификатор.
- отрицательная
- близкая к нулю
- положительная
Таким образом, если разница между фактическим и целевым уровнем воды в баке отрицательная, то есть фактический уровень ниже целевого, то необходимо увеличить расход воды, поступающей в бак; если разница положительная, то есть фактический уровень превышает целевой, то необходимо ограничить подачу воды в бак; если разница близкая к нулю, то есть фактический уровень соответствует целевому или отличается на малую величину, то изменять положение клапана не надо, но если при этом уровень воды изменяется с некоторой скоростью, то для определения скорости открытия/закрытия клапана необходимо учесть вторую переменную – "скорость изменения уровня".
- уменьшается
- не изменяется
- увеличивается
Итак, если разница уровней близкая к нулю и скорость изменения уровня уменьшается, то необходимо медленно увеличивать поток поступающей в бак воды, а если скорость увеличивается, то необходимо медленно уменьшать поток воды, поступающей в бак.
- закрывать быстро
- закрывать медленно
- не менять
- открывать медленно
- открывать быстро
Функции принадлежности, определяющие нечеткие множества для входных переменных будут задаваться как функции принадлежности Гаусса, для выходной переменной – как треугольные функции принадлежности.
- ЕСЛИ "разница уровней" = "отрицательная", ТО "команда клапана" = "открывать быстро"
- ЕСЛИ "разница уровней" = "близкая к нулю", TO "команда клапана" = "не изменять"
- ЕСЛИ "разница уровней" = "положительная", TO "команда клапана" = "закрывать быстро"
- ЕСЛИ "разница уровней" = "близкая к нулю" И "скорость изменения уровня" = "уменьшается", ТО "команда клапана" = "открывать медленно"
- ЕСЛИ "разница уровней" = "близкая к нулю" И "скорость изменения уровня" = "увеличивается", ТО "команда клапана" = "закрывать медленно"
Выполнение задания
- разработана модель негерметичного бака
- разработана модель клапана
- разработана модель нечеткого регулятора как системы нечеткого вывода типа Мамдани
- проведено моделирование системы управления негерметичным баком
- построены графики зависимости уровня воды в баке и расхода обратного тока от времени
- произведено сравнение графиков целевого и фактического уровня воды в баке
Разработка модели негерметичного бака
- В главном окне SimInTech нажать левой кнопкой мыши на кнопку Файл и выбрать пункт Новый проект
- В выпадающем меню выбрать пункт Схема модели общего вида
- Сохранить проект, оставив имя по умолчанию или указать желаемое имя проекта
Разработка моделей негерметичного бака, клапана и нечеткого регулятора будет производиться в отдельных субмоделях для удобства организации блоков по моделям. После разработки всех моделей они будут объединены в общую модель системы управления.
- 1 блок Порт входа и 3 блока Порт выхода из вкладки Субструктуры – данные блоки предназначены для соединения внешней части схемы со схемой, находящейся внутри субмодели
- 1 блок Интегратор с ограничением и 1 блок Язык программирования из вкладки Динамические, 2 блока Усилитель и 1 блок Сравнивающее устройство из вкладки Операторы – данные блоки моделируют работу негерметичного бака

initialization
{Высота бака}
ht = 2;
{Площадь сечения бака}
area = 1;
{Площадь сечения выходной трубы}
outarea = 0.05;
{положение сенсора переполнения от верхнего среза}
overs = 0;
{начальный уровень в баке}
inith = 0;
end; 
Для задания формулы расчета уровня воды необходимо открыть окно Свойства блока Усилитель с подписью "Уровень в баке" и задать в поле "Формула" свойства "Коэффициент усиления" равным "1/area".
{Расчет утечки из бака пропорционально давлению}
input h;
g = 9.8;
outrate = sqrt(2*g*h)*outarea;
output outrate; После закрытия окна
текстового редактора блока Язык программирования
названия портов блока изменятся согласно заданным в скрипте переменным. Поскольку подписи
портов перекрываются, необходимо изменить размеры блока согласно рисунку (Рисунок 25). 
Создание модели бака завершено, далее необходимо выйти из субмодели двойным нажатием левой кнопки мыши по свободному пространству рабочей области субмодели.
Разработка модели клапана
- 2 блока Порт входа и 1 блок Порт выхода из вкладки Субструктуры – данные блоки предназначены для соединения внешней части схемы со схемой, находящейся внутри субмодели
- 1 блок Интегратор с ограничением из вкладки Динамические и 1 блок Перемножитель из вкладки Операторы – данные блоки моделируют работу клапана


Разработка модели нечеткого регулятора
- 2 блока Порт входа и 1 блок Порт выхода из вкладки Субструктуры – данные блоки предназначены для соединения внешней части схемы со схемой, находящейся внутри субмодели
- 2 блока Демультиплексор из вкладки Векторные – данный блок позволяет разделить векторный входной сигнал на отдельные выходные сигналы
- 1 блок Мультиплексор из вкладки Векторные – данный блок обеспечивает поочередную передачу на один выходной порт нескольких входных сигналов
- 2 блока Фазификация Гаусса из подменю Фазификация вкладки Нечеткая логика – данные блоки предназначены для фазификации входных сигналов, то есть для преобразования точных множеств входных величин в нечеткие множества, определяемые с помощью значений функций принадлежности μA(error), μA(dh), соответствующих заданным лингвистическим термам
- 3 блока Импликация, 2 блока И (конъюнкция) из подменю Операции вкладки Нечеткая логика – данные блоки предназначены для формирования механизма вывода на основе заданной в разделе Описание модели нечеткого регулятора базы правил
- 1 блок Треугольная функция из подменю Нечеткий вывод вкладки Нечеткая логика – данный блок предназначен для дефазификации выходной переменной, то есть для преобразования нечеткого множества, определяемого функцией принадлежности μB(valve cmd), в конкретное значение выходной переменной "valve cmd"
Для блоков Демультиплексор необходимо задать значение свойства "Массив размерностей входов" равными "[1, 1, 1]" и для блока Мультиплексор задать значение свойства "Количество портов" равным "5".
- ЕСЛИ "разница уровней" = "отрицательная", ТО "команда клапана" = "открывать быстро"
- ЕСЛИ"разница уровней" = "близкая к нулю", TO "команда клапана" = "не изменять"
- ЕСЛИ "разница уровней" = "положительная", TO "команда клапана" = "закрывать быстро"
- ЕСЛИ "разница уровней" = "близкая к нулю" И "скорость изменения уровня" = "уменьшается", ТО "команда клапана" = "открывать медленно"
- ЕСЛИ "разница уровней" = "близкая к нулю" И "скорость изменения уровня" = "увеличивается", ТО "команда клапана" = "закрывать медленно"

Подписи к блокам Демультиплексор и Мультиплексор обозначают соответствие между номерами выходных и входных портов и лингвистических термов. Так, первому выходному порту верхнего блока Демультиплексор соответствует лингвистический терм "низкая", а первому входному порту блока Мультиплексор – терм "закрывать быстро".



После завершения настройки схемы модели нечеткого регулятора необходимо выйти из субмодели и изменить размер блока с подписью "Нечеткий регулятор" так, чтобы подписи портов не перекрывали друг друга.
Объединение моделей в систему управления негерметичным баком на базе нечеткой логики
- 1 блок Меандр из вкладки Источники – данный блок позволяет задавать целевой уровень воды с определенной периодичностью
- 1 блок Константа из вкладки Источники – данный блок позволяет задать номинальный расход воды, поступающий в бак
- 1 блок Сравнивающее устройство из вкладки Операторы – данный блок предназначен для вычисления разницы между фактическим и целевым уровнем воды в баке
- 2 блока Временной график из вкладки Вывод данных – данные блоки выводят значения результатов моделирования в виде графиков
Так как требуется построить графики не только фактического уровня воды, но и целевого, и сравнить их, необходимо чтобы эти графики были построены в одном окне. Для этого требуется для одного из блоков Временной график задать значение свойства "Количество входных портов" равным "2" .


Далее необходимо задать номинальный расход воды, поступающий в бак. Для этого необходимо открыть окно Свойства блока Константа и задать значение свойства "Значение" равным "0.5".
Настройка параметров расчета

Закрыть окно Параметры проекта, при этом внесенные изменения сохраняются.
Запуск моделирования и построение графиков
После настройки проекта для построения графиков необходимо запустить процесс моделирования и дождаться окончания расчета.
- Открыть окно Свойства графика блока
Временной график с подписью "Графики уровня
воды в баке" и на вкладке Графики и
оси задать значения свойств (Рисунок 35):
- в поле "Название графика" задать значение первому графику "График целевого уровня воды", второму графику "График фактического уровня воды"
- в колонке "Ось Y" задать значение свойства "Название оси" равным "Уровень h, м"

Рис. 33. Окно "Свойства графика" блока "Временной график" с подписью "Графики уровня воды в баке" с выделенными свойствами, которые необходимо изменить. - На вкладке Общие ввести в поле "Заголовок" название графика "Графики уровня воды в баке"

График целевого уровня воды действительно представляет собой импульсы с полупериодом 20 секунд, значения которых изменятся с 1.5 м до 0.5 м и обратно. График фактического уровня воды достаточно плавно стремится к графику целевого уровня. В результате анализа полученных графиков установлено, что модель работает корректно.
- Открыть окно Свойства графика блока Временной график с подписью
"График расхода обратного тока" и задать на вкладке Графики и оси
название оси Y согласно рисунку (Рисунок 37).

Рис. 35. Окно "Свойства графика" блока "Временной график" с подписью "График расхода обратного тока" с выделенным свойством, которое необходимо изменить. - На вкладке Общие в поле "Заголовок" изменить название графика на
"График расхода обратного тока" и отключить свойство "Показывать
легенду" (Рисунок
38).

Рис. 36. Окно "Свойства графика" блока "Временной график" с подписью "График расхода обратного тока", вкладка "Общие", с выделенным свойством, которое необходимо изменить.
Сохранить изменения и закрыть окно нажатием кнопки Ok.

В результате анализа полученного графика установлено, что график полностью соответствует ожидаемым результатам: переменная "outrate" в момент времени 20 секунд приближенно равна "0.271", что согласуется с теоретическим значением, рассчитанным по формуле для значения уровня воды в тот же момент времени, равного "1.5 м":
Задание 3. Преобразование системы управления негерметичным баком в систему с нечетким регулятором в виде "DLL"
SimInTech позволяет преобразовывать расчетные схемы моделей алгоритмов управления во внешние динамические библиотеки "DLL" с использованием автоматической генерации кода Си. Использование динамических библиотек "DLL" вместо исходных схем моделей алгоритмов управления позволяет существенно увеличить скорость расчета и проводить проверку работоспособности данных алгоритмов в качестве бортовых алгоритмов управления. Данный раздел посвящен преобразованию алгоритма управления клапаном – нечеткого регулятора – в программный код на языке Си и его компиляции в "DLL" с помощью встроенного шаблона, настроенного для создания "DLL"-библиотек под Windows "MinGW".
- произведено преобразование нечеткого регулятора в вид динамической библиотеки "DLL" с использованием генератора кода
- проведено моделирование системы управления негерметичным баком с преобразованным нечетким регулятором
- произведено сравнение результатов работы и скорости работы модели системы с преобразованным нечетким регулятором и исходной модели системы
Преобразование нечеткого регулятора во внешнюю динамическую библиотеку "DLL" с использованием генерации кода Си
Перед преобразованием нечеткого регулятора во внешнюю динамическую библиотеку "DLL" необходимо сохранить модель нечеткого регулятора в отдельный файл. Для этого двойным нажатием левой кнопкой мыши по блоку Субмодель с подписью "Нечеткий регулятор" войти в субмодель, затем в главном окне SimInTech необходимо выбрать пункт Файл подпункт Сохранить страницу как. Сохранить модель нечеткого регулятора в файле нового проекта под именем "FL_controller.prt".




В частности, например, для получения кода, выполняющего вычисления с фиксированной точкой, необходимо во вкладке Настройки в строке "Директории шаблона кода" выбрать в выпадающем меню строку: "%codetemplates%FixPoint_16_16_MinGW_DLL\".
- <имя алгоритма>.h
- <имя алгоритма>.inc
- <имя алгоритма>.log
- <имя алгоритма>_init.inc
- <имя алгоритма>_state.inc
- <имя алгоритма>.dll

Рис. 42. Рабочая область проекта с сообщениями генератора кода для схемы.
Исследование работы системы управления негерметичным баком с нечетким регулятором в виде "DLL"
Для исследования работы системы управления негерметичным баком с нечетким регулятором в виде "DLL" необходимо сохранить копию проекта с исходной моделью системы "Схема модели общего вида.prt" под именем "Схема модели общего вида_1.prt". Открыть проект "Схема модели общего вида_1.prt".
- "Количество портов" – с помощью данного свойства задается количество входных портов блока в соответствии с количеством входных контактов в расчетной схеме нечеткого регулятора "FL_controller.prt"
- "Массив размерностей выходов" – с помощью данного свойства задаются размерности выходных портов в виде массива, причем размерность массива соответствует количеству выходных контактов в расчетной схеме нечеткого регулятора. После закрытия окна и сохранения свойств у блока Внешняя DLL появятся два входных порта и один выходной порт
- "Имена загружаемых DLL" – с помощью данного свойства задается путь к сгенерированному на предыдущем шаге файлу с расширением ".dll"
- "Имена файлов проектов для отладки" – с помощью данного свойства задается имя файла проекта с расчетной схемой нечеткого регулятора, соответствующей загружаемой "DLL", который возможно использовать для отладки схемы. Для наблюдения за процессом моделирования нечеткого регулятора необходимо установить синхронизацию с реальным временем, для этого открыть окно Параметры проекта и во вкладке Управление расчётом активировать параметр Синхронизация с реальным временем, и после запуска моделирования совершить двойное нажатие левой кнопкой мыши по блоку Внешняя DLL, после чего откроется проект, указанный в значении данного свойства
- "Тип сортировки" – с помощью данного свойства задается флаг, определяющий порядок расчета блока в общей схеме
- "Имена оборудования" – с помощью данного свойства задаются имена оборудования (компонентов), которые подставляются во входные/выходные контакты схемы "DLL"
- "Создавать по умолчанию не существующие переменные" – при активировании данного свойства будут создаваться переменные в базе данных, которых не существует для рассчитываемого оборудования (компонентов)
- "Выдавать предупреждения если сигнал не найден" – при активировании данного свойства будут выдаваться предупреждения, если сигнал не найден
- "Количество потоков" – с помощью данного свойства задается количество потоков, в которых будут производиться расчеты по данной "DLL"








Заключение
В ходе данной лабораторной работы была разработана модель для исследования работы анимированных блоков на примере блоков библиотеки Нечеткая логика. Также была разработана модель системы управления негерметичным баком с регулятором, основанным на системе нечеткого вывода типа Мамдани. Были построены графики зависимости уровня воды в баке от времени и расхода обратного тока от времени, а также произведено сравнение графиков целевого и фактического уровня воды в баке. В результате математического моделирования была проверена корректность работы модели системы управления негерметичным баком на базе нечеткой логики.
Для знакомства с приемами работы генератора кода Си было проведено преобразование нечеткого регулятора во внешнюю динамическую библиотеку "DLL". Контрольное моделирование показало, что нечеткий регулятор в виде динамической библиотеки "DLL", сгенерированной на языке Си, работает аналогично нечеткому регулятору в субмодели. Сравнение ускорений работы показало, что система с регулятором в виде "DLL" работает в несколько раз быстрее аналогичной системы с регулятором в виде схемы в субмодели.