Примените классы памяти к отдельному сигналу, состоянию и элементам данных параметра

storage class является настройкой генерации кода, что вы обращаетесь к элементу данных (сигнал, параметры блоков или состояние) в модели. Когда вы непосредственно применяете его к элементу данных, классу памяти:

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

  • Предотвращает оптимизацию, такую как Default parameter behavior и Signal storage reuse от устранения элемента данных от сгенерированного кода.

  • С Embedded Coder® можно сконфигурировать формат, в котором сгенерированный код хранит или в противном случае задает элемент данных. Например, можно применить спецификаторы типа хранения const или volatile или сконфигурировать элемент данных параметра, чтобы появиться как макрос (#define).

Непосредственно примените классы памяти к отдельным элементам данных к:

  • Настройки параметров и сигналы монитора и состояния во время выполнения.

  • Сконфигурируйте размещение данных в памяти через разделы памяти.

  • Сгенерируйте код, который обменивается данными (например, глобальные переменные) с вашим внешним кодом.

Для получения информации о применении классов памяти к категориям данных по умолчанию, при помощи Кода, Сопоставляющего Редактор, видят, Конфигурируют Генерацию кода По умолчанию для Данных (Embedded Coder).

Примените классы памяти к элементам данных

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

Исследуйте модель в качестве примера

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

open_system('rtwdemo_roll')

Перейдите в подсистему BasicRollMode.

open_system('rtwdemo_roll/BasicRollMode')

Подсистема содержит блок Integrator, который поддерживает часть данных состояния.

От корневого уровня модели перейдите в подсистему RollAngleReference.

open_system('rtwdemo_roll/RollAngleReference')

Подсистема содержит блок Constant, маркировал UpThr.

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

Примените классы памяти

  1. Перейдите к корневому уровню модели.

  2. Выберите View> Model Data Editor.

  3. Чтобы видеть элементы данных в подсистемах, активируйте кнопку Change scope.

  4. Выберите вкладку Signals.

  5. Установите представление Change выпадающий список на Code.

  6. В поле содержимого Фильтра введите integrator.

  7. Опционально, используйте столбец Имени, чтобы задать имя для выходного сигнала блока Integrator, такого как mySignal.

  8. Используйте столбец Класса памяти, чтобы применить класс памяти ExportedGlobal.

  9. Выберите вкладку Штатов.

  10. Опционально, используйте столбец Имени, чтобы задать имя для состояния, такого как myState.

  11. Используйте столбец Класса памяти, чтобы применить класс памяти ExportedGlobal.

  12. Выберите вкладку Parameters. Вы не можете применить класс памяти непосредственно к параметрам блоков. Вместо этого необходимо создать объект параметра, такой как Simulink.Parameter, использовать объект установить значение параметров блоков и применить класс памяти к объекту.

  13. Установите представление Change выпадающий список на Design.

  14. В поле содержимого Фильтра введите UpThr.

  15. Используйте Столбец значений, чтобы изменить значение параметров от 6 до UpThr.

  16. В то время как редактирование значения параметров, рядом с UpThr, кликает по кнопке действий (с тремя вертикальными точками) и выбирает Create.

  17. В диалоговом окне Create New Data, установленном Значении к Simulink.Parameter и нажимают ОК. Объект Simulink.Parameter под названием UpThr появляется в базовом рабочем пространстве.

  18. В диалоговом окне свойства UpThr, установленном Значении к 6 и Классе памяти к ExportedGlobal. Нажать ОК.

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

% Configure signal
portHandles = get_param('rtwdemo_roll/BasicRollMode/Integrator',...
    'PortHandles');
outportHandle = portHandles.Outport;
set_param(outportHandle,'Name','mySignal')
set_param(outportHandle,'StorageClass','ExportedGlobal')

% Configure state
set_param('rtwdemo_roll/BasicRollMode/Integrator',...
    'StateName','myState')
set_param('rtwdemo_roll/BasicRollMode/Integrator',...
    'StateStorageClass','ExportedGlobal')

% Configure parameter
set_param('rtwdemo_roll/RollAngleReference/UpThr','Value','UpThr')
UpThr = Simulink.Parameter(6);
UpThr.StorageClass = 'ExportedGlobal';

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

Сгенерируйте код из модели.

set_param('rtwdemo_roll','SystemTargetFile','grt.tlc')
rtwbuild('rtwdemo_roll')
### Starting build procedure for model: rtwdemo_roll
### Successful completion of build procedure for model: rtwdemo_roll

Осмотрите файл rtwdemo_roll.c. Файл задает глобальные переменные.

file = fullfile('rtwdemo_roll_grt_rtw','rtwdemo_roll.c');
rtwdemodbtype(file,'/* Exported block signals */','real32_T myState;',1,1)
/* Exported block signals */
real32_T mySignal;                     /* '<S1>/Integrator' */

/* Exported block parameters */
real32_T UpThr = 6.0F;                 /* Variable: UpThr
                                        * Referenced by: '<S3>/UpThr'
                                        */

/* Exported block states */
real32_T myState;                      /* '<S1>/Integrator' */

Файл rtwdemo_roll.h объявляет переменные. Чтобы получить доступ к этим переменным, ваш внешний код может включать (#include) этот заголовочный файл.

В rtwdemo_roll.c, поиск файл для имен переменных, таких как UpThr. Образцовый алгоритм в rtwdemo_roll_step функционирует чтения и записи к переменным.

Встроенные классы памяти можно выбрать

Установкой класса памяти по умолчанию для элемента данных является Auto, что означает, что генератор кода определяет, как элемент появляется в коде. Для списка встроенных классов памяти, которые можно выбрать, смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code.

Решите, где сохранить спецификацию класса памяти

Для каждого отдельного элемента данных состояния или сигнала (включая Блоки памяти Хранилища данных), к которому вы непосредственно применяете класс памяти, Simulink®stores ваша спецификация класса памяти или в образцовом файле или в свойствах, данные сигнала возражают (Simulink.Signal), который вы создаете в базовом рабочем пространстве, рабочем пространстве модели или словаре данных. Чтобы применить класс памяти к параметрам блоков, необходимо создать объект данных параметра (такой как Simulink.Parameter) и задать класс памяти в объекте.

  • Когда вы применяете класс памяти к сигналу или состоянию в модели, например, при помощи Model Data Editor или Property Inspector, вы храните спецификацию класса памяти в образцовом файле.

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

  • Когда вы создаете сигнал или объект данных параметра, вы применяете класс памяти при помощи свойства CoderInfo объекта. Значение свойства является объектом Simulink.CoderInfo, свойство StorageClass которого вы используете, чтобы задать класс памяти. После того, как вы сопоставите элемент данных в модели с объектом, элемент данных получает класс памяти от объекта.

Для сигналов состояния и Блоки памяти Хранилища данных, чтобы решить, сохранить ли спецификацию класса памяти в модели или в объекте данных, видят Атрибуты Проекта Хранилища Сигналов и состояний (Simulink).

Примените классы памяти к блокам выходного порта при помощи Model Data Editor

Можно использовать Model Data Editor, чтобы применить класс памяти непосредственно к блоку Outport корневого уровня или к входному сигналу, который управляет блоком.

  • Чтобы сохранить спецификацию класса памяти в блоке Outport, используйте вкладку Inports/Outports в Model Data Editor. Когда вы используете этот метод, спецификация остается после того, как вы удаляете входной сигнал, который управляет блоком. Используйте этот метод, чтобы сконфигурировать интерфейс модели, прежде чем вы разработаете внутренний алгоритм.

  • Чтобы сохранить спецификацию во входном сигнале, который управляет блоком, используйте вкладку Signals в Model Data Editor.

Методы, чтобы применить классы памяти в интерактивном режиме

Чтобы применить классы памяти к нескольким элементам данных в списке, который можно искать, отсортируйте, и фильтр, используйте Model Data Editor (View> Model Data Editor) как показано в Применяют Классы памяти к Элементам данных.

Чтобы применить класс памяти при фокусировке на одном сигнале, состояние блока или параметр, использует Property Inspector (View> Property Inspector), диалоговое окно Signal Properties (для сигнала) или диалоговое окно блока (для состояния или параметра). Под Code Generation примените класс памяти.

  • Для сигнала состояние или Блок памяти Хранилища данных, сначала дает сигнал или утверждает имя, которое генератор кода использует в качестве имени соответствующего глобального символа. Затем любой задает класс памяти с помощью Storage class (в этом случае образцовые хранилища файлов спецификация) или создает объект данных сигнала как показано в Объектах данных Использования в Моделях Simulink (Simulink) и применяет класс памяти к объекту.

Методы, чтобы применить классы памяти программно

Чтобы взаимодействовать с сигналом или объектом данных параметра, который вы храните в рабочем пространстве модели или словаре данных, используйте программируемый интерфейс рабочей области или словаря. Смотрите Взаимодействуют С Переменными Программно (Simulink).

Примените класс памяти непосредственно к сигнальной линии

Этот пример показывает, как программно применить класс памяти непосредственно к сигнальной линии.

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

    rtwdemo_secondOrderSystem

  2. Получите указатель на вывод блока под названием Сила: f (t).

    portHandles = ...
         get_param('rtwdemo_secondOrderSystem/Force: f(t)','PortHandles');
    outportHandle = portHandles.Outport;

  3. Определите имя соответствующего сигнала к ForceSignal.

    set_param(outportHandle,'Name','ForceSignal')

  4. Установите класс памяти сигнала к ExportedGlobal.

    set_param(outportHandle,'StorageClass','ExportedGlobal')

  5. Сгенерируйте код из модели. Код объявляет и задает глобальную переменную ForceSignal, чтобы представлять сигнал.

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

Этот пример показывает, как программно применить класс памяти к состоянию блока.

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

    rtwdemo_basicsc

  2. Назовите состояние блока Delay как myState.

    set_param('rtwdemo_basicsc/Delay','StateName','myState')

  3. Установите класс памяти состояния к ExportedGlobal.

    set_param('rtwdemo_basicsc/Delay',...
        'StateStorageClass','ExportedGlobal')

  4. Сгенерируйте код из модели. Код объявляет и задает глобальную переменную myState, чтобы представлять состояние.

Схема справочника настройки объекта параметра

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

Похожие темы