В интерактивном режиме сконфигурируйте интерфейс C++

Чтобы оптимизировать интегрирование Кода С++, сгенерированного из приложений Simulink®, компоненты и подсистемы с внешним кодом C or C++, конфигурируют индивидуально настраиваемый интерфейс класса C++. Когда вы генерируете Код С++ из модели, модель появляется как класс, элементы данных появляются как члены класса, и функции модели появляются как методы класса в сгенерированном коде. Конфигурирование интерфейса класса C++ позволяет вам настроить следующие аспекты сгенерированного Кода С++:

  • Информация о классе — Имя класса и пространство имен

  • Информация о члене класса — доступ к Члену класса и видимость

  • Информация о методе класса — имена Метода класса и аргументы

Индивидуально настраиваемый интерфейс класса C++ позволяет сгенерированным классам соответствовать определенным стандартам кода или интерфейсным требованиям так, чтобы сгенерированный код мог скомпилировать и объединяться в более крупные архитектуры с минимальной индивидуальной настройкой постгенерации.

Интерактивный обзор рабочего процесса

Интерактивный рабочий процесс обеспечивает быструю, интуитивную, и полную настройку индивидуально настраиваемого интерфейса класса C++ при помощи инструментов, доступных непосредственно от вкладки C++ Code. От вкладки можно нажать Code Interface и получить доступ к диалоговому окну настройки Class Name & Namespace и редактору Отображений Кода (с Property Inspector), чтобы сконфигурировать интерфейс.

В интерактивном режиме сконфигурировать индивидуально настраиваемый интерфейс C++:

Открытая среда

Откройте среду для конфигурирования индивидуально настраиваемого интерфейса класса C++:

  1. Откройте приложение Embedded Coder®. В галерее Apps нажмите Embedded Coder.

  2. Установите язык на C++. На вкладке C++ Code нажмите Output и выберите Embedded C++ Code.

  3. Установите параметры конфигурации модели. Чтобы открыть диалоговое окно Configuration Parameters, на вкладке C++ Code, нажимают Settings и выбирают C/C++ Code generation settings. Эти параметры конфигурируют поведение генерации кода всей модели. Чтобы сконфигурировать параметры, характерные для генерации индивидуально настраиваемого интерфейса класса C++, можно установить эти параметры (расположенный на панели Interface):

    Параметр конфигурацииОписание
    Code interface packagingВыбирает выходной язык для сгенерированного кода. Для получения дополнительной информации смотрите, что интерфейс Code группирует.
    Multi-instance code error diagnostic

    Задает уровень серьезности для диагностики, отображенной, когда модель нарушает требования для генерации кода мультиэкземпляра. Для получения дополнительной информации смотрите диагностику ошибки в коде Мультиэкземпляра.

    Remove error status field in real-time model data structure

    Задает, не использовать ли ошибочное поле состояния от сгенерированной структуры данных модели реального времени rtModel. Для получения дополнительной информации смотрите, Удаляют ошибочное поле состояния в режиме реального времени структура данных модели.

    Include model types in model class

    Задает, чтобы включать определения типа модели в пространстве имен класса модели. Для получения дополнительной информации смотрите, Включают типы модели в класс модели.

    Интерфейсные параметры, которые связаны, но реже используются, появляются под Advanced parameters.

    Параметр конфигурацииОписание
    Terminate function required

    Задает, сгенерировать ли model_terminate метод. Для получения дополнительной информации смотрите Оконечную требуемую функцию.

    Combine signal/state structures

    Задает, объединить ли глобальные блоки-сигналы и глобальные данные состояния в одну структуру данных в сгенерированном коде. Для получения дополнительной информации смотрите, что Объединение предупреждает/утверждает о структурах.

    Generate destructor

    Задает, сгенерировать ли деструктор для класса модели C++. Для получения дополнительной информации смотрите, Генерируют деструктор.

    Use dynamic memory allocation for model block instantiation

    Задает выделение памяти для иерархий модели. Для получения дополнительной информации, seeUse динамическое выделение памяти для инстанцирования блока модели.

Сконфигурируйте модель как класс

