Опция меню Generate S-function автоматизирует генерацию S-функции из подсистемы. Опция меню Generate S-function представляет параметры, используемые в подсистеме, и позволяет вам объявить выбранные параметры настраиваемыми.
Для создания блоков S-Function из подсистемы смотрите Создание блоков S-Function из подсистемы.
Для примера рассмотрим SourceSubsys
. Цель состоит в том, чтобы автоматически извлечь SourceSubsys
из модели и создайте из нее блок S-Function. Переменная рабочей области K
, который является коэффициентом усиления блока Gain в SourceSubsys
, объявляется и генерируется как настраиваемая переменная.
Чтобы автогенерировать S-функцию из SourceSubsys
который имеет настраиваемый параметр K
:
С SourceSubsys
откройте модель, щелкните подсистему, чтобы выбрать ее.
Щелкните подсистему правой кнопкой мыши и выберите C/C++ Code > Generate S-Function.
В Generate S-Function окне вы видите переменные или объекты данных, которые ссылаются как параметры блоков в подсистеме. Можно объявить их настраиваемыми.
В верхней панели окна отображаются следующие столбцы:
Variable Name: Имя параметра.
Class: Если параметр является переменной рабочей области, отображается его тип данных. Если параметр является объектом данных, отображается его имя и класс.
Tunable: Позволяет вам выбрать настраиваемые параметры. Чтобы объявить параметр настраиваемым, установите флажок. В этом примере параметр K
объявлен настраиваемым.
Когда вы выбираете параметр на верхней панели, на нижней панели показаны блоки, которые ссылаются на параметр, и родительская система каждого блока.
После выбора настраиваемых параметров нажмите кнопку 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.<reservedrangesplaceholder0 >
является зависящим от платформы Файлом MEX расширением (для примера, mexext
SourceSubsys_sf.mexw64
)
Исходный код S-функции записывается в подпапку
. Верхний уровень subsys
_sfcn_rtw.c
или .cpp
файл является файлом-заглушкой, который содержит директиву include, которую можно использовать для интерфейса другого кода C/C + + к сгенерированному коду.
Примечание
Сгенерированный блок S-Function имеет входные и выходные порты, ширина и шаги расчета которых соответствуют ширинам исходной модели.
Следующий код, из mdlOutputs
стандартная программа сгенерированного кода S-функции (в SourceSubsys_sf.c
) показывает, как настраиваемая переменная K
Ссылка осуществляется при помощи вызовов MEX API.
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'
.
Примечание
Используйте оболочку MEX S-функции только в версии MATLAB, в которой создается оболочка.
Предположим, что вы применяете класс памяти, такой как Define
в Simulink.Parameter
объект так, что параметр появляется как макрос в сгенерированном коде. Если вы используете объект параметра внутри подсистемы, из которой вы генерируете ERT S-функцию, вы не можете выбрать объект параметра в качестве настраиваемого параметра. Вместо этого генератор кода S-функции применяет пользовательский класс памяти к объекту параметра. Эта генерация макросов в коде S-функции позволяет вам генерировать S-функции из подсистем, которые содержат элементы варианта, такие как блоки Variant 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
, используйте параметр конфигурации модели Code Generation > Custom Code > Additional build information > Defines, чтобы задать опцию компилятора. Для получения дополнительной информации смотрите Панель генерации кода: Пользовательский код: Дополнительная информация о сборке: Определяет.