И.В.Черных
|
Подсистема это фрагмент Simulink-модели, оформленный в виде отдельного блока. Использование подсистем при составлении модели имеет следующие положительные стороны:
Уменьшает количество одновременно отображаемых блоков на экране, что облегчает восприятие модели (в идеале модель полностью должна отображаться на экране монитора).
Позволяет создавать и отлаживать фрагменты модели по отдельности, что повышает технологичность создания модели.
Позволяет создавать собственные библиотеки.
Дает возможность синхронизации параллельно работающих подсистем.
Позволяет включать в модель собственные справочные средства.
Дает возможность связывать подсистему с каким-либо m-файлом, обеспечивая запуск этого файла при открытии подсистемы (нестандартное открытие подсистемы).
Использование подсистем и механизма их блоков позволяет создавать блоки, не уступающие стандартным по своему оформлению (собственное окно параметров блока, пиктограмма, справка и т.п.).
Количество подсистем в модели не ограничено, кроме того подсистемы могут включать в себя другие подсистемы. Уровень вложенности подсистем друг в друга также не ограничен.
Связь подсистемы с моделью (или подсистемой верхнего уровня иерархии) выполняется с помощью входных (блок Inport библиотеки Sources) и выходных (блок Outport библиотеки Sinks) портов. Добавление в подсистему входного или выходного порта приводит к появлению на изображении подсистемы метки порта, с помощью которой внешние сигналы передаются внутрь подсистемы или выводятся в основную модель. Переименование блоков Inport или Outport позволяет изменить метки портов, отображаемые на пиктограмме подсистемы со стандартных (In и Out) на те, которые нужны пользователю.
Подсистемы могут быть виртуальными (Subsystem) и монолитными (Atomic Subsystem). Отличие этих видов подсистем заключается в порядке выполнения блоков во время расчета. Если подсистема является виртуальной, то Simulink игнорирует наличие границ отделяющих такую подсистему от модели при определении порядка расчета блоков. Иными словами в виртуальной системе сначала могут быть рассчитаны выходные сигналы нескольких блоков, затем выполнен расчет блоков в основной модели, а затем вновь выполнен расчет блоков входящих в подсистему. Монолитная подсистема считается единым (неделимым) блоком и Simulink выполняет расчет всех блоков в такой подсистеме, не переключаясь на расчеты других блоков в основной модели. Изображение монолитной подсистемы имеет более толстую рамку по сравнению с виртуальной подсистемой.
Подсистемы могут быть также управляемыми или неуправляемыми. Управляемые подсистемы всегда являются монолитными. Управляемые подсистемы имеют дополнительные (управляющие) входы, на которые поступают сигналы активизирующие данную подсистему. Управляющие входы расположены сверху или снизу подсистемы. Когда управляемая подсистема активизирована – она выполняет вычисления. В том случае если управляемая подсистема пассивна, то она не выполняет вычисления, а значения сигналов на ее выходах определяются настройками выходных портов.
Для создания в модели подсистемы можно воспользоваться двумя способами:
Скопировать нужную подсистему из библиотеки Subsystem в модель.
Выделить с помощью мыши нужный фрагмент модели и выполнить команду Create Subsystem из меню Edit окна модели. Выделенный фрагмент будет помещен в подсистему, а входы и выходы подсистемы будут снабжены соответствующими портами. Данный способ позволяет создать виртуальную неуправляемую подсистему. В дальнейшем, если это необходимо, можно сделать подсистему монолитной, изменив ее параметры, или управляемой, добавив управляющий элемент из нужной подсистемы находящейся в библиотеке. Отменить группировку блоков в подсистему можно командой Undo.
Рис. 9.9.1 иллюстрирует процесс создания подсистемы вторым способом. На рис. 9.9.2 показан результат этого процесса. В примере использована модель управляемого функционального генератора.
Рис. 9.9.1 Создание подсистемы
Рис. 9.9.2 Модель, использующая подсистему
9.9.1. Виртуальная и монолитная подсистемы Subsystem и Atomic Subsystem
Доступ к окну параметров подсистемы осуществляется через меню Edit командой Block Parameters…
Параметры:
Show port labels – Показать метки портов.
Treat as atomic unit (флажок) – Считать подсистему монолитной. Таким образом, блоки виртуальной и монолитной подсистем – это один и тот же блок, отличающийся значением данного параметра.
Access – Доступность подсистемы для изменений. Выбирается из списка:
ReadWrite – Пользователь может открывать и изменять подсистему.
ReadOnly – Пользователь может открывать подсистему только для просмотра.
NoReadOrWrite – Пользователь не может открывать и изменять подсистему.
Name of error callback function – Имя функции используемой для обработки ошибок возникающих в данной подсистеме.
Остальные параметры подсистемы доступны при разработке приложений с использованием Real-Time Workshop и рассмотрены в документации на это приложение.
Находящийся в библиотеке блок Subsystem (или Atomic Subsystem) содержит входной и выходной порты и линию связи между ними.
После того как блок подсистемы скопирован из библиотеки в модель, он становится доступным для редактирования.
9.9.2. Управляемая уровнем сигнала подсистема Enabled Subsystem
Подсистема Enabled Subsystem (в дальнейшем E-подсистема) активизируется при наличии положительного сигнала на управляющем входе. Если входной сигнал векторный, то подсистема активизируется, если хотя бы один элемент принимает положительное значение. Величина выходного сигнала в том случае, если система заблокирована, определяется настройками выходных портов подсистемы (блоки Outport). В том случае если параметр Output when disabled (вид сигнала на выходе подсистемы) выходного порта имеет значение held, то выходной сигнал подсистемы равен последнему рассчитанному ею значению, если же этот параметр имеет значение reset, то выходной сигнал подсистемы равен значению задаваемому параметром Initial output (начальное значение).
Свойства E-подсистемы определяются параметрами блока Enable, который может находиться в любом месте данной подсистемы. Его параметры перечислены ниже.
Параметры:
States when enabling – Состояние при запуске. Параметр задает состояние подсистемы при каждом запуске. Выбирается из списка:
held – Использовать предыдущее состояние (последнее состояние когда система была активна).
reset – Использовать начальное (исходное) состояние.
Show output port (флажок) – Показать выходной порт. При установленном флажке на пиктограмме блока Enable появляется дополнительный выходной порт, сигнал с которого может быть использован для управления блоками внутри подсистемы.
На рис. 9.9.3 показан пример модели с подсистемой и схема этой подсистемы. В примере параметр States when enabling блока Enable имеет значение held. Параметр Output when disabled первого выходного порта подсистемы имеет значение reset, а второго – held. Как видно из временных диаграмм при выключении подсистемы сигнал первого выходного порта равен начальному значению (нулю), а сигнал второго выходного порта равен последнему рассчитанному значению в момент активности подсистемы.
Рис. 9.9.3 Модель, использующая E-подсистему
Пример на рис. 9.9.4 отличается от предыдущего настройкой блока Enable подсистемы. В данном примере параметр States when enabling блока Enable имеет значение reset. На временных диаграммах видно, что при выключении подсистемы происходит ее сброс до начального состояния.
Рис. 9.9.4 Модель, использующая E-подсистему
9.9.3. Управляемая фронтом сигнала подсистема Triggered Subsystem
Подсистема Triggered Subsystem (в дальнейшем T-подсистема) включается фронтом (перепадом уровня) управляющего сигнала и выполняет вычисления только на том шаге моделирования, где произошло это изменение. Если входной сигнал векторный, то подсистема активизируется, если хотя бы в одном элементе изменяется уровень сигнала. Возврат T-подсистемы в исходное состояние не производится (подсистема сохраняет последнее значение до следующего запуска), поэтому параметр States when enabling выходных портов имеет значение held, и недоступен для изменения.
В T-подсистеме могут использоваться блоки, для которых модельное время является наследуемым параметром от предыдущего блока (например, Gain или Logical Operator), а также дискретные блоки, для которых параметр sample time имеет значение –1 (минус один).
Свойства T-подсистемы определяются параметрами блока Trigger, который может находиться в любом месте данной подсистемы. Его параметры перечислены ниже.
Параметры:
Trigger type – Тип триггера. Выбирается из списка:
rising – Активизация подсистемы положительным фронтом.
falling – Активизация подсистемы отрицательным фронтом.
either – Активизация подсистемы как положительным, так и отрицательным фронтом.
function-call – Активизация подсистемы определяется логикой работы заданной S-функции.
Show output port (флажок) – Показать выходной порт.
На рис. 9.9.5 показан пример модели с T-подсистемой. Сама T-подсистема содержит лишь один усилитель с коэффициентом передачи равным 1. Как видно из временных диаграмм, подсистема срабатывает по положительному фронту управляющего сигнала. Выходной сигнал подсистемы остается неизменным до следующего положительного фронта управляющего сигнала.
Рис. 9.9.5 Модель, использующая T-подсистему
9.9.4. Управляемая уровнем и фронтом сигнала подсистема Enabled and Triggered Subsystem
Подсистема Enabled and Triggered Subsystem (в дальнейшем ET-подсистема) включается фронтом сигнала поступающего на T-вход системы при наличии положительного сигнала на E-входе системы. Так же как и Triggered Subsystem эта подсистема выполняет вычисления только на том шаге моделирования, где произошло изменение управляющего сигнала на T-входе. Параметр States when enabling блока Enable не оказывает влияния на работу ET-подсистемы.
Оба управляющих сигнала могут быть векторными.
Пример ET-подсистемы дан на рис. 9.9.6.
Рис. 9.9.6 Модель, использующая ET-подсистему
9.9.5. Управляемая S-функцией подсистема Function-call subsystem
Function-call subsystem (в дальнейшем FC-подсистема) является T-подсистемой, предназначенной для использования совместно с S-функцией написанной на языке C. Используя специальные средства, можно обеспечить выполнение подсистемы во время выполнения S-функции. На время выполнения FC-подсистемы работа S-функции останавливается, а по окончании выполнения FC-подсистемы работа S-функции возобновляется. Таким образом, FC-подсистема обеспечивает создание S-функций, запускающих подсистемы составленные из Simulink-блоков. Механизм создания таких S-функций описан в документации Simulink, посвященной созданию S-функций.
Для работы с FC-подсистемой можно использовать также Function-Call Generator и средства пакета событийного моделирования Stateflow.
9.9.6. Блок условного оператора If
Назначение:
Обеспечивает формирование управляющих сигналов для подсистем If Action
Subsystem. Блок является аналогом оператора if-else языка программирования C.
Параметры:
Number of inputs – Количество входов.
If expression – Условное выражение. Условное выражение может включать в себя следующие знаки: <. <=, ==, ~=, >, >=, &, |, [ ], а также унарный минус. Если записанное условное выражение истинно, то на выходном If-порту блока формируется управляющий сигнал.
Elseif expressions – Одно или список альтернативных условных выражений разделенных запятыми, вычисляющихся, если условное выражение If expression ложно. Каждому условному выражению, записанному в списке Elseif expressions соответствует выходной Elseif-порт на котором формируется управляющий сигнал, если соответствующее условное выражение истинно. При этом алгоритм вычисления альтернативных условных выражений таков, что если одно из альтернативных условных выражений окажется истинным, то следующие в списке выражения не проверяются. Альтернативное условное выражение может включать в себя те же знаки, что и выражение If expression.
Show else condition (флажок) – Показать Else-порт. На Else-порту формируется управляющий сигнал, если условное выражение и все альтернативные условные выражения ложны.
На пиктограмме блока отображаются условные выражения, записанные в его параметрах. Добавление каждого нового альтернативного условного выражения приводит к появлению нового Elseif выходного порта.
Если входные сигналы блока являются скалярами, то для их обозначения в выражениях используется запись вида u1, u2 ,u3 и т.д. Если входные сигналы векторные, то для обозначения элементов вектора используются выражения вида u1(1), u1(2), u2(1), u2(2) и т.д.
На рис. 9.9.7 показан пример использования блока If совместно с подсистемами If Action Subsystem. В примере первая подсистема пропускает через себя входной сигнал если входной сигал блока If больше 1, вторая – если входной сигнал меньше –1 (минус один), и третья – если входной сигнал лежит в интервале от -1 до +1.
С-код, соответствующий алгоритму работы блока If в приведенном примере выглядит следующим образом:
if (u1 > 1) {
If Action Subsystem 1;
}
elseif (u1 < -1){
If Action Subsystem 2;
}
else {
If Action Subsystem 3;
}
Рис. 9.9.7 Использование блока If совместно с подсистемами If Action Subsystem
9.9.7. Блок переключателя Switch Case
Назначение:
Обеспечивает формирование управляющих сигналов для подсистем Case Action Subsystem. Блок является аналогом оператора Switch языка программирования C.
Параметры:
Case conditions – Список значений входных сигналов (целое число). Каждому значению соответствует отдельный выходной Case-порт. Если значение входного сигнала, поступающего на вход блока Switch Case, совпадает с каким либо значением из списка, то на соответствующем выходе блока формируется управляющий сигнал. Если входной сигнал не является целым, то его дробная часть отбрасывается. В выражении Case conditions можно использовать квадратные скобки, если необходимо вырабатывать управляющий сигал на каком-либо порту для нескольких значений входного сигнала. Например, выражение {1,[7,9]} задает два выходных Case-порта. На первом из них управляющий сигнал формируется, если входной сигнал блока равен 1, а на втором, – если входной сигнал равен 7 или 9. В выражении Case conditions можно использовать также диапазоны значений. Например, выражение {1:5} определяет, что для единственного выходного Case-порта выходной сигал будет вырабатываться, если входной сигнал блока равен 1, 2, 3, 4 или 5.
Show default case (флажок) – Показать default case-порт. На выходе default case-порта формируется управляющий сигнал, если входной сигнал блока не совпадает ни с одним значением, перечисленным в списке Case conditions.
На рис. 9.9.8 показан пример использования блока Switch Case совместно с подсистемами Switch Case Action Subsystem. В примере первая подсистема пропускает через себя входной сигнал, если входной сигал блока Switch Case равен 1, вторая – если входной сигнал равен –1 (минус один), и третья – если входной сигнал не равен ни -1 ни +1.
С-код, соответствующий алгоритму работы блока Switch Case в приведенном примере выглядит следующим образом:
switch (u1) {
case 1:
Switch Case Action Subsystem 1;
break;
case -1:
Switch Case Action Subsystem 2;
break;
default:
Switch Case Action Subsystem 3;
}
Рис. 9.9.8 Использование блока Switch Case совместно с подсистемами Switch Case Action Subsystem
9.9.8. Управляемая по условию подсистема Action Subsystem
Подсистема предназначена для работы под управлением блоков If или Switch Case. В первом случае она называется If Action Subsystem, а во втором Switch Case Action Subsystem.
Параметры подсистемы определяются настройками ее выходных портов, а также настройкой блока Action Port, наличие которого в подсистеме и превращает ее в Action Subsystem.
Блок имеет один параметр настройки:
States when execution is resumed – Состояние подсистемы системы при следующем возобновлении работы. Значение параметра выбирается из списка:
held – Использовать предыдущее состояние (последнее состояние когда система была активна).
reset – Использовать начальное (исходное) состояние.
Рассматриваемый параметр оказывает такое же действие на поведение подсистемы как параметр States when enabling блока Enable.
9.9.9. Управляемая подсистема For Iterator Subsystem
Управляемая подсистема For Iterator Subsystem представляет собой подсистему, которая выполняется неоднократно в течение одного такта моделирования. Количество повторений должно быть известно заранее и может задаваться внешним источником сигнала или с помощью параметра блока. Основные свойства подсистемы задает итерационный блок For Iterator. Блок является аналогом оператора цикла For языка программирования C.
Блока For может находиться в любом месте подсистемы. Его параметры перечислены ниже.
Параметры:
States when starting – Состояние подсистемы при следующем запуске. Значение параметра выбирается из списка:
held – Использовать предыдущее состояние (последнее состояние когда система была активна).
reset – Использовать начальное (исходное) состояние.
Source of number of iterations (флажок) – Источник задающий количество итераций.
internal – Внутренний.
external – Внешний.
Number of iterations – Количество итераций. Параметр доступен, если выбран внутренний источник числа итераций.
Show iteration number port – Отобразить на пиктограмме блока выходной порт, с которого снимается сигнал номера итерации.
Output data type – Тип данных выходного сигнала порта. Значение параметра выбирается из списка: int32, int16, int8 и double.
На рис. 9.9.9 показан пример использования For Iterator Subsystem. В примере выполняется накопление суммы значений с шагом равным 10. Количество итераций задается внешним источником и равно 20.
С-код, соответствующий алгоритму работы For Iterator Subsystem в приведенном примере выглядит следующим образом:
sum = 0;
iterations = 20;
sum_increment = 10;
for (i = 0; i < iterations; i + +) {
sum = sum + sum_increment;
}
Рис. 9.9.9 Применение For Iterator Subsystem
Скачать пример (EX_For_Iterator_Subsystem_1.zip)
9.9.10. Управляемая подсистема While Iterator Subsystem
Управляемая подсистема While Iterator Subsystem представляет собой подсистему, которая выполняется неоднократно в течение одного такта моделирования. Количество повторений заранее не известно. Цикл прекращается, если значение логического сигнала на управляющем входе подсистемы станет равно FALSE. Основные свойства подсистемы задает итерационный блок While Iterator. Блок является аналогом оператора цикла while (do-while) языка программирования C.
Свойства While Iterator Subsystem определяются параметрами блока While Iterator. Его параметры перечислены ниже.
Параметры:
Maximum number of iterations – Максимальное количество итераций. Если значение параметра равно -1 (минус один), то количество итераций не ограничивается.
While loop type (флажок) – Тип цикла. Выбирается из списка:
while – Цикл while.
do-while – Цикл do-while.
States when starting – Состояние подсистемы системы при следующем запуске. Значение параметра выбирается из списка:
held – Использовать предыдущее состояние (последнее состояние когда система была активна).
reset – Использовать начальное (исходное) состояние.
Show iteration number port – Отобразить на пиктограмме блока выходной порт, с которого снимается сигнал номера итерации.
Output data type – Тип данных выходного сигнала порта. Значение параметра выбирается из списка: int32, int16, int8 и double.
Входной порт IC позволяет задать начальное значение сигнала прекращающего выполнение цикла while. При использовании цикла do-while подсистема будет выполнена хотя бы один раз (поскольку проверка условия в этом случае производится в конце цикла).
На рис. 9.9.10 показан пример использования While Iterator Subsystem. В примере выполняется накопление суммы значений с шагом равным 10. Выполнение цикла прекращается, когда величина суммы достигнет значения 100.
С-код, соответствующий алгоритму работы While Iterator Subsystem в приведенном примере выглядит следующим образом:
sum = 0;
IC = 1;
iteration_number = 0;
cond = IC;
while (cond != 0) {
iteration_number = iteration_number + 1;
sum = sum + sum_increment;
if (sum > 100 OR iterations > max_iterations) cond = 0;
}
Рис. 9.9.10 Применение While Iterator Subsystem
9.9.11. Конфигурируемая подсистема Configurable Subsystem
Блок Configurable Subsystem позволяет создавать подсистему, обеспечивающую выбор конфигурации этой подсистемы. Например, в систему управления каким-либо объектом можно поставить конфигурируемую подсистему, наполнив ее различными вариантами регуляторов, и затем, перед проведением расчета, выбирать нужный вариант регулятора.
Для реализации такого механизма конфигурирования необходимо:
Создать библиотеку (File/New/Library).
Добавить в созданную библиотеку блок Configurable Subsystem и все необходимые варианты конфигурации подсистемы. Каждый из вариантов должен представлять собой стандартный блок Simulink либо маскированную подсистему (подсистему, имеющую собственное окно установки параметров).
Открыть Configurable Subsystem и выполнить ее настройку, отметив флажками нужные варианты и выбрав отображаемые входные и выходные порты подсистемы. Пример окна диалога Configuration dialog показан на рис. 9.9.11.
Рис. 9.9.11 Окно диалога Configuration dialog
Поместить в окно модели блок Configurable Subsystem из только что созданной библиотеки.
С помощью команды контекстного меню (вызывается нажатием правой клавиши мыши на объекте) Block choice (вариант блока) выбрать нужный вариант конфигурации. При открытии конфигурируемой подсистемы в окне модели будет автоматически открываться окно параметров того блока, который выбран командой Block choice.
Пример модели, использующей конфигурируемую подсистему, и библиотека конфигурируемой подсистемы показаны на рис. 9.9.12. В примере конфигурируемая подсистема состоит из апериодического и колебательного звеньев, которые могут выбираться при указании нужного варианта.
Рис. 9.9.12 Применение Configurable Subsystem
9.10. Маскирование подсистем
9.10.1. Общие сведения
Механизм маскирования подсистем позволяет оформить подсистему как полноценный библиотечный блок, т.е. снабдить подсистему собственным окном параметров, пиктограммой, справочной системой и т.п.
Маскирование подсистем дает пользователю следующие преимущества:
Расширяет возможности пользователя по управлению параметрами модели.
Позволяет создавать более понятный интерфейс подсистемы.
Повышает наглядность блок-диаграммы.
Расширяет возможности построения сложных моделей.
Повышает защищенность модели от несанкционированной модификации.
Для выполнения маскирования имеющейся подсистемы необходимо предварительно выполнить следующие действия:
Определить какие параметры подсистемы должны задаваться пользователем в будущем окне параметров. Задать эти параметры в подсистеме с помощью идентификаторов (имен).
Определить каким образом параметр должен задаваться в окне диалога (с помощью строки ввода, выбором из раскрывающегося списка или установкой флажка).
Разработать эскиз пиктограммы блока.
Создать комментарии (справку) по использованию подсистемы.
Маскирование подсистемы выполняется с помощью Mask Editor (редактор маски). Для запуска редактора маски необходимо выделить маскируемую подсистему и выполнить команду Mask Subsystem… из меню Edit. Можно также воспользоваться контекстным меню. После запуска Mask Editor на экран будет выведено окно редактора (рис. 9.10.1), имеющее 3 вкладки: Icon (Пиктограмма), Initialization (Инициализация), Documentation (Документация). Первая из вкладок обеспечивает создание пиктограммы подсистемы, вторая – дает возможность создать окно диалога для ввода параметров и третья – позволяет ввести описание блока и создать его справку.
В верхней части всех вкладок имеется поле Mask Type, с помощью которого можно задать имя блока. В нижней части окна имеется 5 кнопок управления редактором:
OK – Сохранить внесенные изменения и закрыть окно.
Cancel – Отменить внесенные изменения и закрыть окно.
Unmask – Снять маску с подсистемы. До закрытия файла модели маску можно восстановить, воспользовавшись командой Edit Mask… из меню Edit.
Help – Открыть окно справки редактора маски.
Apply – Сохранить внесенные изменения без закрытия окна редактора.
Повторный вызов редактора маски для уже маскированной подсистемы осуществляется командой Edit Mask… из меню Edit (или аналогичной командой из контекстного меню).
После того как маскирование системы будет выполнено, двойной щелчок на ее изображении будет открывать окно параметров подсистемы, а не окно модели. Открыть саму подсистему (окно модели) для редактирования или просмотра можно командой Look under mask из меню Edit или контекстного меню.
Рис. 9.10.1 Окно редактора маски Mask Editor
9.10.2. Создание окна параметров
Окно параметров создается с помощью вкладки Initialization (Инициализация) редактора маски. Для создания поля ввода параметра с его описанием необходимо выполнить следующие действия:
Нажать кнопку Add (Добавить).
Ввести описание параметра в поле Prompt (Подсказка). В качестве описания параметра обычно используется его название в виде текста, например, “Gain”, “Constant value” и т.п.
Указать идентификатор параметра в поле Variable (Переменная). Естественно, что это должен быть один из тех идентификаторов, который использовался при задании параметров блоков внутри подсистемы (хотя это не обязательно, поскольку параметр может быть использован и для модификации самого окна диалога). Все переменные, идентификаторы которых заданы на вкладке Initialization, помещаются в Mask Workspace – локальную рабочую область маски и являются доступными только внутри подсистемы.
Выбрать тип элемента интерфейса задающего параметр из списка Control Type:
Edit – Редактируемое поле ввода.
Checkbox – Флажок.
Popup – Раскрывающийся список. В этом случае в графе Popup Strings (Элементы списка) необходимо ввести элементы списка, разделенные символом вертикальной черты. Например, выражение alpha|beta|gamma задаст список из трех элементов: alpha,beta и gamma.
Выбрать формат параметра из списка Assiggment:
Evaluate – Вычисляемый. Выбирается, если параметр должен иметь числовое значение. В данное поле можно будет ввести выражение в соответствии с правилами языка MATLAB. Формат Evaluate позволяет также использовать числовую форму значения переменной в том случае, если тип элемента интерфейса выбран в виде флажка или раскрывающегося списка. Так, например, для раскрывающегося списка alpha|beta|gamma значение связанной со списком переменной будет равно 1, если в списке выбрано alpha, 2 – если в списке выбрано beta, и 3 – если в списке выбрано gamma. Для элемента интерфейса Checkbox вычисляемые значения будут равны 1 (при установленном флажке) и 0 (при снятом флажке).
Literal – Текстовый. Выбирается, если параметр должен быть строкой символов.
Ввести команды инициализации в графе Initialization commands. Команды инициализации представляют собой обычные команды на языке MATLAB и могут включать операторы и m-функции. Такие команды задают переменные, которые будут находиться в рабочей области маскированной подсистемы. Эти переменные доступны внутри подсистемы и могут быть использованы в качестве параметров блоков входящих в состав подсистемы, а также для создания пиктограммы подсистемы. Команды инициализации выполняются в следующих случаях:
При открытии окна модели.
При запуске модели на выполнение.
При выполнении команды Edit/Update diagram.
При вращении блока маскированной подсистемы (в этом случае команды инициализации обеспечивают перерисовку пиктограммы).
При автоматическом изменении пиктограммы, зависящей от параметров блока.
В качестве примера маскированной подсистемы рассмотрим функциональный генератор. Схема модели генератора показана на рис. 9.10.2.
Рис. 9.10.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 редактора маски
Вкладка содержит следующие элементы:
Drawing commands – Область ввода команд рисования. Команды рисования являются выражениями допустимыми в языке MATLAB.
Icon frame – Список позволяющий выбрать способ отображения рамки пиктограммы:
Visible – Рамка видна.
Invisible – Рамка не видна.
Icon transparency - Список позволяющий установить прозрачность пиктограммы:
Opaque – Пиктограмма не прозрачна.
Transparent– Пиктограмма прозрачна.
Icon rotation - Список позволяющий задать возможность вращения пиктограммы:
Fixed – Положение пиктограммы фиксировано.
Rotates – Пиктограмма может вращаться вместе с блоком.
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.