Сконфигурируйте имя класса и пространство имен. Когда вы генерируете Код С++ из модели, та модель появляется как класс в сгенерированном коде. Чтобы упростить интегрирование и выполнить код и интерфейсные требования, можно настроить сгенерированное имя класса. Опционально, можно определить объем сгенерированного кода и предотвратить столкновения символа в рамках проекта путем определения пространства имен для сгенерированного класса. В смоделированных системах, созданных как иерархия модели, можно задать различное пространство имен для каждой модели в иерархии.

Сгенерированный интерфейс класса C++, объявленный в заголовочном файле модели, включает индивидуально настраиваемое имя и пространство имен:

// File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
    // public data and function members
   public:

    // private data and function members     
   private:

  };
}

Рабочий процесс

Сконфигурировать имя класса и пространство имен для индивидуально настраиваемого интерфейса класса C++:

  1. На вкладке C++ Code нажмите Code Interface и выберите Class Name & Namespace.

  2. Чтобы сконфигурировать имя класса, отредактируйте поле C++ Class Name.

  3. Чтобы сконфигурировать пространство имен класса, отредактируйте поле C++ Class Namespace.

  4. Нажмите OK. Валидация выполняется в интерактивном режиме с полевыми предупреждениями, которые предупреждают вас, если вы вводите недопустимое имя или пространство имен.

Сконфигурируйте элементы данных модели как члены класса

Сконфигурируйте видимость и доступ членов класса. Когда вы генерируете Код С++ из модели, элементы данных Simulink появляются как члены класса в сгенерированном коде. Чтобы настроить инкапсуляцию данных о классе, чтобы соответствовать стандартам кода, безопасности или требованиям к производительности, можно настроить видимость и доступ сгенерированных членов класса. Элементы данных Simulink могут быть сгруппированы в эти категории моделирования элементов:

Категория элемента моделиОписание
Inports

Порты ввода данных корневого уровня модели, такие как Inport и блоки In Bus Element. Для получения дополнительной информации смотрите Inport.

Выходные порты

Порты вывода данных корневого уровня модели, такие как Outport и блоки Out Bus Element. Для получения дополнительной информации смотрите Выходной порт.

Аргументы параметра модели

Переменные рабочей области, которые появляются как экземпляр (нестатические) элементы данных класса.

Параметры модели

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

Сигналы, состояния и внутренние данные

Элементы данных, которые являются внутренними к модели, такими как выходные сигналы блока, дискретные состояния блока, хранилища данных и сигналы пересечения нулем.

Для каждой категории элемента модели можно сконфигурировать видимость данных, чтобы управлять модификатором доступа (спецификатор доступа) сгенерированных членов класса. Каждая опция и ее удар на сгенерированный интерфейс класса C++, объявленный в заголовочном файле модели, обрисованы в общих чертах:

Опции видимости данныхОписание
общественность

Если вы конфигурируете элементы данных как public, они появляются как общедоступные члены сгенерированного класса:

File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:
  
    // example inport
    ExtU rtU;

    // example outport
    ExtY rtY;
  
    // example block signals and states
    DW rtDW;
     
   private:
    … 
  };
}

защищенный

Если вы конфигурируете элементы данных как protected, они появляются как защищенные члены сгенерированного класса:

File: rtwdemo_cpp_workflow.h

// Class declaration for model example_model
namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:

   protected:

    // example inport
    ExtU rtU;

    // example outport
    ExtY rtY;
  
    // example block signals and states
    DW rtDW;   

   private:
    … 
  };
}
частный

Если вы конфигурируете элементы как private, они появляются как члены парламента, не занимающие официального поста сгенерированного класса:

File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:
    
   private:
    // example inport
    ExtU rtU;

    // example outport
    ExtY rtY;
  
    // example block signals and states
    DW rtDW;
  };
}
Отдельные аргументы (Только аргументы параметра модели)

Если вы конфигурируете элементы данных как Individual arguments, элементы не появляются как члены класса, но вместо этого заданы вне класса и переданы в качестве аргументов методам класса:

File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:

   // model step function
   void step1(real_T rty_engineState,
     const real_T modelParameterArgument);
    
   private:
    … 
  };
}

