Примечание
Информация, представленная в этом разделе, предназначена только для использования при обслуживании существующих Level-1 MATLAB ® S-функций. Используйте более способный API Уровня 2, чтобы развивать новые S-функции MATLAB (см., Пишут Уровню 2 MATLAB S-Functions). Level-1 S-функции MATLAB поддерживают гораздо меньшее подмножество API S-функций, затем Level-2 S-функции MATLAB, и их функции ограничены по сравнению со встроенными блоками .
Уровень 1 MATLAB S-function - функция MATLAB следующей формы
[sys,x0,str,ts]=f(t,x,u,flag,p1,p2,...)
где f - имя S-функции. Во время моделирования модели модуль Simulink ® многократно вызываетf, с использованием flag для указания задачи (или задач), выполняемой для конкретного вызова. S-функция выполняет задачу и возвращает результаты в выходном векторе.
Шаблонная реализация S-функции Level-1 MATLAB, sfuntmpl.m, находится в папке . Шаблон состоит из функции верхнего уровня и набора скелетных локальных функций, называемых S-функциональными методами обратного вызова, каждый из которых соответствует определенному значению matlabroot/toolbox/simulink/blocksflag. Функция верхнего уровня вызывает локальную функцию, указанную flag. Локальные функции выполняют фактические задачи, требуемые для S-функции во время моделирования.
Движок Simulink передает следующие аргументы Level-1 MATLAB S-функции:
t | Текущее время |
x | Вектор состояния |
u | Входной вектор |
flag | Целое значение, указывающее задачу, выполняемую S-функцией |
В следующей таблице описаны значения, которые flag может предполагать и перечислять соответствующий Level-2 метод S-функции MATLAB для каждого значения.
Аргумент флага
| Флаг Level-1 | Level-2 Метод обратного вызова | Описание |
|---|---|---|
| 0 | setup | Определяет основные характеристики S-функциональных блоков, включая время выборки, начальные условия непрерывного и дискретного состояний и sizes массив (описание см. в разделе Определение характеристик S-функционального блока) sizes массив). |
| 1 | mdlDerivatives | Вычисляет производные переменных непрерывного состояния. |
| 2 | mdlUpdate | Обновление дискретных состояний, времени выборки и требований к основным временным шагам. |
| 3 | mdlOutputs | Вычисляет выходные данные S-функции. |
| 4 | mdlOutputs метод обновляет объект времени выполнения NextTimeHit собственность | Вычисляет время следующего попадания в абсолютное время. Эта подпрограмма используется только при указании переменного времени выборки дискретного времени в setup способ. |
| 9 | mdlTerminate | Выполняет все необходимые задачи по завершению моделирования. |
Уровень 1 MATLAB S-function возвращает вектор продукции, содержащий следующие элементы:
sys, универсальный возвращаемый аргумент. Возвращаемые значения зависят от flag значение. Например, для flag = 3, sys содержит выходные данные S-функции.
x0, начальные значения состояния (пустой вектор, если в системе нет состояний). x0 игнорируется, за исключением случаев, когда flag = 0.
str, первоначально предназначенная для будущего использования. Level-1 S-функции MATLAB должны установить его в пустую матрицу, [].
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.
При вызове S-функции Level-1 MATLAB механизм Simulink всегда передает стандартные параметры блока. t, x, u, и flag, к S-функции в качестве аргументов функции. Механизм может передавать дополнительные специфичные для блока параметры, определенные пользователем, в S-функцию. Пользователь указывает параметры в поле S-function parameters диалогового окна S-Function Block Parameters (параметры S-Function Block) (см. раздел Передача параметров S-Functions). Если в диалоговом окне блока указаны дополнительные параметры, механизм передает параметры S-функции в качестве дополнительных аргументов функции. Дополнительные аргументы следуют за стандартными аргументами в списке аргументов S-функции в том порядке, в котором соответствующие параметры появляются в диалоговом окне блока. Эта возможность параметра S-функции для конкретного блока позволяет одной и той же S-функции реализовать различные опции обработки. См. раздел limintm.m пример в папке для примера S-функции, которая использует параметры, специфичные для блока.matlabroot/toolbox/simulink/simdemos/simfeatures
Вы можете преобразовать Уровень 1 MATLAB S-functions в Уровень 2 MATLAB S-functions, нанеся на карту кодекс, связанный с каждым флагом S-функции Уровня 1 к соответствующему методу отзыва S-функции Уровня 2. Сопоставление флагов Level-1 с Level-2 методами обратного вызова см. в таблице «Аргументы флага». Кроме того:
Хранить дискретную информацию о состоянии для Level-2 S-функций MATLAB в векторах DWork, инициализированных в PostPropagationSetup способ.
Доступ параметры диалога Уровня 2 MATLAB S-function, используя DialogPrm свойство объекта времени выполнения вместо передачи их в S-функцию в качестве аргументов функции.
Для S-функций с переменным временем выборки обновите NextTimeHit свойство объекта времени выполнения в Outputs метод, чтобы установить следующий типовой хит времени для Уровня 2 MATLAB S-function.
Например, в следующей таблице показано, как преобразовать Level-1 S-функцию MATLAB. sfundsc2.m к Level-2 S-функции MATLAB. Пример использует шаблон Уровня 2 MATLAB S-function msfuntmpl_basic.m в качестве начальной точки при преобразовании Level-1 S-функции MATLAB. Номера строк в таблице соответствуют строкам кода в sfundsc2.m.
| Номер строки | Код в файле sfundsc2.m | Кодекс в файле (sfundsc2_level2.m) Уровня 2 MATLAB |
|---|---|---|
| 1 | function [sys,x0,str,ts]= ... sfundsc2(t,x,u,flag) | function sfundsc2(block) setup(block); function изменение строки для принятия одного входного аргумента block, который является объектом времени выполнения блока S-Function Level-2 MATLAB. Основная часть Уровня 2 MATLAB S-function содержит одну линию, которая звонит местному жителю setup функция. |
| 13 - 19 | switch flag, case 0, [sys,x0,str,ts] = ... mdlInitializeSizes; | function setup(block) flag нулевое значение соответствует вызову setup способ. S-функция Level-2 MATLAB не использует switch для вызова методов обратного вызова. Вместо этого локальный setup регистрирует методы обратного вызова, которые вызываются непосредственно во время моделирования. |
| 24 - 31 | case 2, sys = mdlUpdate(t,x,u); case 3, sys = mdlOutputs(t,x,u); | 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]; | setup функция также инициализирует атрибуты Level-2 MATLAB S-функции: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; | 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; | InitializeConditions инициализирует значение дискретного состояния.function InitConditions(block) %% Initialize Dwork block.Dwork(1).Data = 0 |
| 77 - 78 | function sys = ... mdlUpdate(t,x,u) sys = u; | Update вычисляет следующее значение дискретного состояния.function Update(block) block.Dwork(1).Data = block.InputPort(1).Data; |
| 88 - 89 | function sys = ... mdlOutputs(t,x,u) sys = x; | Outputs вычисляет выходной сигнал S-функции.function Outputs(block) block.OutputPort(1).Data = block.Dwork(1).Data; |