MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

Simulink

И.В.Черных. "Simulink: Инструмент моделирования динамических систем"

  В оглавление книги \ К следующему разделу \ К предыдущему разделу

9. Библиотека блоков Simulink

9.10. Маскирование подсистем

9.10.1. Общие сведения

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

Маскирование подсистем дает пользователю следующие преимущества:

  1. Расширяет возможности пользователя по управлению параметрами модели.
  2. Позволяет создавать более понятный интерфейс подсистемы.
  3. Повышает наглядность блок-диаграммы.
  4. Расширяет возможности построения сложных моделей.
  5. Повышает защищенность модели от несанкционированной модификации.

Для выполнения маскирования имеющейся подсистемы необходимо предварительно выполнить следующие действия:

  1. Определить какие параметры подсистемы должны задаваться пользователем в будущем окне параметров. Задать эти параметры в подсистеме с помощью идентификаторов (имен).
  2. Определить каким образом параметр должен задаваться в окне диалога (с помощью строки ввода, выбором из раскрывающегося списка или установкой флажка).
  3. Разработать эскиз пиктограммы блока.
  4. Создать комментарии (справку) по использованию подсистемы.

Маскирование подсистемы выполняется с помощью Mask Editor (редактор маски). Для запуска редактора маски необходимо выделить маскируемую подсистему и выполнить команду Mask Subsystem… из меню Edit. Можно также воспользоваться контекстным меню. После запуска Mask Editor на экран будет выведено окно редактора (рис. 9.10.1), имеющее 3 вкладки: Icon (Пиктограмма), Initialization (Инициализация), Documentation (Документация). Первая из вкладок обеспечивает создание пиктограммы подсистемы, вторая – дает возможность создать окно диалога для ввода параметров и третья – позволяет ввести описание блока и создать его справку.

В верхней части всех вкладок имеется поле Mask Type, с помощью которого можно задать имя блока. В нижней части окна имеется 5 кнопок управления редактором:

  1. OK – Сохранить внесенные изменения и закрыть окно.
  2. Cancel – Отменить внесенные изменения и закрыть окно.
  3. Unmask – Снять маску с подсистемы. До закрытия файла модели маску можно восстановить, воспользовавшись командой Edit Mask… из меню Edit.
  4. Help – Открыть окно справки редактора маски.
  5. Apply – Сохранить внесенные изменения без закрытия окна редактора.

Повторный вызов редактора маски для уже маскированной подсистемы осуществляется командой Edit Mask… из меню Edit (или аналогичной командой из контекстного меню).

После того как маскирование системы будет выполнено, двойной щелчок на ее изображении будет открывать окно параметров подсистемы, а не окно модели. Открыть саму подсистему (окно модели) для редактирования или просмотра можно командой Look under mask из меню Edit или контекстного меню.

Рис. 9.10.1 Окно редактора маски Mask Editor

9.10.2. Создание окна параметров

