Используя Code interface packaging (Simulink Coder) опция C++ class
, на Code Generation> панель Interface диалогового окна Configuration Parameters, можно сгенерировать интерфейс класса C++ к типовому кодексу. Сгенерированный интерфейс инкапсулирует требуемые данные модели в атрибуты класса C++ и образцовые функции точки входа в методы класса C++. Преимущества инкапсуляции класса C++ включают:
Большее управление доступом к данным модели
Способность умножиться инстанцирует образцовых классов
Более легкое интегрирование типового кодекса в среды программирования на C++
Инкапсуляция класса C++ также работает на сборки щелчка правой кнопкой невиртуальных подсистем. (Для получения информации о требованиях, которые применяются, смотрите, Конфигурируют Интерфейсы Класса C++ для Невиртуальных Подсистем.)
Общая процедура для генерации интерфейсов класса C++ к типовому кодексу следующие:
Сконфигурируйте свою модель, чтобы использовать системный конечный файл ert.tlc
, обеспеченный MathWorks®.
Выберите язык C++
для своей модели.
Выберите интерфейс C++ class
кода, группирующий для вашей модели.
Опционально, сконфигурируйте связанные настройки интерфейса класса C++ для своего типового кодекса, с помощью или графического интерфейса пользователя (GUI) или прикладного программного интерфейса (API).
Сгенерируйте типовой кодекс и исследуйте результаты.
Чтобы начать с примером, смотрите Простое Использование Управления Классом C++. Для получения дополнительной информации о конфигурировании интерфейсов класса C++ для вашего типового кодекса, смотрите, Настраивают Интерфейсы Класса C++ Используя Графические интерфейсы и Настраивают Интерфейсы Класса C++ Программно. Для ограничений, которые применяются, смотрите Ограничения Управления Интерфейсом Класса C++.
Для примера генерации кода класса C++ см. модель rtwdemo_cppclass
в качестве примера.
Настройте интерфейсы класса C++ Используя графические интерфейсы
Задайте пользовательский класс памяти для генерации кода класса C++
Этот пример иллюстрирует простое использование упаковки интерфейса C++ class
кода. Это генерирует C + интерфейсы класса кода из модели в качестве примера без обширных модификаций к настройкам по умолчанию.
Для получения дополнительной информации об установке параметров класса C++, смотрите разделы, которые следуют этому примеру, начало Настраивают Интерфейсы Класса C++ Используя Графические интерфейсы.
Сгенерировать интерфейсы класса C++ для модели Simulink®:
Откройте модель, для которой требуется сгенерировать интерфейсы класса C++ кода. Этот пример использует модель rtwdemo_counter
.
Сконфигурируйте модель, чтобы использовать системный конечный файл ert.tlc
, обеспеченный MathWorks. Например, откройте диалоговое окно Configuration Parameters, перейдите к панели Code Generation, выберите целевое значение из меню System target file и нажмите Apply.
На панели Code Generation диалогового окна Configuration Parameters, установленного параметр Language на C++
.
На Code Generation> панель Interface, проверяйте, что параметр Code interface packaging устанавливается на C++ class
.
Нажмите Apply.
Сразу сгенерировать стиль по умолчанию кода класса C++, не исследуя связанные образцовые параметры конфигурации, шаги 4-8 пропуска и перейти непосредственно к шагу 9.
Перейдите к панели Interface диалогового окна Configuration Parameters и исследуйте подпанель Code interface.
Когда вы выбираете интерфейс C++ class
кода, группирующий для вашей модели, дополнительные средства управления интерфейсом класса C++ становятся доступными в подпанели Code interface. Смотрите Конфигурируют Опции Интерфейса Кода для описаний этих средств управления. Вы можете хотеть изменить настройки по умолчанию согласно своему приложению.
Нажмите кнопку Configure C++ Class Interface. Это действие открывает Сконфигурировать диалоговое окно интерфейса класса C++, которое позволяет вам конфигурировать метод шага для своего сгенерированного образцового класса. Диалоговое окно первоначально отображается представление для конфигурирования Default step method для образцового класса. В этом представлении можно задать образцовое имя класса, имя метода шага и пространство имен для модели.
Смотрите Конфигурируют Метод Шага для Вашего Образцового Класса для описаний этих средств управления.
Если стиль интерфейса по умолчанию удовлетворяет ваши потребности, можно пропустить шаги 6-8 и перейти непосредственно к шагу 9.
Если вы хотите, чтобы вход и выход модели корневого уровня был аргументами на методе шага, выберите значение I/O arguments step method
из меню Function specification. Диалоговое окно отображается представление для конфигурирования метода шага стиля аргументов I/O для образцового класса.
Смотрите Конфигурируют Метод Шага для Вашего Образцового Класса для описаний этих средств управления.
Нажмите кнопку Get Default Configuration. Это действие заставляет подпанель Configure C++ class interface появляться в диалоговом окне. Подпанель отображает начальную интерфейсную настройку для вашей модели, которая обеспечивает отправную точку для дальнейшей индивидуальной настройки.
Смотрите Передающие Аргументы ввода-вывода для описаний этих средств управления.
Выполните этот дополнительный шаг, только если вы хотите настроить настройку аргументов 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.
Сгенерируйте код для модели. Когда сборка завершается, отчет генерации кода для 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++ для невиртуальных подсистем
Чтобы выбрать упаковку интерфейса 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
в модель, на которую ссылаются.
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++ для сборок щелчка правой кнопкой невиртуальных подсистем в моделях Simulink, если следующие требования удовлетворяются:
Модель сконфигурирована для языка C++
и упаковки интерфейса C++ class
кода.
Подсистема конвертируема к блоку Model с помощью функционального Simulink.SubSystem.convertToModelReference
. Для образцовых требований преобразования, на которые ссылаются смотрите страницу с описанием Simulink Simulink.SubSystem.convertToModelReference
.
Чтобы сконфигурировать интерфейсы класса C++ для подсистемы, которая удовлетворяет требования:
Откройте содержание модели и выберите блок подсистемы.
Введите следующую команду MATLAB®:
RTW.configSubsystemBuild(gcb)
где gcb
является функцией Simulink gcb
, возвращая полный путь блока текущего блока.
Эта команда открывается, подсистема, эквивалентная из Сконфигурировать класса C++, соединяют интерфейсом с диалоговой последовательностью, которая описана подробно в предыдущем разделе, Сконфигурируйте Метод Шага для Своего Образцового Класса. (Для получения дополнительной информации об использовании команды MATLAB смотрите RTW.configSubsystemBuild
.)
Используйте Сконфигурировать диалоговые окна интерфейса класса C++, чтобы сконфигурировать настройки класса C++ для подсистемы.
Щелкните правой кнопкой по подсистеме и выберите C/C++ Code> Build This Subsystem.
Когда сборка подсистемы завершается, можно исследовать интерфейсы класса C++ в сгенерированных файлах и отчете генерации кода HTML.
Если вы выбираете опцию Code interface packaging C++ class
для вашей модели, можно использовать функции управления интерфейса класса C++ (перечисленный в Функциях управления Интерфейса Класса C++), чтобы программно сконфигурировать метод шага для образцового класса.
Типичное использование этих функций включает:
Создайте и подтвердите новый интерфейс метода шага, начиная с конфигурационной информации по умолчанию из вашей модели Simulink
Создайте образцово-специфичный интерфейс класса C++ с
или obj = RTW.ModelCPPDefaultClass
, куда obj = RTW.ModelCPPArgsClass
возвращает указатель на недавно созданный, пустой интерфейс класса C++.obj
Присоедините интерфейс класса C++ к своей загруженной основанной на ERT модели Simulink с помощью attachToModel
.
Получите конфигурационную информацию интерфейса класса C++ по умолчанию из своей модели с помощью getDefaultConf
.
Используйте Get
и функции Set
, перечисленные в Функциях управления Интерфейса Класса C++, чтобы протестировать или сбросить образцовое имя класса и образцовое имя метода шага. Кроме того, если вы используете метод шага стиля аргументов I/O, можно протестировать и сбросить имена аргумента, положения аргумента, категории аргумента и спецификаторы типа аргумента.
Подтвердите интерфейс класса C++ использование runValidation
. (Если валидация перестала работать, используйте информацию о сообщении об ошибке thatrunValidation
, возвращается, чтобы решить проблемы.)
Сохраните свою модель и затем сгенерируйте код с помощью функции rtwbuild
.
Измените и подтвердите существующий интерфейс метода шага для модели Simulink
Получите указатель на существующий образцово-специфичный интерфейс класса C++, который присоединен к вашей загруженной основанной на ERT модели Simulink с помощью
, где obj = RTW.getClassInterfaceSpecification(modelName)
является вектором символов, задающим имя загруженной основанной на ERT модели Simulink, и modelName
возвращает указатель на интерфейс класса C++, присоединенный к заданной модели. Если модель не имеет присоединенной настройки интерфейса класса C++, функция возвращает obj
[]
.
Используйте Get
и функции Set
, перечисленные в Функциях управления Интерфейса Класса C++, чтобы протестировать или сбросить образцовое имя класса и образцовое имя метода шага. Кроме того, если возвращенный интерфейс использует метод шага стиля аргументов I/O, можно протестировать и сбросить имена аргумента, положения аргумента, категории аргумента и спецификаторы типа аргумента.
Подтвердите интерфейс класса C++ использование runValidation
. (Если валидация перестала работать, используйте информацию о сообщении об ошибке, которую runValidation
возвращает, чтобы решить проблемы.)
Сохраните свою модель и затем сгенерируйте код с помощью функции 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
Сконфигурировать параметр Simulink, сигнал или состояние, чтобы использовать пользовательский класс памяти (CSC) с генерацией кода класса C++:
Откройте основанную на ERT модель, для которой Language установлен в C++
, и Code interface packaging установлен в C++ class
.
Откройте диалоговое окно Configuration Parameters.
На Code Generation> панель Interface, набор Multi-instance code error diagnostic (Simulink Coder) параметр к значению кроме Error
.
Если опция Configuration Parameters> Ignore custom storage classes выбран, очистите его.
Примените изменения.
В модели выберите пользовательский класс памяти для параметра, сигнала или состояния. Например, выберите сигнал, откройте его диалоговое окно Properties и просмотрите его опции генерации кода. В Storage class выпадающий список выберите пользовательский класс памяти, и затем сконфигурируйте его атрибуты. Примените изменения.
Генерация кода класса C++ не поддерживает следующий CSCs:
CSCs со спецификациями Volatile
.
CSCs типа Other
, кроме GetSet
.
Создайте модель.
В отчете генерации кода исследуйте файлы
и model.h
, чтобы наблюдать использование CSCs в сгенерированном Коде С++.model.cpp
Генерация кода автоматически добавляет конструктора копии и оператор присваивания к объявлениям класса 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++ соединяют интерфейсом с диалоговым окном настройки, набор 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).