Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
И.В.Черных. Simulink.doc
Скачиваний:
317
Добавлен:
03.12.2018
Размер:
3.88 Mб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]