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

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

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

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

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

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

Общая процедура для генерации интерфейсов класса C++ к типовому кодексу следующие:

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

  2. Выберите язык C++ для своей модели.

  3. Выберите интерфейс C++ class кода, группирующий для вашей модели.

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

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

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

Примечание

Для примера генерации кода класса C++ см. модель rtwdemo_cppclass в качестве примера.

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

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

Примечание

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

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

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

  2. Сконфигурируйте модель, чтобы использовать системный конечный файл ert.tlc, обеспеченный MathWorks. Например, откройте диалоговое окно Configuration Parameters, перейдите к панели Code Generation, выберите целевое значение из меню System target file и нажмите Apply.

  3. На панели Code Generation диалогового окна Configuration Parameters, установленного параметр Language на C++.

    На Code Generation> панель Interface, проверяйте, что параметр Code interface packaging устанавливается на C++ class.

    Нажмите Apply.

    Примечание

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

  4. Перейдите к панели Interface диалогового окна Configuration Parameters и исследуйте подпанель Code interface.

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

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

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

    Примечание

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

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

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

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

    Смотрите Передающие Аргументы ввода-вывода для описаний этих средств управления.

  8. Выполните этот дополнительный шаг, только если вы хотите настроить настройку аргументов I/O, сгенерированных для вашего образцового метода шага.

    Примечание

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

    Если вы принимаете решение выполнить этот шаг, сначала необходимо проверять, что необходимая опция, Remove root level I/O zero initialization выбран на панели Optimization, и затем перешел назад к представлению I/O arguments step method Сконфигурировать диалогового окна интерфейса класса C++.

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

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

    Нажмите Apply и OK.

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

Примечание

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

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

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

Чтобы выбрать упаковку интерфейса C++ class кода, в диалоговом окне Configuration Parameters, на панели Code Generation, устанавливают параметр Language на C++. Затем в Code Generation> панель Interface, проверяйте, что параметр Code interface packaging устанавливается на C++ class:

Выбор этого значения:

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

  • Добавляют дополнительные параметры интерфейса класса C++, которые описаны в следующем разделе.

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

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

  • Multi-instance code error diagnostic

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

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

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

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

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

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

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

  • Parameter visibility

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

  • Parameter access

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

  • External I/O access

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

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

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

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

    Примечание

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

  • 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 (Simulink Coder)

    Для модели, содержащей блоки 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 для образцового класса.

Примечание

Чтобы использовать аргументы I/O разрабатывают метод шага, необходимо выбрать опцию Remove root level I/O zero initialization на панели Optimization диалогового окна Configuration Parameters.

  • 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, Pointer или 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. Если опция Configuration Parameters> Ignore custom storage classes выбран, очистите его.

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

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

    Примечание

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

    • CSCs со спецификациями Volatile.

    • CSCs типа Other, кроме GetSet.

  6. Создайте модель.

  7. В отчете генерации кода исследуйте файлы model.h и model.cpp, чтобы наблюдать использование CSCs в сгенерированном Коде С++.

Образцовый конструктор копии класса и оператор присваивания

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

  • Образцовая опция Use dynamic memory allocation for model block instantiation (Simulink Coder) установлена в on.

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

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

Примечание

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

Выборка кода ниже показов сгенерировала код model.h для образцового класса, который имеет участника указателя. (Ищите экземпляры 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++ управляет ограничениями

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

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

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

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

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

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

  • Интерфейс C++ class кода упаковочная опция не поддерживает некоторые параметры конфигурации модели Simulink. Выбор C++ class отключает следующие элементы в диалоговом окне Configuration Parameters:

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

    • Параметр 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, и это использует корневое значение импорта модели или вызывает подсистему, которая использует корневое значение импорта модели, необходимо сделать одно из следующих, чтобы сгенерировать код:

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

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

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

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

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

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

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

Похожие темы