%что выход не должен измениться
%
if abs(round((t-doffset)/dperiod)-(t-doffset)/dperiod) < 1e-8
sys = x(2);
else
sys = []; % Это - не момент времени выборки, поэтому возвратите пустую матрицу,
%чтобы указать, что выход не изменился
end
% Конец mdlOutputs.
Рис. Модель в Simulink.
Рис. Параметры моделирования.
Рис. Результаты моделирования.
Данный M-файл - пример S-функции, что использует переменное время сэмпплирования. Этот пример, в M-файле, названном vsfunc.m, вызывает mdlGetTimeOfNextVarHit когда флажок = 4. Поскольку вычисление следующего типового раза зависит от входа u, этот блок имеет прямой проход. Вообще, все блоки, что использовуют вход, чтобы вычислить в следующий момент квантования (флажок = 4), требует прямой проход.
Вот - код для S-функции M-файла.
function [sys,x0,str,ts] = vsfunc(t,x,u,flag)
% ЭТОТ ПРИМЕР S-ФУНКЦИЯ ИЛЛЮСТРИРУЕТ, КАК СОЗДАТЬ БЛОК С ПЕРЕМЕННЫМ ШАГОМ
% В SIMULINK. ЭТОТ БЛОК ОСУЩЕСТВЛЯЕТ ПЕРЕМЕННУЮ ЗАДЕРЖКУ ШАГА,
%В КОТОРОЙ ПЕРВЫЙ ВХОД ОТСРОЧЕН НА ВРЕМЯ, ОПРЕДЕЛЕННОЕ ВТОРЫМ ВХОДОМ.
%
% dt = u(2)
% y(t+dt) = u(t)
%
switch flag,
case 0
[sys,x0,str,ts] = mdlInitializeSizes; % ИНИЦИАЛИЗАЦИЯ
case 2
sys = mdlUpdate(t,x,u); % МОДИФИЦИРОВАТЬ ДИСКРЕТНЫЕ СОСТОЯНИЯ
case 3
sys = mdlOutputs(t,x,u); % ВЫЧИСЛИТЬ ВЫХОДЫ
case 4
sys = mdlGetTimeOfNextVarHit(t,x,u); % ПОЛУЧАЕТ СЛЕДУЮЩЕЕ ВРЕМЯ ВЫБОРКИ
case 9,
sys=mdlTerminate(t,x,u);
case 1
sys = []; % НЕИСПОЛЬЗОВАННЫЕ ФЛАЖКИ
otherwise
error(['Unhandled flag = ',num2str(flag)]); % Обработка ошибок
end
% Конец vsfunc.
%==============================================================
% mdlInitializeSizes
% Возвратить размеры, задать состоЯниЯ, и указать параметры времени квантованиЯ длЯ
% S-функции.
%==============================================================
%
function [sys,x0,str,ts] = mdlInitializeSizes
%
% Вызвать simsizes длЯ структуры размеров, заполнить её и конвертировать{преобразовать}
% к массиву размеров.
%
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 1;
sizes.NumOutputs = 1;
sizes.NumInputs = 2;
sizes.DirFeedthrough = 1; % flag=4 требует прЯмого прохода
%, если вход u вовлечен в
%вычисление следующего момента квантованиЯ.
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
%
% Инициализировать начальные условиЯ{состоЯниЯ}.
%
x0 = [0];
%
% ПриравнЯем str к пустой матрице.
%
str = [];
%
% Инициализировать массив периода дискретизации и смещениЯ.
%
ts = [-2 0];
% переменное типовое времЯ
% Конец mdlInitializeSizes.
%
%==============================================================
% mdlUpdate
% Обработать обновлениЯ дискретных состоЯний, произвести выбор момента времени.
%==============================================================
%
function sys = mdlUpdate(t,x,u)
sys = u(1);
% Конец mdlUpdate.
%
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.