exponenta event banner

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

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

  • Сведения о классе - имя класса и пространство имен

  • Сведения об элементе класса - Доступ и видимость элемента класса

  • Сведения о методе класса - имена и аргументы метода класса

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

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

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

  • Для создания или извлечения объекта сопоставления кода для настройки настраиваемого интерфейса класса C++ можно использовать функции 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 для установки следующих параметров:

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

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

    Удалить поле состояния ошибки в структуре данных модели в реальном времени

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

    Включить типы моделей в класс моделей

    Определяет включение определений типов моделей в пространство имен классов модели. Дополнительные сведения см. в разделе Включение типов моделей в класс моделей.

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

    Параметр конфигурацииОписание
    Требуется завершить функцию

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

    Объединение структур сигналов/состояний

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

    Создать деструктор

    Указывает, нужно ли создавать деструктор для класса модели C++. Дополнительные сведения см. в разделе Создание деструктора.

    Использовать динамическое выделение памяти для создания экземпляра блока модели

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

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

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

Настроить модель как класс

Настройте имя класса и пространство имен. При создании кода C++ из модели эта модель появляется как класс в созданном коде. Для упрощения интеграции и соответствия требованиям к коду и интерфейсу можно настроить созданное имя класса. Дополнительно можно задать область действия созданного кода и предотвратить конфликты символов в проекте, указав пространство имен для созданного класса. В моделируемых системах, использующих иерархию моделей, для каждой модели в иерархии можно указать разное пространство имен.

Сгенерированный интерфейс класса 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);

Настройка элементов данных модели в качестве элементов класса

Настройте видимость и доступ членов класса. При создании кода C++ из модели элементы данных 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:
    … 
  };
}

После задания видимости данных категории элементов модели можно настроить метод доступа к данным для определения способа создания методов 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, выходы отображаются как метод get на основе агрегированной структуры для категории элементов модели. Эта опция конфигурации не применяется к другим категориям элементов модели.

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

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 и 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 укажите объект «Сопоставления кодов», категорию элементов модели, свойство видимости данных и параметр видимости данных. Допустимые параметры видимости данных зависят от категории элемента модели.

    % 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 укажите объект Code Mappings, категорию элемента модели, свойство метода доступа к элементу и параметр метода доступа к элементу. Допустимые параметры метода доступа к элементу зависят от категории элемента модели и выбранной опции видимости данных.

    % 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');
    

Настройка функций модели как методов классов

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

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

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

Код инициализации модели. В начале кода приложения вызовите функцию один раз. Не используйте эту функцию для сброса структуры данных модели в реальном времени (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 можно подавить генерацию этой функции, очистив параметр конфигурации модели Обязательная функция завершения (установлено по умолчанию).

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 укажите объект «Сопоставления кодов» и категорию функций, которые требуется просмотреть для модели. Допустимыми опциями категории функций являются:

    • Функции

    • 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, имя функции модели, свойство имени метода и пользовательское имя. Допустимые имена функций модели указываются следующим образом:

    • Initialize - Инициализация функции.

    • Terminate - Завершить функцию.

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

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

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

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

    • ExportedFunction:slIdentifier - Функция симулятора, где 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 укажите объект Code Mappings, имя функции модели, свойство arguments и прототип метода. Допустимые имена функций модели указываются следующим образом:

    • Initialize - Инициализация функции.

    • Terminate - Завершить функцию.

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

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

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

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

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

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

    Параметр идентификатораПредварительный просмотр
    Значение (только для ввода)myPeriodic (argInport)
    Ссылка Const (только для ввода)myPeriodic (const & argInport)
    Указатель на КонстmyPeriodic (const * argInport)
    УказательmyPeriodic (* argInport)
    Указатель Const на 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++ (C++ Code) щелкните Просмотр кода (View Code). Созданный код появляется рядом с моделью в рабочем пространстве модели.

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

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

Соображения и ограничения

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

    Ограничения параметров, специфичных для экземпляра, включают в себя:

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

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

  • Поведение при генерации кода интерфейса - стиль аргументов ввода-вывода спецификации пошагового метода поддерживает односкоростные модели и многоскоростные модели с одной задачей. Многоскоростные многозадачные модели не поддерживаются. Кроме того, интерфейс инкапсуляции C++ не является интерфейсом по умолчанию, значение игнорируется для скалярных корневых входов с фиксированным размером Pass по значению параметра генерации кода.

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

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

    • Вставьте блок Simulink Signal Conversion сразу после корневого входа. В диалоговом окне Параметры блока преобразования сигналов выберите Исключить этот блок из оптимизации «Уменьшение блока».

  • Simscape™ Соображения. Если значение корневого входа модели соединяется с блоком Simscape, вставьте блок преобразования сигнала Simulink между корневым входом и блоком преобразования Simscape. В диалоговом окне Параметры блока преобразования сигналов выберите Исключить этот блок из оптимизации «Уменьшение блока».

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

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

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

См. также

| | | | | | | | | | |

Связанные примеры

Подробнее