Сгенерируйте S-функцию от подсистемы

Функция Generate S-function автоматизирует процесс генерации S-функции от подсистемы. Кроме того, функция Generate S-function представляет отображение параметров, используемых в подсистеме, и позволяет вам объявить выбранные настраиваемые параметры.

Как пример, рассмотрите SourceSubsys, та же подсистема, проиллюстрированная в примере, Создают Блоки s-function из Подсистемы. Цель состоит в том, чтобы автоматически извлечь SourceSubsys из модели и создать Блок s-function из него, как в предыдущем примере. Кроме того, переменная K рабочей области, которая является фактором усиления блока Gain в SourceSubsys (как показано в следующем диалоговом окне параметров блоков Усиления), объявляется и генерируется как настраиваемая переменная.

Автоматически сгенерировать S-функцию от SourceSubsys с настраиваемым параметром K,

  1. С открытой моделью SourceSubsys кликните по подсистеме, чтобы выбрать его.

  2. Из меню Code выберите C/C++ Code> Generate S-Function. Этот пункт меню включен, когда подсистема выбрана в текущей модели.

    Также можно щелкнуть правой кнопкой по подсистеме и выбрать C/C++ Code> Generate S-Function из контекстного меню блока подсистемы.

  3. Окно Generate S-Function отображено (см. следующую фигуру). Это окно показывает переменные (или объекты данных), на которые ссылаются как параметры блоков в подсистеме, и позволяет вам объявить их как настраиваемых.

    Верхняя панель окна отображает три столбца:

    • Variable Name: имя параметра.

    • Класс: Если параметр является переменной рабочей области, ее тип данных показывают. Если параметр является объектом данных, его имя и класс показывают

    • Tunable: Позволяет вам выбрать настраиваемые параметры. Чтобы объявить настраиваемый параметр, установите флажок. В следующей фигуре параметр K объявляется настраиваемый.

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

    Сгенерируйте окно S-функции

  4. После выбора настраиваемых параметров нажмите кнопку Build. Это инициирует генерацию кода и компиляцию S-функции, с помощью цели S-функции. Опция Create New Model автоматически включена.

  5. Процесс сборки отображает сообщения о состоянии в Командном окне MATLAB®. Когда сборка завершается, завершения окна настраиваемых параметров, и новое неназванное окно модели открывается.

  6. Окно модели содержит Блок s-function с тем же именем как подсистема, от которой блок был сгенерирован (в этом примере, SourceSubsys). Опционально, можно сохранить сгенерированную модель, содержащую сгенерированный блок.

  7. Сгенерированный код для Блока s-function хранится в текущей рабочей папке. Следующие файлы записаны в папку верхнего уровня:

    • subsys_sf.c или .cpp, где subsys является именем подсистемы (например, SourceSubsys_sf.c)

    • subsys_sf.h

    • subsys_sf.mexext, где mexext является зависимым платформой расширением файла MEX (например, SourceSubsys_sf.mexw64)

    Исходный код для S-функции записан в подпапку subsys_sfcn_rtw. .c верхнего уровня или файл .cpp являются тупиковым файлом, который просто содержит включать директиву, чтобы можно было использовать, чтобы соединить интерфейсом с другим кодом C/C++ к сгенерированному коду.

    Примечание

    Для списка файлов, требуемых развернуть ваш Блок s-function для симуляции или генерации кода, смотрите Необходимые Файлы для Развертывания S-функции.

  8. Сгенерированный Блок 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, чтобы задать параметр компилятора. Для получения дополнительной информации смотрите Панель Генерации кода: Пользовательский код: Дополнительная информация о Сборке: Задает.

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

Похожие темы