Окно параметров создается с помощью вкладки Initialization (Инициализация) редактора маски. Для создания поля ввода параметра с его описанием необходимо выполнить следующие действия:

  1. Нажать кнопку Add (Добавить).
  2. Ввести описание параметра в поле Prompt (Подсказка). В качестве описания параметра обычно используется его название в виде текста, например, “Gain”, “Constant value” и т.п.
  3. Указать идентификатор параметра в поле Variable (Переменная). Естественно, что это должен быть один из тех идентификаторов, который использовался при задании параметров блоков внутри подсистемы (хотя это не обязательно, поскольку параметр может быть использован и для модификации самого окна диалога). Все переменные, идентификаторы которых заданы на вкладке Initialization, помещаются в Mask Workspace – локальную рабочую область маски и являются доступными только внутри подсистемы.
  4. Выбрать тип элемента интерфейса задающего параметр из списка Control Type:
    • Edit – Редактируемое поле ввода.
    • Checkbox – Флажок.
    • Popup – Раскрывающийся список. В этом случае в графе Popup Strings (Элементы списка) необходимо ввести элементы списка, разделенные символом вертикальной черты. Например, выражение alpha|beta|gamma задаст список из трех элементов: alpha,beta и gamma.
  5. Выбрать формат параметра из списка Assiggment:
    • Evaluate – Вычисляемый. Выбирается, если параметр должен иметь числовое значение. В данное поле можно будет ввести выражение в соответствии с правилами языка MATLAB. Формат Evaluate позволяет также использовать числовую форму значения переменной в том случае, если тип элемента интерфейса выбран в виде флажка или раскрывающегося списка. Так, например, для раскрывающегося списка alpha|beta|gamma значение связанной со списком переменной будет равно 1, если в списке выбрано alpha, 2 – если в списке выбрано beta, и 3 – если в списке выбрано gamma. Для элемента интерфейса Checkbox вычисляемые значения будут равны 1 (при установленном флажке) и 0 (при снятом флажке).
    • Literal – Текстовый. Выбирается, если параметр должен быть строкой символов.
  6. Ввести команды инициализации в графе Initialization commands. Команды инициализации представляют собой обычные команды на языке MATLAB и могут включать операторы и m-функции. Такие команды задают переменные, которые будут находиться в рабочей области маскированной подсистемы. Эти переменные доступны внутри подсистемы и могут быть использованы в качестве параметров блоков входящих в состав подсистемы, а также для создания пиктограммы подсистемы. Команды инициализации выполняются в следующих случаях:
    • При открытии окна модели.
    • При запуске модели на выполнение.
    • При выполнении команды Edit/Update diagram.
    • При вращении блока маскированной подсистемы (в этом случае команды инициализации обеспечивают перерисовку пиктограммы).
    • При автоматическом изменении пиктограммы, зависящей от параметров блока.

В качестве примера маскированной подсистемы рассмотрим функциональный генератор. Схема модели генератора показана на рис. 9.10.2.

Рис. 9.10.2 Функциональный генератор.

[Скачать пример]

Модель генератора обладает следующими возможностями:

  1. Значения амплитуды и частоты сигнала могут задаваться либо как параметры генератора в его окне диалога, либо от внешних источников через входные порты.
  2. Форма выходного сигнала генератора (треугольник, прямоугольник или синусоида) задается в окне диалога.

Вид окна диалога, созданного с помощью редактора маски показан на рис. 9.10.3.

Рис. 9.10.3 Окно параметров генератора

Название параметра, идентификатор связанной с ним переменной, тип элемента интерфейса и формат параметра приведены в таблице 9.10.1.

Таблица 9.10.1.

N

Prompt

Variable

Control Type

Assiggment

Назначение

1

Internal source of frequency signal

Internal_freq

Checkbox

Evaluate

Задает тип источника сигнала задания на частоту: внутренний или внешний.

2

Frequency (Hz)

Freq

Edit

Evaluate

Задает величину задания на частоту внутреннего источника

3

Wave form

Wave_form

Popup

Evaluate

Задает форму выходного сигнала: треугольник, прямоугольник или синусоида

4

Internal source of magnitude signal

Internal_magn

Checkbox

Evaluate

Задает тип источника сигнала задания на амплитуду: внутренний или внешний.

5

Magnitude

Magn

Edit

Evaluate

Задает величину задания на амплитуду внутреннего источника

Окно редактора маски с открытой вкладкой Initialization, в котором создано окно параметров генератора, показано на рис. 9.10.4.

Рис. 9.10.4 Окно редактора маски на этапе создания окна параметров

Выбор типа источников задания на частоту (внутренний или внешний) осуществляется с помощью блока Selector1 (см. рис. 9.10.2). Для этого значение параметра Elements блока Selector1 задано как [(Internal_freq+1)]. Таким образом, если флажок параметра Internal source of frequency signal установлен, то числовое значение переменной Internal_freq равно 1 и на выход селектора проходит сигнал от внутреннего источника, если же флажок снят, то на выход селектора проходит сигнал от входного порта системы (т.е. от внешнего по отношению к генератору источника). Аналогичным образом с помощью переменной Internal_magn выполняется выбор источника сигнала задания на амплитуду.