После того, как вы устанавливаете видимость данных категории элемента модели, можно сконфигурировать метод доступа модели, чтобы определить, как методы для получения и установки сгенерированы для элементов данных. Это управления конфигурацией, как код приложения может просмотреть и изменить данные о члене класса. Каждая опция и ее удар на сгенерированный интерфейс класса C++, объявленный в заголовочном файле модели, обрисованы в общих чертах:

Опции метода доступа членаОписание
Метод

Если вы конфигурируете импорт как Method, метод установки появляется для каждого импорта. Если вы конфигурируете выходные порты как Method, получить метод появляется для каждого выходного порта в модели. Если вы конфигурируете другие категории элемента модели как Method, совокупный основанный на структуре метод для получения и установки появляется для категории элемента данных.

File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:
   // example inport
   void setInport(real_T localArgInput);

   // example outport
   real_T getOutport() const;

   // example of model parameter arguments configured with
   // ‘DataAccess’ ‘Direct'
   real_T const & getInstP() const;

   // example of model parameter arguments configured with
   // ‘DataAccess’ ‘Pointer’
   // real_T const * getInstP() const;

   // example Block parameters get and set methods
   const rtwdemo_cppclass_workflowModelClass::rtwdemo_cppclass_workflow_P &
     getBlockParameters() const;
 
   void setBlockParameters(const rtwdemo_cppclass_workflow_P
     *prtwdemo_cppclass_workflowrtrtP);

   // example Block states get and set methods
  const rtwdemo_cppclass_workflowModelClass::rtwdemo_cppclass_workflow_DW &
    getDWork() const;
 
  void setDWork(const rtwdemo_cppclass_workflow_DW
                *prtwdemo_cppclass_workflowrtDW);
    
   private:
    … 
  };
}
Встроенный метод

Если вы конфигурируете импорт как Inlined method, метод установки, заданный в его объявлении, появляется для каждого импорта. Если вы конфигурируете выходные порты как Inlined method, получить метод, заданный в его объявлении, появляется для каждого выходного порта в модели. Если вы конфигурируете другие категории элемента модели как Inlined method, совокупный основанный на структуре метод для получения и установки, заданный в его объявлении, появляется для категории элемента данных.

File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:
   // example inport set method
   void setkeyState(real_T localArgInput)
   {
     rtU.keyState = localArgInput;
   }
 
   // example outport get method
   const real_T* getengineState() const
   {
     return rtY.engineState;
   }

   // example Block parameters get and set method
   const rtwdemo_cppclass_workflowModelClass::rtwdemo_cppclass_workflow_P &
     getBlockParameters() const
   {
     return rtwdemo_cppclass_workflowrtrtP;
   }
 
   void setBlockParameters(const rtwdemo_cppclass_workflow_P
     *prtwdemo_cppclass_workflowrtrtP)
   {
     rtwdemo_cppclass_workflowrtrtP = *prtwdemo_cppclass_workflowrtrtP;
   }

  // example Block states get and set methods
   const rtwdemo_cppclass_workflowModelClass::rtwdemo_cppclass_workflow_DW &
     getDWork() const
   {
     return rtwdemo_cppclass_workflowrtDW;
   }
 
   void setDWork(const rtwdemo_cppclass_workflow_DW
                 *prtwdemo_cppclass_workflowrtDW)
   {
     rtwdemo_cppclass_workflowrtDW = *prtwdemo_cppclass_workflowrtDW;
   }
     
   private:
    … 
  };
}
Основанный на структуре метод

Если вы конфигурируете импорт как Structure-based method, импорт появляется как совокупный основанный на структуре метод установки для категории элемента модели. Если вы конфигурируете выходные порты как Structure-based method, выходные порты появляются, когда основанный на структуре агрегат получает метод для категории элемента модели. Этот параметр конфигурации не применяется к другим категориям элемента модели.

File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
    // public data and function members
   public:
   // example inport
   void setExternalInputs(const ExtU_demoMethodScheduledModel_T 
      * pExtU_demoMethodScheduledModel_T);
 
   // example outport 
   const myNamespace::myModelClass::ExtY_demoMethodScheduledModel_T
      & getExternalOutputs() const;

    // Other model element categories may not be configured as ‘Structure-based method’
        
   private:
    … 
  };
}
Встроенный основанный на структуре метод

