Создайте S-функции автоматически Используя разработчика S-функции

S-Function Builder является Simulink® блокируйтесь, который интегрирует код C/C++, чтобы создать S-функцию из технических требований и кода С, который вы предоставляете. S-Function Builder также служит оберткой для сгенерированной S-функции в моделях, которые используют 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-функции.

S-function builder settings with the number of discrete states set to 2, discrete states set to 1 comma 1, number of continuous states set to 0. Array layout set to column-major. Sample mode set to discrete. Sample time value is grayed out. Number of P works set to 0. Enable access to SimStruct is unchecked. Direct feedthrough is checked.

Определите номер состояний и начальных условий

Используя таблицу Settings, можно задать количество дискретных и непрерывных состояний и их начальных условий.

Можно ввести значения начальных условий как список запятых-seperated, (например, 1,1,1) или как вектор (например, [1 1 1]). Количество начальных условий должно быть равно количеству обозначенных состояний.

Установите размещение массивов

Установите размещение массивов своего кода C/C++. Можно выбрать одну из перечисленных в таблице опций.

ОпцияРазмещение массивов Функции C/C++Действие
Column-majorУпорядоченный по столбцам

Блок S-Function Builder добавляет функцию SimStruct ssSetArrayLayoutForCodeGen в mdlInitializeSizes отметить S-функцию для упорядоченной по столбцам генерации кода.

Row-majorУпорядоченный по строкам

Блок S-Function Builder добавляет функцию SimStruct ssSetArrayLayoutForCodeGen в mdlInitializeSizes отметить S-функцию для упорядоченной по строкам генерации кода.

В процессе моделирования, если ваш код C/C++ включает матрицы или многомерные входные параметры, выходные параметры или параметры, транспонирует, добавляются к этим методам коллбэка S-функции:

  • mdlOutputs

  • mdlUpdate

  • mdlDerivatives

Simulink также применяется, они транспонирует когда рабочая симуляция в Акселераторе и Быстрых Режимах Accelerator. S-функция не встраивается при помощи TLC. Вместо этого S-функция MEX с транспонирует, скомпилирован непосредственно.

AnyФункция C/C++ не затронута размещением массивов

Блок S-Function Builder добавляет функцию SimStruct ssSetArrayLayoutForCodeGen в mdlInitializeSizes отметить S-функцию как принимающий и упорядоченную по строкам и упорядоченную по столбцам генерацию кода.

Выберите Sample Mode

Выберите демонстрационный режим своей 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

Сделайте 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-входным-параметром-функции.

Задайте порты и параметры для S-функции

Используйте таблицу Ports and Parameters на нижней части редактора, чтобы задать порты ввода и вывода и параметры для S-функции. Добавить порт или параметр:

  • Выберите таблицу Ports and Parameters, и от Разработчика S-функции панель инструментов, выберите свой выбор под Insert Port.

  • Выберите таблицу Ports and Parameters и щелкните правой кнопкой по одному из заголовков на таблице.

Чтобы удалить порт или параметр в таблице, выберите порт или параметр, который требуется удалить, щелкнуть правой кнопкой, чтобы открыть меню и нажать Delete.

Порядок портов и параметров в таблице является порядком портов и параметров на блоке. Например, первый входной порт на таблице является входным портом с индексом 0, и первый параметр является параметром с индексом 0.

В Ports and Parameters таблица можно задать следующее:

  1. Имя — Имя порта или параметра. Чтобы изменить название порта или параметра, дважды кликните на имени.

  2. Осциллограф Осциллограф порта или параметра. Переменная могла быть портом ввода или вывода или параметром. Нажмите на значение осциллографа, чтобы изменить осциллограф порта или параметра.

  3. Тип данных — Тип данных порта или параметра. Можно задать весь Simulink встроенные типы данных, а также fixdt типы данных и шины как порты.

  4. Размерности — Размерность порта или параметра. Для портов задайте размерность к-1, чтобы наследовать размерности от другого блока. Для параметров размерность установлена в -1 и наследован от параметров блоков в интерфейсе блока.

    Чтобы задать 1D размерность, только введите номер строк для размерности, например, [2]. Чтобы ввести 2D размерность, введите размерность как количество строки и столбцов, например, [2,1].

  5. Сложность — можно задать сложность порта или параметра как действительную или комплексную.

Используйте таблицу библиотек, чтобы задать внешний код и пути

Таблица Libraries позволяет вам задавать местоположение внешних файлов кода, на которые ссылается пользовательский код, что вы вводите в другой методы обертки редактора S-Function Builder.

