S-Function Builder является Simulink® блокируйтесь, который интегрирует код C/C++, чтобы создать S-функцию из технических требований и кода С, который вы предоставляете. S-Function Builder также служит оберткой для сгенерированной S-функции в моделях, которые используют S-функцию.
Чтобы использовать S-Function Builder, кликните по холсту Simulink и введите Разработчика S-функции или перетащите блок S-Function Builder из Simulink Library> User-Defined. Чтобы открыть редактор S-Function Builder, дважды кликните значок блока S-Function Builder или выберите блок. Затем выберите Open Block из меню Edit на редакторе моделей или контекстном меню блока.
Редактор S-Function Builder состоит из четырех компонентов пользовательского интерфейса:
Разработчик S-функции панель инструментов
Панель настроек
Порты и таблица параметров
Таблица Libraries
Задайте имя для своей S-функции, чтобы начать создавать ваш блок S-Function Builder. Обратите внимание на то, что, когда вы называете S-функцию, все функции в Разработчике S-функции, изменения редактора и S-имя-функции становятся префиксом ко всем функциям обертки.
Используйте Разработчика S-функции панель инструментов, чтобы задать выходной язык для S-функции, которую требуется сгенерировать:
C Сгенерируйте S-функции C.
C++ — Сгенерируйте S-функции C++.
Inherit from model — Наследуйте настройки языка от установки Language модели. Смотрите Язык (Simulink Coder) для получения дополнительной информации.
Настройте основные характеристики ваша S-функция, такие как начальные условия и количество состояний, при помощи панели Settings справа от редактора S-Function Builder. Разработчик S-функции использует информацию, которую вы вводите в эту панель, чтобы сгенерировать mdlInitializeSizes
метод коллбэка. Механизм Simulink вызывает этот метод во время фазы инициализации модели симуляции, чтобы получить основную информацию о S-функции.
Используя таблицу Settings, можно задать количество дискретных и непрерывных состояний и их начальных условий.
Можно ввести значения начальных условий как список запятых-seperated, (например, 1,1,1
) или как вектор (например, [1 1 1]
). Количество начальных условий должно быть равно количеству обозначенных состояний.
Установите размещение массивов своего кода C/C++. Можно выбрать одну из перечисленных в таблице опций.
Опция | Размещение массивов Функции C/C++ | Действие |
---|---|---|
Column-major | Упорядоченный по столбцам | Блок S-Function Builder добавляет функцию SimStruct |
Row-major | Упорядоченный по строкам | Блок S-Function Builder добавляет функцию SimStruct В процессе моделирования, если ваш код C/C++ включает матрицы или многомерные входные параметры, выходные параметры или параметры, транспонирует, добавляются к этим методам коллбэка S-функции:
Simulink также применяется, они транспонирует когда рабочая симуляция в Акселераторе и Быстрых Режимах Accelerator. S-функция не встраивается при помощи TLC. Вместо этого S-функция MEX с транспонирует, скомпилирован непосредственно. |
Any | Функция C/C++ не затронута размещением массивов | Блок S-Function Builder добавляет функцию SimStruct |
Выберите демонстрационный режим своей S-функции. Демонстрационный режим определяет длину интервала между временами, когда S-функция обновляет свой выход. Можно выбрать одну из следующих опций:
Inherited
— S-функция наследовала свой шаг расчета от блока, соединенного с ее входным портом. Когда наследованный шаг расчета выбран, обратите внимание, что поле Sample time value таблицы Settings неактивно.
Continuous
— Блок обновляет свои выходные параметры в каждом шаге симуляции. Когда время непрерывной выборки выбрано, обратите внимание, что поле Sample time value таблицы Settings неактивно.
Discrete
— S-функция обновляет свои выходные параметры на уровне, заданном в поле Sample time value таблицы Settings.
PWorks
Установите PWorks
, количество указателей данных используется S-функцией. PWorks
точки к памяти за жизненный цикл блока. Если вы вводите значение, чем 0
для Number of PWorks это добавляет указатель, void **PW
, ко всем функциям в Разработчике S-функции. Например, можно объявить и инициализировать указатель на файл или память в Start_wrapper
, получите доступ к нему в Outputs_wrapper
, Update_wrapper
, и Derivatives_wrapper
функции, и освобождают его в Terminate_wrapper
функция. Код, написанный в этих функциях, вызван mdlStart
, mdlOutputs
, mdlUpdate
, mdlDerivatives
, и mdlTerminate
методы. Смотрите Скользящее среднее значение в качестве примера с Запуском и Оконечный и Сочетание с помощью Классов Cpp в Демонстрациях S-функции.
Примечание
Использование PWorks
влияет на податливость SimState. Если вы объявляете PWorks
, использование SimState сохраняет, и восстановление не позволено. В противном случае, установка податливости SimState по умолчанию, USE_DEFAULT_SIM_STATE
, используется.
Сделайте SimStruct
S
) доступный для функций обертки, которые использует Разработчик S-функции. Этот выбор позволяет вам использовать SimStruct
макросы и функции с вашим кодом в Outputs_wrapper
, Derivatives_wrapper
, и Update_wrapper
функции. Когда вы включаете эту установку, SimStruct *S
добавляется к списку параметров.
Например, с этой включенной опцией, можно использовать макросы такой как ssGetT
в коде, который вычисляет S-функцию выходные параметры:
double t = ssGetT(S); if(t < 2) { y0[0] = u0[0]; } else { y0[0]= 0.0; } |
Установите флажок Direct Feedthrough на таблице Settings, если значения от шага текущего времени S-входных-параметров-функции используются для расчета его выходные параметры. Механизм Simulink использует эту информацию, чтобы обнаружить алгебраические циклы, созданные, прямо или косвенно соединяя S-функцию выход с S-входным-параметром-функции.
Используйте таблицу Ports and Parameters на нижней части редактора, чтобы задать порты ввода и вывода и параметры для S-функции. Добавить порт или параметр:
Выберите таблицу Ports and Parameters, и от Разработчика S-функции панель инструментов, выберите свой выбор под Insert Port
.
Выберите таблицу Ports and Parameters и щелкните правой кнопкой по одному из заголовков на таблице.
Чтобы удалить порт или параметр в таблице, выберите порт или параметр, который требуется удалить, щелкнуть правой кнопкой, чтобы открыть меню и нажать Delete.
Порядок портов и параметров в таблице является порядком портов и параметров на блоке. Например, первый входной порт на таблице является входным портом с индексом 0
, и первый параметр является параметром с индексом 0
.
В Ports and Parameters таблица можно задать следующее:
Имя — Имя порта или параметра. Чтобы изменить название порта или параметра, дважды кликните на имени.
Осциллограф Осциллограф порта или параметра. Переменная могла быть портом ввода или вывода или параметром. Нажмите на значение осциллографа, чтобы изменить осциллограф порта или параметра.
Тип данных — Тип данных порта или параметра. Можно задать весь Simulink встроенные типы данных, а также fixdt типы данных и шины как порты.
Размерности — Размерность порта или параметра. Для портов задайте размерность к-1, чтобы наследовать размерности от другого блока. Для параметров размерность установлена в -1
и наследован от параметров блоков в интерфейсе блока.
Чтобы задать 1D размерность, только введите номер строк для размерности, например, [2]
. Чтобы ввести 2D размерность, введите размерность как количество строки и столбцов, например, [2,1]
.
Сложность — можно задать сложность порта или параметра как действительную или комплексную.
Таблица Libraries позволяет вам задавать местоположение внешних файлов кода, на которые ссылается пользовательский код, что вы вводите в другой методы обертки редактора S-Function Builder.
Чтобы ввести новый путь или запись, выберите таблицу Libraries и выберите одну из опций под Insert Paths
на Разработчике S-функции панель инструментов. В качестве альтернативы нажмите на один из тегов или значений на таблице Libraries. Если вы выбираете путь или запись, можно изменить выбор путем нажатия на тег на таблице. Можно ввести пути или записи во внешние библиотеки, объектные коды и исходные файлы, на которые ссылается пользовательский код на редакторе S-Function Builder.
Пометьте, чтобы выбрать | Цель |
---|---|
LIB_PATH | Задайте контуры объектов и пути к библиотеке. |
INC_PATH | Задайте включать пути поиска файлов для заголовочных файлов и исходных файлов. |
SRC_PATH | Задайте пути поиска файлов для объектных файлов и исходных файлов. |
ENV_PATH | Задайте переменные окружения. |
ENTRY | Задайте объект, источник и имена файлов библиотеки. Можно также ввести директивы препроцессору в это поле, например, |
Заключите имена заголовочных файлов на верхней части редактора кода. Если вы используете пользовательские заголовочные файлы, которые не находятся на том же пути, убедитесь, что включали директорию с INC_PATH
тег. Точно так же используйте верхнюю часть редактора, чтобы объявить внешних функций, которые не объявляются в заголовочных файлах. Включайте каждое объявление по отдельной линии.
Можно ввести пути или записи для к внешним библиотекам, объектным кодам и исходным файлам, на которые ссылается пользовательский код на редакторе S-Function Builder.
Например, считайте Разработчика S-функции проектом в C:\Program Files\MATLAB\work
. Таблица показывает о том, как соединиться с внешними файлами:
Расположение файлов | Записи в таблицу библиотек |
---|---|
|
|
C:\Program Files\MATLAB\work\customobjs\userfunctions.obj |
|
|
|
Можно использовать LIB_PATH
задавать и объект и пути к файлам библиотеки. Можно включать имя библиотеки в LIB_PATH
объявление, однако, необходимо поместить имя объектного файла в отдельную линию. Тег $MATLABROOT
указывает на путь относительно MATLAB® установка. Перечислите несколько LIB_PATH
записи на отдельных линиях. Пути ищутся в порядке, который вы задаете.
Каждая директива должна быть перечислена на отдельной линии.
Примечание
Не помещайте кавычки вокруг пути к библиотеке, даже если путь имеет пробелы в нем. Если вы добавите кавычки, компилятор не найдет библиотеку.
Разработчик S-функции использует методы обертки, чтобы задать код S-функции и свойства, которые генерируют соответствующую S-функцию. Используйте соответствующие методы обертки, чтобы создать S-тело-функции. Нажмите Apply на панели инструментов, чтобы сгенерировать код S-функции.
Эта таблица предоставляет сводные данные Разработчика S-функции методы:
Метод S-функции | Метод обертки | Цель |
---|---|---|
Запустите и завершите работу |
| Выделите и освободите память в запуске и конце симуляции. На выделенную память ссылаются с помощью PWorks для использования в S-функции. |
Выходные параметры |
| Введите код, который вычисляет выходные параметры S-функции на каждом шаге времени симуляции. |
Обновление |
| Введите код, который вычисляет значение дискретных состояний на следующем временном шаге с помощью значений на шаге текущего времени. Этот метод только существует, когда вы задаете Number of Discrete States на таблице Settings. |
Производные |
| Введите код, чтобы вычислить производные состояния. Этот метод только существует, когда вы задаете Number of Continuous States на таблице Settings. |
Теперь можно исследовать эти методы более подробно.
В Разработчике S-функции используйте Outputs_wrapper
метод, чтобы ввести код, который вычисляет выходные параметры S-функции на каждом шаге времени симуляции. Обратите внимание на то, что при генерации кода S-функции, S-Function Builder генерирует метод обертки с помощью имени модели и функции обертки в форме <system_name>_<function_name>_wrapper
. Например, если именем вашей модели является dsfunc_builder
, выходной метод появляется как dsfunc_builder_Output_wrapper
в редакторе S-Function Builder. Если у вас еще нет имени для вашего блока S-Function Builder, это появляется как system_Output_wrapper
.
См. следующий код для примера Outputs
метод:
void sfun_Outputs_wrapper(const real_T *u, real_T *y, const real_T *xD, /* optional */ const real_T *xC, /* optional */ const real_T *param0, /* optional */ int_T p_width0 /* optional */ real_T *param1 /* optional */ int_t p_width1 /* optional */ int_T y_width, /* optional */ int_T u_width) /* optional */ { /* Your code inserted here */ } |
где sfun
имя S-функции. Разработчик S-функции вставляет вызов этой функции обертки в mdlOutputs
метод коллбэка, который это генерирует для вашей S-функции. Механизм Simulink вызывает mdlOutputs
метод в каждом времени симуляции или шаге расчета продвигается, чтобы вычислить S-функцию выход. mdlOutputs
метод в свою очередь вызывает функцию обертки, содержащую ваш выходной код. Ваш выходной код затем вычисляет и возвращает S-функцию выход.
mdlOutputs
метод передает некоторых или все следующие аргументы к выходной функции обертки.
Аргумент | Описание |
---|---|
u0, u1, ... uN | Указатели на массивы, содержащие входные параметры к S-функции, где N количество входных портов, заданных на осциллографе Input, найденном на таблице Ports and Parameters. Имена аргументов, которые появляются в выходной функции обертки, совпадают с именами, найденными на осциллографе Input таблицы Ports and Parameters. Ширина каждого массива совпадает с входом width, заданным для каждого входа на панели Dimensions. Если вход является матрицей, ширина равняется продукту размерностей массивов. Если вы задаете-1 как вход width, ширина массива задана функцией обертки u_width аргумент. |
y0, y1, ... yN | Указатель на массивы, содержащие выходные параметры S-функции, где N количество выходных портов, заданных на панели Scope на таблице Ports and Parameters. Имена аргументов, которые появляются в выходной функции обертки, совпадают с именами, найденными на осциллографе Output таблицы Ports and Parameters. Ширина каждого массива совпадает с выходом width, заданным для каждого выхода на панели Dimensions. Если выход является матрицей, ширина равняется продукту размерностей массивов. Если вы задали-1 как выход width, ширина массива задана функцией обертки y_width аргумент. Используйте этот массив, чтобы передать выходные параметры, которые ваш код вычисляет назад к механизму Simulink. |
xD | Указатель на массив, содержащий дискретные состояния S-функции. Этот аргумент появляется, только если вы задаете дискретные состояния на Number of discrete states в меню Settings. На первом шаге времени симуляции дискретные состояния имеют начальные значения, которые вы задаете на Discrete states IC. На последующих шагах шага расчета состояния получены из значений, которые S-функция вычисляет на предыдущем временном шаге. |
xC | Указатель на массив, содержащий непрерывные состояния S-функции. Этот аргумент появляется, только если вы задаете количество непрерывных состояний на строке Number of continuous states меню Settings. На первом шаге времени симуляции непрерывные состояния имеют начальные значения, которые вы задаете на строке Continuous states IC. На последующих временных шагах состояния получены путем числовой интеграции производных состояний на предыдущем временном шаге. |
param0 , p_width0 , param1 , p_width1 ... paramN , p_widthN | param0 , param1 ... paramN указатели на массивы, содержащие S-параметры-функции, где N количество параметров, задают на таблице Ports and Parameters. p_width0 , p_width1 ... p_widthN ширины массивов параметров. Если параметр является матрицей, ширина равняется продукту размерностей массивов. Например, ширина параметра 3-на-2 матрицы равняется 6. |
y_width | Ширина массива, содержащего S-функцию выходные параметры. Этот аргумент появляется в сгенерированном коде, только если вы задаете -1 когда ширина S-функции выводится. Если выход является матрицей, y_width продукт размерностей матрицы. |
u_width | Ширина массива, содержащего S-входные-параметры-функции. Этот аргумент появляется в сгенерированном коде, только если вы задаете -1 как ширина S-входного-параметра-функции. Если вход является матрицей, u_width продукт размерностей матрицы. |
Эти аргументы разрешают вам вычислять выход блока в зависимости от его входных параметров и, опционально, его состояний и параметров. Код, который вы вводите в этом поле, может вызвать внешние функции, объявленные в заголовочных файлах или внешних объявлениях на таблице Libraries, которая позволяет вам использовать существующий код, чтобы вычислить выходные параметры S-функции.
Используйте Update_wrapper
функция, чтобы ввести код, который вычисляет значения дискретных состояний на следующем временном шаге согласно значениям на шаге текущего времени. См. следующий код:
void sfun_Update_wrapper(const real_T *u, const real_T *y, real_T *xD, const real_T *param0, /* optional */ int_T p_width0, /* optional */ real_T *param1,/* optional */ int_T p_width1, /* optional */ int_T y_width, /* optional */ int_T u_width) /* optional */ { /* Your code inserted here. */ }
где sfun
имя S-функции. Разработчик S-функции вставляет вызов этой функции обертки в mdlUpdate
метод коллбэка, который это генерирует для S-функции. Механизм Simulink вызывает mdlUpdate
метод в конце каждого временного шага, чтобы получить значения дискретных состояний на следующем временном шаге (см. Взаимодействие Engine Simulink с S-функциями C). На следующем временном шаге механизм передает обновленные состояния обратно mdlOutputs
метод.
mdlUpdate
метод коллбэка, сгенерированный для S-функции, передает следующие аргументы Update_wrapper
функция:
u
y
xD
param0
, p_width0
, param1
, p_width1
... paramN
, p_widthN
y_width
u_width
Смотрите Вычисляют Выходные параметры Используя Выходной Метод для значений и использования этих аргументов. Ваш код должен использовать переменную дискретных состояний, xD
, возвращать значения дискретных состояний, которые это вычисляет. Аргументы позволяют вашему коду вычислять дискретные состояния как функции S-входных-параметров-функции, выходных параметров, и, опционально, параметров. Ваш код может вызвать внешние функции, объявленные в редакторе кода.
Если S-функция имеет непрерывные состояния, используйте Derivatives_wrapper
функция, чтобы ввести код, требуемый вычислить производные состояния. Введите код для mdlDerivatives
функция, чтобы вычислить производные непрерывного редактора состояний под этим полем. Объявление в качестве примера функции может быть похожим на следующее:
void system_Derivatives_wrapper(const real_T *u, const real_T *y, real_T *dx, real_T *xC, const real_T *param0, /* optional */ int_T p_width0, /* optional */ real_T *param1,/* optional */ int_T p_width1, /* optional */ int_T y_width, /* optional */ int_T u_width) /* optional */ { /* Your code inserted here. */ } |
где system
имя S-функции.
Разработчик S-функции вставляет вызов этой функции обертки в mdlDerivatives
метод, который это генерирует для S-функции. Механизм Simulink вызывает mdlDerivatives
метод в конце каждого временного шага, чтобы получить производные непрерывных состояний (см. Взаимодействие Engine Simulink с S-функциями C). Решатель Simulink численно интегрирует производные, чтобы определить непрерывные состояния на следующем временном шаге. На следующем временном шаге механизм передает обновленные состояния обратно mdlOutputs
метод. Для получения дополнительной информации о том, как механизм Simulink взаимодействует с S-функциями, смотрите Взаимодействие Engine Simulink с S-функциями C.
mdlDerivatives
метод, сгенерированный для S-функции, передает следующие аргументы функции обертки производных:
u
y
dx
xC
param0
, p_width0
, param1
, p_width1
... paramN
, p_widthN
y_width
u_width
dx
аргумент является указателем на массив, ширина которого совпадает с количеством непрерывных производных, заданных на панели Settings. Ваш код должен использовать этот массив, чтобы возвратить значения производных, которые это вычисляет. Смотрите, что объяснение под Вычисляет Выходные параметры Используя Выходной метод Метода для значений и использования других аргументов. Аргументы позволяют вашему коду вычислять производные в зависимости от S-входных-параметров-функции, выходных параметров, и, опционально, параметров. Ваш код может вызвать внешние функции, объявленные в редакторе кода.
Используйте Start_wrapper
метод, чтобы записать код, чтобы выделить память в начале симуляции. На выделенное ссылается Pworks
для использования в S-функции. Точно так же используйте Terminate_wrapper
метод, чтобы записать код в свободный память, выделенная в Start_wrapper
метод. На память ссылается PWorks
может также быть замечен Terminate и должен быть освобожден здесь.
Смотрите Набор Количество PWorks, чтобы узнать больше о PWorks
.
После ввода кода в Разработчике S-функции редактор исследуйте опции в соответствии с меню Build, чтобы создать вашу S-функцию.
Меню сборки содержит следующие выборы:
Show compile steps — Регистрируйте каждый шаг сборки в поле Build Log.
Create a debuggable MEX-file — Включайте отладочную информацию в сгенерированный файл MEX.
Generate wrapper TLC — Выбирание этой опции позволяет вам генерировать файл TLC. Необходимо сгенерировать файл TLC, если вы запускаете свою модель в Быстром Режиме Accelerator или генерируете код Simulink Coder™ из вашей модели. Кроме того, в то время как это не необходимо для симуляций Режима Accelerator, файл TLC генерирует код для S-функции и таким образом заставляет вашу модель запуститься быстрее в Режиме Accelerator.
Enable support for coverage — Сделайте совместимое S-Function с покрытием модели. Для получения дополнительной информации смотрите Покрытие для Пользовательского Кода C/C++ в Моделях Simulink (Simulink Coverage) в документации Simulink Coverage™.
Enable support for design verifier — Сгенерируйте S-функцию для использования с Simulink Design Verifier™. Для получения дополнительной информации смотрите Ограничения Поддержки для S-функций и Кода C/C++ (Simulink Design Verifier).
Когда вы сделаете свой выбор, нажмите Build, чтобы создать вашу S-функцию и создать файл MEX. Чтобы исключить создание файла MEX из сгенерированного исходного кода, выберите Generate Code Only.
S-Function | S-Function Builder