Если вы конфигурируете импорт как Structure-based method, импорт появляется как совокупный основанный на структуре метод установки, заданный в его объявлении для категории элемента модели. Если вы конфигурируете выходные порты к Structure-based method, выходные порты появляются, когда основанный на структуре агрегат задал метод в их объявлении для категории элемента модели. Этот параметр конфигурации не применяется к другим категориям элемента модели.

File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:
   // example inport
   void setExternalInputs(const ExtU_demoMethodScheduledModel_T
      * pExtU_demoMethodScheduledModel_T)
   {
      demoMethodScheduledModelWithR_U = *pExtU_demoMethodScheduledModel_T;
   }
 
    // example outport
   const myNamespace::myModelClass::ExtY_demoMethodScheduledModel_T
      & getExternalOutputs() const
   {
      return demoMethodScheduledModelWithR_Y;
   }
   // Other model element categories may not be configured as ‘Inlined structure-based method’
    
   private:
    … 
  };
}
'none'

Если вы конфигурируете доступ категории элемента модели как None, методы для получения и установки не появляются в сгенерированном классе, и к данным может получить доступ непосредственно код приложения.

File: rtwdemo_cpp_workflow.h

  // External inputs (root inport signals with default storage)
  struct ExtU {
    real_T keyState;                   // '<Root>/keyState'
  };
 
  // External outputs (root outports fed by signals with default storage)
  struct ExtY {
    real_T engineState[3];             // '<Root>/engineState'
    real_T cycleTime;                  // '<Root>/cycleTime'
  };

namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:
   // External inputs
   ExtU rtU;
 
   // External outputs
   ExtY rtY;
        
   private:
    … 
  };
}

Для каждой категории элемента модели обрисованы в общих чертах допустимая видимость данных и комбинации метода доступа члена:

Категория элемента моделиВидимость данныхМетод доступа члена
Inportsчастный

Метод

Встроенный метод

Основанный на структуре метод

Встроенный основанный на структуре метод

общественность

'none'

Метод

Встроенный метод

Основанный на структуре метод

Встроенный основанный на структуре метод

Выходные портычастный

Метод

Встроенный метод

Основанный на структуре метод

Встроенный основанный на структуре метод

общественность

'none'

Метод

Встроенный метод

Основанный на структуре метод

Встроенный основанный на структуре метод

Аргументы параметра моделиОтдельные аргументы

'none'

частный

Метод

Встроенный метод

Параметры моделичастный

'none'

Метод

Встроенный метод

общественность

'none'

Метод

Встроенный метод

Сигналы, состояния и внутренние данныечастный

'none'

Метод

Встроенный метод

общественность

'none'

Метод

Встроенный метод

Рабочий процесс

Сконфигурировать члены класса индивидуально настраиваемого интерфейса класса C++:

  1. Откройте редактор Отображений Кода. На вкладке C++ Code нажмите Code Interface и выберите Code Mappings.

  2. Откройте панель Data. В редакторе Отображений Кода кликните по вкладке Data.

  3. Сконфигурируйте видимость. Чтобы сконфигурировать видимость категории элементов данных Simulink в сгенерированном коде, из столбца Data Visibility, выбирают спецификатор доступа из данных опций. Опции варьируются в зависимости от Model Element Category.

  4. Сконфигурируйте доступ. Сконфигурировать доступ категории элементов данных Simulink в сгенерированном коде, из столбца Member Access Method, выбор, как сгенерировать методы для получения и установки из данных опций. Опции варьируются в зависимости от Model Element Category и выбранного Data Visibility.

Сконфигурируйте функции модели как методы класса

Сконфигурируйте имена метода класса и аргументы. Когда вы генерируете Код С++ из модели, функции модели появляются как методы класса в сгенерированном коде. Чтобы объединяться с внешним кодом или интерфейсными требованиями, можно настроить имя сгенерированных методов класса. Кроме того, для периодических функций тарифной ставки и Функций Simulink, можно сконфигурировать имя, порядок и идентификатор сгенерированных аргументов.

