Министерство образования и науки российской федерации Федеральное государственное бюджетное образовательное учреждение Высшего профессионального образования Сибирский государственный аэрокосмический университет имени академика М.Ф. Решетнева. (СибГАУ) Методические указания к лабораторным работам по «Управляющим ЭВМ и комплексам» на основе программного комплекса MatLab 2007 (Simulink) Авторы: Сидоров В.Г. Сидоров А.С. Красноярск 2010
Simulink 5 - система математического моделирования I. Запуск При нажатии на кнопку Simulink, которая находиться рядом с кнопкой «?», происходит запуск Браузера Библиотек. II. Окно Браузера Библиотек Библиотеки Simulink представляют собой обширный набор поименованных блоков, имеющих графическое изображение (пиктограмму) и содержащихся в отдельных файлах. Для их просмотра служит Браузер Библиотек (рисунок 1). Рисунок 1 Окно Браузера Библиотек Окно Браузера Библиотек имеет заголовок, меню, панель инструментов, поле информационных сообщений, окна с деревом библиотек и компонентами выделенного раздела библиотек и строку состояния (внизу окна). Из окна Браузера можно перетаскивать компоненты мышью в окно модели. 1. Заголовок и строка состояния Заголовок имеет кнопку, открывающую стандартное меню управления окном: восстановление окна в размерах, перемещение, изменение размера, свертывание и развертывание и закрытие. Строка состояния служит для вывода коротких сообщений о состоянии системы. Эти сообщения контекстно-зависимые. 2. Меню окна Браузера Библиотек Меню Браузера Библиотек содержит следующие пункты: File - работа с файлами библиотек; Edit - добавление компонентов и их поиск; View - управление показом элементов интерфейса; Help - вывод окна справки по Браузеру Библиотек.
На рисунке 2 показано окно Браузера Библиотек с открытым пунктом меню File. Этот пункт меню имеет всего три команды: New - создание S-модели (команда Model) или библиотеки (команда Library), Open… - загрузка файлов S-модели и их поиск в файловой системе и Preferences… - настройка Simulink. Рисунок 2 Окно Браузера Библиотек - меню File В меню Edit (рисунок 3) Браузера Библиотек имеется три команды: Add to the current model - добавить выделенный блок в текущую модель; Find block… - найти блок с заданным именем; Find next block… - найти следующий блок с заданным именем. Рисунок 3 Окно Браузера Библиотек - меню Edit Первая команда очевидна. Надо лишь отметить, что если текущего окна нет, то появиться окно с предложением создать новое окно модели. Команда Find block… выводит окно с запросом имени блока. Команда Find next block… служит для поиска следующего блока, в который входит заданное слово. Меню View (рисунок 4) Браузера Библиотек содержит команды для управления видом интерфейса Браузера: Рисунок 4 Окно Браузера Библиотек - меню View Toolbar - вывод / скрытие панели инструментов; Status bar - вывод / скрытие строки состояния; Description - вывод / скрытие окна сообщений; Stay on top - установка статуса окна Браузера «поверх всех окон»;
Collapse entire Browser - закрытие текущего раздела библиотеки; Expand entire Browser - раскрытие текущего радела библиотеки; Large Icons - отображение пиктограмм блоков в увеличенном размере; Small Icons - отображение пиктограмм блоков в уменьшенном размере; Show Parameters for selected block - вывод окна установки параметров отмеченного блока. Меню Help (рисунок 5) служит для доступа к справочной системе окна Браузера. Содержит следующие команды: Рисунок 5 Окно Браузера Библиотек - меню Help Help on the selected block - справка по выделенному блоку; Simulink help - вывод окна справочной системы Simulink; Tip of the day - полезные советы на каждый день. 3. Панель инструментов окна Браузера Библиотек Панель инструментов окна Браузера Библиотек имеет всего четыре кнопки, дублирующие некоторые команды меню: Create a new model - создание S-модели; Open a model - загрузка S-модели; Stay on top - установка статуса окна Браузера «поверх всех окон»; Find - поиск блока по заданному имени. III. Интерфейс окна моделей Simulink 1. Панель инструментов окна моделей Команда New Model в окне Браузера Библиотек открывает пустое окно модели пакета Simulink (рисунок 6). Рисунок 6 Окно S-модели пакета Simulink Как видно из рисунка 6, панель инструментов содержит 18 кнопок, которые для удобства расшифровки назначения пронумерованы: 1. New Model - создание новой модели; 2. Open Model - загрузка модели; 3. Save - сохранение текущей модели; 4. Print - печать текущей модели; 5. Cut - перенос выделенного объекта в буфер; 6. Copy - копирование выделенного объекта в буфер обмена;
7. Paste - вставка объекта из буфера; 8. Undo - отмена последней операции; 9. Redo - восстановление последней отмененной операции; 10. Start Simulation - запуск моделирования; 11. Stop Simulation - остановка моделирования; 12. Build All - создание RTW кода; 13. Update Diagram - обновление графической информации модели; 14. Build Subsystem - создание кода, для выделенной подсистемы; 15. Library Browser - открытие Браузера Библиотек; 16. Toggle Model Browser - открытие Браузера моделей в левой части окна модели; 17. Go to the Parent System - переход в основную (родительскую) систему; 18. Debug - переход в режим отладки моделей. 2. Основное меню пакета Simulink Несмотря на наличие панели инструментов, важная роль принадлежит обычному меню пакета Simulink. Оно дает более полный набор средства по управлению процессом моделирования. Меню содержит следующие пункты: File - операции с файлами S-моделей; Edit - операции редактирования текущей модели; View - управление видом интерфейса; Simulation - операции запуска моделирования и его настройки; Format - операции форматирования текущей модели; Tools - доступ к инструментальным средствам; Help - доступ к средствам справочной системы. 3. Меню File окна модели Меню File содержит ряд команд ля работы с файлами (см рисунок 7). Рисунок 7 Меню File окна модели New - создание модели (Model) или библиотеки (Library); Open… - загрузка файла модели; Close - закрытие окна текущей модели; Save - сохранение текущей модели; Save As… - сохранение текущей модели под заданным именем; Source Control… - управление источниками сигналов; Model Properties - вывод окна свойств текущей модели; Preferences… - вывод окна свойств Simulink;
Print… - печать текущей модели; Print Setup - вывод окна установок печати; Exit MATLAB - завершение работы. 4. Меню редактирования Edit Undo - отмена последней операции; Redo - восстановление последней отмененной операции; Cut - перенос выделенных объектов в буфер; Copy - копирование выделенных объектов в буфер; Paste - вставка объектов из буфера в заданное курсором мыши место; Clear - уничтожение выделенных объектов; Select All - выделение всех объектов модели; Copy model to clipboard - копирование всей модели в буфер; Find - поиск в модели заданного объекта. 5. Меню форматирования Format В меню Format (и в контекстном меню) находится ряд команд форматирования блоков. Их можно разделить на несколько характерных групп. Управление отображением надписей и видом блоков: Font - установка шрифта для текстовых надписей; Text alignment - выравнивание текста в текстовом блоке; Flip name - помещение подписи блока сверху или снизу блока; Show / Hide name - отображение или скрытие подписи выделенного блока; Flip block - отображение блока относительно вертикальной оси; Rotate block - вращать блок на 90°; Show drop shadow - показ тени от блока. Показ меток портов: Show port labels - показ меток портов. Установка цветов: Foreground color - установка цвета линий выделенных блоков; Background color - установка цвета фона для выделенных блоков; Screen color - установка цвета фона для всего окна модели. Прочие установки: Library link display - отображение связей с библиотеками; Sample time colors - установка цвета блока индикации времени; Wide nonscalar lines - увеличение / уменьшение ширины нескалярных линий; Signal dimensions - отображение размерности сигналов; Port data types - вывод данных о типе портов; Execution order - вывод порядкового номера блока в последовательности исполнения. IV. Установка параметров моделирования В меню Simulation окна модели есть команда Simulation Parameters… На вкладке Решатель (Solver) находятся параметры решающего устройства (рисунок 8). Время моделирования задается двумя параметрами: Start time - начальное время; Stop time - конечное время. Реальное время моделирования зависит от быстродействия компьютера. В опциях Решателя Solver Options можно установить тип решения Type и метод решения. Возможно два типа решения: Variable-step - решение с переменным шагом; Fixed-step - решение с постоянным шагом.
Рисунок 8 Установка параметров моделирования Лучшие результаты дает решение с переменным шагом. В этом случае шаг автоматически подстраивается под скорость изменения результатов в ходе решения. Это исключает расхождение решения, которое нередко случается при фиксированном шаге. Метод с фиксированным шагом стоит применять, когда фиксированный шаг определяется спецификой решения задачи, например, получение таблицы результатов с фиксированным шагом. Метод решения дифференциальных уравнений имеет решающие значение в достижение успеха моделирования. Методы, в наименовании которых имеется слово stiff, служат для решения жестких систем дифференциальных уравнений. Следующие три параметра задаются автоматически (auto), но в особых случаях можно ввести явно. Max step size - максимальный размер шага интегрирования; Min step size - минимальный шаг интегрирования; Initial step size - начальный шаг интегрирования. Еще важен такой параметр моделирования, как точность интегрирования. Relative tolerance - относительная точность интегрирования; Absolute tolerance - абсолютная точность интегрирования. V. Библиотека источников сигналов и воздействий (Sources) 1. Источник постоянного воздействия Constant Источник постоянного воздействия задает константу. Источник характеризуется всего лишь одним параметром - своим уровнем воздействия в виде константы (по умолчанию 1). Уровень воздействия может быть задан в виде скаляра (например, 1), вектора (например, [1, 2] - вектор из двух констант) или матрицы (например, [1, 2; 5, 6] - матрица из четырех констант). При установленном флажке Interpret vector parameters as 1-D вектор параметров интерпретируется как одномерный. Параметр Show Additional Parameters включает / выключает отображение падающего списка типа выходного сигнала. 2. Источник синусоидального воздействия Sine Wave Источник задает синусоидальное воздействие. Источник характеризуется следующими параметрами для непрерывной во времени синусоиды (Sine type: Time based):
амплитудой Amplitude, смещением (постоянной составляющей) Bias, частотой Frequency (радиан/сек), фазой Phase (радиан) и периодом дискретизации (используется для согласования работы источника и других компонентов модели во времени) Sample Time. А для дискретной синусоиды (Sine type: Sample based) источник характеризуется следующими параметрами: амплитудой Amplitude, смещением (постоянной составляющей) Bias, количеством выборок за период Samples per period, количеством выборок начального смещения (фаза) Number of offset samples, эталонное время Sample time. 3. Источник нарастающего воздействия Ramp Источник линейно нарастающего воздействия вида F (t) = k⋅t. Параметры источника: Slope - наклон, угловой коэффициент временной зависимости k; Start time - время, начиная с которого воздействие нарастает; Initial value - начальный уровень воздействия. 4. Источник одиночного перепада Step Источник воздействия в виде одиночного перепада. Параметры источника: Step time - время появления перепада; Initial value - начальное значение воздействия (до перепада); Final value - конечное значения воздействия (до перепада); Sample time - период дискретизации. 5. Генератор сигналов Signal Generator Источник воздействия типа генератор сигналов служит для создания одного из четырех типов периодических сигналов: Sine - синусоидальный; Square - прямоугольный; Sawtooth - пилообразный; Random - случайный. Источник характеризуется двумя параметрами - амплитудой и частотой сигнала. 6. Источник случайного сигнала с равномерным распределением Uniform Random Number Источник случайного сигнала с равномерным распределением. Уровень сигнала ограничен сверху и снизу значениями Maximum и Minimum. Параметр Initial Seed задает начальное число для генерации псевдослучайных чисел. 7. Источник случайного сигнала с нормальным распределением Random Number Источник случайного сигнала служит для создания случайного сигнала с равномерным распределением. Специфическими параметрами являются среднее значение сигнала Mean и среднеквадратическое отклонение Variance. 8. Источник дискретных импульсов Pulse Generator Источник служит для создания прямоугольных импульсов. Параметры: Amplitude - амплитуда; Period - период (в секундах для непрерывного временного масштаба; количество тактов периода дискретизации, для дискретного временного масштаба); Pulse width - ширина импульсов (в процентах от периода для непрерывного временного масштаба; количество тактов периода дискретизации, для дискретного временного масштаба);
Phase delay - фазовая задержка (в секундах для непрерывного временного масштаба; количество тактов периода дискретизации, для дискретного временного масштаба); Sample time - период дискретизации. 9. Генератор сигнала нарастающей частоты Chirp Generator Генератор задает почти синусоидальные колебания, частота которых увеличивается до некоторого момента времени. 10. Генератор белого шума с ограниченной полосой Band Limited White Noise Генератор служит для создания шумового сигнала с заданной мощностью, равномерно распределенной по частоте. 11. Источник времени моделирования Clock Служит для генерации чисел, которые являются значениями текущего времени моделирования. Параметром является шаг Decimation, с которым меняются отсчеты времени. 12. Цифровой источник времени Digital Clock Источник имитирует работу цифровых часов, создавая ступенчатый нарастающий сигнал, соответствующий времени моделирования. Он имеет единственный параметр - период дискретизации Sample time. 13. Источник постоянного сигнала с нулевым значением Ground «Источник» применяется для заземления входа какого-либо блока, чтобы исключить появление предупреждения о неподсоединенных входах. 14. Конструктор сигналов Signal Builder По умолчанию конструктор создает сигнал в виде прямоугольного импульса, который виде в окне конструктора. Используя мышь, можно перемещать линии импульса и придавать им наклон. 15. Блок From File Блок From File служит для получения данных из внешнего файла. 16. Блок From Workspace Блок From Workspace служит для получения данных из рабочего пространства. 17. Блок In Блок In служит создания входного порта подсистемы для приема данных, поступающих извне. 18. Генератор последовательности повторяющихся чисел Repeating Sequence Генератор позволяет задать последовательность повторяющихся чисел. Параметры: Time values - вектор значения моментов времени. Значения должны монотонно увеличиваться; Output values - вектор выходных значений в моменты времени, заданные Time values.
VI. Библиотека Регистраторов сигналов Sinks 1. Осциллограф Scope Двойной щелчок по блоку Scope открывает окно осциллографа (рисунок 9). Панель инструментов содержит ряд кнопок: Print - Печать графика на принтере; Parameters - Параметры; Zoom - масштаб по осям Х и У; Zoom X-Axis - масштаб по оси Х; Zoom Y-Axis - масштаб по оси У; Autoscale - автомасштабирвоание; Save current axes settings - записать текущее установки осей; Restore saved axes settings - восстановить сохраненные настройки осей; Floating scope - включение / выключения осциллографа, оптимизированного под регистрацию сигналов с форматом чисел с плавающей точкой. Рисунок 9 Окно осциллографа При нажатии на кнопку Parameters происходит открытие окна параметров осциллографа (рисунок 10). Рисунок 10 Окно параметров осциллографа
Вкладка General содержит основные параметры: Number of axes - число осей (каналов) осциллографа; Time range - пределы временного интервала; Tick labels - вывод / скрытие отметок по осям; Sampling - установка временных соотношений (Decimation - в десятичных долях времени; Sample time - в тактах периода дискретизации). Вкладка Data History содержит параметры, позволяющие задать максимальное число точек для хранения и параметры хранения осциллограмм в рабочем пространстве системы MatLAB. 2. Графопостроитель XY Graph Графопостроитель, в отличии от осциллографа, имеет входы по оси Х и У, что позволяет строить графики функций в полярной системе координат, фигуры Лиссажу, фазовые портреты и т.д. Параметре блока: x-min - минимальное значение по оси х; x-max - максимальное значение по оси х; y-min - минимальное значение по оси у; y-max - максимальное значение по оси у; Sample time - период дискретизации (-1 для наследования). 3. Дисплей Display Дисплей - это устройство представления цифровой информации. В окне параметров можно установить: Format - формат отображения данных; Decimation - представление входных данных в десятичной долях времени; Sample time - представление данных в долях периода дискретизации. Floating point - представление вещественных данных в формате числе с плавающей точкой. 4. Блок остановки моделирования Stop Блок остановки моделирования обеспечивает прерывание моделирования и его остановку, если на его входе действует сигнал, не равный нулю. Для остановки моделирования в заданный момент времени нужно сформировать в этот момент отличный от нуля сигнал, а в остальное время обеспечить нулевой сигнал. 5. Заглушка Terminator Отвод для неиспользуемых (например, на этапе отладки) выходных портов. 6. Блок Out Блок Out служит для создания выходного порта подсистемы для передачи ее данных. VII. Библиотека Маршрутизации сигналов Signal Routing 1. Блок создания шины Bus Creator Блок служит для создания шины данных, в основном для удобства графического моделирования.
2. Блок шинного селектора Bus Selector Блок обеспечивает выбор заданных сигналов из нескольких в шине данных. 3. Блок резервирования памяти под данные Data Store Memory Блок обеспечивает резервирование памяти под хранение данных, которые могут понадобиться в ходе моделирования. Основные параметры: Data store name - задает имя сохраняемых данных; Data store read and write blocks - отображает список блоков считывания Data Store Read и записи Data Store Write, которые обслуживает данная память; Initial value - задает начальное значение и формат данных (например, если этот параметр задан как [1, 2; 5, 6], то это означает, что он является матрицей размера 2х2); Если блок находится в подсистеме, то доступными будут данные только этой подсистемы. Если блок будет расположен в системы, то все ее данные будут видимы, т.е. доступными для сохранения и для считывания. 4. Блок считывания данных Data Store Read Блок служит для считывания данных с заданным именем. Данные задаются блоком Data Store Memory. Параметры: Data store name - задается область памяти для считывания, которая была создана блоком Data Store Memory; Data store write blocks - отображает список блоков записи Data Store Write, которые работают с данной памятью. Sample time- период дискретизации. 5. Блок записи данных Data Store Write Блок служит для записи данных с заданным именем. Данные задаются блоком Data Store Memory. Параметры: Data store name - задается область памяти для записи, которая была создана блоком Data Store Memory; Data store read blocks - отображает список блоков считывания Data Store Write, которые работают с данной памятью. Sample time- период дискретизации. 6. Блок демультиплексирования Demux Блок служит для демультиплексирования сигналов. Основным параметром является количество выходов Number of outputs. 7. Блок From Блок From осуществляет прием сигнала от блока Goto. 8. Блок Goto
С помощью блока Goto можно создать «беспроводной» передатчик данных, совместимых с этим блоком и имеющих ярлык (обычно в виде буквы). Параметры: Tag - ярлык; Tag visibility - область видимости ярлыка (Local - локальная, на блоке ярлык заключен в []; Scoped - ограниченная, на блоке ярлык заключен в {}, и требует дальнейшего определения блоком Goto Tag Visibility; Global - глобальная, на блоке ярлык без скобок). 9. Блок Goto Tag Visibility Блок используется для определения ограниченной видимости ярлыка, заданной блоком Goto, для блока From. Если блок находится в подсистеме, то ярлык будет видим только в подсистеме. 10. Блок мультиплексирования Мux Блок производит мультиплексирование нескольких входных сигналов. Количество устанавливается параметром Number of inputs. Нумерация входных сигналов ведется сверху вниз. 11. Блок ручного переключения между двумя входами Manual Switch Блок ручного переключения представляет собой тумблер, с помощью которого выбирается один из двух входов, чей сигнал появиться на выходе. Переключение осуществляется двойным нажатием мыши. Переключение может осуществляться как и до моделирования, так в входе его. 12. Блок условного переключения между двумя входами Switch Блок передает сигнал с первого или третьего входа (информационные входы) на выход в соответствии со значением на втором входе (управляющий вход). Основным параметром является условие для передачи сигнала с первого входа Criteria for passing first input, которое заключается в том, что сигнал на управляющем входе может быть больше или равен пороговому значению (u2>=threshold), больше порогового значения (u2>threshold) или не равен нулю (u2 ~= 0). Пороговое значение задается в поле Threshold. 13. Блок управляемого переключения между входами Multiport Switch Блок осуществляет передачу сигнала с выбранного входа. Верхний (первый) называется управляющим входом, а остальные информационными. Значение сигнала на управляющем входе определяет, какой вход будет работать. Например, если на управляющем входе сигнал равен 1, то первый информационный вход будет работать. VIII. Библиотека Атрибутов сигналов Signal Attributes 1. Блок преобразования типа сигнала Data Type Conversion Блок служит для преобразования типа сигнала. Параметром является тип выходного сигнала Data Type. Параметр Saturate on integer overflow позволяет избежать выхода за граница целочисленного диапазона. 2. Блок задания начального значения IC Блок служит для задания начального значения (инициализация). 3. Блок проверки сигналов Probe
Блок служит для проверки сигнала по следующим параметрам: Probe width - проверка количества сигналов в канале; Probe sample time - проверка периода дискретизации; Probe complex signal - проверка сигнала на принадлежность к комплексным числам (возвращает 1, если сигнал представлен в комплексном виде, 0 в противном случае); Probe signal dimension - проверка размерности сигнала. 4. Блок Width Блок показывает количество сигналов, передающихся по шине или линии. IX. Библиотека Математических операций Math Operations 1. Вычисление абсолютного значения Abs Блок производит вычисление абсолютного значения сигнала. Параметры: Saturate on integer overflow - ограничивать при переполнении целого типа; Enable zero-crossing detection - задействовать определение пересечения нуля. 2. Блок алгебраического ограничения Algebraic Constraint Блок алгебраического ограничения служит для вычисления значений переменной исходя из заданных (обычно в виде уравнения или системы уравнений) ограничений. Иными словами, этот блок служит для решения систем уравнений, накладывающих ограничения на значения переменных. Параметром служит предполагаемое решение Initial guess. Оно позволяет более эффективно решать уравнение. 3. Блок побитовых операций Bitwise Logical Operation Блок служит для осуществления побитовых логических операций. Операция выбирается в падающем меню Bitwise operator, второй операнд записывается в поле Second Operand. 4. Блок комбинаторной логики Combinatorial Logic Блок обеспечивает преобразование входного сигнала в соответствии с правилами, задаваемыми таблицей истинности. Параметром является вектор-столбец выходных значений таблицы истинности (например, [0; 0; 0; 1] задает операцию И), при этом значения таблицы истинности для входных сигналов формируется неявно. Входной сигнал - это вектор-строка, состоящий из значений входных переменных (например, [1 0] соответствует третьей строке таблицы истинности для двух входных переменных).
Рисунок 11 Пример использования блока комбинаторной логики На рисунке 11 показан пример использования блока комбинаторной логики (таблица истинности задает операцию И). Mux (мультиплексор) позволяет объединить ряд входных сигналов в один. На входе блока комбинаторной логики действует сигнал [1 0], что соответствует второй строке таблицы истинности. В соответствии с логикой операции И значение выхода будет 0. Следует отметить, что на вход блока комбинаторной логики должен поступать сигнал типа boolean. Для этого необходимо чтобы, либо у источника сигнала на выходе был сигнал типа boolean, либо использовать блок Преобразования типов данных из библиотеки Атрибуты сигналов для преобразования типа данных сигнала. 5. Блок Complex to Magnitude-Angle Блок вычисления абсолютного значения и фазы комплексного числа. 6. Блок Complex to Real-Imaginary Блок вычисления реальной и мнимой части комплексного числа. 7. Блок скалярного умножения Dot Product Блок производит операцию скалярного произведения двух сигналов. 8. Блок масштабирования Gain Коэффициент масштабирования данных (т.е. умножение на заданный коэффициент). Параметр умножение Multiplication позволяет установить тип умножения (Element-wise - поэлементное, или Matrix - матричное). 9. Блок логические операторы Logical operator Блок позволяет задать любую базовую логическую операцию. Параметр оператор Operator позволяет выбрать тип операции (AND - И, OR - ИЛИ, NAND - И-НЕ, NOR - НЕ-ИЛИ, XOR - искл. ИЛИ, NOT - ОТРИЦАНИЕ), а параметр Number of inputs - количество входов. 10. Блок Magnitude-Angle to Complex Блок формирует комплексное число по модулю и фазе.
11. Блок математическая функция Math Function Блок позволяет задать математическую функцию. Аргументом является входной сигнал - u (для функции двух переменных u и v). Вид функции определяется параметром Функция Function: exp(u) - экспоненциальная; log(u) - логарифмическая; 10u - показательная с основанием 10; log10(u) - десятичный логарифмическая; magnitude^2 - модуль аргумента в квадрате; square - возведение в квадрате; sqrt - квадратный корень; pow - uv; conjugate - комплексно-сопряженное число; reciprocal - обратная величина; hypot - гипотенуза двух входных сигналов u2 +v2 ; rem - остаток от деления u ; v transpose - транспонирование. 12. Блок объединения сигналов в матрицу Matrix Concatenation Блок объединения сигналов в матрицу образует их ряда векторов матрицу, обеспечивая их объединение (конкатенацию) по горизонтали или по вертикала - параметр Concatenation Method. 13. Блок масштабирования матричных данных Matrix Gain Служит для масштабирования матричных данных. 14. Блок поиска минимума или максимума MinMax Для поиска в данных минимального и максимального значения служит блок MinMax. Параметр функция Function определяет выходной параметр (минимум или максимум). 15. Блок полиномиальных выражений Polynomial Блок служит для задания степенного многочлена P(u) в виде вектора его коэффициентов. Они задаются в порядке уменьшения степени независимой переменной u. Выходной сигнал - это значения полинома для входного сигнала. 16. Умножение Product Блок предназначен для умножения или деления ряда входных сигналов. Если в параметре количество входов Number of inputs указать цифру (например, 2), то будет происходить умножение. Для того чтобы блок мог выполнять деление, необходимо в строке Number of inputs записать вместо цифры операцию для каждого входа (например, запись */**// означает, что вход 1 - умножение, вход 2 - деление, входы 3 и 4 - умножение, входы 5 и 6 - деление). 17. Блок Real-Imaginary to Complex Блок формирует комплексное число по реальной и вещественной частям.
18. Блок операторов отношения Relational operator Блок производит сравнение первого сигнала со вторым. На выходе будет единичный сигнал, если условие истинно, нулевой, если условие ложно. Оператор сравнения выбирается из падающего списка Relational Operator: == - равно; ~= - неравно; < - меньше; <= - меньше или равно; > - больше; >= - больше или равно. 19. Блок изменения размерности вектора или матрицы Reshape Блок позволяет изменить размерность вектора или матрицы. Выходом может быть: 1-D array - одномерный массив; Column vector - вектор-столбец; Row vector - вектор-строка; Customize - размерность задается в строке Output dimensions. 20. Блок функций округления Rounding Functions Блок позволяет выбрать функцию округления до целого значения. Функция округления задается параметром Function: Floor - округление до минимума (например, 6.8 округлится до 6); Ceiling - округление до максимума (например, 6.1 округлится до 7); Round - округление по общему правилу; Fix - фиксация целой части и отбрасывание дробной. 21. Блок контроля знака Sign Блок служит для определения знака сигнала. Если на входе блока действует положительный сигнал, то на выходе +1, если отрицательный, то -1. 22. Блок ползункового интерактивного масштабирования Slider Gain Блок позволяет задавать коэффициент масштабирования с помощью ползунка от минимального значения Low до максимального Max. 23. Блок суммирования сигналов Sum Блок позволяет производить суммирование нескольких сигналов. Параметры: Icon Shape - внешний вид блока (Rectangular - прямоугольный, Round - круглый). List of signs - число входов и выполняемые по ним операции (например, ++- означает, что блок будет иметь 3 входа, первые два суммирующие, а третий вычитающий). Знак | позволяет увеличить расстояние между входами на изображении блока. 24. Блок тригонометрических функций Trigonometric Functions Блок выполняет вычисление тригонометрических функций, где аргументом является входной сигнал. Вид функции выбирается из падающего списка Functions.
X. Библиотека Непрерывных блоков Continuous 1. Дифференцирующий Derivative Блок позволяет производить дифференцирование входных сигналов. Он не имеет параметров. 2. Интегрирующий блок Integrator Блок выполняет функции интегрирования входных сигналов. Окно параметров содержит следующие элементы: External Reset (внешний сброс) - тип внешнего управляющего сигнала (none - нет, rising - нарастающий, falling - спадающий, either - любой); Initial condition source - источник начального значения выходного сигнала (internal - внутренний, external - внешний); Limit output - включение / выключение ограничение выходного сигнала; Upper / lower saturation limit - верхний / нижний предел ограничения (по умолчанию inf, +∞); Show saturation port - включает / выключает отображение порта, выводящего уровни ограничения выходного сигнала; Show state port - включает / выключает отображение порта состояния системы; Absolute tolerance - абсолютная погрешность (по умолчанию auto - автоматический выбор). 3. Блок задания модели в пространстве состояний State-Space Блок служит для задания модели в пространстве состояний. Параметрами являются матрицы A, B, C, D и начальные условия Initial Conditions и абсолютная точность Absolute tolerance. 4. Блок задания передаточной функции Transfer Fcn Блок служит для задания передаточной функции. Блок имеет два параметра - векторы коэффициентов числителя Numerator и знаменателя Denominator. 5. Блок фиксированной задержки Transport Delay Блок фиксированной задержки обеспечивает временную задержку входного сигнала на заданное время. Время задержки следует выбирать больше шага моделирования. Параметры блока: Time delay - время задержки (может быть вещественным числом); Initial input - начальный уровень входа; Buffer size - размер буфера, выделяемого под задержанный сигнал, в байтах (должно быть число кратное 8); Pade order (for linearization) - порядок линеаризации Паде. 6. Блок создания передаточной функции по нулям и полюсам Блок служит для создания передаточной функции с заданными полюсами и нулями. Параметрами являются список нулей Zero, список полюсов Poles и коэффициент передачи Gain. XI. Библиотека Нелинейных блоков Discontinuous 1. Блок люфта Backlash Блок моделирует эффект возникновения люфта. Параметры: Deadband width - ширина мертвой зоны;
Initial output - начальное значение сигнала на выходе. 2. Блок фрикционных явлений Coulomb and Viscous Fraction Блок позволяет моделировать эффекты сухого и вязкого трения. Наличие скачка при нулевом значении входного сигнала моделирует сухое трение. Линейное усиление моделирует вязкое трение. Параметрами являются: Coulomb friction value (offset) - величина скачка при нулевом входном сигнале; Coefficient of viscous friction (Gain) - коэффициент вязкого трения (наклон). 3. Блок с зоной нечувствительности Dead Zone Блок моделирует наличие зоны нечувствительности. Параметрами являются начало зоны нечувствительности Start of dead zone и конец End of dead zone. Флажки позволяют выбрать ограничение при переполнении целых чисел Saturate on integer overflow и заменять блок при линеаризации коэффициентом усиления Treat as gain when linearizing. 4. Блок обнаружения пересечения Hit Crossing Блок позволяет зафиксировать состояния, когда входной сигнал пересечет заданное значение. При возникновении такой ситуации формируется единичный сигнал. Параметры: Hit crossing offset - уровень, на котором нужно идентифицировать пересечение; Hit crossing direction - направление, при котором следует обнаруживать пересечение (rising - нарастание, falling - спад, either - или нарастание, или спад); Show output port - показать порт выхода; Enable zero-crossing detection - включить определение пересечения нулевого значения. 5. Блок следящего квантования Quantizer Блок служит для квантования меняющихся сигналов с одинаковым шагом квантования Quantization interval. 6. Блок ограничения скорости нарастания / спада Rate Limiter Блок служит для ограничения скорости нарастания / спада входного сигнала. Параметр скорость нарастания сигнала Rising slew rate ограничивает максимальную скорость нарастания, а параметр скорость спада сигнала Falling slew rate ограничивает скорость спада сигнала. Если входной сигнал превысит ограничивающую скорость, то на выходе сигнал будет меняться с ограничивающей скоростью. В промежутке между значениями ограничивающих скоростей сигнал на выходе повторяет сигнал на входе. 7. Релейный блок Relay Блок имеет разрывную передаточную характеристику с гистерезисом (или без него). Если сигнал на входе меньше некоторого порога, то на выходе получается сигнал одного уровня (обычно низкого), а если порог превышен, то сигнал на выходе становится другого уровня (обычного высокого). Параметры: Switch on point - порог включения (eps - бесконечно малая величина); Switch off point - порог выключения; Output when on - уровень на выходе, когда включен; Output when off - уровень на выходе, когда выключен. 8. Блок ограничения Saturation
Блок позволяет моделировать ограничение входного сигнала, когда тот достигнет заданных порогов ограничения: верхнего upper limit или нижнего lower limit. XII. Библиотека дискретных компонентов Discrete 1. Блок дискретной единичной задержки Unit Delay Блок обеспечивает задержку входного сигнал на один шаг периода дискретизации. 2. Блок память Memory Блок запоминает входной сигнал и смещает его на один такт времени. Параметры: Initial conditions - начальные условия; Inherit sample time - задержка на период дискретизации; Direct feedthrough of input during linearization - прямая передача при линеаризации. XIII. Функции, создаваемые пользоваетелем User-defined Functions 1. Блок функции Fcn Блок используется для задания определенной функции от входной переменной “u” (которая может быть и вектором). Переменные из рабочего пространства данный блок не поддерживает. В поле выражение Expression задается вид функции. Например, выражение sin(u(1)) ⋅exp(2.3⋅u(2)) задает функцию от двух переменных. 2. Блок MATLab функции MATLab Fcn Блок служит для передачи входных аргументов в Matlab функцию. Параметры: MATLab function - функция или выражение. Если вы указываете функцию (например, sin), то аргументы в скобах можно и не писать; Output dimensions - устанавливает размерности сигнала на выходе блока. Если необходимо, что размерность выходного сигнала совпадала с размерностью входного, то укажите -1. В противном случае укажите размерность. Размерность выходного значения функции должна соответствовать размерности выхода блока; Output signal type - позволяет выбрать тип выходного сигнала; Collapse 2-D array results to 1-D - позволяет свернуть выходные результаты в виде двумерного массива в одномерный с разверткой по столбцам. 3. Блок S-функции S-Function Блок обеспечивает возможность доступа к S-функции, которая может быть написана на языке С, Ada или в виде М-файла. Создание S-функции S-функция включает в себя Matlab функцию вида: [sys, x0, str,ts] = f (t, x,u, flag, p1, p2,...) , где f - это имя S-функции. В ходе моделирования, Simulink многократно вызывает f, используя аргумент flag для обозначения вида задания, которое будет выполнено при конкретном вызове. Каждый раз функция выполняет задание и возвращает результаты в выходной вектор. Аргументы S-функции Simulink передает следующие аргументы в S-функцию: t - текущее время;
x - вектор состояния; u - входной вектор; flag - целочисленное значение, которое указывает на вид выполняемого задания S- функцией; p1, p2, … - дополнительные переменные (вводятся в поле S-function parameters). Когда вызывается M-файл S-функции, Simulink всегда передает стандартные параметры (t, x, u, flag) в S-функцию в качестве аргументов. Simulink также может передавать и дополнительные параметры, определенные в поле S-function parameters в качестве дополнительных аргументов, которые следуют за основными в том порядке, в котором они были написаны в поле блока. Дополнительные параметры позволяют реализовать различные вычислительные возможности. Далее в таблице приведены значения, которые может принимать переменная flag и выполняемые S-функцией действия. Таблица 1Аргумент flag flag Выполняемая функция Описание 0 mdlInitializesSizes Определяет основные характеристики блока S- 1 mdlDerivatives функции, включая периоды дискретизации, 2 mdlUpdate начальные значения непрерывных и дискретных состояний и массив sizes. 3 mdlOutputs 9 mdlTerminate Вычисляет производные непрерывных переменных состояния Обновляет дискретные состояния, периоды дискретизации, и требования для главного временного шага Вычисляет выходные значения S-функции Выполняет необходимые операции завершения моделирования Выходные значения S-функции M-файл возвращает вектор, состоящий из следующих элементов: sys - общая возвращаемая переменная. Значения зависят от значения flag. Например, если flag = 3, то sys содержит выходные значения S-функции; x0 - начальные значений состояния (пустой вектор, если в системе нет состояний). x0 возвращается, когда flag = 0; str - зарезервирован для использования в будущем. S-функции M-файла должны присваивать этому элементу пустую матрицу, []; ts - матрица с двумя столбцами, содержащая периоды дискретизации и начальные задержки. Если вы хотите, что S-функция запускалась в каждый шаг моделирования, то ts =[0,0] (устанавливается, в теле функции mdlInitializeSizes). Определение характеристик блока S-функции Чтобы Simulink мог распознать S-функцию типа M-файл, необходимо снабдить Simulink определенной информацией о S-функции. Эта информация включает в себя число входов, выходов, состояний, и другие характеристики блока. Чтобы дать эту информацию Simulink, необходимо вызвать функцию simsizes в начале подфункции mdlInitializeSizes. sizes = simsizes; Эта функция возвращает неинициализированную структуру sizes. Вы должны заполнить эту структуру. Следующая таблица описывает поля этой структуры.
Таблица 2 Поля структуры sizes Имя поля Описание sizes.NumContStates Число непрерывных состояний sizes.NumDiscStates Число дискретных состояний sizes.NumOutputs Число выходов sizes.NumInputs Число входов sizes.DirFeedthrough Флаг для прямой передачи (короткое замыкание блока) sizes.NumSampleTimes Число строк матрицы ts, которая состоит из периода квантования и времени смещения После инициализации структуры sizes, необходимо вызвать функцию simsizes снова sys = simsizes(sizes); Это позволит передать информацию из структуры sizes в вектор sys, который будет использоваться Simulink. Следует отметить, в поле NumInputs мы устанавливаем не как таковое число входов, а размерность входного вектора (то есть если NumInputs будет равно 3, то на изображении блока S-function три входа не появиться, просто теперь на вход может поступать вектор их трех элементов). Для того, чтобы подать несколько сигналов на вход блока S-function необходимо при помощи мультиплексора Mux объединить сигналы в один вектор. А в поле NumInputs написать размерность этого вектора. Для использования сигналов в теле S-функции необходимо в векторе u указывать номер сигнала (например, u(2) - второй сигнал).
Описание основных функций, используемых при проектировании GUI Что такое дескриптор. Все графические объекты выполнены в системе MATLab по объектной технологии и характеризуются набором свойств. Чтобы изменить свойства графических объектов, нужно получить доступ к ним. Доступ осуществляется при помощи идентификатора или дескриптора (handle). Дескрипторы графического объекта возвращают функции конструкторы, создающие эти объекты. Запомнив дескрипторы в переменных, мы будем иметь возможность простого доступа к графическому объекту. 1. guidata - сохраняет или извлекает информацию о приложении. guidata (H, Data) – сохраняет определенные данные в данных фигуры. H – дескриптор, который может идентифицировать либо саму фигуру, либо объект, содержащий фигуру. Data – сохраняемая информация. 2. findall - находит все объекты. ObjList=findall(HandleList) – возвращает список всех объектов, которые являются потомками объекта с дескриптором HandleList. ObjList=findall(HandleList, Param1, Val1, Param2, Val2, …) – возвращает список всех объектов, которые являются потомками объекта с дескриптором HandleList, и, у которых свойства Param имеют значения Val. Например, fig_ex1=findall(0, 'type', 'figure', 'Tag', 'Ex1_gui') – ищет объекты типа Figure (‘type’, ‘figure’) с ярлыками ‘Ex1_gui’ ('Tag', 'Ex1_gui'), которые являются потомками объекта с дескриптором 0 (базовый объект Root). 3. findobj – ищет объекты с определенными свойствами. Например, ax=findobj(fig_ex1, 'type', 'axes', 'Tag', 'axes1') – ищет объект типа Axes ('type', 'axes'), с ярлыком ‘axes1’ ('Tag', 'axes1'), который является потомком объекта с дескриптором fig_ex1. 4. get – возвращает список свойств объекта. V=get(H) – возвращает структуру свойств объекта с дескриптором H, где поле соответствует имени свойства, а содержимое поля – значению свойства. V=get(H, ‘PropertyName’) – возвращает значения свойства PropertyName объекта с дескриптором H. 5. set – устанавливает определенное значение свойству объекта. Set(H, ‘PropertyName’, ‘PropertyValue’) – устанавливает значение PropertyValue свойству PropertyName объекта с дескриптором H. 6. isempty – возвращает 1 для пустого массива. isempty(x) – возвратит 1, если массив пустой, 0 – если не пустой. 7. ispc – проверяет, является ли версия MATLab для PC(Windows). 8. closereq – удаляет текущее окно объекта Figure. 9. find_system – ищет открытые модели Simulink. find_system(‘ParamName1’, Value1, ‘ParamName2’, Value2, …) – ищет все открытые модели и возвращает массив ячеек, содержащий полные пути в иерархическом порядке всех систем, подсистем и блоков, чьи параметры ParamName имеют значения Value. Например, find_system('Name', 'Example1') – ищет открытые модели с именем Example1. 10. open_system – открывает окно модели Simulink. open_system(‘sys’) – откроет модель с именем sys. 11. close_system – закрывает окно модели Simulink. close_system(‘sys’) – закрывает окно модели с именем sys.
12. get_param – возвращает текущее значение определенного параметра блока или модели. get_param(‘obj’, ‘param’) – возвращает значение параметра param модели obj. 13. set_param – устанавливает значение параметра блока или модели. Например, set_param('Example1/Sine Wave', 'Amplitude', get(handles.edit1, 'String')) – устанавливает параметру Amplitude блока Sine Wave модели Example1 значение, которое считывается с текстового поля типа Edit1. 14. axes - создает оси в произвольном положении. axes, вызванная без параметров, создает оси и возвращает дескриптор. axes(H) - переводит фокус на оси с дескриптором H. 15. axis - позволяет управлять масштабированием осей и их видимостью. axis([Xmin Xmax Ymin Ymax]) - устанавливает масштаб для осей х и у. v=axis возвращает вектор масштабов. axis auto - устанавливает автоматическое масштабирование для осей. axis on / off - включает / выключает разметку осей, подписи и фон. 16. hold - удерживает текущий график. hold on - фиксирует текущий график и все свойства объекта Axes, содержащий график, таким образом, что последующие графические команды добавляются к существующему графику (например, повторное использование функции plot будет отображаться на данном объекте Axes, а не на новом). 17. drawnow - очищает очередь графических событий и выводит их на экран. 18. gcb - возвращает полный путь Simulink к текущему блоку. 19. gcs - возвращает полный путь Simulink к текущей системе или подсистеме. 20. fill - создает двумерный залитый многоугольник. H=fill(X, Y, C) - создает двумерный залитый многоугольник, чьи вершины задаются парами элементов векторов X и Y, и возвращает дескриптор H на этот объект. Вектор С задает цвет (для RGB - это [r, g, b] - вектор из трех чисел, чьи значения могут лежат в диапазоне от 0 до 1).
XIV. Пример №1. В этом примере рассматривается создание приложения, которое будет состоять из окна, содержащего: поля ввода Edit - для запроса и передачи параметров в модель Simulink; объекта Axes - для представления результатов моделирования в виде графика; и кнопки запуска моделирования PushButton. Рассмотрим подробно шаги создания приложения: 1. В системе математического моделирования Simulink создадим следующую модель (рисунок 12). Рисунок 12 Модель для примера №1 В поле S-function name блока S-function укажем имя S-функции Example1_s (ее имя высветиться на изображении блока), которую создадим позже. Сохраним файл под именем Example1.mdl. 2. В командной строке MATLab наберем ключевое слово guide. Появиться окно Guide Quick Start с двумя закладками: Создать новый графический интерфейс пользователя (ГИП) Create New GUI или открыть существующий Open Existing GUI. Выбираем пустой шаблон Blank GUI. Тем самым мы запустили Конструктор графического интерфейса. 3. Сохраним пустой шаблон под именем Ex1_gui. Будут созданы два файла: первый с расширением fig, который использует Конструктор во время проектировки приложения, и в котором хранятся все объекты. Второй файл - это M-файл, который Конструктор автоматически вызовет после сохранения. Этот файл содержит код данного приложения. Этот код состоит из двух частей: кода инициализации приложения и кодов callback-функций (функции-обработчики событий, которые вызываются средой MATLab для обработки определенного события; они вызываются самой средой MATLab у нас «за спиной», отсюда и происхождение названия), которые должен написать разработчик. Оба этих файла работают совместно. Приведем полный код файла Ex1_gui уже готового приложения, для удобства описания процесса создания приложения. Также, для удобства, пронумерованы строки и удалены комментарии на английском языке, которые были сгенерированы автоматически. Листинг файла Ex1_gui 1) function varargout = ex1_gui(varargin) 2) % Начало кода инициализации - РЕДАКТИРОВАТЬ НЕЛЬЗЯ 3) % Генерируется автоматически 4) gui_Singleton = 1; 5) gui_State = struct('gui_Name', mfilename, ... 6) 'gui_Singleton', gui_Singleton, ... 7) 'gui_OpeningFcn', @ex1_gui_OpeningFcn, ... 8) 'gui_OutputFcn', @ex1_gui_OutputFcn, ... 9) 'gui_LayoutFcn', [] , ...
10) 'gui_Callback', []); 11) if nargin & isstr(varargin{1}) 12) gui_State.gui_Callback = str2func(varargin{1}); 13) end 14) if nargout 15) [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 16) else 17) gui_mainfcn(gui_State, varargin{:}); 18) end 19) % Конец кода инициализации - РЕДАКТИРОВАТЬ НЕЛЬЗЯ 20) % --- Выполняется до того, как ex1_gui станет видимым 21) function ex1_gui_OpeningFcn(hObject, eventdata, handles, varargin) 22) if isempty(find_system('Name', 'Example1')) %Если модель Example1 не найдена 23) open_system('Example1'); %то открыть модель 24) set_param('Example1/Sine Wave', 'Amplitude', get(handles.edit1, 'String')); 25) %Установить параметру Amplitude блока Sine Wave модели Example1 26) %значение считанное с поля ввода Edit1 27) set_param('Example1/Sine Wave', 'Frequency', get(handles.edit2, 'String')); 28) %Установить параметру Frequency блока Sine Wave модели Example1 29) %значение считанное с поля ввода Edit2 30) set_param('Example1', 'StopTime', get(handles.edit3, 'String')); 31) %Установить параметру StopTime модели Example1 32) %значение считанное с поля ввода Edit3 33) end 34) set(hObject, 'DoubleBuffer', 'on'); %Включаем двойную буферизацию 35) handles.output = hObject; %Генерируется автоматически 36) guidata(hObject, handles); %Генерируется автоматически 37) % --- Подфункция, которая будет возвращать выходные переменные функции 38) % Ex1_gui в командную строку. Генерируется автоматически 39) function varargout = ex1_gui_OutputFcn(hObject, eventdata, handles) 40) varargout{1} = handles.output; 41) % --- Выполняется в ходе создания объекта Edit1. Генерируется автоматически 42) function edit1_CreateFcn(hObject, eventdata, handles) 43) if ispc 44) set(hObject,'BackgroundColor','white'); 45) else 46) set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); 47) end 48) % --- Выполняется в ходе создания объекта Edit2. Генерируется автоматически 49) function edit2_CreateFcn(hObject, eventdata, handles) 50) if ispc 51) set(hObject,'BackgroundColor','white'); 52) else 53) set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
54) end 55) % --- Выполняется в ходе создания объекта Edit3. Генерируется автоматически 56) function edit3_CreateFcn(hObject, eventdata, handles) 57) if ispc 58) set(hObject,'BackgroundColor','white'); 59) else 60) set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); 61) end 62) %--- Функция-обработчик события завершения ввода в поле Edit1 63) function edit1_Callback(hObject, eventdata, handles) 64) set_param('Example1/Sine Wave', 'Amplitude', get(handles.edit1, 'String')); 65) %Установить параметру Amplitude блока Sine Wave модели Example1 66) %значение, считанное с поля ввода Edit1 67) %--- Функция-обработчик события завершения ввода в поле Edit2 68) function edit2_Callback(hObject, eventdata, handles) 69) set_param('Example1/Sine Wave', 'Frequency', get(handles.edit2, 'String')); 70) %Установить параметру Frequency блока Sine Wave модели Example1 71) %значение, считанное с поля ввода Edit2 72) %--- Функция-обработчик события завершения ввода в поле Edit3 73) function edit3_Callback(hObject, eventdata, handles) 74) set_param('Example1', 'StopTime', get(handles.edit3, 'String')); 75) %Установить параметру Frequency модели Example1 76) %значение, считанное с поля ввода Edit3 77) % --- Выполняется при закрытии окна Ex1_gui. 78) function Ex1_gui_CloseRequestFcn(hObject, eventdata, handles) 79) if ~isempty(find_system('Name', 'Example1')) %Если модель Example1 открыта 80) close_system('Example1', 0); %то закрывать ее без внесения изменений 81) end 82) delete(hObject); %Вызываем деструктор окна Ex1_gui 83) % --- Функция-обработчик нажатия на кнопку PushButton1 84) function pushbutton1_Callback(hObject, eventdata, handles) 85) if get_param('Example1', 'SimulationStatus')=='stopped' 86) %Если моделирование не производится 87) set_param('Example1', 'SimulationCommand', 'start'); %То запускаем его 88) end Конец листинга файла Ex1_gui Рассмотрим код, который был сгенерирован автоматически. Строка 1 содержит объявление функции Ex1_gui.
Далее (строки 2 - 19) идет код инициализации приложения. Код инициализации почти одинаковый для всех приложений и редактировать его нельзя! Редактируются только callback-функции. Также автоматически генерируется строки 35 - 61, назначение которых ясно из приведенных комментариев. 4. Займемся непосредственно созданием интерфейса пользователя. Перетащим шесть объектов Static Text, три объекта Edit, один объект Pushbutton и один объект Axes. (рисунок 13). Далее вызовем Инспектор Объектов (View → Property Inspector). Выбирая соответствующий объект и, возвращаясь в Инспектор объектов, можно менять свойства данного объекта. Изменим следующие свойства: a) у объекта Figure переключим свойство HandleVisability в значение On. Это позволит иметь доступ к дескриптору объекта Figure из любой функции. b) для объектов Static Text в свойствах String напишем: для Text1 - Амплитуда, для Text2 - Частота, для Text3 - Время моделирования, для Text4 - График синусоиды, для Text5 - Время, для Text6 - sin(t). c) для объектов Edit в свойствах String напишем: для Edit1 - 2 (соответствует Амплитуде), для Edit2 - 10 (соответствует Частоте), для Edit3 - 10 (соответствует времени моделирования). В свойствах выравнивания по горизонтали HorizontalAlignment выберем left. d) для кнопки PushButton в свойстве String напишем Моделирование. Сохраним изменения. Рисунок 13 Создание графического интерфейса Далее займемся написанием callback-функций (далее просто функции). 5. В код функции ex1_gui_OpeningFcn добавим код, который должен следовать сразу после объявления функции (в листинге это строки 22 - 34). Эта функция вызывается перед тем, как Ex1_gui станет видимым. Итак, что мы здесь делаем. Проверяем, открыто ли окно модели Example1. Функция find_system('Name', 'Example1') возвратит пустой массив, если окно не открыто. А функция isempty проверяет, пустой ли массив. Таким образом, если окно не отрыто, мы
открываем модель open_system('Example1'), и устанавливаем значения амплитуды, частоты и времени моделирования с полей ввода Edit в соответствующие параметры блоков модели. set(hObject, 'DoubleBuffer', 'on') - включает объекту Figure двойную буферизацию, что позволит производить перерисовку без мерцаний. Далее идет код, который был сгенерирован автоматически, и его менять нельзя. Следует отметить, что handles - это структура, поля которой это имена объектов, а значения полей - дескрипторы объектов. 6. Раз мы модель открыли, то мы должны предусмотреть и ее закрытие при завершении работы нашего приложения. Для этого в поле фигуры (чтобы ни одни объект не был выделен) щелкнем правой кнопкой мыши и, в появившемся контекстном меню, выберем просмотр callback-функций (View callback), а из списка функций выберем CloseRequestFcn. В М-файле Конструктор автоматически сгенерирует заголовок данной функции function Ex1_gui_CloseRequestFcn(hObject, eventdata, handles) и также укажет ее в свойстве CloseRequestFcn вместо стандартной функции closereq. В тело функции добавим код, что соответствует строкам 79-82 листинга. ~isempty(find_system('Name', 'Example1')) - если модель открыта, то закроем ее close_system('Example1', 0). Параметр 0 означает, что закроем без сохранения изменений (1 - сохранить изменения и закрыть). Далее завершение работы графического окна мы передаем стандартной функции delete. 7. А теперь, напишем функции-обработчики окончания ввода для текстовых полей Edit. Для этого выделим объект Edit1, щелкнем правой кнопкой мыши и, в появившемся контекстном меню, выберем просмотр callback-функций (View callback), а из списка функций выберем callback. В сгенерированном теле функции edit1_Callback напишем код, что соответствует строкам листинга 62-66. set_param('Example1/Sine Wave', 'Amplitude', get(handles.edit1, 'String')) - параметру Amplitude блока Sine Wave модели Example1 устанавливаем значение get(handles.edit1, 'String'), которое считано с поля Edit1. Для текстовых полей Edit2 и Edit3 действия аналогичны (строки 67-71 и 72-76). 8. И, наконец, остался самый главный объект - кнопка запуска моделирования PushButton. Сгенерируем для нее заголовок callback-функции таким же образом, как и для объектов Edit. Затем добавим код обработки события (строки 83-88). Сначала, необходимо проверить, на какой фазе моделирования находиться система get_param('Example1', 'SimulationStatus'). Возможны следующие состояния: stopped, initializing, running, paused, updating, terminating. Если моделирование остановлено 'stopped', то запускаем моделирование set_param('Example1', 'SimulationCommand', 'start'). SimulationCommand также может принимать следующие значения: stop, pause, continue, update. 9. Теперь, если на панели Конструктора графического интерфейса нажать кнопку Run (зеленый треугольник), мы запустим наше графическое окно. Вместе с ним откроется и окно модели. Нажимаем на кнопку Моделирование и получаем сообщение об ошибке. Так как нет S-функции, которая будет получать данные о ходе моделирования и обновлять график. Создадим ее. 10. В среде MATLab выбираем File → New → M-File. Тем самым мы запустили редактор М-файлов. Сохраним файл (пока пустой) под именем Example1_s. Если вы знаете, что такое S-функция (если нет, то прочитайте выше пункт Создание S- функции), то вы также знаете, что ее поведение зависит от переменной flag, которая отражает фазу моделирования. Значение переменной flag устанавливается самой системой моделирования Simulink в соответствии с фазой моделирования, и вы можете только написать соответствующие подфункции обработки. Поэтому, после
заголовка функции, необходимо описать какие подфункции будут вызываться в зависимости от значения flag. function [sys, x0, str, ts] = Example1_s(t, x, u, flag) switch flag, case 0, %Инициализация [sys, x0, str, ts]=mdlInitializeSizes; case 2, %Обновление sys=mdlUpdate(t, x, u); case {1, 3, 4, 9} %Все остальные значения flag sys=[]; otherwise %обработка на неожиданное значение flag error('Unhandled flag = ', num2str(flag)); end Для выбора подфункции используется оператор переключения switch. Заметим, что имена подфункций должны иметь шаблонные имена, а не произвольные. 11. Далее необходимо написать подфункцию инициализации mdlInitializeSizes. Ее код приведен ниже. function [sys, x0, str, ts] = mdlInitializeSizes(u); sizes=simsizes; %Инициализируем структуру sizes sizes.NumContStates = 0; %Размерность вектора состояния непрерывной системы sizes.NumDiscStates = 0; %Размерность вектора состояния дискрутной системы sizes.NumOutputs = 0; %Размерность вектора выхода sizes.NumInputs = 1; %Размерность вектора входа sizes.DirFeedthrough = 0; %Наличие прямой связи между входом и выходом sizes.NumSampleTimes = 1; %Число строк матрицы ts. Минимальное значение 1 sys=simsizes(sizes); %Записываем структуру sizes в вектор sys x0=[]; %Начальные условия - нет str=[]; %Зарезервированная переменная. Всегда пустая ts=[0 0]; %Инициализация периода квантования и смещения. fig_ex1=findall(0, 'type', 'figure', 'Tag', 'Ex1_gui'); %Ищем объект Figure % с ярлыком Ex1_gui. Если он найден, то функция findall возвратит его %дескриптор, который будет сохранен в переменную fig_ex1 %Если не найден, то функция вернет пустой массив if isempty(fig_ex1) %Если переменая fig_ex1 содержит пустой массив Ex1_gui % то открываем окно фигуры Ex1_gui else %если переменная fig_ex1 не пуста, то ax=findobj(fig_ex1, 'type', 'axes', 'Tag', 'axes1'); %Ищем объект оси с ярлыком axes1 %и запоминаем его дескриптор в переменную ax axes(ax); %Переводим фокус команд на объект с дескриптором ax
cla; %очищаем оси axis auto; %устанавливаем автомасштабирование hold on; %включаем режим удержания hndl=plot(0, 0); %строим точку в начале координат. Функция plot возвращает %дескриптор на объект линия set(ax, 'UserData', hndl); %Записываем в свойство UserData дескриптор линии end В начале мы заполняем структуру sizes, которая содержит информацию о S- функции. У нас функция только воспринимает информацию, поэтому количество входов равно 1, а количество выходов 0. Число строк в матрице ts равно одному. (см. создание S-функции). Возвращаем информацию о S-функции системе sys = simsizes(sizes), начальных состояний у нас нет (x0 - пустой), выходной аргумент str пустой по умолчанию, ts=[0 0] - S-функция будет запускаться каждый шаг интегрирования. Затем мы инициализируем объект Axes в графическом окне. fig_ex1=findall(0, 'type', 'figure', 'Tag', 'Ex1_gui') - ищем открытое графическое окно. Если открыто, то findall вернет его дескриптор. Если функция findall вернула пустой массив (if isempty(fig_ex1)), то запускаем графическое окно Ex1_gui. Если окно найдено (else), то ищем объект типа Axes с ярлыком axes1 и запоминаем его дескриптор ax=findobj(fig_ex1, 'type', 'axes', 'Tag', 'axes1'). Переводим фокус действия на этот объект axes(ax), чтобы в дальнейшем другие функции использовать без дескриптора объекта axes1. Очищаем содержимое объекта axes1 cla (на случай, когда запускаем повторное моделирование), устанавливаем автоматическое масштабирование axis auto, и функцией hold on включаем добавлением последующих графических команд данному объекту axes1. Строим точку в начале координат plot(0, 0). Функция plot возвращает дескриптор на объект Line, запоминаем этот дескриптор в переменной hndl. Дескриптор объекта Line необходимо запомнить для последующего использования, поэтому записываем его в свойство UserData объекта axes1 (это свойство может хранить любую информацию пользователя) set(ax, 'UserData', hndl). 12. Осталось написать подфункцию обновления mdlUpdate. Ее код приведен ниже. function sys=mdlUpdate(t, x, u) fig_ex1=findall(0, 'type', 'figure', 'Tag', 'Ex1_gui'); %Ищем объект Figure % с ярлыком Ex1_gui. Если он найден, то функция findall возвратит его %дескриптор, который будет сохранен в переменную fig_ex1 %Если не найден, то функция вернет пустой массив if isempty(fig_ex1) %Если переменая fig_ex1 содержит пустой массив Ex1_gui %то открываем окно фигуры Ex1_gui else %если переменная fig_ex1 не пуста, то ax=findobj(fig_ex1, 'type', 'axes', 'Tag', 'axes1'); %Ищем объект оси с ярлыком axes1 %и запоминаем его дескриптор в переменную ax hndl=get(ax, 'UserData'); %Считываем дескриптор линии set(hndl, 'Xdata', [get(hndl, 'XData') t], 'YData', [get(hndl, 'YData') u]); %добавляем текущую точку в линию drawnow; %очищаем графический буфер. Содержимое выводится на экран end sys=[]; Начало данной подфункции аналогично началу подфункции инициализации. После того как был найден объект axes1, считываем из свойства UserData дескриптор объекта Line hndl=get(ax, 'UserData'). Так как на вход S-функции поступают текущие
значения переменных t и u, а для построения линии необходимы вектора значений этих переменных, то мы эти значения добавляем set(hndl, 'Xdata', [get(hndl, 'XData') t], 'YData', [get(hndl, 'YData') u]). Свойство объекта Line ‘Xdata’ хранит вектор значений, который будет откладываться по оси х. Так как необходимо текущее значение времени добавлять к предыдущим, то необходимо производить конкатенацию векторов (слияние двух векторов в один). Первый вектор - это вектор предыдущих значений. Мы его считываем из объекта Line get(hndl, 'XData'). Второй вектор - вектор с одним элементом - текущее время моделирования t. Два вектора, записанные в квадратных скобках [] через пробел, образуют один вектор. [get(hndl, 'XData') t] - таким образом, мы сформировали новый вектор, содержащий предыдущие значения и текущие. Аналогично и для свойства ‘Ydata’. Выводим линию на экран drawnow. 13. Все, S-функция готова. Сохраняем ее. Для запуска всего графического приложения необходимо ввести с командной строки MATLab команду Ex1_gui. Это запустит наше приложение. Если теперь запустить моделирование, то можно увидеть, что у блока S-function нет выходного порта, так как мы установили число выходов равным 0.
XV. Пример №2. Создание графической анимации диска, двигающегося в полукруглом желобе. Предполагается, что диск катится без проскальзывания. Уравнение движения системы имеет вид: θ = − g ⋅sinθ r) , 0.456⋅ (R − где θ - угол отклонения центра диска от положения равновесия; R - радиус желоба; r - радиус диска. Кинематическое соотношение между углом поворота диска вокруг оси и отклонением от центра тяжести имеет вид: ψ =θ ⋅ (R − r) , r где ψ - угол поворота диска вокруг своей оси. Структурная схема Simulink модели приведена на рис.13 (файл Example2.mdl). Начальное условие Initial Condition в блоке Интегратора Integrator установлено равным 1, что задает начальный угол отклонения центра диска от положения равновесия. Рисунок 14 Структурная схема Simulink модели диска в полукруглом желобе Файл S-функции называется Example2_gui.m. В этом примере для создания графического интерфейса пользователя мы не будем использовать Конструктор. Все объекты создаются динамически. Приведем листинг S-функции. Он снабжен подробными комментариями. function[sys, x0, str, ts] = example2_gui(t, x, u, flag) switch flag, case 0, %Инициализация [sys, x0, str, ts]=mdlInitializeSizes; case 2, %Обновление sys=mdlUpdate(t, x, u); case {1, 3, 4, 9} %Все остальные значения flag sys=[]; otherwise %обработка на неожиданное значение flag error('Unhandled flag = ', num2str(flag)); end %--------------------------------------------------------------------------
%Функция инициализации %-------------------------------------------------------------------------- function [sys, x0, str, ts] = mdlInitializeSizes(u); size=simsizes; %Инициализируем структуру sizes sizes.NumContStates = 0; %Размерность вектора состояния непрерывной системы sizes.NumDiscStates = 0; %Размерность вектора состояния дискрутной системы sizes.NumOutputs = 0; %Размерность вектора выхода sizes.NumInputs = 1; %Размерность вектора входа sizes.DirFeedthrough = 0; %Наличие прямой связи между входом и выходом sizes.NumSampleTimes = 1; %Число строк матрицы ts. Минимальное значение 1 sys=simsizes(sizes); %Записываем структуру sizes в вектор sys x0=[]; %Начальные условия - нет str=[]; %Зарезервированная переменная. Всегда пустая ts=[0 0]; %Инициализация периода квантования и %смещения. S-функция будет запускаться %Инициализация фигуры if (isempty(findobj('UserData', gcb))) %Найти объект, у которого в свойстве %UserData записан путь к текущему %блоку (блок S-function). См. далее %если не найден, то создаем графическое окно h_fig=figure('Position', [200 200 400 300], ... %положение и размеры 'MenuBar', 'none', 'NumberTitle', 'off', ... %Нет меню и нет заголовка 'Resize', 'off', 'Name', [gcs, 'Rolling Disk']); %Нельзя менять размер %Имя окна состоит из имени модели - gcs и Rolling Disk %h_fig - дескриптор объекта Figure set (h_fig, 'UserData', gcb); %Устанавливаем в свойстве UserData имя текущего блока, %чтобы в при повторном моделировании, если %окно открыто, не создать еще одно окно set(h_fig, 'CloseRequestFcn' , 'Example2_close'); %Устанавливаем свой обработчик %события на закрывание окна. % См. файл Example2_close.m set(h_fig, 'DoubleBuffer', 'on'); %Включаем двойную буферизацию, % чтобы не было мельканий при перерисовке окна set_param('Example2', 'StopTime', 'inf'); %Устанавливаем время моделирования %до бесконечности r=2; %радиус диска R=12; %радиус желоба q=r; %временная переменная, равная радиуса диска %Формирование желоба
thp=0:0.2:pi; %Переменная, изменяющаяся от 0 до пи с шагом 0.2 xp=R*cos(thp); %Проекции радиуса желоба на ось Х yp=-R*sin(thp); %Проекции радиуса желоба на ось У xp=[xp, -R, -(R+q), -(R+q), (R+q), (R+q), R]; %Вектор с координатами %желоба по оси Х yp=[yp, 0, 0, -(R+q), -(R+q), 0, 0]; %Вектор с координатами желоба по оси У cl_x=[0, 0]; %Вектор значений координат по оси Х для отвесной линии cl_y=[0, -R]; %Вектор значений координат по оси У для отвесной линии %Формирование диска thp=0:0.2:2*pi; %Переменная, изменяющаяся от 0 до пи с шагом 0.2 xd=r*cos(thp); %Проекции радиуса диска на ось Х yd=r*sin(thp);%Проекции радиуса диска на ось У %Построение желоба hd=fill(xp, yp, [0.85, 0.85, 0.85]); %Рисуем многоульник и заполняем его. % hd - его дескриптор. При использовании fill, % по умолчанию был создан объект Оси hold on; %Включаем добавление последующих построений на данные Оси %Свойство EraseMode управляет режимом взаимодействия цвета пикселов %создаваемой линии с цветом пикселов поля графика set(hd, 'EraseMode', 'none'); %Кривая не рисуется, воспроизводятся только маркеры axis('equal'); %Устанавливаем одниковый масштаб по осям Х и У axis('off'); %Делаем Оси невидимыми %Построение отвесной линии hd0=plot(cl_x, cl_y, 'k--'); %Строим отвесную линию, пунктиром set(hd0, 'EraseMode', 'none'); %Кривая не рисуется, воспроизводятся только маркеры %Формирование линии на диске theta=0; %Начальный угол отклонения равен нолю xc=(R-r)*sin(theta); %Находим положение центра диска по оси Х yc=-(R-r)*cos(theta); %Находим положение центра диска по оси У psi=theta*(R-r)/r; %Находим угол поворота оси диска xm_c=r*sin(psi); %Находим координату точки на поверхности диска относительно % центра диска вдоль оси Х, которая повернулась на угол psi ym_c=r*cos(psi); %Находим координату точки на поверхности диска относительно %центра диска, вдоль оси У, которая повернулась на угол psi xm=xc+xm_c; %Находим координату точки на поверхности диска по оси Х %относительно начала координат, которая повернулась на угол psi ym=yc+ym_c; %Находим координату точки на поверхности диска по оси У %относительно начала координат, которая повернулась на угол psi %Построение диска и линии на диске hd2=fill(xd+xc, yd+yc, [0.85, 0.85, 0.85]); %Рисуем закрашенный диска hd3=plot([xc, xm], [yc, ym], 'k-'); %Строим линию set_param(gcb, 'UserData', [hd2, hd3]); %Записываем дескрипторы диска и линии на % диске в виде одного вектора в свойство %UserData блока S-function
end %--------------------------------------------------------------- %Функция обновления %-------------------------------------------------------------- function sys = mdlUpdate(t, x, u) sys=[]; %Выходная вектор пустой r=2; %радиус диска R=12; %радиус желоба q=r; %временная переменная, равная радиуса диска UserDat=get_param(gcb, 'UserData'); %Считываем вектор дескрипторов диска и линии % на диске из свойства UserData блока S-function hd2=UserDat(1); %Декриптор диска hd3=UserDat(2); %Дескриптор линии на диске theta=u; %Угол текущий отклонения считываем из входного аргумента S-функции xc=(R-r)*sin(theta); %Находим положение центра диска по оси Х yc=-(R-r)*cos(theta); %Находим положение центра диска по оси У psi=theta*(R-r)/r; %Находим угол поворота оси диска xm_c=r*sin(psi); %Находим координату точки на поверхности диска относительно % центра диска вдоль оси Х, которая повернулась на угол psi ym_c=r*cos(psi); %Находим координату точки на поверхности диска относительно %центра диска, вдоль оси У, которая повернулась на угол psi xm=xc+xm_c; %Находим координату точки на поверхности диска по оси Х %относительно начала координат, которая повернулась на угол psi ym=yc+ym_c; %Находим координату точки на поверхности диска по оси У %относительно начала координат, которая повернулась на угол psi %Формирование диска thp=0:0.2:2*pi; %Переменная, изменяющаяся от 0 до пи с шагом 0.2 xd=r*cos(thp); %Проекции радиуса диска на ось Х yd=r*sin(thp);%Проекции радиуса диска на ось У %Перерисовка диска set(hd2, 'XData', xd+xc); set(hd2, 'YData', yd+yc); %Перерисовка линии на диске set(hd3, 'XData', [xc xm]); set(hd3, 'YData', [yc ym]); Зачем нам понадобился отдельный обработчик события закрытие окна. Если мы в процессе моделирования закроем окно без его остановки, то система MATLab сгенерирует ошибку, так как S-функции негде будет рисовать. Графическое окно у нас создается только при инициализации в момент времени 0. Далее, только происходят обновления графических объектов в нем. Поэтому сначала необходимо остановить моделирование, а потом уже только закрыть окно.
function Example2_close %Функция-обработчик события закрытия графического окна if ~(get_param('Example2', 'SimulationStatus')=='stopped') %Если моделирование % не остановлено set_param('Example2', 'SimulationCommand', 'stop'); % то останавливаем моделирование end delete(findobj('Name', [gcs, 'Rolling Disk'])); %Удаляем графическое окно Следует отметить, что при динамическом создании объектов, обработчик события (callback-функция), создаваемый пользователем, должен находиться в отдельном М-файле.
Search
Read the Text Version
- 1 - 37
Pages: