Настройте сгенерированные интерфейсы класса C++

Путем установки параметра конфигурации модели Code interface packaging (Simulink Coder) к C++ class, можно сгенерировать интерфейс класса C++ к типовому кодексу. Сгенерированный интерфейс инкапсулирует требуемые данные модели в атрибуты класса C++ и функции точки входа модели в методы класса C++. Преимущества инкапсуляции класса C++ включают:

  • Большее управление доступом к данным модели

  • Способность умножиться инстанцирует классов модели

  • Более легкое интегрирование типового кодекса в среды программирования на C++

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

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

  1. Сконфигурируйте свою модель, чтобы использовать основанный на ERT системный конечный файл, обеспеченный MathWorks®.

  2. В диалоговом окне Configuration Parameters, установленном эти параметры:

    • Установите Language на C++.

    • Установите Code interface packaging на C++ class.

  3. Опционально, сконфигурируйте связанные настройки интерфейса класса C++ для своего типового кодекса, с помощью графического интерфейса пользователя (GUI) или прикладного программного интерфейса (API).

  4. Сгенерируйте типовой кодекс и исследуйте результаты.

Чтобы начать с примером, смотрите Простое Использование Управления Классом C++. Для получения дополнительной информации о конфигурировании интерфейсов класса C++ для типового кодекса, смотрите, Настраивают Интерфейсы Класса C++ Используя Графические интерфейсы и Настраивают Интерфейсы Класса C++ Программно. Для ограничений, которые применяются, смотрите Ограничения Управления Интерфейсом Класса C++.

Для примера генерации кода класса C++ смотрите, Настраивают Интерфейс к Сгенерированному Коду С++, Который Вызван кодом С.

Простое использование управления классом C++

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

Для получения дополнительной информации об установке параметров класса C++, смотрите разделы, которые следуют этому примеру, начало Настраивают Интерфейсы Класса C++ Используя Графические интерфейсы.

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

  1. Откройте модель, для которой требуется сгенерировать интерфейсы класса C++ кода. Этот пример использует модель rtwdemo_counter. Сохраните копию модели к перезаписываемому местоположению.

  2. Сконфигурируйте модель, чтобы использовать основанный на ERT системный конечный файл, обеспеченный MathWorks.

  3. Установите параметр конфигурации модели Language на C++. Установка для параметра конфигурации модели Code interface packaging превращается в C++ class. Сохраните изменения конфигурации модели путем нажатия на Apply.

    Примечание

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

  4. Откройте панель Interface диалогового окна Configuration Parameters и исследуйте раздел Code interface. Когда вы выбираете C++ class интерфейс кода, группирующий для вашей модели, дополнительные средства управления интерфейсом класса C++ появляются в разделе Code interface. Смотрите Конфигурируют Параметры Интерфейса Кода С++ для описаний этих средств управления. Измените установки параметров согласно своим требованиям к приложению.

  5. Откройте Сконфигурировать диалоговое окно интерфейса класса C++ путем нажатия кнопки Configure C++ Class Interface. Используйте диалоговое окно, чтобы сконфигурировать метод шага для вашего сгенерированного класса модели. Диалоговое окно первоначально отображается представление для конфигурирования Default step method для класса модели. В этом представлении можно задать имя класса модели, имя метода шага и пространство имен для модели.

    Смотрите Конфигурируют Метод Шага для Вашего Класса Модели для описаний этих средств управления.

    Если стиль интерфейса по умолчанию удовлетворяет ваши потребности, шаги 6 - 8 пропуска.

  6. Если вы хотите, чтобы вход и выход модели корневого уровня был аргументами на методе шага, установите Function specification на I/O arguments step method. Диалоговое окно отображается представление для конфигурирования метода шага стиля аргументов I/O для класса модели. Смотрите Конфигурируют Метод Шага для Вашего Класса Модели для описаний средств управления.

  7. Нажмите кнопку Get Default Configuration. Подпанель Configure C++ class interface появляется. Подпанель отображает начальную интерфейсную настройку для вашей модели. Смотрите Передающие Аргументы ввода-вывода для описаний средств управления.

  8. Если вы хотите сконфигурировать аргументы I/O, сгенерированные для вашего метода шага модели, продолжить изменять и подтверждать интерфейс, пока вы не удовлетворены настройкой метода шага. Используйте средства управления диалоговым окном, чтобы сконфигурировать атрибуты аргумента I/O. Например, в подпанели Configure C++ class interface, в строке для Input аргумент, можно изменить значение Category от Value к Pointer и измените значение Qualifier от none к const *. Предварительный просмотр обновляется, чтобы отразить ваши изменения. Нажмите кнопку Validate, чтобы подтвердить модифицированную интерфейсную настройку. Чтобы сохранить ваши изменения, нажмите Apply и OK.

    Если вы выбираете not to configure I/O arguments, нажмите Cancel, чтобы выйти из диалогового окна.

  9. Сгенерируйте код для модели В представлении Code, рассмотрите сгенерированный код. Заметьте, что требуемые данные модели инкапсулируются в атрибуты класса C++, и функции точки входа модели инкапсулируются в методы класса C++. Например, избранный файл rtwdemo_counter.h видеть объявление класса для модели.

Если вы сконфигурировали пользовательские аргументы I/O для метода шага модели (дополнительный шаг 8), исследуйте сгенерированный код на метод шага в rtwdemo_counter.h и rtwdemo_counter.cpp. Аргументы должны отразить ваши изменения. Например, если вы внесли предложенные изменения для Input аргумент, входной параметр должен появиться как const int32_T *arg_Input.

Настройте интерфейсы класса C++ Используя графические интерфейсы

Выберите C ++ Class Code Interface Packaging

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

  1. Установите параметр конфигурации модели Language на C++.

  2. Установите параметр Code interface packing на C++ class.

Эти установки параметров:

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

Когда вы конфигурируете модель для, выбирают C++ class упаковка интерфейса кода, панель Interface показывает параметры, которые применяются к интерфейсу C++.

  • Multi-instance code error diagnostic

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

    • None — Возобновите сборку, не отображая диагностическое сообщение.

    • Warning — Возобновите сборку после отображения предупреждающего сообщения.

    • Error (значение по умолчанию) — Сборка аварийного прекращения работы после отображения сообщения об ошибке.

  • Remove error status field in real-time model data structure

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

    Выбирание этой опции может заставить генератор кода не использовать rtModel структура данных от сгенерированного кода.

  • Include model types in model class

    Включает определения типа модели в пространстве имен класса модели. Определения типа модели включают:

    • Импорт корневого уровня и выходные порты

    • Блокируйте вводы и выводы

    • Векторы DWork

    • Параметры блоков и постоянные параметры

    • Непрерывные состояния

    • Структура данных модели реального времени (rtM)

    Сгенерированный код уменьшает MISRA 7-3-1 нарушение.

  • Parameter visibility

    Задает, сгенерировать ли структуру параметров блоков как public, private, или protected элемент данных класса модели C++ (private по умолчанию).

  • Parameter access

    Задает, сгенерировать ли методы доступа для параметров блоков для класса модели C++ (None по умолчанию). Можно выбрать невстроенные методы доступа (Method) или встроенные методы доступа (Inlined method).

  • External I/O access

    Задает, сгенерировать ли методы доступа для сигналов ввода-вывода корневого уровня для класса модели C++ (Inlined structure-based method по умолчанию). Если вы хотите сгенерировать методы доступа, у вас есть следующие опции:

    • Сгенерируйте невстроенные или встроенные методы доступа.

    • Сгенерируйте методы доступа structure-based или per-signal. Можно сгенерировать серию набора и получить методы на основе на сигнал или сгенерировать всего один метод установки, который берет адрес внешней входной структуры в качестве аргумента и для внешних выходных параметров (если применимо), только каждый получает метод, который возвращает ссылку на внешнюю структуру output. Сгенерированный код для основанных на структуре методов доступа имеет следующую общую форму:

      class ModelClass {
      ...
         // Root inports set method
         void setExternalInputs(const ExternalInputs* pExternalInputs);
      
         // Root outports get method
         const ExternalOutputs & getExternalOutputs() const;
      }

    Этот параметр влияет на сгенерированный код, только если вы используете метод шага стиля по умолчанию в своем классе модели, не, если вы явным образом передаете аргументы для сигналов ввода-вывода корневого уровня при помощи метода шага стиля аргументов I/O. Для получения дополнительной информации смотрите Передающие Параметры по умолчанию и Передающие Аргументы ввода-вывода.

  • External I/O visibility

    Задает, сгенерировать ли структуру ввода-вывода корневого уровня как public, private, или protected элемент данных класса модели C++ (private по умолчанию).

  • Configure C++ Class Interface

    Открывает Сконфигурировать диалоговое окно интерфейса класса C++, которое позволяет вам сконфигурировать метод шага для своего класса модели. Для получения дополнительной информации смотрите, Конфигурируют Метод Шага для Вашего Класса Модели.

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

  • Terminate function required

    Задает, сгенерировать ли model_terminate метод (на по умолчанию). Эта функция содержит код завершения модели и должна быть вызвана как часть завершения работы системы.

  • Combine signal/state structures

    Задает, объединить ли глобальные блоки-сигналы и глобальные данные состояния в одну структуру данных в сгенерированном коде (очищенный по умолчанию). Выбор этого параметра уменьшает RAM и улучшает удобочитаемость сгенерированного кода.

  • Internal data visibility

    Задает, сгенерировать ли внутренние структуры данных, такие как ввод-вывод Блока, векторы DWork, модель Runtime, Нулевые пересечения и непрерывные состояния, как public, private, или protected элементы данных класса модели C++ (private по умолчанию).

  • Internal data access

    Задает, сгенерировать ли методы доступа для внутренних структур данных, таких как ввод-вывод Блока, векторы DWork, модель Runtime, Нулевые пересечения и непрерывные состояния, для класса модели C++ (None по умолчанию). Можно выбрать невстроенные методы доступа (Method) или встроенные методы доступа (Inlined method).

  • Generate destructor

    Задает, сгенерировать ли деструктор для класса модели C++ (выбранный по умолчанию).

  • Use dynamic memory allocation for model block instantiation

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

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

    • Если вы выбираете этот параметр, bad_alloc исключение может быть отображено на стандарт C++, если ошибка из памяти происходит во время использования new. Предоставьте код, чтобы отловить и обработать bad_alloc исключение в случае, если ошибка из памяти происходит для new вызовите во время конструкции объекта топ-модели.

    • Если вы выбираете Use dynamic memory allocation for model block instantiation, и базовая модель содержит блок Model, процесс сборки может сгенерировать конструктора копии и функции оператора присваивания в частном разделе класса модели. Цель функций состоит в том, чтобы предотвратить члены указателя в классе модели от того, чтобы быть скопированным другим кодом. Для получения дополнительной информации смотрите Конструктора Копии Класса Модели и Оператор присваивания.

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