Сгенерированные методы класса упоминаются как методы точки входа и являются местоположениями в коде, где передача программного управления (выполнение) происходит. Методы точки входа варьируются в зависимости от типа модели Simulink и могут быть сгруппированы в следующие типы:

Тип моделиТип функции моделиОписаниеИмя функции моделиОжидаемое имя метода
Модели экспорта функцийЭкспортируемая функцияЭкспортируемая функция для подсистемы.ExportedFunction:slIdentifier, где slIdentifier имя блока Inport вызова функции в моделиfunction-call-inport-block-name или signal-label (если задано)
Функция SimulinkЭкспортируемая функция для блока Simulink Function.Simulink Function:slIdentifier, где slIdentifier имя блока Simulink Function в моделиfunction-name для глобального блока Simulink Function или model_function-name для ограниченного по объему блока Simulink Function
Экспорт функций или основанные на уровне моделиИнициализируйте функцию

Код инициализации для модели. В начале кода приложения вызовите функцию однажды. Не используйте эту функцию, чтобы сбросить структуру данных модели реального времени (rtM).

Initializemodel_initialize
Функция разделаДля раздела модели, выхода и кода обновления. Параметр конфигурации модели Single output/update function выбран (значение по умолчанию).Partition:slIdentifier, где slIdentifier раздел, который был создан явным образом из блока в модели и показан в Редакторе Расписания Simulink® (например, P1)model_stepn, где n однозначно определяет функцию, сгенерированную в течение одного из периодов расчета модели
Периодическая многозадачная функцияДля блоков в основанной на уровне модели, сконфигурированной для многозадачности, выхода и кода обновления. Генератор кода производит функцию в течение каждого периода расчета. Параметр конфигурации модели Single output/update function выбран (значение по умолчанию).Periodic:slIdentifier, где slIdentifier аннотация, которая соответствует периоду шага расчета для периодического или непрерывного уровня многозадачной модели (например, D1)model_stepn, где n однозначно определяет функцию, сгенерированную в течение одного из периодов расчета модели
Периодическая однозадачная функцияДля блоков в основанной на уровне модели, сконфигурированной для однозадачности, выхода и кода обновления. Параметр конфигурации модели Single output/update function выбран (значение по умолчанию).Periodicmodel_step
Функция сброса

Если модель включает блок Reset Function, сгенерированный код сброса. Чтобы сбросить условия или утвердить, вызовите функцию от кода приложения.

Reset:slIdentifier, где slIdentifier имя функции сброса в моделиmodel_reset-function-name
Оконечная функция

Код для того, чтобы выключить систему. Для основанных на ERT моделей можно подавить генерацию этой функции путем очистки параметра конфигурации модели Terminate function required (набор по умолчанию).

Terminatemodel_terminate

Сгенерированный интерфейс класса C++, объявленный в заголовочном файле модели, включает имя функции и индивидуальные настройки аргумента в сгенерированных методах точки входа:

File: rtwdemo_cpp_workflow.h

namespace CustomizedNamespace
{
  class customized_ModelClass {
   public:
    // model initialize function- customized name
   void customized_initialize();

    // model step function- customized name & arguments
   void customized_step(customArg1, const* customArg2);

    // model terminate function- customized name
   void customized_terminate();

    // Constructor
   customized_ModelClass();

    // Destructor
   ~customized_ModelClass();
 
   private:
  … 
  };
}