Выбор формы выходного сигнала выполняется также с помощью блока Selector. Треугольный, прямоугольный и синусоидальный сигналы объединяются в вектор с помощью блока Mux, а затем в зависимости от числового значения переменной Wave_form, блок Selector выполняет выбор нужного элемента входного вектора. Значение параметра Elements блока Selector задано как [Wave_form]. Таким образом, если, например, параметр генератора Wave form имеет значение Sine, то числовое значение переменной Wave_form равно 3, и, следовательно, на выход селектора проходит третий элемент входного вектора, т.е. синусоидальный сигнал.

9.10.3. Создание пиктограммы подсистемы

Пиктограмма подсистемы создается с помощью вкладки Icon (Пиктограмма) редактора маски. Окно редактора маски с открытой вкладкой Icon показано на рис. 9.10.5.

Рис. 9.10.5 Вкладка Icon редактора маски

Вкладка содержит следующие элементы:

  1. Drawing commands – Область ввода команд рисования. Команды рисования являются выражениями допустимыми в языке MATLAB.
  2. Icon frame – Список позволяющий выбрать способ отображения рамки пиктограммы:
    • Visible – Рамка видна.
    • Invisible – Рамка не видна.
  3. Icon transparency - Список позволяющий установить прозрачность пиктограммы:
    • Opaque – Пиктограмма не прозрачна.
    • Transparent– Пиктограмма прозрачна.
  4. Icon rotation - Список позволяющий задать возможность вращения пиктограммы:
    • Fixed – Положение пиктограммы фиксировано.
    • Rotates – Пиктограмма может вращаться вместе с блоком.
  5. Drawing coordinates – Список, задающий условия масштабирования пиктограммы.
    • Autoscale – Автоматическое масштабирование. Рисунок занимает максимально возможную площадь внутри пиктограммы.
    • Normalized – Нормализованное масштабирование. Координаты левого нижнего угла пиктограммы (0,0), координаты правого верхнего угла (1,1).
    • Pixel – Координаты рисунка задаются в пикселах.

9.10.3.1. Команды вывода текста

Для вывода текста могут использоваться следующие команды:

  • disp('text') или disp(variablename) – Вывод текста 'text' или значения символьной переменной variablename в центре пиктограммы.
  • text(x, y, 'text') или text(x, y, variablename) – Вывод текста 'text' или значения символьной переменной variablename начиная с позиции, заданной координатами x и y.
  • text(x, y, 'text', 'horizontalAlignment', halign,'verticalAlignment', valign)-Вывод текста 'text' в позиции заданной координатами x и y и с указанием способов выравнивания относительно этой позиции по вертикали или горизонтали. Параметр halign может принимать значения: 'left', 'right' или 'center'. Параметр valign может принимать значения: 'base', 'bottom' или 'middle'.
  • fprintf('text') или fprintf('format', variablename) – Форматированный вывод (по правилам языка C) текста 'text' или значения символьной переменной variablename в центре пиктограммы.
  • port_label(port_type, port_number, label) – Вывод на пиктограмме метки порта. Например, выражение port_label('input', 1, 'a') выводит на пиктограмме метку a первого входного порта.

Для вывода текста в несколько строк допускается использование сочетания символов \n для перехода на новую строку.

Примеры маскированных подсистем с различными вариантами текстовых надписей даны на рис. 9.10.6. Значения текстовых переменных заданы на вкладке Initialization в графе Initialization commands.

Рис. 9.10.6. Варианты текстовых надписей на пиктограммах

[Скачать пример]

9.10.3.2. Команды построения графиков

Для построения графиков на пиктограмме могут использоваться следующие команды:

  • plot(Y) – В том случае, если Y является вектором, то строится график по оси абсцисс которого откладывается значение индекса элемента, а по оси ординат значение самого элемента. В том случае если Y является матрицей – строятся линии для каждого столбца. По оси абсцисс в этом случае также откладывается значение индекса элемента.
  • plot(X1,Y1,X2,Y2,...) – Строится графики вида Y1(X1), Y2(X2) и т.д.

Примеры маскированных подсистем с различными вариантами графиков представлены на рис. 9.10.7. Значения переменных заданы на вкладке Initialization в графе Initialization commands.

Рис. 9.10.7. Варианты графиков на пиктограммах

[Скачать пример]

9.10.3.3. Команды отображения передаточных функций

Для отображения на пиктограмме передаточной функции используются следующие команды:

  • dpoly(num, den) – Отображение дробно-рациональной передаточной функции (num – вектор коэффициентов числителя, den – вектор коэффициентов знаменателя). Оператор Лапласа будет отображен с помощью символа s.
  • dpoly(num, den, 'character') - Отображение дробно-рациональной передаточной функции. Оператор Лапласа будет отображен с помощью символа character.
  • dpoly(num, den, 'z') Отображение дискретной дробно-рациональной передаточной функции.
  • dpoly(num, den, 'z-') - Отображение дискретной дробно-рациональной передаточной функции от обратного аргумента.
  • droots(z, p, k) - Отображение Zpk-формы передаточной функции. Для рассматриваемого выражения может быть добавлен четвертый аргумент в виде 'z' или 'z-' для отображения дискретных передаточных функций.

Примеры маскированных подсистем с различными вариантами отображения передаточных функций показаны на рис. 9.10.8.

Рис. 9.10.8. Варианты отображения передаточных функций на пиктограммах

[Скачать пример]

9.10.3.4. Команды отображения рисунка из графического файла

Для отображения на пиктограмме рисунка из графического файла используются следующие команды:

  • image(imread('filename')) – Отображение рисунка из файла с полным именем filename. Для правильной работы этой команды необходимо поместить рисунок в туже папку, где находится файл модели, и сделать эту папку рабочей. Допускается также совместно с именем файла указывать его полный путь.
  • image(a, [x, y, w, h]) – Отображение рисунка содержащегося в переменной a. Ширина и высота рисунка задаются параметрами w и h, соответственно. Левый нижний угол рисунка расположен в точке с координатами x,y. Считывание рисунка из файла может быть выполнено командой a = imread('filename')).
  • image(a, [x, y, w, h], rotation) – Команда аналогичная предыдущей, но позволяющая задавать поведение рисунка при вращении пиктограммы. Значение параметра rotation равное 'on' позволяет поворачивать рисунок вместе с пиктограммой подсистемы.
  • patch(x, y) – Отображение закрашенного многоугольника, координаты которого заданы векторами x и y. Цвет рисунка – черный.
  • patch(x, y, [r g b]) - Команда аналогичная предыдущей, но позволяющая задавать цвет рисунка. Параметры r,g и b задают соотношение красного, зеленого и синего цветов в рисунке. Значение параметров должно находиться в пределах от 0 до 1.

Примеры маскированных подсистем с различными вариантами команд отображения рисунков показаны на рис. 9.10.9.

Рис. 9.10.9. Варианты отображения рисунков на пиктограммах.

[Скачать пример]

9.10.3.5. Использование редактора пиктограмм iconedit

Для создания пиктограмм можно также использовать редактор пиктограмм iconedit. Для его вызова используется команда:

iconedit('modelname','Subsystem'),

где modelname – имя файла модели (без расширения),

Subsystem – имя подсистемы, для которой будет создаваться пиктограмма.

Пиктограмма создается по точкам, расположение которых указывается с помощью мыши. Между собой точки соединяются прямыми линиями. Для того, чтобы начать новую линию необходимо нажать клавишу n на клавиатуре. Для отмены создания последней точки используется клавиша d. Выход из редактора с автоматическим обновлением пиктограммы осуществляется клавишей q. По завершении работы с редактором необходимо также закрыть его окно рисования. Кроме обновления пиктограммы завершение работы с редактором пиктограмм сопровождается выводом в командной строке MATLAB графической команды, обеспечивающей построение пиктограммы.

Пример пиктограммы, созданный с помощью iconedit, его окно рисования, а также текст команды, обеспечивающей построение пиктограммы, показаны на рис. 9.10.10.

Рис. 9.10.10 Создание пиктограммы с помощью iconedit

[Скачать пример]

9.10.3.6. Создание автоматически обновляемых пиктограмм

