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

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

Для создания блоков S-Function из подсистемы смотрите Создание блоков S-Function из подсистемы.

Для примера рассмотрим SourceSubsys. Цель состоит в том, чтобы автоматически извлечь SourceSubsys из модели и создайте из нее блок S-Function. Переменная рабочей области K, который является коэффициентом усиления блока Gain в SourceSubsys, объявляется и генерируется как настраиваемая переменная.

Чтобы автогенерировать S-функцию из SourceSubsys который имеет настраиваемый параметр K:

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

  2. Щелкните подсистему правой кнопкой мыши и выберите C/C++ Code > Generate S-Function.

  3. В Generate S-Function окне вы видите переменные или объекты данных, которые ссылаются как параметры блоков в подсистеме. Можно объявить их настраиваемыми.

    В верхней панели окна отображаются следующие столбцы:

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

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

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

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

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

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

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

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

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

    • subsys_sf.h

    • subsys_sf.<reservedrangesplaceholder0 >, где mexext является зависящим от платформы Файлом MEX расширением (для примера, 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, чтобы задать опцию компилятора. Для получения дополнительной информации смотрите Панель генерации кода: Пользовательский код: Дополнительная информация о сборке: Определяет.

См. также

Похожие темы