Чтобы сконфигурировать метод шага для вашего класса модели, на Code Generation> панель Interface, нажимают кнопку Configure C++ Class Interface, которая доступна, когда вы выбираете C++ class интерфейс кода, группирующий для модели. В Сконфигурировать диалоговом окне интерфейса класса C++, которое появляется, сконфигурируйте метод шага для своего класса модели в любом из двух стилей:

Default step method поддерживает односкоростные модели и многоскоростные модели. Можно сконфигурировать модель для однозадачной операции или многозадачной операции. Этот метод также поддерживает виртуальные контуры пересечения шины.

I/O arguments step method поддерживает односкоростные модели и многоскоростные модели. Можно сконфигурировать модель для однозадачной операции.

Передача Параметров по умолчанию.  Сконфигурировать диалоговое окно интерфейса класса C++ первоначально отображается представление для конфигурирования Default step method для класса модели.

  • Step method name

    Позволяет вам задавать имя метода шага кроме значения по умолчанию, step.

  • Class name

    Позволяет вам задавать имя класса модели кроме значения по умолчанию, modelModelClass.

  • Namespace

    Позволяет вам задавать пространство имен для класса модели. Если задано, пространство имен испускается в сгенерированном коде для класса модели. Параметр Namespace обеспечивает средние значения определения объема классов модели C++. В иерархии модели - ссылки можно задать различное пространство имен для каждой модели, на которую ссылаются.

  • Step function preview

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

    Список аргументов ступенчатой функции имеет запись для каждого из портов I/O корневого уровня модели. Этот список не включает аргументы параметра модели, которые могут появиться в сгенерированном коде, когда модель используется в качестве модели, на которую ссылаются. Например, модель sldemo_mdlref_counter_paramargs имеет импорт с именем аргумента arg_input, выходной порт с именем аргумента arg_output, и насыщение блокируется, чьи пределы имеют имена аргумента параметра рабочей области lower_saturation_limit и upper_saturation_limit.

    Предварительный просмотр ступенчатой функции для этой модели:

    sldemo_mdlref_counter_paramargsModelClass :: step ( arg_input, * arg_output )

    Прототип функции в сгенерированном коде отличается от предварительного просмотра. Прототип в сгенерированном коде (с дополнительными аргументами параметра модели):

    sldemo_mdlref_counter_paramargsModelClass::step (
       real_T arg_input,
       real_T *arg_output,
       real_T rtp_lower_saturation_limit,
       real_T rtp_upper_saturation_limit)
    
  • Validate

    Подтверждает вашу настройку ступенчатой функции текущей модели. Панель Validation отображает состояние и объяснение отказа.

Передающие Аргументы ввода-вывода.  Если вы выбираете I/O arguments step method в меню Function specification диалоговое окно отображается представление для конфигурирования метода шага стиля аргументов I/O для класса модели.

  • Get Default Configuration

    Нажмите эту кнопку, чтобы получить начальную интерфейсную настройку, которая обеспечивает начальную точку для дальнейшей индивидуальной настройки.

  • Step function preview

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

  • Validate

    Подтверждает вашу настройку ступенчатой функции текущей модели. Панель Validation отображает состояние и объяснение отказа.