Создание автоматически обновляемой пиктограммы рассмотрим на примере функционального генератора (рис. 9.10.2). Генератор может вырабатывать сигнал трех видов: треугольный, прямоугольный и синусоидальный. Вполне логично было бы создать такую пиктограмму, на которой отображалась бы форма выбранного на текущий момент сигнала. Это достаточно легко сделать, поскольку за выбор формы сигнала в рабочей области маски отвечает переменная Wave_form. Числовое значение этой переменной равное 1 соответствует треугольному сигналу на выходе генератора, значение равное 2 соответствует прямоугольному сигналу, и 3 – синусоидальному. Реализация поставленной задачи обеспечивается указанными ниже командами, которые необходимо ввести в графе Initialization commands редактора маски:

switch Wave_form
    case 1
% треугольный сигнал
    x=[-6.28 -4.71 -1.57 1.57 4.71 6.28 ];
    y=[0 1 -1 1 -1 0];

    case 2
% прЯмоугольный сигнал
    x=[-6.28 -6.28 -3.14 -3.14 0 0 3.14 3.14 6.28 6.28 ];
    y=[0 1 1 -1 -1 1 1 -1 -1 0];

    case 3
% синусоидальный сигнал
    x=(-314*2:314*2)/100;
    y=sin(x);
end;

Примечание: Здесь и в дальнейшем в текстах на языке MATLAB включены комментарии на русском языке, которые необходимо удалить при составлении выражений в среде MATLAB.

В зависимости от значения переменной Wave_form векторам x и y присваиваются разные значения, благодаря чему команда построения графика plot(x,y); , указанная в графе Drawing commands строит разные графики.

Пример, показывающий все три варианта пиктограммы генератора, представлен на рис. 9.10.11. В примере, дополнительно, строятся оси координат с помощью следующих команд:

plot([-6.28 -6.28],[1.2 -1.2]);
plot([-6.28 8],[0 0]);

Также в графе графе Drawing commands введена команда, рисующая одну точку в левом нижнем углу пиктограммы:

plot([-10,-10],[-1.2 -1.2]);

С помощью этой команды достигается относительное смещение графиков вправо. Таким образом в левой части пиктограммы появляется дополнительное свободное место для отображения меток входных портов (управление портами маскированной подсистемы будет рассмотрено позже).

Рис. 9.10.11 Варианты пиктограммы функционального генератора.

[Скачать пример]

9.10.4. Создание справки маскированной подсистемы

Для создания описания и справки маскированной подсистемы служит вкладка Documentation (Документация). Вкладка Documentation содержит две графы: Block description (Описание блока) и Block Help (Справка по блоку). Внешний вид редактора маски с открытой вкладкой Documentation показан на рис. 9.10.12.

Рис. 9.10.12 Вкладка Documentation редактора маски

Текст, введенный в графу Block description, отображается в верхней части окна диалога и предназначен для краткого описания блока. В графу Block Help вносятся команды обеспечивающие загрузку файлов справки, созданных пользователем, в справочную систему при нажатии клавиши Help в окне параметров. Эти команды описаны в документации по Simulink. Наиболее удобным форматом файла справки является htm (html) – формат. Вызов справочного htm-файла осуществляется командой вида:

web(['file:///' which('helpfile.htm')]); ,

где

helpfile.htm – имя файла справки.

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

Пример окна справки подсистемы показан на рис. 9.10.13.

Рис. 9.10.13.Пример окна справки подсистемы

[Скачать пример]

9.10.5. Создание динамически обновляемых окон диалога

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

1. Выделить блок и ввести в командном окне MATLAB следующее выражение:

set_param(gcb, 'MaskSelfModifiable', 'on') . После чего модель необходимо сохранить. Данная команда дает разрешение на самомодификацию окна.

2. Ввести в командном окне команду вида:

set_param(gcb,'MaskCallbacks',{'parm1_callback', '','parm3_callback'}); ,

где в фигурных скобках указываются функции обрабатывающие событие изменения параметра. В данном примере функция parm1_callback обрабатывает событие при изменении первого параметра, а функция parm3_callback обрабатывает событие при изменении третьего параметра. В том случае, если для какого-либо параметра такая обработка не нужна, функция не записывается, но два апострофа для данного параметра (пустая функция) все равно должны указываться. В данном примере обработка события для второго параметра отсутствует. Сама функция может быть любым допустимым выражением на языке MATLAB.

