- •Лабораторная работа № 9 тема: «Связь Simulink-модели и приложения с графическим интерфейсом»
- •Описание приложения с графическим интерфейсом и Simulink-модели
- •Аргументы mysfun
- •Подфункция mdlInitializeSizes
- •Value - текущее значение, задаем равным InitControl.
- •Подфункция mdlUpdate
- •Окно с запросом на удаление окна приложения
- •Подфункция sldCallback
- •Текст s-функции mysfun с подфункциями
Аргументы mysfun
Входными аргументами функции mysfun являются:
t - текущее время;
x - вектор состояний (в нашем случае он не используется);
u - вектор значений входных сигналов (в нашем случае его длина равна 2, т.к. на вход блока S-function по шине приходит два сигнала);
flag - целое число 0, 1, 2, 3, 4 или 9, в зависимости от которого вызывается одна из подфункций mdlInitializeSizes, mdlUpdate, mdlOutputs или mdlTerminate.
Функция mysfun возвращает следующие величины
sys - зависит от того, какая из подфункций работает, т.е. от значения flag. Тогда sys является результатом работы соответствующей подфункции;
x0 - начальное состояние, которое определяется в функции mdlInitializeSizes (в нашем примере не используется);
str - зарезервировано для будущих расширений, пока значение str должно быть пустым массивом;
ts - матрица из двух столбцов, которая содержит шаги дискретизации и смещения по времени.
В зависимости от значения входного аргумента flag функции mysfun вызываются следующие подфункции (это реализовано при помощи условного переключателя switch).
Подфункция mdlInitializeSizes (см. раздел Подфункция mdlInitializeSizes), которая служит для инициализации S-функции и создания окна приложения с двумя парами осей и полосой прокрутки.
Подфункция mdlUpdate (см. раздел Подфункция mdlUpdate), которая предназначена для выполнения действий на каждом шаге по времени.
Подфункция mdlOutputs (см. раздел Подфункция mdlOutputs) возвращает сигналы на выходах блока S-function (в нашем примере и блока S-function нет выходов, поэтому выходным аргументом будет пустой массив).
Подфункция mdlTerminate (см. раздел Подфункция mdlTerminate) выполняется при завершении работы Simulink-модели, в ней производится запрос на удаление окна приложения GUI_Simulink.
Наша модель не имеет непрерывных состояний и работает с постоянным шагом, поэтому для работы S-функции достаточно перечисленных функций. В общем случае может понадобится еще и программирование подфункции mdlDerivatives, которая вычисляет производные от непрерывных состояний, и подфункции mdlGetTimeOfNextVarHit, которая находит значение следующего момента времени, при котором должен будет работать блок S-function.
Кроме перечисленных подфункций в функции mysfun есть еще подфункция sldCallback (см. раздел Подфункция sldCallback), которая служит для обработки события Callback полосы прокрутки, возникающего при изменении положения ее бегунка.
Подфункция mdlInitializeSizes
В подфункции mdlInitializeSizes выполняется инициализация параметров S-функции, для чего вызывается функция simsizes, возвращающая структуру sizes со следующими полями, каждое из которых по умолчанию имеет значение 0:
NumContStates -число непрерывных состояний блока S-function (в нашем примере их нет).
NumDiscStates - число дискретных состояний блока S-function (в нашем примере их так же задавать не надо).
NumOutputs - число выходов блока S-function (в нашей модели у блока S-functions нет выходов).
NumInputs - число входов блока S-function (в нашем примере их 2).
DirFeedthrough - флаг, задающий так называемый прямой проход (Direct Feedthrough), т.е. определяется ли значения на выходах блока S-function только значениями на его входах (в нашем примере он так же не нужен).
NumSampleTimes - число дискретизаций по времени, на которых работает блок S-function (в нашем случае он работает на одной частоте, поэтому полагаем NumSampleTimes=1).
После заполнения полей структуры sizes при помощи функции simsizes создается вектор sys с информацией об S-функции.
Далее в подфункции mdlInitializeSizes в качестве значения выходного аргумента x0 с начальными условиями для непрерывных состояний задается пустой массив (поскольку непрерывных состояний нет) и выходному аргументу str (который зарезервирован для будущих расширений) так же задается пустой массив.
После этого задается значение выходного аргумента ts с временем дискретизации блока S-function равным -1 (это значит, что время дискретизации наследуется из того блока, который обращается ко входу блока S-function).
На этом в функции mdlInitializeSizes задание параметров блока S-function завершается и начинается создание окна приложения GUI_Simulink с графическим интерфейсом.
Сначала при помощи функции figure создается окно, указатель на него записывается в переменную Fig. При создании окна используются следующие его свойства.
Position - положение окна на экране монитора, значение - вектор [x y width height], где (x,y) - координаты левого нижнего угла окна, width - ширина, а height - высота (все единицы по умолчанию в пикселях).
Color - цвет окна, 'k' значит черный.
MenuBar - отвечает за наличие стандартных меню и панели инструментов в графическом окне. Нам они не нужны, поэтому присваиваем значение 'none'.
Name - имя, выводимое в заголовке окна приложения, в нашем случае это имя приложения GUI_Simulink.
NumberTitle - отвечает за наличие в заголовке окна приложения слова Figure и номера окна, в нашем случае это не нужно, поэтому присваиваем свойству NumberTitle значение 'off'.
Далее в переменную InitControl записывается начальное значение параметра Control равное 1 и при помощи функции uicontrol создается полоса прокрутки внизу окна, бегунок которой установлен в значение, соответствующее 1. При создании полосы прокрутки используются следующие ее свойства.