Когда вы нажимаете Get Default Configuration, подпанель Configure C++ class interface появляется в диалоговом окне, отображая начальную интерфейсную настройку. Например:

  • Step method name

    Позволяет вам задавать имя метода шага кроме значения по умолчанию, step.

  • Class name

    Позволяет вам задавать имя класса модели кроме значения по умолчанию, modelModelClass.

  • Namespace

    Позволяет вам задавать пространство имен для класса модели. Если задано, пространство имен испускается в сгенерированном коде для класса модели. Параметр Namespace обеспечивает средние значения определения объема классов модели C++. В иерархии модели - ссылки можно задать различное пространство имен для каждой модели, на которую ссылаются.

  • Order

    Отображает числовое положение каждого аргумента. Используйте кнопки Up и Down, чтобы изменить порядок аргументов.

  • Port Name

    Отображает имя порта каждого аргумента (не конфигурируемое использование этого диалогового окна).

  • Port Type

    Отображает тип порта, Inport или Outport, из каждого аргумента (не конфигурируемое использование этого диалогового окна).

  • Category

    Отображает передающий механизм для каждого аргумента. Чтобы изменить передающий механизм для аргумента, выберите ValueУказатель, или Reference в меню Category аргумента.

  • Argument Name

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

  • Qualifier

    Отображает const введите спецификатор для каждого аргумента. Чтобы изменить спецификатор для аргумента, выберите доступное значение из меню Qualifier аргумента. Возможные значения:

    • none

    • const Значение

    • const* (значение, на которое ссылается указатель)

    • const*const (на значение ссылаются указатель и сам указатель),

    • const & (значение, на которое ссылается ссылка)

Совет

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

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

Embedded Coder® обеспечивает управление пространством имен для определения объема классов модели, сгенерированных с помощью упаковки интерфейса класса C++ кода. В Сконфигурировать диалоговом окне интерфейса класса C++ используйте параметр Namespace, чтобы задать пространство имен для класса модели. Если задано, пространство имен испускается в сгенерированном коде для класса модели. Чтобы определить объем классов модели C++ в иерархии модели - ссылки, можно задать различное пространство имен для каждой модели, на которую ссылаются.

Для примера управления пространством имен см. модель rtwdemo_cppclass в качестве примера. Эта модель присваивает пространства имен можно следующим образом:

  • TopNS для модели rtwdemo_cppclass верхнего уровня

  • MiddleNS для модели rtwdemo_cppclass_refmid, на которую ссылаются,

  • BottomNS для модели rtwdemo_cppclass_refbot, на которую ссылаются,

Если вы создаете модель с ее настройками по умолчанию, можно исследовать сгенерированный заголовок и исходные файлы для каждой модели, чтобы видеть, где пространство имен испускается. Например, установка Namespace для модели rtwdemo_cppclass_refmid показывается ниже, сопровождается выборками испускаемого кода пространства имен в заголовке модели и исходных файлах.

42   // Class declaration for model rtwdemo_cppclass_refmid
43   namespace MiddleNS {
44     class MiddleClass {
45       // public data and function members
46      public:
47       // Model entry point functions
...
52       // model step function
53       void StepMethod(const real_T *arg_In1, const real_T &arg_In2, real_T
54                       *arg_Out1, real_T *arg_Out2);
...
87     };
88   }
15   #include "rtwdemo_cppclass_refmid.h"
16   #include "rtwdemo_cppclass_refmid_private.h"
17   
18   namespace MiddleNS
19   {
20     // Model step function
21     void MiddleClass::StepMethod(const real_T *arg_In1, const real_T &arg_In2,
22       real_T *arg_Out1, real_T *arg_Out2)
23     {
...
43     }
...
83   }

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

Можно сконфигурировать интерфейсы класса C++ для сборок щелчка правой кнопкой невиртуальных подсистем в моделях Simulink, если следующие требования удовлетворяются:

  • Модель сконфигурирована для C++ язык и C++ class упаковка интерфейса кода.

  • Подсистема конвертируема с блоком Model с помощью функционального Simulink.SubSystem.convertToModelReference. Для требований преобразования модели, на которые ссылаются смотрите страницу с описанием Simulink Simulink.SubSystem.convertToModelReference.

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

  1. Откройте содержание модели и выберите блок подсистемы.

  2. Введите следующую команду MATLAB®:

    RTW.configSubsystemBuild(gcb)

    где gcb функция Simulink gcb, возврат полного пути блока текущего блока.

    Эта команда открывается, подсистема, эквивалентная из Сконфигурировать класса C++, соединяют интерфейсом с диалоговой последовательностью, которая описана подробно в предыдущем разделе, Сконфигурируйте Метод Шага для Своего Класса Модели. (Для получения дополнительной информации об использовании команды MATLAB смотрите RTW.configSubsystemBuild.)

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

  4. Щелкните правой кнопкой по подсистеме и выберите C/C++ Code> Build This Subsystem.

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

Настройте интерфейсы класса C++ программно

Если вы выбираете опцию Code interface packaging C++ class для вашей модели можно использовать функции управления интерфейса класса C++ (перечисленный в Функциях управления Интерфейса Класса C++), чтобы программно сконфигурировать метод шага для класса модели.

