Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ № 9 Связь Simulink с приложением с графичес...doc
Скачиваний:
12
Добавлен:
24.11.2019
Размер:
152.06 Кб
Скачать

Аргументы 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. При создании полосы прокрутки используются следующие ее свойства.