exponenta event banner

Создание S-функции из подсистемы

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

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

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

Автогенерация S-функции из SourceSubsys с настраиваемым параметром K:

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

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

  3. В окне Создать S-функцию (Generate S-Function) отображаются переменные или объекты данных, на которые в подсистеме имеются ссылки в качестве параметров блока. Их можно объявить настраиваемыми.

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

    • Имя переменной: имя параметра.

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

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

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

  4. После выбора настраиваемых параметров нажмите кнопку «Построить». Процесс построения инициирует генерацию кода и компиляцию 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.mexext, где 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-функции флажок «Использовать значение для перестраиваемых параметров» снят или в командной строке установлено значение 'off'.

Примечание

Обертка MEX S-функции используется только в версии MATLAB, в которой создается обертка.

Параметры макроса

Предположим, что применяется такой класс хранения данных, как Define в Simulink.Parameter таким образом, параметр отображается как макрос в сгенерированном коде. При использовании объекта параметра в подсистеме, из которой создается S-функция ERT, невозможно выбрать объект параметра в качестве настраиваемого параметра. Вместо этого генератор кода S-функции применяет пользовательский класс хранения к объекту параметра. Эта генерация макросов в коде S-функции позволяет создавать S-функции из подсистем, содержащих элементы вариантов, такие как блоки Variant Subsystem, которые настраиваются для создания условий препроцессора в сгенерированном коде. Изменение значения параметра во время моделирования S-функции невозможно.

Чтобы выбрать объект параметра в качестве настраиваемого параметра, примените другой класс хранения или создайте собственный класс хранения. Классы хранения данных, которые рассматривают параметры как макросы, включают Define, ImportedDefine, CompilerFlagи классы хранения, создаваемые путем установки для инициализации данных значения Macro в конструкторе классов настраиваемых хранилищ. При использовании класса хранения, отличного от макроса, нельзя использовать объект параметра в качестве переменной управления исполнениями и создавать условия препроцессора.

Если применяется класс хранения, который обрабатывает объект параметра как импортированный макрос, перед созданием S-функции ERT предоставьте определение макроса. Например, предположим, что применяется класс хранения ImportedDefine в Simulink.Parameter и использовать объект параметра в качестве переменной управления вариантами в подсистеме. Если задан пользовательский атрибут HeaderFile кому 'myHdr.h', при создании S-функции поместите пользовательский файл заголовка myHdr.h в текущей папке. Созданная S-функция использует значение макроса из файла заголовка вместо значения из Value свойства объекта параметра.

Использование макроса, определяемого параметром компилятора, например, при применении класса хранения CompilerFlagиспользуйте параметр конфигурации модели Создание кода > Пользовательский код > Дополнительные сведения о построении > Определяет параметр компилятора. Дополнительные сведения см. в разделе Область создания кода: Пользовательский код: Дополнительные сведения о построении: Определяет.

См. также

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