Типичное использование этих функций включает:

  • Создайте и подтвердите новый интерфейс метода шага, начиная с конфигурационной информации по умолчанию из вашей модели Simulink

    1. Создайте интерфейс класса C++ модели специфичный с obj = RTW.ModelCPPDefaultClass или obj = RTW.ModelCPPArgsClass, где obj возвращает указатель на недавно созданный, пустой интерфейс класса C++.

    2. Присоедините интерфейс класса C++ к своей загруженной основанной на ERT модели Simulink с помощью attachToModel.

    3. Получите конфигурационную информацию интерфейса класса C++ по умолчанию из своей модели с помощью getDefaultConf.

    4. Используйте Get и Set функции, перечисленные в Функциях управления Интерфейса Класса C++, чтобы протестировать или сбросить имя класса модели и модель, продвигаются имя метода. Кроме того, если вы используете метод шага стиля аргументов I/O, можно протестировать и сбросить имена аргумента, положения аргумента, категории аргумента и спецификаторы типа аргумента.

    5. Подтвердите интерфейс класса C++ использование runValidation. (Если валидация перестала работать, используйте информацию о сообщении об ошибке thatrunValidation возвращается, чтобы решить проблемы.)

    6. Сохраните свою модель и затем сгенерируйте код с помощью rtwbuild функция.

  • Измените и подтвердите существующий интерфейс метода шага для модели Simulink

    1. Получите указатель на существующий интерфейс класса C++ модели специфичный, который присоединен к вашей загруженной основанной на ERT модели Simulink с помощью obj = RTW.getClassInterfaceSpecification(modelName), где modelName вектор символов, задающий имя загруженной основанной на ERT модели Simulink и obj возвращает указатель на интерфейс класса C++, присоединенный к заданной модели. Если модель не имеет присоединенной настройки интерфейса класса C++, функция возвращает [].

    2. Используйте Get и Set функции, перечисленные в Функциях управления Интерфейса Класса C++, чтобы протестировать или сбросить имя класса модели и модель, продвигаются имя метода. Кроме того, если возвращенный интерфейс использует метод шага стиля аргументов I/O, можно протестировать и сбросить имена аргумента, положения аргумента, категории аргумента и спецификаторы типа аргумента.

    3. Подтвердите интерфейс класса C++ использование runValidation. (Если валидация перестала работать, используйте информацию о сообщении об ошибке что runValidation возвращается, чтобы решить проблемы.)

    4. Сохраните свою модель и затем сгенерируйте код с помощью rtwbuild функция.

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

Функции управления интерфейса класса C++

ФункцияОписание
attachToModelПрисоедините интерфейс класса C++ модели специфичный к загруженной основанной на ERT модели Simulink
getArgCategoryПолучите категорию аргумента для порта модели Simulink от интерфейса класса C++ модели специфичного
getArgNameПолучите имя аргумента порта модели Simulink от интерфейса класса C++ модели специфичного
getArgPositionПолучите положение аргумента для порта модели Simulink от интерфейса класса C++ модели специфичного
getArgQualifierПолучите спецификатор типа аргумента для порта модели Simulink от интерфейса класса C++ модели специфичного
getClassNameПолучите имя класса от интерфейса класса C++ модели специфичного
getDefaultConfПолучите конфигурационную информацию по умолчанию для интерфейса класса C++ модели специфичного от модели Simulink, до которой это присоединяется
getNamespaceПолучите пространство имен от интерфейса класса C++ модели специфичного
getNumArgsПолучите количество аргументов метода шага от интерфейса класса C++ модели специфичного
getStepMethodNameПолучите имя метода шага от интерфейса класса C++ модели специфичного
RTW.configSubsystemBuildОткрытый графический интерфейс пользователя, чтобы сконфигурировать прототипа функции C или класс C++ взаимодействует через интерфейс для сборки щелчка правой кнопкой заданной подсистемы
RTW.getClassInterfaceSpecificationПолучите указатель на объект управления интерфейса класса C++ модели специфичный
runValidationПодтвердите интерфейс класса C++ модели специфичный против модели Simulink, к которой он присоединяется
setArgCategoryУстановите категорию аргумента для порта модели Simulink в интерфейсе класса C++ модели специфичном
setArgNameУстановите имя аргумента порта модели Simulink в интерфейсе класса C++ модели специфичном
setArgPositionУстановите положение аргумента для порта модели Simulink в интерфейсе класса C++ модели специфичном
setArgQualifierУстановите спецификатор типа аргумента для порта модели Simulink в интерфейсе класса C++ модели специфичном
setClassNameУстановите имя класса в интерфейсе класса C++ модели специфичном
setNamespaceУстановите пространство имен в интерфейсе класса C++ модели специфичном
setStepMethodNameУстановите имя метода шага в интерфейсе класса C++ модели специфичном

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