Применительно к рассматриваемому функциональному генератору эта команда выглядит следующим образом:

set_param(gcb,'MaskCallbacks',{'call_back_freq','','','call_back_magn',''}); .

Функция call_back_freq обрабатывает событие при установке или снятии флажка параметра Internal source of frequency signal (тип источника сигнала задания на частоту, переменная Internal_freq), а функция call_back_magn обрабатывает событие при установке или снятии флажка параметра Internal source of magnitude signal (тип источника сигнала задания на амплитуду, переменная Internal_magn).

После этого модель необходимо сохранить.

3. Разработать функции обработки.

Для рассматриваемого примера функция call_back_freq (файл call_back_freq.m) выглядит следующим образом:

Freq_param=get_param(gcb,'Internal_freq'); % Присвоение переменной Freq_param значениЯ
                            % параметра Internal_freq (тип источника % сигнала заданиЯ на частоту: внутренний или
                            % внешний). Параметр Internal_freq является
                            % вторым в списке параметров окна диалога.
if strcmp(Freq_param,'on'); % Если значение переменной Freq_param есть 'on'
                            % (внутренний источник сигнала заданиЯ на частоту), то
    enable={'on','on','on','on','on'}; % всем элементам вектора enable присваиваются
                            % значениЯ равные 'on' (все параметры окна диалога
                            % должны быть активны).
else; % Если значение переменной Freq_param не равно 'on'
              % (внешний источник сигнала заданиЯ на частоту), то
    enable={'on','off','on','on','on'}; % второму элементу вектора enable присваивается
                            % значение 'off' (второй параметр должен быть не % активным).
end; % Завершение конструкци if … else
set_param(gcb,'MaskEnables',enable);
% Присвоение параметру маскированной подсистемы
                            % MaskEnables значениЯ вектора enable.
                            % Параметр MaskEnables устанавливает режим
                            % активности параметров окна диалога маскированной
                            % подсистемы.

Функция проверяет значение параметра Internal_freq. Если значение этого параметра есть 'on', то вектор enable имеет все элементы равные 'on', если же значение параметра Internal_freq равно 'off' (используется внешний источник сигнала задания на частоту), то второй элемент вектора enable имеет значение 'off' и функция set_param(gcb,'MaskEnables',enable); сделает не активной графу для ввода второго параметра (частота внутреннего источника).

Функция call_back_magn (файл call_back_magn.m) выглядит следующим образом:

Magn_param=get_param(gcb,'Internal_magn'); % Присвоение переменной Magn_param
                    % значениЯ параметра Internal_magn (тип
                    % источника сигнала заданиЯ на амплитуду:
                    % внутренний или внешний).
                    % Параметр Internal_magn ЯвлЯетсЯ пЯтым
                    % в списке параметров окна диалога.
if strcmp(Magn_param,'on'); % Если значение переменной Magn_param есть 'on'
                    % (внутренний источник сигнала заданиЯ на амплитуду),
    visible={'on','on','on','on','on'}; % то всем элементам вектора visible присваиваютсЯ
                    % значениЯ равные 'on' (все параметры окна диалога
                    % должны быть видимы).
else; % Если значение переменной Magn_param не равно 'on'
                % (внешний источник сигнала заданиЯ на на амплитуду), то
    visible={'on','on','on','on','off'}; % пЯтому элементу вектора visible присваиваетсЯ
                    % значение 'off' (пЯтый параметр окна диалога должен
                    % быть не видимым).
end; % Завершение конструкци if ... else
set_param(gcb,'MaskVisibilities',visible);
% Присвоение параметру маскированной подсистемы
                    % MaskVisibilities значениЯ вектора visible.
                    % Параметр MaskVisibilities устанавливает режим
                    % видимости параметров окна диалога маскированной
                    % подсистемы.

Функция проверяет значение параметра Internal_magn. Если значение этого параметра есть 'on', то вектор visible имеет все элементы равные 'on', если же значение параметра Internal_magn равно 'off' (используется внешний источник сигнала задания на амплитуду), то пятый элемент вектора visible имеет значение 'off' и функция set_param(gcb,'MaskVisibilities',visible); сделает не отображаемой графу для ввода пятого параметра (амплитуда внутреннего источника).

