Модель дискретной системы с переменным шагом расчета дана в файле vsfunc.m. Рассматриваемая S-функция моделирует устройство задержки сигнала. Время задержки определяется величиной входного сигнала. Для вычисления момента времени срабатывания блока используется callback-метод mdlGetTimeOfNextVarHit, вызываемый при значении переменой flag = 4. Поскольку время срабатывания блока зависит от входного сигнала, то параметр DirFeedthrough должен иметь значение равное 1. В целом, любой блок, в котором время срабатывания вычисляется по величине входного сигнала, должен иметь DirFeedthrough = 1.
Ниже приведен текст этой S-функции.
S-функция dsfunc:
function [sys,x0,str,ts] = vsfunc(t,x,u,flag)% VSFUNC Пример S-функции. S-функциЯ моделирует систему, с переменным шагом% расчета (устройство задержки сигнала).% ВремЯ задержки определЯетсЯ величиной сигнала. поступающего на второй вход:%% dt = u(2)% y(t+dt) = u(t)%% Смотри также SFUNTMPL, CSFUNC, DSFUNC. % Copyright 1990-2001 The MathWorks, Inc.% $Revision: 1.9 $% Авторский перевод комментариев: Черных И.В.%%switch flag, % В зависимости от значениЯ переменной 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); %=========================================%% Неиcпользуемые значениЯ переменной flag %%=========================================% % В примере нет непрерывных переменных состоЯниЯ, % поэтому значение переменной flag = 1 не используетсЯ. % Результатом S-функции в этом случае ЯвлЯетсЯ пустаЯ матрица. case 1, sys = []; %======================================%% Неизвестное значение переменной flag %%======================================% otherwise error(['Unhandled flag = ',num2str(flag)]); end % Окончание vsfunc %%===============================================================%% mdlInitializeSizes %% ФункциЯ инициализации %% Расчет начальных условий, значений вектора шагов модельного %% времени, размерности матриц %%===============================================================%%function [sys,x0,str,ts]=mdlInitializeSizes%sizes = simsizes; sizes.NumContStates = 0; % Число непрерывных переменных состоЯниЯ.sizes.NumDiscStates = 1; % Число дискретных переменных состоЯниЯ.sizes.NumOutputs = 1; % Число выходных переменных (размерность выходного% вектора).sizes.NumInputs = 2; % Число входных переменных (размерность входного % вектора).sizes.DirFeedthrough = 1; % ПрЯмой проход. Входной сигал используетсЯ % в методе mdlGetTimeOfNextVarHit .sizes.NumSampleTimes = 1; % Размерность вектора шагов модельного времени. sys = simsizes(sizes); x0 = [0]; % Задание вектора начальных значений переменных % состоЯниЯ. % Начальные условиЯ нулевые.str = []; % Параметр заразервирован длЯ будущего % использованиЯ. ts = [-2 0]; % Переменный шаг модельного времени длЯ дискретной % части системы. При вызове S-функции со значением % переменной flag = 4 выполнЯетсЯ расчет следующей % точки по времени. % Окончание mdlInitializeSizes %%=========================================================================%% mdlUpdate %% ФункциЯ длЯ расчета значений вектора состоЯниЯ дискретной части системы %%=========================================================================%%function sys=mdlUpdate(t,x,u) sys = u(1); % Окончание mdlUpdate %%========================================================% % mdlOutputs %% ФункциЯ длЯ расчета значений вектора выходных сигналов %%========================================================% %function sys=mdlOutputs(t,x,u) sys = x(1); % Окончание mdlOutputs %%===========================================================================%% mdlGetTimeOfNextVarHit %% Расчет значениЯ времени длЯ следующей расчетной точки дискретной части %% системы. %% ФункциЯ рассчитывает времЯ (абсолютное значение), по достижении которого %% значениЯ дискретной части системы передаютсЯв Simulink-модель. %% ФункциЯ используетсЯ только в случае моделированиЯ дискретной части %% системы с переменным шагом (variable discrete-time sample time). В этом %% случае параметр ts функции mdlInitializeSizes должен быть задан как [-2 0]%%===========================================================================%%function sys=mdlGetTimeOfNextVarHit(t,x,u) sys = t + u(2); % Окончание mdlGetTimeOfNextVarHit %%=========================================%% mdlTerminate %% ФункциЯ, выполнЯющаЯ завершение расчета %%=========================================%%function sys=mdlTerminate(t,x,u) sys = []; % Окончание mdlTerminate
Пример модели с S-функцией vsfunc приведен на рис.16.8. В примере время задержки сигнала увеличивается с 0.0005 с до 0.0015 с.