Следующий демонстрационный скрипт MATLAB конфигурирует метод шага для rtwdemo_counter класс модели, с помощью Функций управления Интерфейса Класса C++.

%% Open the rtwdemo_counter model
rtwdemo_counter

%% Select ert.tlc as the System Target File for the model
set_param(gcs,'SystemTargetFile','ert.tlc')

%% Select C++ as the target language for the model
set_param(gcs,'TargetLang','C++')

%% Select C++ class as the code interface packaging for the model
set_param(gcs,'CodeInterfacePackaging','C++ class')

%% Set required option for I/O arguments style step method (cmd off = GUI on)
set_param(gcs,'ZeroExternalMemoryAtStartup','off')

%% Create a C++ class interface using an I/O arguments style step method
a=RTW.ModelCPPArgsClass

%% Attach the C++ class interface to the model
attachToModel(a,gcs)

%% Get the default C++ class interface configuration from the model
getDefaultConf(a)

%% Move the Output port argument from position 2 to position 1
setArgPosition(a,'Output',1)

%% Reset the model step method name from step to StepMethod
setStepMethodName(a,'StepMethod')

%% Change the Input port argument name, category, and qualifier
setArgName(a,'Input','inputArg')
setArgCategory(a,'Input','Pointer')
setArgQualifier(a,'Input','const *')

%% Validate the function prototype against the model
[status,message]=runValidation(a)

%% if validation succeeded, generate code and build
if status
    rtwbuild(gcs)
end

Задайте пользовательский класс памяти для генерации кода класса C++

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

  1. Откройте основанную на ERT модель, для которой Language установлен в C++ и Code interface packaging установлен в C++ class.

  2. Откройте диалоговое окно Configuration Parameters.

  3. На Code Generation> панель Interface, установленный параметр Multi-instance code error diagnostic (Simulink Coder) к значению кроме Error.

  4. Если параметр, Ignore custom storage classes выбран, очистите его.

    Примените изменения.

  5. В модели выберите пользовательский класс памяти для параметра, сигнала или состояния. Например, выберите сигнал, откройте его диалоговое окно Properties и просмотрите его опции генерации кода. В Storage class выпадающий список выберите пользовательский класс памяти, и затем сконфигурируйте его атрибуты. Примените изменения.

    Генерация кода класса C++ не поддерживает следующие классы памяти:

    • Классы памяти с Volatile технические требования.

    • Классы памяти типа Other, кроме GetSet.

  6. Сгенерируйте код.

  7. Исследуйте файлы modelH и model.cpp наблюдать использование классов памяти в сгенерированном Коде С++.

Конструктор копии класса модели и оператор присваивания

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

  • Параметр конфигурации модели Use dynamic memory allocation for model block instantiation установлен.

  • Базовая модель содержит блок Model. Блок Model не прямо или косвенно в подсистеме, для которых параметров блоков Function packaging установлен в Reusable function.

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

Чтобы предотвратить генерацию этих функций, считайте очистку параметра Use dynamic memory allocation for model block instantiation.

Выборка кода ниже показов сгенерировала modelH код для класса модели, который имеет член указателя. (Ищите экземпляры MiddleClass_ptr). Конструктора копии и объявления оператора присваивания показывают полужирным.

class MiddleClass;    // class forward declaration for <S1>/Bottom model instance
typedef MiddleClass* MiddleClass_ptr;
...

// Class declaration for model cppclass_top
class Top {
...
  // private data and function members
 private:
  // Block signals
  BlockIO_cppclass_top cppclass_top_B;

  // Block states
  D_Work_cppclass_top cppclass_top_DWork;

  // Real-Time Model
  RT_MODEL_cppclass_top cppclass_top_M;

  // private member function(s) for subsystem '<Root>/Subsystem'
  void cppclass_top_Subsystem_Init();
  void cppclass_top_Subsystem_Start();
  void cppclass_top_Subsystem();

  //Copy Constructor
  Top(const Top &rhs);

  //Assignment Operator
  Top& operator= (const Top &rhs);

  // model instance variable for '<S1>/Bottom model instance'
  MiddleClass_ptr Bottom_model_instanceMDLOBJ1;
};

