Ведение Level-1 S-функций MATLAB

О обслуживании Level-1 S-функций MATLAB

Примечание

Информация, представленная в этом разделе, предназначена только для использования в обслуживании существующих Level-1 MATLAB® S-функции. Используйте более способный Level-2 API, чтобы разработать новые S-функции MATLAB (см. «Запись Level-2 S-функции MATLAB»). Level-1 MATLAB S-функции поддерживают намного меньшее подмножество S-функции API, затем Level-2 MATLAB S-функции, и их функции ограничены по сравнению со встроенными блоками.

A Level-1 MATLAB S-функция является функцией MATLAB следующей формы

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

где f - имя S-функции. Во время симуляции модели Simulink® engine неоднократно вызывает f, с использованием flag аргумент для указания задачи (или задач), которая должна выполняться для определенного вызова. S-функция выполняет задачу и возвращает результаты в векторе выхода.

Реализация шаблона Level-1 S-функции MATLAB, sfuntmpl.m, находится в папке matlabroot/ toolbox/simulink/блоки. Шаблон состоит из функции верхнего уровня и набора локальных функций скелета, называемых методами коллбэка S-функции, каждый из которых соответствует конкретному значению flag. Функция верхнего уровня вызывает локальную функцию, обозначенную flag. Локальные функции выполняют фактические задачи, необходимые для S-функции во время симуляции.

Level-1 аргументов S-функции MATLAB

Механизм Simulink передает следующие аргументы Level-1 S-функции MATLAB:

tТекущее время
xВектор состояния
uВходной вектор
flagЦелое число значения, которое указывает задачу, которая должна быть выполнена S-функцией

Следующая таблица описывает значения, которые flag может предположить и перечислить соответствующий метод Level-2 S-функции MATLAB для каждого значения.

Аргумент флага

Level-1 флагLevel-2 коллбэкаОписание
0setupЗадает основные характеристики блоков s-function, включая шаги расчета, начальные условия непрерывных и дискретных состояний и sizes массив (для описания sizes смотрите Define S-Function Block Characteristics массив).
1mdlDerivativesВычисляет производные переменных непрерывного состояния.
2mdlUpdateОбновляет дискретные состояния, шаги расчета и основные требования к временным шагам.
3mdlOutputsВычисляет выходы S-функции.
4mdlOutputs метод обновляет объект во время выполнения NextTimeHit свойствоВычисляет время следующего попадания в абсолютное время. Эта стандартная программа используется только, когда вы задаете переменную дискретного времени шага расчета в setup способ.
9mdlTerminateВыполняет любые необходимые задачи в конце симуляции.

Level-1 выходов S-функции MATLAB