Чтобы ввести новый путь или запись, выберите таблицу Libraries и выберите одну из опций под Insert Paths на Разработчике S-функции панель инструментов. В качестве альтернативы нажмите на один из тегов или значений на таблице Libraries. Если вы выбираете путь или запись, можно изменить выбор путем нажатия на тег на таблице. Можно ввести пути или записи во внешние библиотеки, объектные коды и исходные файлы, на которые ссылается пользовательский код на редакторе S-Function Builder.

Пометьте, чтобы выбратьЦель
LIB_PATHЗадайте контуры объектов и пути к библиотеке.
INC_PATHЗадайте включать пути поиска файлов для заголовочных файлов и исходных файлов.
SRC_PATHЗадайте пути поиска файлов для объектных файлов и исходных файлов.
ENV_PATHЗадайте переменные окружения.
ENTRY

Задайте объект, источник и имена файлов библиотеки. Можно также ввести директивы препроцессору в это поле, например, -DDEBUG, -DHARDWARE_VARIANT=1 или -UDEBUG. Задайте каждый файл на отдельной линии.

Заключите имена заголовочных файлов на верхней части редактора кода. Если вы используете пользовательские заголовочные файлы, которые не находятся на том же пути, убедитесь, что включали директорию с INC_PATH тег. Точно так же используйте верхнюю часть редактора, чтобы объявить внешних функций, которые не объявляются в заголовочных файлах. Включайте каждое объявление по отдельной линии.

Можно ввести пути или записи для к внешним библиотекам, объектным кодам и исходным файлам, на которые ссылается пользовательский код на редакторе S-Function Builder.

Например, считайте Разработчика S-функции проектом в C:\Program Files\MATLAB\work. Таблица показывает о том, как соединиться с внешними файлами:

Расположение файловЗаписи в таблицу библиотек

c:\customfolder\customfunctions.lib

LIB_PATH c:\customfolder

ENTRY customfunctions.lib

C:\Program Files\MATLAB\work\customobjs\userfunctions.obj

LIB_PATH $MATLABROOT\customobjs

ENTRY userfunctions.obj

D:\externalsource\freesource.c

SRC_PATH D:\externalsource

ENTRY freesource.c

Можно использовать LIB_PATH задавать и объект и пути к файлам библиотеки. Можно включать имя библиотеки в LIB_PATH объявление, однако, необходимо поместить имя объектного файла в отдельную линию. Тег $MATLABROOT указывает на путь относительно MATLAB® установка. Перечислите несколько LIB_PATH записи на отдельных линиях. Пути ищутся в порядке, который вы задаете.

Каждая директива должна быть перечислена на отдельной линии.

Примечание

Не помещайте кавычки вокруг пути к библиотеке, даже если путь имеет пробелы в нем. Если вы добавите кавычки, компилятор не найдет библиотеку.

Разработайте S-функцию

Разработчик S-функции использует методы обертки, чтобы задать код S-функции и свойства, которые генерируют соответствующую S-функцию. Используйте соответствующие методы обертки, чтобы создать S-тело-функции. Нажмите Apply на панели инструментов, чтобы сгенерировать код S-функции.

Эта таблица предоставляет сводные данные Разработчика S-функции методы:

Метод S-функцииМетод оберткиЦель
Запустите и завершите работу

<system_name>_Start_wrapper

<system_name>_Terminate_wrapper

Выделите и освободите память в запуске и конце симуляции. На выделенную память ссылаются с помощью PWorks для использования в S-функции.
Выходные параметры

<system_name>_Outputs_wrapper

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

<system_name>_Update_wrapper

Введите код, который вычисляет значение дискретных состояний на следующем временном шаге с помощью значений на шаге текущего времени. Этот метод только существует, когда вы задаете Number of Discrete States на таблице Settings.
Производные

<system_name>_Derivatives_wrapper

Введите код, чтобы вычислить производные состояния. Этот метод только существует, когда вы задаете 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_widthNparam0, 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-функцию

После ввода кода в Разработчике S-функции редактор исследуйте опции в соответствии с меню Build, чтобы создать вашу S-функцию.

S-function Builder build pane. There are two buttons; Build and Generate Code Only. Then there are options. These options are: Show compile steps, Create a debuggable MEX-file, Generate wrapper TLC, Enable support for coverage, Enable support for design verifier.

Меню сборки содержит следующие выборы:

  • 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.

Смотрите также

|

Похожие темы