Функция Generate S-function автоматизирует процесс генерации S-функции от подсистемы. Кроме того, функция Generate S-function представляет отображение параметров, используемых в подсистеме, и позволяет вам объявить выбранные настраиваемые параметры.
Как пример, рассмотрите SourceSubsys
, та же подсистема, проиллюстрированная в примере, Создают Блоки s-function из Подсистемы. Цель состоит в том, чтобы автоматически извлечь SourceSubsys
из модели и создать Блок s-function из него, как в предыдущем примере. Кроме того, переменная K
рабочей области, которая является фактором усиления блока Gain в SourceSubsys
(как показано в следующем диалоговом окне параметров блоков Усиления), объявляется и генерируется как настраиваемая переменная.
Автоматически сгенерировать S-функцию от SourceSubsys
с настраиваемым параметром K
,
С открытой моделью SourceSubsys
кликните по подсистеме, чтобы выбрать его.
Из меню Code выберите C/C++ Code> Generate S-Function. Этот пункт меню включен, когда подсистема выбрана в текущей модели.
Также можно щелкнуть правой кнопкой по подсистеме и выбрать C/C++ Code> Generate S-Function из контекстного меню блока подсистемы.
Окно Generate S-Function отображено (см. следующую фигуру). Это окно показывает переменные (или объекты данных), на которые ссылаются как параметры блоков в подсистеме, и позволяет вам объявить их как настраиваемых.
Верхняя панель окна отображает три столбца:
Variable Name: имя параметра.
Класс: Если параметр является переменной рабочей области, ее тип данных показывают. Если параметр является объектом данных, его имя и класс показывают
Tunable: Позволяет вам выбрать настраиваемые параметры. Чтобы объявить настраиваемый параметр, установите флажок. В следующей фигуре параметр K
объявляется настраиваемый.
Когда вы выбираете параметр в верхней панели, более низкая панель показывает блоки что ссылка параметр и родительская система каждого такого блока.
Сгенерируйте окно S-функции
После выбора настраиваемых параметров нажмите кнопку Build. Это инициирует генерацию кода и компиляцию S-функции, с помощью цели S-функции. Опция Create New Model автоматически включена.
Процесс сборки отображает сообщения о состоянии в Командном окне MATLAB®. Когда сборка завершается, завершения окна настраиваемых параметров, и новое неназванное окно модели открывается.
Окно модели содержит Блок s-function с тем же именем как подсистема, от которой блок был сгенерирован (в этом примере, SourceSubsys
). Опционально, можно сохранить сгенерированную модель, содержащую сгенерированный блок.
Сгенерированный код для Блока s-function хранится в текущей рабочей папке. Следующие файлы записаны в папку верхнего уровня:
или subsys_sf.c
.cpp
, где
является именем подсистемы (например, subsys
SourceSubsys_sf.c
)
subsys_sf.h
, где subsys_sf.mexext
является зависимым платформой расширением файла MEX (например, mexext
SourceSubsys_sf.mexw64
)
Исходный код для S-функции записан в подпапку
. subsys_sfcn_rtw
.c
верхнего уровня или файл .cpp
являются тупиковым файлом, который просто содержит включать директиву, чтобы можно было использовать, чтобы соединить интерфейсом с другим кодом C/C++ к сгенерированному коду.
Для списка файлов, требуемых развернуть ваш Блок s-function для симуляции или генерации кода, смотрите Необходимые Файлы для Развертывания S-функции.
Сгенерированный Блок s-function имеет импорт и выходные порты, ширины которых и шаги расчета соответствуют тем из исходной модели.
Следующий код, от стандартной программы mdlOutputs
сгенерированного кода S-функции (в SourceSubsys_sf.c
), показывает, как на настраиваемую переменную K
ссылаются при помощи вызовов API MEX.
static void mdlOutputs(SimStruct *S, int_T tid)
...
/* Gain: '<S1>/Gain' incorporates:
* Sum: '<S1>/Sum'
*/
rtb_Gain_n[0] = (rtb_Product_p + (*(((const
real_T**)ssGetInputPortSignalPtrs(S, 2))[0]))) * (*(real_T
*)(mxGetData(K(S))));
rtb_Gain_n[1] = (rtb_Product_p + (*(((const
real_T**)ssGetInputPortSignalPtrs(S, 2))[1]))) * (*(real_T
*)(mxGetData(K(S))));
В автоматической генерации S-функции очищена опция Use Value for Tunable Parameters, или в командной строке установлен в 'off'
.
Используйте обертку S-функции MEX только в версии MATLAB, в которой создается обертка.
Если вы задаете пути и файлы с абсолютом
Предположим, что вы применяете пользовательский класс памяти, такой как Define
к объекту Simulink.Parameter
так, чтобы параметр появился как макрос в сгенерированном коде. Если вы используете объект параметра в подсистеме, от которой вы генерируете S-функцию ERT, вы не можете выбрать объект параметра как настраиваемый параметр. Вместо этого генератор кода S-функции применяет пользовательский класс памяти к объекту параметра. Эта генерация макросов в коде S-функции позволяет вам генерировать S-функции от подсистем, которые содержат различные элементы, такие как Различные блоки Subsystem, которые вы конфигурируете, чтобы произвести условные выражения препроцессора в сгенерированном коде. Однако вы не можете изменить значение параметра во время симуляции S-функции.
Чтобы выбрать объект параметра как настраиваемый параметр, примените различный класс памяти или пользовательский класс памяти. Пользовательские классы памяти, которые обрабатывают параметры как макросы, включают Define
, ImportedDefine
, CompilerFlag
и пользовательские классы памяти, которые вы создаете установкой Data initialization к Macro
в Custom Storage Class Designer. Если вы используете немакро-класс памяти или пользовательский класс памяти, вы не можете использовать объект параметра в качестве различной контрольной переменной и сгенерировать условные выражения препроцессора.
Если вы применяете пользовательский класс памяти, который обрабатывает объект параметра как импортированный макрос, обеспечьте макроопределение, прежде чем вы сгенерируете S-функцию ERT. Например, предположите, что вы применяете пользовательский класс памяти ImportedDefine
к объекту Simulink.Parameter
и используете объект параметра в качестве различной контрольной переменной в подсистеме. Если вы устанавливаете пользовательский атрибут HeaderFile
на 'myHdr.h'
, когда вы генерируете S-функцию, помещаете пользовательский заголовочный файл myHdr.h
в текущую папку. Сгенерированная S-функция использует макро-значение от вашего заголовочного файла вместо значения из свойства Value
объекта параметра.
Чтобы использовать макрос, который вы задаете через параметр компилятора, например, путем применения пользовательского класса памяти CompilerFlag
, используют образцовый параметр конфигурации Configuration Parameters> Code Generation> Custom Code> Additional build information> Defines, чтобы задать параметр компилятора. Для получения дополнительной информации смотрите Панель Генерации кода: Пользовательский код: Дополнительная информация о Сборке: Задает (Simulink Coder).