Применение S-функций в Simulink, страница 10

%что выход не должен измениться

%

if abs(round((t-doffset)/dperiod)-(t-doffset)/dperiod) < 1e-8

  sys = x(2);

else

  sys = []; % Это - не момент времени выборки, поэтому возвратите пустую матрицу,

                %чтобы указать, что выход не изменился

end        

% Конец mdlOutputs.

Рис. Модель в Simulink.

Рис. Параметры моделирования.

Рис. Результаты моделирования.


Пример - S-функция, использующая переменное  время сэмпплирования.

Данный 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.

%