Управление портами маскированной подсистемы
В предыдущем параграфе рассматривалась методика создания динамически обновляемых окон диалога. В приведенном примере задание на амплитуду или частоту генератора сигналов может задаваться как параметр окна диалога блока, либо поступать от внешнего источника через входной порт подсистемы. При этом внешний вид блока, когда внешние источники не задействованы, оказывается точно таким же, как и при их использовании. Это неудобно, поскольку внешний вид блока (наличие на пиктограмме входных портов) вводит в заблуждение относительно фактических источников сигналов задания. Выходом из создавшейся ситуации является создание 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 Модель функционального генератора при использовании внутреннего источника задания на амплитуду сигнала.
10. Редактор дифференциальных уравнений DEE
Simulink содержит специальный блок – Differential Equation Editor(редактор дифференциальных уравнений). С помощью этого блока можно задавать системы дифференциальных уравнений в явной форме Коши и выполнять их решение. Вызов редактора выполняется вводом команды dee в окне MATLAB.
Использование редактора рассмотрим на примере расчета переходных процессов в последовательном колебательном контуре. Задача заключается в нахождении тока протекающего в электрической цепи и напряжения на конденсаторе C после замыкания ключа. Схема цепи показана на рис. 10.1. Начальные условия полагаем нулевыми (ток в цепи отсутствует, и конденсатор не заряжен).
Рис.10.1. Расчетная электрическая схема
Предварительно составляем систему дифференциальных уравнений, описывающую электрическую цепь:
,
,
где i – ток в цепи, - напряжение на конденсаторе
Записываем данную систему уравнений в явной форме Коши:
,
.
Вводим “машинные” переменные:
В итоге система уравнений примет вид:
,
Введение “машинных” переменных, связано с тем, что редактор дифференциальных уравнений требует задавать в виде векторов входные воздействия (u) и переменные состояния (х) и имена этих векторов жестко заданы.
После получения системы дифференциальных уравнений с использованием “машинных” переменных, необходимо запустить редактор командой dee в окне MATLAB. Затем нужно поместить блок редактора в окно с создаваемой моделью, открыть окно редактора и ввести систему дифференциальных уравнений, начальные условия, а также алгебраические уравнения для расчета выходных сигналов (в рассматриваемой задаче выходные переменные равны переменным состояния). Также необходимо указать размерность вектора входного сигнала (# of inputs). Схема модели и окно редактора показаны на рис. 10.2. Там же приведены и результаты расчета.
Рис. 10.2. Модель, использующая редактор дифференциальных уравнений
[Скачать пример]
Значения постоянных коэффициентов системы уравнений можно задавать не только как числовые константы, но и использовать переменные рабочей области MATLAB.
[Скачать пример]
Достоинством редактора DEE является также то, коэффициенты дифференциального уравнения могут быть переменными и задаваться также как и входные сигналы (через входной порт). В качестве примера на рис. 10.3 показан вариант предыдущей модели, в котором величина сопротивления увеличивается в 10 раза в процессе расчета. В системе дифференциальных уравнений сопротивление записано как входной сигнал u(2).
Рис. 10.3 Второй вариант модели
11. Использование Simulink LTI-Viewer для анализа динамических систем
Инструмент Simulink LTI-Viewer входит в состав пакета прикладных программ Control System Toolbox и предназначен для анализа линейных стационарных систем. С помощью данного инструмента можно легко построить частотные характеристики исследуемой системы, получить ее отклики на единичные ступенчатое и импульсное воздействия, найти нули и полюса системы и т.д.
Краткий алгоритм работы с Simulink LTI-Viewerприведен ниже.