Для правильной работы такого окна диалога необходимо чтобы файл модели и файлы функций обработки находились в одной папке, и данная папка являлась рабочей. Согласно документации по Simulink текст callback-функций можно записывать также явным образом в вызове функции set_param.

Внешний вид окна диалога генератора для случая использования внешних источников сигналов задания на частоту и амплитуду показан на рис. 9.10.14.

 

Рис. 9.10.14.Окно диалога генератора

[Скачать пример]

При разработке динамически изменяемых окон диалога можно также переопределять с помощью функции set_param следующие параметры маскированной подсистемы:

  • MaskType – Название блока.
  • MaskDescription – Описание маскированной подсистемы.
  • MaskPromptString – Названия параметров, задаваемые в окне диалога.
  • MaskValueString – Значения параметров, задаваемые в окне диалога.

9.10.6. Управление портами маскированной подсистемы

В предыдущем параграфе рассматривалась методика создания динамически обновляемых окон диалога. В приведенном примере задание на амплитуду или частоту генератора сигналов может задаваться как параметр окна диалога блока, либо поступать от внешнего источника через входной порт подсистемы. При этом внешний вид блока, когда внешние источники не задействованы, оказывается точно таким же, как и при их использовании. Это неудобно, поскольку внешний вид блока (наличие на пиктограмме входных портов) вводит в заблуждение относительно фактических источников сигналов задания. Выходом из создавшейся ситуации является создание callback-функций убирающих или восстанавливающих входные порты в подсистеме. Основная идея при этом заключается в том, чтобы в случае, если внешний источник не используется – заменить входной порт подсистемы на блок Ground, а если внешний источник используется – выполнить обратную замену. Такие замены легко выполняются с помощью команд управления Simulink-моделью (команды подробно рассмотрены в документации на Simulink). Для повышения наглядности пиктограммы генератора стандартные названия входных портов In1 и In2 заменены на M (входной порт для сигнала задания на амплитуду) и F (входной порт сигнала задания на частоту). Пиктограмма генератора и его схема показаны на рис. 9.10.15.

Рис. 9.10.15 Функциональный генератор.

Текст callback-функции задающей вид источника сигнала задания на частоту (файл call_back_freq.m) приведен ниже.

                    % ПерваЯ часть (управление окном диалога)
Freq_param=get_param(gcb,'Internal_freq');
if strcmp(Freq_param,'on');
    enable={'on','on','on','on','on'};
else;
    enable={'on','off','on','on','on'};
end;
set_param(gcb,'MaskEnables',enable);

                    % ВтораЯ часть (управление портами)
Magn_param=get_param(gcb,'Internal_magn'); % Присвоение переменной Magn_param
                    % значениЯ параметра Internal_magn (тип источника
                    % сигнала заданиЯ на амплитуду: внутренний или внешний).

In_2_BlockType=get_param([gcb,'/F'],'BlockType'); % Определение типа блока в подсистеме,
                    % имеющего метку F .

if strcmp(Freq_param,'on')&(In_2_BlockType=='Inport');% Если значение переменной
                    % Freq_param равно 'on' (внутренний источник сигнала
                    % заданиЯ на частоту), а тип блока, имеющего метку F,
                    % есть 'Inport', то
    replace_block(gcb,'Name','F','Ground','noprompt') % выполнЯетсЯ замена блока, имеющего
                    % метку F (второго входного порта) на блок Ground.
                    % Порт с меткой F с пиктограммы блока исчезает.
                    % Величина заданиЯ на частоту генератора
                    % определЯетсЯ параметром, задаваемым в окне диалога.
end; % Завершение конструкции if.

if strcmp(Freq_param,'off')&(In_2_BlockType=='Ground'); % Если значение переменной
                    % Freq_param равно 'off' (внешний источник сигнала
                    % заданиЯ на частоту), а тип блока, меющего метку F,
                    % есть 'Ground', то
    replace_block(gcb,'Name','F','Inport','noprompt')% выполнЯетсЯ замена блока Ground
                    % на блок Inport. Порт с меткой F на пиктограмме блока
                    % поЯвлЯетсЯ. Величина заданиЯ на частоту генератора
                    % определЯетсЯ сигналом поступающим на данный порт.
