- •Лабораторная работа № 9 тема: «Связь Simulink-модели и приложения с графическим интерфейсом»
- •Описание приложения с графическим интерфейсом и Simulink-модели
- •Аргументы mysfun
- •Подфункция mdlInitializeSizes
- •Value - текущее значение, задаем равным InitControl.
- •Подфункция mdlUpdate
- •Окно с запросом на удаление окна приложения
- •Подфункция sldCallback
- •Текст s-функции mysfun с подфункциями
Лабораторная работа № 9 тема: «Связь Simulink-модели и приложения с графическим интерфейсом»
Данный раздел посвящен обмену данными Simulink-модели и приложения с графическим интерфейсом пользователя. Мы разберем один из вариантов реализации обмена, в котором значение некоторого параметра Simulink-модели устанавливается в приложении с графическим интерфейсом, а данные, получаемые в Simulink-модели, визуализируются на осях приложения с графическим интерфейсом.
Для чтения этого материала необходимы знания:
среды Simulink (см. Simulink: Инструмент моделирования динамических систем (Занятия по изучению Simulink проводит д.т.н., проф. Федяева Г. на кафедре АЭП БГТУ));
программирования S-функций для Simulink-моделей (см. Simulink-функции);
программирования приложений с графическим интерфейсом без среды визуального программирования GUIDE (см. Создание приложений с GUI без среды GUIDE ЛАБ № 5).
Некоторые необходимые сведения изложены в материале этого раздела.
Описание приложения с графическим интерфейсом и Simulink-модели
Рассмотрим простую задачу. В приложении GUI_Simulink с графическим интерфейсом (окно которого приведено ниже) есть полоса прокрутки и пара осей.
Окно приложения GUI_Simulink
Полоса прокрутки служит для изменения параметра Control в Simulink-модели от 0 до 5. Этот параметр влияет на выходной сигнал, возвращаемый Simulink-моделью, по следующему простому закону:
выходной сигнал = Control * sin(t)
Изменение значения Control приводит к отображению этого значения на верхних осях желтой линией и отображению значения выходного сигнала на нижних осях фиолетовой линией. Пределы по оси времени через каждые 50 сек. сдвигаются (на 50 сек.).
Сама Simulink-модель приведена ниже. Файл GUI_Simulink с моделью здесь.
Simulink-модель
Simulink-модель состоит из следующих блоков:
блока с именем Control (это библиотечный блок Constant);
блока с именем Sin Wave (библиотечный генератор синусоидального сигнала с параметрами по умолчанию);
мультиплексора, т.е. библиотечного блока Mux;
блока S-function, который как раз и является S-функцией, предназначенной для реализации обмена между Simulink-моделью и приложением GUI_Simulink (для того, чтобы задать S-функцию блока, достаточно сделать по нему двойной щелчок и в появившемся диалоговом окне Sink Block Parameters: S-function в строке ввода S-function задать имя mysfun (см. рисунок ниже).
Задание имени S-функции для блока S-function
Для солвера Simulink-модели сделаны следующие настройки, которые показаны на рисунке ниже (настройки солвера задаются в окне Configuration Parameters, которое появляется после выбора в меню Simulation окна модели пункта Configuration Parameters…).
Настройки солвера модели GUI_Simulink.mdl
После запуска Simulink-модели появляется окно приложения GUI_Simulink, в котором пользователь управляет значением Control и наблюдает за результатом. При остановке Simulink-модели появляется диалоговое окно с запросом, надо ли оставить окно приложения GUI_Simulink или его можно удалить.
Для того, чтобы блок S-function работал, необходимо запрограммировать функцию с подфункциями для:
инициализации блока S-function;
действиями на каждом шаге по времени;
действиями, выполняемыми перед завершением работы Simulink-модели.
Детально эта функция mysfun и подфункции обсуждаются в следующих разделах.
Совместная работа приложения с графическим интерфейсом и Simulink-модели происходит потому, что при инициализации S-функции создается окно приложения GUI_Simulink с полосой прокрутки и осями с заголовками. С событием Callback полосы прокрутки связывается функция, которая меняет значение константы блока Control. Далее на каждом шаге расчета модели S-функция получает на вход значения с выходов блоков Sine Wave и Control и выводит на оси приложения GUI_Simulink значение Control и Control * sin(t).
Основная проблема состоит в том, что подфункция, выводящая текущие значения Control и Control * sin(t) на оси приложения GUI_Simulink, должна знать указатели на оси. Для решения этой проблемы используется следующий механизм обмена указателями между подфункциями. При создании окна приложения указатель на него сохраняется в качестве значения свойства UserData блока S-function. Далее, при расчете на каждом шаге по времени указатель на окно приложения извлекается из свойства UserData и этот указатель используется для получения указателей на оси приложения.
S-функция mysfun
S-функция mysfun (ее текст приведен в разделе Текст S-функции mysfun с подфункциями) состоит из основной функции mysfun и подфункций, необходимых для работы S-функции и приложения с графическим интерфейсом. Основная функция mysfun вызывается как при инициализации Simulink-модели, так и при ее работе и перед остановкой Simulink-модели.