Интерфейс класса C++ управляет ограничениями

  • Если модель имеет пользовательскую ступенчатую функцию модели, для которой скалярный выход передается значением и обновляется в условно выполняемом контексте, сконфигурируйте выход, который будет передан указателем. В модели Configure класс C++ соединяют интерфейсом с диалоговым окном, набор Category к Pointer. Примеры условно выполняемого контекста включают:

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

    • Выход записан в в условно выполняемой подсистеме.

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

    • Выход записан в блоком Hit Crossing.

    • Выход записан в блоком Rate Transition.

  • C++ class значение для параметра конфигурации модели Code interface packaging не поддерживает некоторые параметры конфигурации модели Simulink. Выбор C++ class отключает эти параметры:

    • Подпанель Identifier format control на панели Identifiers

    • Параметр File customization template на панели Templates

      Код и шаблоны данных на панели Templates поддерживаются для C++ class генерация кода. Однако следующие функции файла шаблона, которые поддерживаются для других выборов языка, не поддерживаются для сгенерированного кода класса C++:

      • Текст свободной формы вне обрабатывает разделы по шаблону

      • Пользовательские лексемы

      • Команды TLC (<! > лексемы

    • Подпанель Global data placement (custom storage classes only) на панели Code Placement

    Выбор C++ class также отключает редактор Отображений Кода (см., Конфигурируют генерацию кода C По умолчанию для Категорий Данных модели и Функций). Вы не можете применить классы памяти по умолчанию, разделы памяти или шаблоны функций к модели.

  • Среди интерфейсов обмена данными, доступных на панели Interface диалогового окна Configuration Parameters, только, API-интерфейс C поддерживается для C++ class генерация кода. Если вы выбираете External mode или ASAP2 interface, генерация кода перестала работать с ошибкой валидации.

  • Стиль аргументов I/O спецификации метода шага поддерживает односкоростные модели и многоскоростные однозадачные модели, но не многоскоростные многозадачные модели.

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

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

    • Вставьте блок Simulink Signal Conversion сразу после корневого импорта. В диалоговом окне параметров блоков Signal Conversion выберите Exclude this block from 'Block reduction' optimization.

  • Если корневое значение импорта модели соединяется с блоком преобразования Simscape™, вставьте блок Simulink Signal Conversion между корневым импортом и блок преобразования Simscape. В диалоговом окне параметров блоков Signal Conversion выберите Exclude this block from 'Block reduction' optimization.

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

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

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

  • Если интерфейс инкапсуляции C++ не является значением по умолчанию, значение проигнорировано для параметра Pass fixed-size scalar root inputs by value for code generation. Для получения дополнительной информации смотрите скалярные корневые входные параметры фиксированного размера Передачи значением для генерации кода (Simulink).

Настройте интерфейс к сгенерированному коду С++, который вызван кодом С

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

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

Если начиная с новой модели:

  1. Создайте модель по крайней мере с одним импортом и по крайней мере одним выходным портом.

  2. Откройте приложение Embedded Coder.

  3. Установите Язык параметра конфигурации модели на C++.

  4. Установите упаковку интерфейса Code параметра конфигурации модели на C++ class.

  5. В диалоговом окне Model Configuration Parameters, на Генерации кода> Интерфейсная панель, нажимают Configure C ++ Class Interface. Настройте интерфейс по мере необходимости. Смотрите Настраивают Сгенерированные Интерфейсы Класса C++.

Об интерфейсах инкапсуляции C++

Сгенерированный класс C++ инкапсулирует данные модели и методы. Используя Embedded Coder®, интерфейс инкапсуляции конфигурируем через параметры конфигурации модели нейтральные и настройки модели специфичные. Интерфейс поддерживает два стиля интерфейсов метода шага модели: метод шага по умолчанию и аргументы I/O продвигаются метод. Используйте интерфейс стиля аргументов I/O, чтобы настроить прототип метода шага. Используйте и интерфейс стиля метода шага по умолчанию, чтобы достигнуть максимизируемого поддерживаемого набора функций включая виртуальные шины через контуры модели и многозадачный интерфейс.

open_system('rtwdemo_cppclass');

Сгенерируйте код

  1. Откройте модель rtwdemo_cppclass в качестве примера.

  2. Сохраните копию модели к перезаписываемому местоположению.

  3. Откройте приложение Embedded Coder.

  4. Сгенерируйте код.

  5. Исследуйте сгенерированный исходный код. Минимально, рассмотрите индивидуально настраиваемый шаг модели и классы инициализации ModelClass::step_method и ModelClass::initialize в файле rtwdemo_cppclass.cpp.

  6. Просмотрите интерфейсную настройку. В модели дважды кликните, желтая кнопка пометила View Interface Configuration. В качестве альтернативы в диалоговом окне Model Configuration Parameters на Генерации кода> Интерфейсная панель, нажмите Configure C ++ Class Interface. Наблюдайте индивидуально настраиваемые аргументы для ступенчатой функции и как они относятся к сгенерированному коду.

Превратитесь в параметры по умолчанию и восстановите модель

Если начиная с новой модели, заполните начальную настройку для интерфейса класса C++.

  1. В диалоговом окне Model Interface нажмите Get Default Configuration.

  2. Закройте диалоговое окно Model Interface.

  3. Закройте диалоговое окно Model Configuration Parameters.

  4. Сгенерируйте код.

  5. Используйте отчет генерации кода смотреть индивидуально настраиваемый шаг модели и классы инициализации ModelClass::step_method и ModelClass::initialize в файле rtwdemo_cppclass.cpp. Наблюдайте параметры по умолчанию для ступенчатой функции и как они относятся к сгенерированному коду.

Примените пользовательские аргументы и восстановите модель

  1. В модели дважды кликните, желтая кнопка пометила View Interface Configuration. В качестве альтернативы диалоговое окно Model Configuration Parameters, в Генерации кода> Интерфейсная панель, нажимает Configure C ++ Class Interface.

  2. В классе C++ Confgiure соединяют интерфейсом с диалоговым окном, Имя перемещаемого порта Out1 к верхней части порядка и набора его Категория к Value.

  3. Закройте Сконфигурировать диалоговое окно интерфейса класса C++.

  4. Закройте диалоговое окно Model Configuration Parameters.

  5. Сгенерируйте код.

  6. В сгенерированном файле rtwdemo_cppclass.cpp, смотрите индивидуально настраиваемый шаг модели и классы инициализации ModelClass::step_method и ModelClass::initialize. Заметьте, что пользовательские аргументы появляются в сгенерированном коде.

Сравните Интерфейс По умолчанию (Максимальная Поддержка) с Интерфейсом Аргументов ввода-вывода

rtwdemo_cppclass модель обеспечивает кнопки, чтобы переключить функциональную спецификацию для интерфейса класса C++ между методом шага по умолчанию (в многозадачном режиме), и аргументы I/O продвигаются метод.

  1. Сконфигурируйте функциональную спецификацию для метода шага по умолчанию путем двойного клика по желтой кнопке, пометил Use Default Interface in MultiTasking Mode.

  2. Сгенерируйте код.

  3. В сгенерированном коде смотрите шаг модели и классы инициализации.

  4. Сконфигурируйте функциональную спецификацию для метода шага аргументов I/O путем двойного клика по желтой кнопке, пометил Use I/O Arguments Interface.

  5. Сгенерируйте код.

  6. В сгенерированном коде смотрите шаг модели и классы инициализации.

Примените интерфейс класса C++ с моделями, на которые ссылаются,

rtwdemo_cppclass_refmid модель является моделью, на которую ссылаются, в модели rtwdemo_cppclass в качестве примера. Та модель, на которую ссылаются, показывает, как сгенерировать настраиваемый интерфейс класса C++ к сгенерированному коду для модели, на которую ссылаются, в иерархии модели - ссылки.

  1. Открытая модель rtwdemo_cppclass_refmid.

  2. Откройте приложение Embedded Coder.

  3. Дважды кликните Subsystem_with_MdlRef_blks блок. Затем дважды кликните middle_instance_1 блок.

  4. Просмотрите интерфейсную настройку в rtwdemo_cppclass_refmid модель. Дважды кликните желтая кнопка пометила View Interface Configuration. В качестве альтернативы в диалоговом окне Model Configuration Parameters, на Генерации кода> Интерфейсная панель, нажимают Configure C ++ Class Interface. Заметьте, что настройка для интерфейса класса для модели, на которую ссылаются, отличается от интерфейса класса для топ-модели (например, пространство имен отличается).

open_system('rtwdemo_cppclass_refmid');

Примените Смешанные Стили интерфейса C/C++ в Иерархии Модели - ссылки

rtwdemo_cppclass_refc модель является моделью, на которую ссылаются, в модели rtwdemo_cppclass в качестве примера. Та модель, на которую ссылаются, показывает, как использовать смешанные стили интерфейса в иерархии модели - ссылки. Модель использует стиль интерфейса кода С (скомпилированный с компилятором C++), в то время как другие модели в той же иерархии модели используют интерфейсы класса C++.

  1. Открытая модель rtwdemo_cppclass.

  2. Дважды кликните Subsystem_with_MdlRef_blks блок. Затем дважды кликните ref_c_instance блок.

  3. Откройте приложение Embedded Coder. Диалоговое окно кажется спрашивающим, хотите ли вы сгенерировать код для топ-модели rtwdemo_cppclass или для активной модели rtwdemo_cppclass_refc.

  4. Кликните по Открытой активной модели как по главной кнопке.

  5. В окне Simulink Editor, которое открывается для модели rtwdemo_cppclass_refc, откройте приложение Embedded Coder.

  6. Проверяйте установку упаковки интерфейса Code параметра конфигурации модели. Это установлено в функцию Одноразового использования (для прототипа функции C). Затем закройте диалоговое окно Model Configuration Parameters.

  7. Кликните по вкладке Code Mappings - C.

  8. В редакторе Отображений Кода кликните по вкладке Functions.

  9. Нажмите кнопку Update Code Mappings.

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

  11. Закройте модель.

open_system('rtwdemo_cppclass_refc');

Больше о

Для большего количества детали и ограничений, смотрите, Настраивают Сгенерированные Интерфейсы Класса C++ в документации Embedded Coder®.