end; % Завершение конструкци if.

if strcmp(Freq_param,'off')&strcmp(Magn_param,'off') % Если значениЯ переменных
                    % Freq_param и Magn_param равны 'off' (частота и амплитуда
                    % генератора задаетсЯ внешними источниками), то должна быть
                    % выполнена проверка правильности нумерации входных портов.
                    % Порт, имеющий метку М должен быть первым, а порт, имеющий
                    % метку F должен быть вторым.
    Port_1_param=get_param([gcb,'/M'],'port'); % Переменной Port_1_param присваиваетсЯ
                    % значение номера порта имеющего метку M.
    Port_2_param=get_param([gcb,'/F'],'port'); % Переменной Port_2_param присваиваетсЯ
                    % значение номера порта имеющего метку F.
    if (Port_1_param = = '2')&(Port_2_param = = '1'); % Если нумерациЯ портов нарушена, то
        replace_block(gcb,'Name','F','Ground','noprompt') % порт, имеющий метку F
                    % (через который поступает задание на частоту) временно заменЯетсЯ
                    % на блок Ground. При этом оставшемусЯ порту
                    % автоматически присваиваетсЯ первый номер.
        replace_block(gcb,'Name','F','Inport','noprompt') % Блок, имеющий метку F заменЯетсЯ на
                    % блок входного порта. При этом ему автоматически присваиваетсЯ
                    % второй номер.
    end; % Завершение внутренней конструкци if.
end;
% Завершение внешней конструкци if.

Первая часть функции управляет окном диалога (она полностью повторяет приведенную в предыдущем параграфе), а вторая часть выполняет управление входным портом F (задание на частоту).

Текст callback-функции задающей вид источника сигнала задания на амплитуду (файл call_back_magn.m) аналогичен тексту функции call_back_freq и приводится ниже без комментариев.

Magn_param=get_param(gcb,'Internal_magn');
if strcmp(Magn_param,'on');
    visible={'on','on','on','on','on'};
else;
    visible={'on','on','on','on','off'};
end;
set_param(gcb,'MaskVisibilities',visible);

Freq_param=get_param(gcb,'Internal_freq');
In_1_BlockType=get_param([gcb,'/M'],'BlockType');
if strcmp(Magn_param,'on')&(In_1_BlockType=='Inport');
    replace_block(gcb,'Name','M','Ground','noprompt')
end;
if strcmp(Magn_param,'off')&(In_1_BlockType= ='Ground');
    replace_block(gcb,'Name','M','Inport','noprompt')
end;

if strcmp(Freq_param,'off')&strcmp(Magn_param,'off')
    Port_1_param=get_param([gcb,'/M'],'port');
    Port_2_param=get_param([gcb,'/F'],'port');
    if (Port_1_param = = '2')&(Port_2_param = = '1')
        replace_block(gcb,'Name','F','Inport','noprompt')
    end;
end;

Первая часть функции call_back_freq управляет окном диалога, и аналогична приведенной в предыдущем параграфе. Вторая часть – управляет первым входным портом подсистемы. Вторая часть функции содержит также команды проверяющие правильность нумерации портов и восстанавливающие ее, если нумерация портов нарушена.

На рис.9.10.16 приведена модель генератора для случая, когда источник задания на амплитуду сигнала является внутренним, а источник задания на частоту – внешним.

Рис. 9.10.16 Модель функционального генератора при использовании внутреннего источника задания на амплитуду сигнала.

[Скачать пример]

На рисунке видно, что при выборе внутреннего источника сигнала задания на амплитуду (флажок Internal source of magnitude signal установлен) соответствующий входной порт на пиктограмме отсутствует, а в самой модели генератора входной порт M заменен блоком Ground. При этом задание на амплитуду сигнала поступает от блока Constant2 внутри подсистемы, а задание на частоту выходного сигнала – от внешнего источника через входной порт с меткой F.

В оглавление книги \ К следующему разделу \ К предыдущему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика