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

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

  3. Чтобы сконфигурировать индивидуально настраиваемый интерфейс класса C++ для модели, создайте объект Code Mappings. Чтобы создать новый объект Code Mappings для модели, используйте функцию 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. Получите объект Code Mappings для своей модели. Чтобы получить объект, используйте функцию 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. Для получения дополнительной информации смотрите Выходной порт.

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

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

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

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

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

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

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

Метод

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

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

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

  1. Получите объект Code Mappings для модели. Чтобы получить объект, используйте функцию 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 функционируйте, задайте объект 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');
    

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

Сконфигурируйте имена метода класса и аргументы. Когда вы генерируете Код С++ из модели, функции модели появляются как методы класса в сгенерированном коде. Чтобы объединяться с внешним кодом или интерфейсными требованиями, можно настроить имя сгенерированных методов класса. Кроме того, для периодических функций тарифной ставки и Функций 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:
  … 
  };
}

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

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

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

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

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

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

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

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

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

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

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

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

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

    Опция идентификатораПредварительный просмотр
    Значение (Только Inports)myPeriodic (argInport)
    Ссылка const (Только Inports)myPeriodic (const & argInport)
    Указатель на ConstmyPeriodic (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++ Code, нажимают View Code. Сгенерированный код появляется около модели в рабочем пространстве модели.

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

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

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

  • Специфичная для экземпляра Поддержка Параметра — можно использовать аргументы параметра модели, чтобы сконфигурировать переменные рабочей области, которые были заданы в качестве аргументов. Можно сконфигурировать эти аргументы как члены парламента, не занимающие официального поста класса или в качестве отдельных аргументов, заданных вне класса. Чтобы сконфигурировать в классе, можно установить установку видимости данных на частный и сконфигурировать генерацию методов для получения и установки. Опционально, можно сконфигурировать значения члена класса, как задано в классе (setDatat(cm,'ModelParameterArguments','DataAccess','Direct')) или переданный ссылкой через конструктора класса (setDatat(cm,'ModelParameterArguments','DataAccess','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. Когда крест сигналов шины сослался контуры, модели, или используют невиртуальные шины или используют метод шага По умолчанию.

Смотрите также

| | | | | | | | | | |

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

Больше о