Level-1 S-функция MATLAB возвращает вектор выхода, содержащий следующие элементы:

  • sys, универсальный возвращаемый аргумент. Возвращенные значения зависят от flag значение. Для примера, для flag = 3, sys содержит выходы S-функции.

  • x0, начальные значения состояния (пустой вектор, если состояний в системе нет). x0 игнорируется, кроме тех случаев, когда flag = 0.

  • str, первоначально предназначенный для будущего использования. Level-1 MATLAB S-функции должны установить это в пустую матрицу, [].

  • ts, двухколоночная матрица, содержащая шаги расчета и смещения блока (см. "Задание шага расчета в использовании Simulink" для получения информации о том, как задать шаги расчета и смещения ").

    Для примера, если вы хотите, чтобы ваша S-функция запускалась в каждый временной шаг (непрерывный шаг расчета), установите ts на [0 0]. Если вы хотите, чтобы ваша S-функция выполнялась с той же скоростью, что и блок, с которым она связана (унаследованный шаг расчета), задайте ts на [-1 0]. Если вы хотите, чтобы он запускался каждый 0.25 секунд (дискретный шаг расчета), начиная с 0.1 через секунды после начала симуляции установите ts на [0.25 0.1].

    Можно создать S-функции, которые выполняют несколько задач с разной частотой дискретизации (то есть многоразовую S-функцию). В этом случае ts должен указать все частоты дискретизации, используемые вашей S-функцией в порядке возрастания по шагу расчета. Например, предположим, что ваша S-функция выполняет одну задачу каждые 0,25 секунды, начиная со времени начала симуляции, и другую задачу каждые 1 секунду, начиная с 0,1 секунды после времени начала симуляции. В этом случае ваша S-функция должна задать ts равно [.25 0; 1.0 .1]. Это заставит механизм Simulink выполнять S-функцию в следующее время: [0 0.1 0.25 0.5 0.75 1 1.1 ...]. Ваша S-функция должна решать в каждом шаге расчета, какую задачу выполнять в этом шаге расчета.

    Можно также создать S-функцию, которая выполняет некоторые задачи постоянно (т.е. в каждый временной шаг) и другие с дискретными интервалами.

Задайте характеристики блока s-function

Чтобы механизм Simulink распознал Level-1 S-функцию MATLAB, вы должны предоставить ему конкретную информацию о S-функции. Эта информация включает количество входов, выходов, состояний и других блоков характеристик.

Чтобы предоставить эту информацию, вызовите simsizes функция в начале S-функции.

sizes = simsizes;

Эта функция возвращает неинициализированное sizes структура. Вы должны загрузить sizes структура с информацией о S-функции. В таблице ниже перечислены поля sizes и описывает информацию, содержащуюся в каждом поле.

Поля в размерах Структура

Имя поляОписание
sizes.NumContStatesКоличество непрерывных состояний
sizes.NumDiscStatesКоличество дискретных состояний
sizes.NumOutputsКоличество выходов
sizes.NumInputsКоличество входов
sizes.DirFeedthroughФлаг для прямого сквозного соединения
sizes.NumSampleTimesКоличество шагов расчета

После инициализации sizes структура, вызов simsizes снова:

sys = simsizes(sizes);

Это передает информацию в sizes структура, к sys, вектор, который содержит информацию для использования механизмом Simulink.

Обработка параметров S-функции

При вызове Level-1 S-функции MATLAB механизм Simulink всегда передает стандартные параметры блоков, t, x, u, и flag, в S-функцию как аргументы функции. Механизм может передать дополнительные специфичные для блока параметры, заданные пользователем, в S-функцию. Пользователь задает параметры в S-function parameters поле диалогового окна Блок S-function Parameters (см. Передача параметров S-Functions). Если диалоговое окно блока задает дополнительные параметры, двигатель передает параметры S-функции в качестве дополнительных аргументов функции. Дополнительные аргументы следуют стандартным аргументам в списке аргументов S-функции в том порядке, в котором соответствующие параметры появляются в диалоге блоков. Можно использовать эту специфическую для блока возможность параметра S-функции, чтобы позволить той же S-функции реализовать различные опции обработки. Смотрите limintm.m пример в папке matlabroot/ toolbox/simulink/simdemos/simfeatures для примера S-функции, которая использует специфичные для блока параметры.

Преобразуйте Level-1 MATLAB S-Functions в Level-2

Можно преобразовать Level-1 S-функции MATLAB в Level-2 S-функции MATLAB, сопоставив код, сопоставленный с каждым Level-1 флагом S-функции, с соответствующим Level-2 методом коллбэка S-функции. Смотрите таблицу Аргументы Флага для отображения Level-1 флагов, чтобы Level-2 методы коллбэка. В сложение:

  • Сохраните информацию о дискретном состоянии для Level-2 S-функций MATLAB в векторах DWork, инициализированных в PostPropagationSetup способ.

  • Доступ Level-2 параметрам диалогового окна S-функции MATLAB с помощью DialogPrm свойство объекта во время выполнения вместо передачи их в S-функцию в качестве аргументов функции.

  • Для S-функций с переменными шагами расчета, обновите NextTimeHit свойство объекта во время выполнения в Outputs метод, чтобы задать следующий шаг расчета для Level-2 S-функции MATLAB.

Для примера в следующей таблице показов, как преобразовать Level-1 S-функцию MATLAB sfundsc2.m к Level-2 S-функции MATLAB. В примере используется Level-2 шаблон S-функции MATLAB msfuntmpl_basic.m как начальная точка при преобразовании Level-1 S-функции MATLAB. Номера линий в таблице соответствуют строкам кода в sfundsc2.m.

 sfundsc2_level2.m

Номер линииКод в sfundsc2.mКод в Level-2 файле MATLAB (sfundsc2_level2.m)
1
function [sys,x0,str,ts]= ...
  sfundsc2(t,x,u,flag)
function sfundsc2(block)
  setup(block);
Синтаксис function Линия изменения, чтобы принять один входной параметр block, который является объектом выполнения Блок Level-2 MATLAB S-function. Основное тело Level-2 S-функции MATLAB содержит одну линию, которая вызывает локальную setup функция.
13 - 19
switch flag,

case 0,
[sys,x0,str,ts] = ...
   mdlInitializeSizes;
function setup(block)
The flag значение нуля соответствует вызову setup способ. A Level-2 MATLAB S-функция не использует switch оператор для вызова методов коллбэка. Вместо этого локальный setup функция регистрирует методы коллбэка, которые непосредственно вызываются во время симуляции.
24 - 31
case 2,
   sys = mdlUpdate(t,x,u);

case 3,
   sys = mdlOutputs(t,x,u);
The setup функция регистрирует две локальные функции, связанные с flag значения 2 и 3.
block.RegBlockMethod('Outputs' ,@Output);
block.RegBlockMethod('Update'  ,@Update);
53 - 66
sizes = simsizes;

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 1;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;

sys = simsizes(sizes);

x0  = 0;
str = [];
ts  = [.1 0];
The setup функция также инициализирует атрибуты Level-2 S-функции MATLAB:
block.NumInputPorts  = 1;
block.NumOutputPorts = 1;
block.InputPort(1).Dimensions        = 1;
block.InputPort(1).DirectFeedthrough = false;
block.OutputPort(1).Dimensions       = 1;
block.NumDialogPrms     = 0;
block.SampleTimes = [0.1 0];
Поскольку эта S-функция имеет дискретные состояния, setup метод регистрирует PostPropagationSetup метод коллбэка для инициализации вектора DWork и InitializeConditions метод коллбэка, чтобы задать начальное значение состояния.
block.RegBlockMethod('PostPropagationSetup',...
 @DoPostPropSetup);
block.RegBlockMethod('InitializeConditions', ...
 @InitConditions);
56
sizes.NumDiscStates  = 1;
The PostPropagationSetup метод инициализирует вектор DWork, который сохраняет одно дискретное состояние.
function DoPostPropSetup(block)

  %% Setup Dwork
  block.NumDworks = 1;
  block.Dwork(1).Name = 'x0'; 
  block.Dwork(1).Dimensions      = 1;
  block.Dwork(1).DatatypeID      = 0;
  block.Dwork(1).Complexity      = 'Real';
  block.Dwork(1).UsedAsDiscState = true;
64
x0  = 0;
The InitializeConditions метод инициализирует значение дискретного состояния.
function InitConditions(block)

%% Initialize Dwork 
block.Dwork(1).Data = 0
77 - 78
function sys = ...
   mdlUpdate(t,x,u)

sys = u;    
The Update метод вычисляет следующее значение дискретного состояния.
function Update(block)
block.Dwork(1).Data = block.InputPort(1).Data;
88 - 89
function sys = ...
   mdlOutputs(t,x,u)
sys = x;
The Outputs метод вычисляет выход S-функции.
function Outputs(block)
block.OutputPort(1).Data = block.Dwork(1).Data;