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

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

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

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

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

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

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

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

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

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

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

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

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

Откройте модель 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. Откройте приложение Simulink Coder. Когда запрошено, изменение системный конечный файл к grt.tlc.

  3. Кликните по вкладке Model Data Editor.

  4. В Model Data Editor кликните по кнопке Change scope. Это расширяет списки элементов данных, чтобы включать в подсистемы.

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

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

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

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

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

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

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

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

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

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

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

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

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

  18. В диалоговом окне Create New Data, установленном Значении к Simulink.Parameter и местоположение к Base Workspace. Нажмите Create. Simulink.Parameter возразите названному UpThr появляется в базовом рабочем пространстве.

  19. В 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: rtwdemo_roll
### Generated code for 'rtwdemo_roll' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for: 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 Coder).

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Для сигнала состояние или блок Data Store Memory, сначала дает сигнал или утверждает имя, которое генератор кода использует в качестве имени соответствующего глобального символа. Затем любой задает класс памяти с помощью 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 представлять состояние.

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

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

Похожие темы