exponenta event banner

Автоматическое построение S-функций с помощью построителя S-функций

S-Function Builder - это блок Simulink ®, который интегрирует код C/C + + для создания S-функции из спецификаций и кода C. Построитель S-функций также служит оболочкой для сгенерированной S-функции в моделях, использующих S-функцию.

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

Для использования S-Function Builder щелкните холст Simulink и введите S-Function Builder или перетащите блок S-Function Builder из библиотеки Simulink Library > User-Defined. Чтобы открыть редактор S-Function Builder, дважды щелкните значок блока S-Function Builder или выберите блок. Затем выберите «Открыть блок» в меню «Правка» редактора модели или в контекстном меню блока.

Редактор S-Function Builder состоит из четырех компонентов пользовательского интерфейса:

  • Панель инструментов S-Function Builder

  • Область параметров

  • Таблица портов и параметров

  • Таблица библиотек

Укажите имя S-функции для начала построения блока S-Function Builder. Обратите внимание, что при присвоении имени S-функции все функции в редакторе S-Function Builder изменяются, и имя S-функции становится префиксом ко всем функциям-оболочкам.

Используйте панель инструментов S-Function Builder, чтобы указать целевой язык для S-функции, которую необходимо создать:

  • C - генерация C S-функций.

  • C++ - генерировать C++ S-функции.

  • Наследовать из модели (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) можно указать количество дискретных и непрерывных состояний и их исходные условия.