Рабочий процесс

  1. Откройте редактор Отображений Кода. На вкладке C++ Code нажмите Code Interface и выберите Code Mappings.

  2. Откройте панель Functions. В редакторе Отображений Кода кликните по вкладке Functions. Чтобы просмотреть полный список функций точки входа для вашей модели, нажмите кнопку Update Diagram.

  3. Сконфигурируйте имена методов.

    1. Чтобы сконфигурировать имя метода точки входа в сгенерированном коде, из столбца Method Name, нажатия кнопки и непосредственно редактируют электронную таблицу. Можно ввести пользовательское имя, или можно использовать параметры формата идентификатора, чтобы управлять динамически сгенерированным именем. Для получения дополнительной информации о параметрах формата идентификатора, смотрите Управление форматом Идентификатора.

    2. Проверьте имя в столбце Method Preview.

  4. Сконфигурируйте аргументы метода. Для периодических функций тарифной ставки и Функций Simulink, можно сконфигурировать имя, порядок и идентификаторы аргументов метода.

    Сконфигурировать аргументы периодической функции тарифной ставки:

    1. Откройте диалоговое окно настройки Интерфейса Ступенчатой функции. Из редактора Отображений Кода, на вкладке Functions, в столбце Method Preview, кликают по гиперссылке предварительного просмотра метода периодической функции тарифной ставки:

    2. В диалоговом окне выберите Configure arguments for Step function prototype и нажмите Get default. Это действие запускает представление аргументов метода.

    3. Чтобы изменить порядок аргументов, перетащите строки аргумента в средстве просмотра.

    4. Чтобы изменить идентификатор, в столбце C++ Type Qualifier, выбирают соответствующий идентификатор из выпадающего списка:

      Опция идентификатораПредварительный просмотр
      Значение (Только Inports)myPeriodicFunction (argInport)
      Ссылка const (Только Inports)myPeriodicFunction (const & argInport)
      Указатель на ConstmyPeriodicFunction (const * argInport)
      УказательmyPeriodicFunction (* argInport)
      Указатель const на constmyPeriodicFunction (const * const argInport)

    5. Чтобы изменить название аргумента, в столбце C++ Identifier Name, нажатии кнопки и непосредственно редактируют имя. Можно ввести пользовательское имя, или можно использовать параметры формата идентификатора, чтобы управлять динамически сгенерированным именем. Для получения дополнительной информации о параметрах формата идентификатора, смотрите Управление форматом Идентификатора.

      1. Если вы вводите то же имя для аргумента импорта и аргумента выходного порта, импорт и выходной порт появляются как один параметр в сгенерированном методе. Например, если вы задаете импорт как argInport и аргумент выходного порта как argOutport, сгенерированный метод был бы:

        myStepFunction(argInport, argOutport);

        Если вы задаете аргумент импорта как argIO и аргумент выходного порта как argIO, сгенерированный метод был бы:

        myStepFunction(argIO);
    6. Чтобы проверить выборы аргументов, нажмите Validate.

    7. Чтобы применить изменения и выйти из диалогового окна, нажмите OK.

    Сконфигурировать аргументы Функции Simulink:

    1. Откройте Функцию Simulink Интерфейсное диалоговое окно настройки. Из редактора Отображений Кода, на вкладке Functions, в столбце Method Preview, кликают по гиперссылке предварительного просмотра метода Функции Simulink:

    2. Чтобы изменить возвращаемый аргумент, выберите опцию возвращаемого аргумента от C/C++ return argument выпадающий список.

    3. Чтобы изменить порядок аргументов, перетащите строки аргумента в средстве просмотра.

    4. Чтобы изменить идентификатор, в столбце C++ Type Qualifier, выбирают идентификатор из выпадающего списка:

      Опция идентификатораПредварительный просмотр
      'auto'mySimulinkFunction (argInport)
      Const_referencemySimulinkFunction (const & argInport)
      Указатель на ConstmySimulinkFunction (const * argInport)
      УказательmySimulinkFunction (* argInport)
      Указатель const на constmySimulinkFunction (const * const argInport)

    5. Чтобы изменить название аргумента, в столбце C++ Identifier name, нажатии кнопки и непосредственно редактируют имя. Можно ввести пользовательское имя, или можно использовать параметры формата идентификатора, чтобы управлять динамически сгенерированным именем. Для получения дополнительной информации о параметрах формата идентификатора, смотрите Управление форматом Идентификатора.

    6. Чтобы проверить изменения в Аргументах функции Simulink, рассмотрите поле Simulink function prototype, чтобы просмотреть ожидаемый прототип метода.

    7. Чтобы применить изменения и выйти из диалогового окна, нажмите OK.

Сгенерируйте интерфейс класса C++

