Примечание
Информация, представленная в этом разделе, предназначена только для использования в обслуживании существующих 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
, находится в папке
. Шаблон состоит из функции верхнего уровня и набора локальных функций скелета, называемых методами коллбэка S-функции, каждый из которых соответствует конкретному значению matlabroot
/ toolbox/simulink/блокиflag
. Функция верхнего уровня вызывает локальную функцию, обозначенную flag
. Локальные функции выполняют фактические задачи, необходимые для S-функции во время симуляции.
Механизм Simulink передает следующие аргументы Level-1 S-функции MATLAB:
t | Текущее время |
x | Вектор состояния |
u | Входной вектор |
flag | Целое число значения, которое указывает задачу, которая должна быть выполнена S-функцией |
Следующая таблица описывает значения, которые flag
может предположить и перечислить соответствующий метод Level-2 S-функции MATLAB для каждого значения.
Аргумент флага
Level-1 флаг | Level-2 коллбэка | Описание |
---|---|---|
0 | setup | Задает основные характеристики блоков s-function, включая шаги расчета, начальные условия непрерывных и дискретных состояний и sizes массив (для описания sizes смотрите Define S-Function Block Characteristics массив). |
1 | mdlDerivatives | Вычисляет производные переменных непрерывного состояния. |
2 | mdlUpdate | Обновляет дискретные состояния, шаги расчета и основные требования к временным шагам. |
3 | mdlOutputs | Вычисляет выходы S-функции. |
4 | mdlOutputs метод обновляет объект во время выполнения NextTimeHit свойство | Вычисляет время следующего попадания в абсолютное время. Эта стандартная программа используется только, когда вы задаете переменную дискретного времени шага расчета в setup способ. |
9 | mdlTerminate | Выполняет любые необходимые задачи в конце симуляции. |
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-функцию, которая выполняет некоторые задачи постоянно (т.е. в каждый временной шаг) и другие с дискретными интервалами.
Чтобы механизм 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.
При вызове 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
пример в папке
для примера S-функции, которая использует специфичные для блока параметры.matlabroot
/ toolbox/simulink/simdemos/simfeatures
Можно преобразовать 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.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) 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]; 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; |