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

Реализация S-функций

Вы можете реализовать S-функцию или как М. Файл или MEX файл.

S-функции в виде М-файлов

М-файл S-функции  состоит из функции MATLAB следующей формы

[sys,x0,str,ts]=f(t,x,u,flag,p1,p2,...)

где f - имя S-функции,

t - текущее время,

x - вектор состояния, передаваемый блоком S-function,

u - входы блока,

flag-флажок указывает задачу, которая должна быть выполнена,

и p1, p2... - параметры блока.

В течение моделирования по модели,

Simulink неоднократно вызывает f, используя флажок, чтобы указать задачу, которая будет выполнена для данного обращения.

Стадии моделирования

Подпрограмма S-функции

Flag

Инициализация

mdlInitializeSizes

flag =0

Вычисление времени следующего  сэмплирования (только для переменного шага интегрирования )

mdlGetTimeOfNextVarHit

flag =4

Вычисление выходов

mdlOutputs

flag =3

Модифицирует дискретные состояния

mdlUpdate

flag =2

Вычисление производных

mdlDerivatives

flag =1

Конец задач моделирования

mdlTerminate

flag =9

Рекомендуется, чтобы Вы следовали за структурой и соглашениями об именах шаблона при создании S-функций в M-файле. Это облегчит понимание структуры S-функции, которые Вы создаете.

Простой Пример S-функции в виде M-файла

Для понимания как должна протекать работа S-функций, рассмотрим  простой пример.

Этот блок (timestwo) берет входной скалярный сигнал, удваивает его, и выводит на  график.

Код M-файла, который содержит S-функцию, сделан на шаблоне S-функции, названном sfuntmpl.m, который включен с Simulink. Используя этот шаблон, Вы можете создать M-файл S-функции, которая очень близка по структуре к C MEX S-функции. Это полезно, потому что это делает переход от M-файла к созданию C MEX-файла намного проще.

Ниже - код M-файла для timestwo.m S-функции.

function [sys,x0,str,ts] = timestwo(t,x,u,flag)

%  КОД M-ФАЙЛА ДЛЯ TIMESTWO.M S-ФУНКЦИИ

% ПРОВЕРИТЬ ФЛАЖОК. ОПЕРАТОР SWITCH УПРАВЛЯЕТ ВЫЗОВАМИ

% ПОДПРОГРАММ S-ФУНКЦИИ В КАЖДОЙ СТАДИИ МОДЕЛИРОВАНИЯ.

switch flag,

   case 0

     [sys, x0, str, ts] = mdlInitializeSizes; % ИНИЦИАЛИЗАЦИЯ

   case 3

     sys = mdlOutputs(t,x,u); % ВЫЧИСЛИТЬ ВЫХОДЫ

 case {1,2,4,9} %Неиспользуемые  значениЯ flag!!!

   otherwise

     error(['Неподдерживаемое значение flag = ',num2str(flag)]); % ОБРАБОТКА ОШИБОК

end;

% Конец функции timestwo.

% Ниже - подпрограммы S-функции (внутренние функции), которые  вызывает timestwo.m.

%==============================================================

% ФУНКЦИЯ MDLINITIALIZESIZES ИНИЦИАЛИЗИРУЕТ СОСТОЯНИЯ,