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

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

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

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

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

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

Обзор программируемого рабочего процесса

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

  • Чтобы создать или получить объект Code Mappings для конфигурирования пользовательского интерфейса C++ Class, можно использовать функции coder.mapping.utils.create и coder.mapping.api.get.

  • Чтобы сконфигурировать имя класса и пространство имен, можно использовать функции getClassName, setClassName, getClassNamespace, и setClassNamespace.

  • Чтобы сконфигурировать, как элементы данных появляются в качестве членов класса, можно использовать функции getData и setData.

  • Чтобы сконфигурировать, как функции модели появляются как методы класса, можно использовать функции find, getFunction, и setFunction.

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

Открытое окружение

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

  1. Откройте модель и командную строку MATLAB. Также можно создать скрипт строения MATLAB.

    model='rtwdemo_cpp_workflow'
    open_system(model)
    
  2. Установите параметры конфигурации модели. Эти параметры конфигурируют поведение генерации кода всей модели. Чтобы сконфигурировать параметры, характерные для генерации пользовательского интерфейса класса C++, можно использовать set_param функция для установки следующих параметров:

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

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

    Remove error status field in real-time model data structure

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

    Include model types in model class

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

    Параметры интерфейса, которые связаны, но реже используются:

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

    Определяет, нужно ли генерировать model_terminate способ. Для получения дополнительной информации см. Раздел «Требуется оконечная функция».

    Combine signal/state structures

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

    Generate destructor

    Определяет, нужно ли генерировать деструктор для класса модели C++. Для получения дополнительной информации см. Раздел «Генерация деструктора».

    Use dynamic memory allocation for model block instantiation

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

  3. Чтобы сконфигурировать пользовательский интерфейс класса C++ для модели, создайте объект Отображения. Чтобы создать новый объект Отображения для модели, используйте функцию coder.mapping.utils.create. Если объект Code Mappings уже существует для модели, функция возвращает существующий объект.

    % Create a new Code Mappings object for a model 
    cm = coder.mapping.utils.create(model);

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

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

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

// File: rtwdemo_cpp_workflow.h

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

    // private data and function members     
   private:

  };
}

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

Чтобы программно сконфигурировать имя класса и пространство имен, получите объект Code Mappings для вашей модели и установите имя и пространство имен:

  1. Получите объект Отображения для вашей модели. Чтобы получить объект, используйте функцию coder.mapping.api.get.

    % Get the Code Mappings object for a model 
    cm = coder.mapping.api.get(model);
    
  2. Сконфигурируйте имя класса. Чтобы задать имя класса, используйте функцию setClassName.

    % Set the class name
    setClassName(cm, 'customized_ModelClass');
    

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

    % Get the class name
    getClassName(cm);
    
  3. Сконфигурируйте пространство имен классов. Чтобы задать пространство имен, используйте функцию setClassNamespace.

    % Set the class namespace
    setClassNamespace(cm, 'customized_namespace');

    Чтобы проверить новое пространство имен перед генерацией кода, используйте функцию getClassNamespace.

    % Get the class namespace
    getClassNamespace(cm);

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

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

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

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

Вспомогательные порты

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

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

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

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

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

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

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

Для каждой категории элемента модели можно сконфигурировать видимость данных, чтобы управлять модификатором доступа (спецификатором доступа) сгенерированных членов класса. Каждая опция и ее влияние на сгенерированный интерфейс класса 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:
    … 
  };
}

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

Опции метода доступа к представителюОписание
Метод

Если вы конфигурируете входные порты как Methodдля каждого входного порта появляется метод set. Если вы конфигурируете выходные порты следующим MethodМетод get появляется для каждого выхода в модели. Если вы конфигурируете другие категории элементов модели следующим Methodдля категории элемента данных появляется метод get and set, основанный на совокупной структуре.

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для каждого входного порта появляется метод set, заданный в его объявлении. Если вы конфигурируете выходные порты следующим Inlined methodметод get, заданный в его объявлении, появляется для каждого выхода в модели. Если вы конфигурируете другие категории элементов модели следующим Inlined methodдля категории элемента данных появляется метод get and set, основанный на совокупной структуре, заданный в его объявлении.

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, get and set методы не появляются в сгенерированном классе и к данным можно получить доступ непосредственно по коду приложения.

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частный

Метод

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

Структурный метод

Метод, основанный на встроенной структуре

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

Ничего

Метод

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

Структурный метод

Метод, основанный на встроенной структуре

Вспомогательные портычастный

Метод

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

Структурный метод

Метод, основанный на встроенной структуре

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

Ничего

Метод

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

Структурный метод

Метод, основанный на встроенной структуре

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

Ничего

частный

Метод

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

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

Ничего

Метод

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

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

Ничего

Метод

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

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

Ничего

Метод

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

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

Ничего

Метод

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

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

Чтобы программно сконфигурировать видимость и доступ члена класса, получите объект Code Mappings для модели и установите свойства доступа к данным и видимости:

  1. Получите объект Отображения для модели. Чтобы получить объект, используйте функцию coder.mapping.api.get.

    % Get the Code Mappings object
    cm = coder.mapping.api.get(model);
  2. Настройте видимость. Чтобы задать видимость данных категории элементов данных Simulink в сгенерированном коде, используйте функцию setData. Когда вы используете setData задайте объект Code Mappings, категорию элемента модели, свойство видимости данных и опцию видимости данных. Допустимые опции видимости данных варьируются в зависимости от категории элемента модели.

    % Set the data visibility of Simulink model data elements by category 
    % setData(Code Mappings object, model element category, 'DataVisibility', data visibility option)
    setData(cm, 'Outports', 'DataVisibility', 'private');
    

    Чтобы проверить настройку видимости данных перед генерацией кода, используйте функцию getData:

    % Get the data visibility of Simulink model data elements by category 
    % getData(code mappings object, model element category, 'DataVisibility')
    getData(cm, 'Outports', 'DataVisibility');
    
  3. Сконфигурируйте доступ. Чтобы задать метод доступа представителя категории элементов данных Simulink в сгенерированном коде, используйте функцию setData. Когда вы используете setData function, задайте объект Кода Отображений, категорию элемента модели, представителя свойства метода доступа и опцию метода представителя доступа. Допустимые опции метода доступа к представителю варьируются в зависимости от категории элемента модели и выбранной опции видимости данных.

    % Set the access of Simulink model data elements by category 
    % setData(Code Mappings object, model element category,... 
    % 'MemberAccessMethod', member access method option)
    setData(cm, 'Inports', 'MemberAccessMethod', 'Method');

    Чтобы проверить настройку метода доступа к представителю перед генерацией кода, используйте функцию getData:

    % Get the visibility of Simulink model data elements by category 
    % getData(code mappings- C++ object, model element category, 'MemberAccessMethod')
    getData(cm, 'Inports', 'MemberAccessMethod');
    

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

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

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

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

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

Initializemodel_initialize
Функция разбиенияДля раздела модели выводите и обновляйте код. Выбран параметр конфигурации <reservedrangesplaceholder0> модели (по умолчанию).Раздел: slIdentifier, где slIdentifier - раздел, который был создан явно из блока в модели и показан в Simulink ® Редактор (например, P1)model_stepn, где n однозначно определяет функцию, сгенерированную для одного из периодов дискретизации модели
Периодическая функция многозадачностиДля блоков в модели на основе скорости, настроенной для многозадачности, выхода и обновления кода. Генератор кода производит функцию для каждого периода дискретизации. Выбран параметр конфигурации <reservedrangesplaceholder0> модели (по умолчанию).Периодический: slIdentifier, где slIdentifier - аннотация, которая соответствует периоду шага расчета для периодической или непрерывной скорости многозадачной модели (для примера, D1)model_stepn, где n однозначно определяет функцию, сгенерированную для одного из периодов дискретизации модели
Периодическая однозадачная функцияДля блоков в модели на основе скорости, сконфигурированной для однозадачного, выхода и обновления кода. Выбран параметр конфигурации <reservedrangesplaceholder0> модели (по умолчанию).Periodicmodel_step
Функция сброса

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

Сброс: slIdentifier, где slIdentifier - имя функции сброса в моделиmodel_reset-function-name
Функция завершения

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

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:
  … 
  };
}

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

Чтобы программно сконфигурировать имена методов классов и аргументы, получите объект Code Mappings для модели и установите свойства функции:

  1. Получите объект Отображения для модели. Чтобы получить объект, используйте функцию coder.mapping.api.get.

    % Get the Code Mappings object
    cm = coder.mapping.api.get(model);
  2. Чтобы просмотреть доступные методы точки входа для модели, используйте функцию find. Когда вы используете find function, задайте объект Code Mappings и категорию функций, которую вы хотели бы просмотреть для модели. Допустимые опции категории функций:

    • Функции

    • PeriodicFunctions

    • PartitionFunctions

    • ExportedFunctions

    • ResetFunctions

    • SimulinkFunctions

    % View entry-point methods for a model by category 
    % This example shows how to view the entry-point functions for a model
    % find(Code Mappings object, function category')
    find(cm, 'Functions');
  3. Сконфигурируйте имена методов. Чтобы сконфигурировать имя метода точки входа, используйте функцию setFunction. Когда вы используете setFunction задайте объект Code Mappings, имя функции модели, свойство method name и пользовательское имя. Допустимые имена функции модели заданы следующим образом:

    • Initialize - Инициализируйте функцию.

    • Terminate - Оконечная функция.

    • Periodic:slIdentifier - Периодическая функция (неявная задача), где slIdentifier - аннотация (для примера, D1), соответствующая периоду шага расчета. Periodic достаточно для однозадачной периодической функции.

    • Partition:slIdentifier - Функция секционирования (явная задача), где slIdentifier - имя раздела в редакторе расписаний.

    • Reset:slIdentifier - Сбросьте функцию где slIdentifier - имя функции сброса в модели.

    • ExportedFunction:slIdentifier - Экспортированная функция, где slIdentifier - имя входного блока вызова функции.

    • ExportedFunction:slIdentifier - функция Simulink, где slIdentifier - имя функции Simulink в модели.

    % Set the name of individual entry-point methods 
    % This examples shows how to customize the name of a periodic function
    % setFunction(Code Mappings object, model function, 'MethodName', custom name)
    setFunction(cm, 'Periodic', 'MethodName', 'custom_Periodic');
    

    Чтобы проверить имя метода перед генерацией кода, используйте функцию getFunction:

    % Get method name 
    % getFunction(code mappings object, model function, 'MethodName')
    getData(cm, 'Periodic', 'MethodName');
    
  4. Сконфигурируйте аргументы метода. Для периодических функций базовой скорости и функций Simulink, можно использовать функцию setFunction для настройки сгенерированных аргументов метода. Когда вы используете setFunction function, задайте объект Code Mappings, имя функции model, свойство arguments и прототип метода. Допустимые имена функции модели заданы следующим образом:

    • Initialize - Инициализируйте функцию.

    • Terminate - Оконечная функция.

    • Periodic:slIdentifier - Периодическая функция (неявная задача), где slIdentifier - аннотация (для примера, D1), соответствующая периоду шага расчета. Periodic достаточно для однозадачной периодической функции.

    • Partition:slIdentifier - Функция секционирования (явная задача), где slIdentifier - имя раздела в редакторе расписаний.

    • Reset:slIdentifier - Сбросьте функцию где slIdentifier - имя функции сброса в модели.

    • ExportedFunction:slIdentifier - Экспортированная функция, где slIdentifier - имя входного блока вызова функции.

    • ExportedFunction:slIdentifier - функция Simulink, где slIdentifier - имя функции Simulink в модели.

    Допустимые опции идентификатора для параметров:

    Опция идентификатораПредварительный просмотр
    Значение (только для входных портов)myPeriodic (argInport)
    Ссылка Const (только входные порты)myPeriodic (const & argInport)
    Указатель на ConstmyPeriodic (const * argInport)
    УказательmyPeriodic (* argInport)
    Const Pointer to constmyPeriodic (const * const argInport)

    В приведенном ниже примере периодическая функция, foo, сконфигурирован, чтобы сгенерировать метод, где y - возвращаемый аргумент и его параметр u1 передается как скаляр и u2 передается как постоянный указатель:

    % Configure method arguments 
    % setFunction(Code Mappings object, function, 'Arguments', function prototype)
    setFunction(cm, 'Periodic:foo', 'Arguments', 'y=(u1, const *u2)');

    Чтобы проверить аргументы метода перед генерацией кода, используйте функцию getFunction:

    % Get method name 
    % getFunction(Code Mappings object, model function, 'Arguments')
    getData(cm, 'Periodic:foo', 'Arguments');
    

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

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

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

    slbuild example_model
  2. Просмотрите код. Чтобы просмотреть сгенерированный код, откройте модель в Embedded Coder® приложение.

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

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

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

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

  • Поддержка параметров конкретного экземпляра - можно использовать аргументы параметра модели, чтобы сконфигурировать переменные рабочей области, которые были заданы в качестве аргументов. Можно настроить эти аргументы как частные представители вашего класса или как отдельные аргументы, заданные вне класса. Чтобы сконфигурировать в классе, можно задать частный параметр видимости данных и сконфигурировать генерацию методов get и set. Опционально можно сконфигурировать значения членов класса, как определено в классе (setDatat(cm,'ModelParameterArguments','DataAccess','Direct')) или переданные по ссылкам через конструктор классов (setDatat(cm,'ModelParameterArguments','DataAccess','Pointer')). Настройка доступа к данным поддерживается для сборок верхней модели. Для сборок образца модели код генерируется как ссылки в классе модели. Чтобы сконфигурировать параметры конкретного экземпляра вне класса, установите видимость данных на отдельные аргументы.

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

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

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

  • Поведение генерации кода интерфейса - стиль аргументов ввода-вывода спецификации шагового метода поддерживает односкоростные модели и мультирациональные однозадачные модели. Многозадачные модели не поддерживаются. Кроме того, интерфейс инкапсуляции 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 сразу после корневого входного порта. В диалоговом окне Signal Conversion параметры блоков выберите Исключить этот блок из оптимизации 'Block reduction'.

  • Simscape™ факторов - Если значение входного порта корня модели соединяется с блоком Simscape, вставьте блок Simulink Signal Conversion между корневым входным портом и блоком преобразования Simscape. В диалоговом окне Signal Conversion параметры блоков выберите Исключить этот блок из оптимизации 'Block reduction'.

  • Образец модели Факторов - при построении модели-ссылки, которая сконфигурирована для генерации интерфейса класса C++:

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

    • Не используйте виртуальные шины как входы или выходы к ссылочной модели, когда ссылочная модель использует метод шага ввода-вывода аргументов. Когда сигналы шины пересекают контуры модели-ссылки, либо используйте невиртуальные шины, либо используйте метод Default step.

См. также

| | | | | | | | | | |

Похожие примеры

Подробнее о

Для просмотра документации необходимо авторизоваться на сайте