Можно ввести значения начальных условий в виде списка, разделенного запятыми (например, 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 также применяет эти преобразования при выполнении моделирования в режимах ускорителя и ускорителя. Функция S не встроена с помощью TLC. Вместо этого непосредственно компилируется S-функция MEX с транспозами.

AnyКомпоновка массива не влияет на функцию C/C + +

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

Выбор режима выборки

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

  • Inherited - S-функция наследует время выборки от блока, подключенного к входному порту. Если выбрано наследуемое время выборки, обратите внимание, что поле Значение времени выборки в таблице Настройки неактивно.

  • Continuous - Блок обновляет выходные данные на каждом этапе моделирования. Если выбрано непрерывное время выборки, обратите внимание, что поле Значение времени выборки в таблице Настройки неактивно.

  • Discrete - S-функция обновляет выходные данные с частотой, указанной в поле Sample time value таблицы Settings.

Установка количества PWorks

Набор PWorks, количество указателей данных, используемых S-функцией. PWorks указывает на память в течение жизненного цикла блока. При вводе любого другого значения, кроме 0 для Number of PWorks добавляется указатель, void **PW, для всех функций в S-Function Builder. Например, можно объявить и инициализировать указатель на файл или память в 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-Function Builder. Этот выбор позволяет использовать 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-Function Builder выберите нужный вариант в разделе Insert Port.

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

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

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

В таблице Ports and Parameters (Порты и параметры) можно определить следующие параметры:

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

  2. Scope - область порта или параметра. Переменная может быть входным или выходным портом или параметром. Щелкните по значению области для изменения области порта или параметра.

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

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

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

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

Таблица библиотек используется для указания внешнего кода и путей

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

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

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

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

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

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

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

В этой таблице представлена сводка методов S-Function Builder:

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

<system_name>_Start_wrapper

<system_name>_Terminate_wrapper

Выделение и освобождение памяти в начале и в конце моделирования. Ссылка на выделенную память используется PWorks для использования во всей S-функции.
Продукция

<system_name>_Outputs_wrapper

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

<system_name>_Update_wrapper

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

<system_name>_Derivatives_wrapper

Введите код для вычисления производных состояний. Этот метод существует только в том случае, если в таблице Настройки указано Число непрерывных состояний (Number of Continuous Stations).

Теперь эти методы можно исследовать более подробно.

Вычислить выходные данные с помощью метода выходных данных

В построителе 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 - количество входных портов, указанных в области ввода в таблице Ports and Parameters. Имена аргументов, которые отображаются в функции оболочки выходных данных, совпадают с именами, найденными в области ввода таблицы Порты и параметры (Ports and Parameters). Ширина каждого массива совпадает с шириной ввода, указанной для каждого ввода на панели «Размеры». Если вход является матрицей, ширина равна произведению размеров массивов. Если в качестве входной ширины указан -1, ширина массива определяется функцией-оболочкой u_width аргумент.
y0, y1, ... yNУказатель на массивы, содержащие выходы S-функции, где N - количество выходных портов, указанных на панели Область (Scope) в таблице Порты и параметры (Ports and Parameters). Имена аргументов, которые отображаются в функции оболочки выходных данных, совпадают с именами, найденными в области вывода таблицы Порты и параметры (Ports and Parameters). Ширина каждого массива совпадает с шириной вывода, указанной для каждого вывода на панели «Размеры». Если выводом является матрица, ширина равна произведению размеров массивов. Если в качестве выходной ширины указан -1, ширина массива определяется функцией-оболочкой y_width аргумент. Этот массив используется для передачи выходных данных, вычисляемых кодом, в модуль Simulink.
xDУказатель на массив, содержащий дискретные состояния S-функции. Этот аргумент появляется только при указании дискретных состояний в поле Число дискретных состояний в меню Настройки. На первом шаге времени моделирования дискретные состояния имеют начальные значения, заданные в IC дискретных состояний. На последующих этапах времени выборки состояния получают из значений, которые S-функция вычисляет на предыдущем этапе времени.
xCУказатель на массив, содержащий непрерывные состояния S-функции. Этот аргумент появляется только в том случае, если в строке Число непрерывных состояний меню Настройки указано количество непрерывных состояний. На первом этапе моделирования непрерывные состояния имеют начальные значения, указанные в строке 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 - произведение размеров матрицы.

Эти аргументы позволяют вычислять выходные данные блока как функцию его входных данных и, необязательно, его состояний и параметров. Код, введенный в это поле, может вызывать внешние функции, объявленные в файлах заголовков или внешних объявлениях в таблице Библиотеки, что позволяет использовать существующий код для вычисления выходных данных 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 способ в конце каждого временного шага для получения значений дискретных состояний на следующем временном шаге (см. Simulink Engine Interaction with C S-Functions). На следующем шаге времени движок передает обновленные состояния обратно в 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 способ в конце каждого временного шага для получения производных непрерывных состояний (см. Simulink Engine Interaction with C S-Functions). Решатель Simulink численно интегрирует производные для определения непрерывных состояний на следующем шаге времени. На следующем шаге времени движок передает обновленные состояния обратно в mdlOutputs способ. Дополнительные сведения о взаимодействии модуля Simulink с S-функциями см. в разделе Взаимодействие модуля Simulink с C-S-функциями.

mdlDerivatives метод, созданный для S-функции, передает следующие аргументы функции-оболочке производных:

  • u

  • y

  • dx

  • xC

  • param0, p_width0, param1, p_width1, ... paramN, p_widthN

  • y_width

  • u_width

dx аргумент - указатель на массив, ширина которого совпадает с числом непрерывных производных, указанных на панели «Параметры». Код должен использовать этот массив для возврата значений производных, которые он вычисляет. Значения и использование других аргументов см. в пояснении в разделе Метод расчета выходных данных с помощью метода вывода. Аргументы позволяют коду вычислять производные как функцию входов, выходов и, при необходимости, параметров S-функции. Код может вызывать внешние функции, объявленные в редакторе кода.

Выделение и освобождение памяти с помощью методов запуска и завершения

Используйте Start_wrapper способ записи кода для выделения памяти в начале моделирования. На назначенную ссылку ссылается Pworks для использования по всей S-функции. Аналогично, используйте Terminate_wrapper метод записи кода для освобождения памяти, выделенной в Start_wrapper способ. Память, на которую ссылается PWorks также можно увидеть с помощью команды Terminate, и его следует отменить здесь.

Дополнительные сведения см. в разделе Установка количества PWorks PWorks.

Построение S-функции

После ввода кода в редакторе S-Function Builder изучите опции в меню 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.

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

  • Показать шаги компиляции - записывать каждый шаг сборки в поле Журнал компоновки.

  • Создание отладочного файла MEX - включение отладочной информации в создаваемый файл MEX.

  • Создать оболочку TLC - при выборе этой опции можно создать файл TLC. Файл TLC необходимо создать, если модель выполняется в режиме ускорителя Rapid или из модели генерируется код Simulink Coder™. Кроме того, хотя для моделирования в режиме акселератора не требуется, файл TLC генерирует код для S-функции и, таким образом, ускоряет запуск модели в режиме акселератора.

  • Включить поддержку покрытия - сделать S-функцию совместимой с покрытием модели. Дополнительные сведения см. в разделе Покрытие для пользовательского кода C/C + + в моделях Simulink (покрытие Simulink) в документации Simulink Coverage™.

  • Включить поддержку средства проверки проекта - создание S-функции для использования с Verifier™ Simulink Design. Дополнительные сведения см. в разделе Ограничения поддержки S-функций и кода C/C + + (Simulink Design Verifier).

После выбора нажмите кнопку «Построить», чтобы построить S-функцию и MEX-файл. Чтобы исключить построение MEX-файла из созданного исходного кода, выберите «Создать только код».

См. также

|

Связанные темы