Сгенерируйте индивидуально настраиваемый интерфейс класса C++ путем генерации кода из модели. Чтобы проверить ваши настройки интерфейса класса C++, создайте модель и просмотрите сгенерированный класс, член класса и представления метода класса.

  1. Сгенерируйте код. Чтобы сгенерировать интерфейс класса C++, на вкладке C++ Code, нажимают Build.

  2. Просмотрите код. Чтобы просмотреть сгенерированный код, на вкладке нажимают View Code. Сгенерированный код появляется около модели в рабочем пространстве модели.

  3. Выполнить итерации. Если сгенерированный интерфейс не удовлетворяет требования кода, вносит корректировки настройки, пока требованиям не удовлетворяют.

Если представление сгенерированного кода не удовлетворяет ваши требования, реконфигурировало интерфейс и генерирует код снова, пока требованиям генерации кода не удовлетворяют. Для руководства при понимании сгенерированного кода смотрите, Анализируют Интерфейс Сгенерированного кода.

Факторы и ограничения

  • Специфичная для экземпляра Поддержка Параметра — можно использовать аргументы параметра модели, чтобы сконфигурировать переменные рабочей области, которые были заданы в качестве аргументов. Можно сконфигурировать эти аргументы как члены парламента, не занимающие официального поста класса или в качестве отдельных аргументов, заданных вне класса. Чтобы сконфигурировать в классе, можно установить видимость данных на частный и сконфигурировать генерацию методов для получения и установки. Опционально, можно сконфигурировать значения члена класса, как задано в классе (в Property Inspector, установить Data Access на Direct) или переданный ссылкой через конструктора класса (в Property Inspector, набор Data Access к Pointer). Установка доступа к данным поддерживается для сборок топ-модели. Для сборок образца модели код сгенерирован как ссылки в классе модели. Чтобы сконфигурировать специфичные для экземпляра параметры вне класса, установите видимость данных на отдельные аргументы.

    Специфичные для экземпляра ограничения параметра включают:

    • Переменные MATLAB®, отмеченные как аргументы модели, не могут быть сконфигурированными как частные члены класса.

    • Аргументы параметра модели не поддерживаются сборками щелчка правой кнопкой.

  • Интерфейсный стиль аргументов Code Generation Behavior — The I/O спецификации метода шага поддерживает односкоростные модели и многоскоростные однозадачные модели. Многоскоростные многозадачные модели не поддерживаются. Кроме того, интерфейс инкапсуляции C++ не является значением по умолчанию, значение проигнорировано для параметра Pass fixed-size scalar root inputs by value for code generation.

  • Факторы Stateflow® — Если у вас есть лицензия Stateflow для диаграммы Stateflow, которая находится в корневой модели, сконфигурированной, чтобы использовать I/O arguments step method функциональная спецификация, и это использует корневое значение импорта модели или вызывает подсистему, которая использует корневое значение импорта модели, сделайте одно из следующих, чтобы сгенерировать код:

    • В диаграмме Stateflow снимите флажок Execute (enter) Chart At Initialization.

    • Вставьте блок Simulink Signal Conversion сразу после корневого импорта. В диалоговом окне параметров блоков Преобразования Сигнала выберите Exclude этот блок из 'Оптимизации' сокращения блока.

  • Факторы Simscape™ — Если корневое значение импорта модели соединяется с блоком Simscape, вставьте блок Simulink Signal Conversion между корневым импортом и блок преобразования Simscape. В диалоговом окне параметров блоков Преобразования Сигнала выберите Exclude этот блок из 'Оптимизации' сокращения блока.

  • Факторы Модели, на которые ссылаются — При создавании модели, на которую ссылаются, которая сконфигурирована, чтобы сгенерировать интерфейс класса C++:

    • Не используйте интерфейс класса C++ в случаях, когда модель, на которую ссылаются, не сможет иметь объединенной функции выхода/обновления. Случаи включают модель, которая имеет время непрерывной выборки или сохраняет состояния.

    • Не используйте виртуальные шины в качестве вводов или выводов к модели, на которую ссылаются, когда модель, на которую ссылаются будет, использовать метод шага аргументов I/O. Когда крест сигналов шины сослался контуры, модели, или используют невиртуальные шины или используют метод шага По умолчанию.

Похожие темы