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

В Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра, вы управляете объявлением и определением глобальных переменных в сгенерированном коде путем применения классов памяти непосредственно к отдельным элементам данных. С Embedded Coder® и основанным на ERT системным конечным файлом, можно иметь более точный контроль над способом, которым данные появляются в сгенерированном коде.

Чтобы достигнуть шаблонов кода С, таких как сгруппированные переменные в плоские структуры и управлять объявлением и размещением файла определения, можно использовать классы памяти, доступные с Embedded Coder, от встроенного пакета Simulink.

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

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

Для списка встроенных классов памяти, которые можно выбрать, смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code.

Создайте свой собственный класс памяти

Если классы памяти от Simulink пакет не удовлетворяет вашим требованиям, можно задать собственные классы памяти. Для получения информации об определении вашего собственного класса памяти смотрите, Создают Определения Кода, чтобы Заменить Настройки по умолчанию.

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

Непосредственно применять класс памяти от встроенного пакета Simulink в интерактивном режиме используйте методы, описанные в, Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.

Применять класс памяти от пакета кроме Simulink (такие как пакет, который вы создаете):

Целевой класс не появляется в списке классов объектов сигнала

Когда вы используете Signal object class выпадающий список в диалоговом окне или в Property Inspector, если класс, который вы хотите, не появляется в списке:

  1. Из списка выберите Customize class lists.

  2. В диалоговом окне, под Signal classes, устанавливают флажок рядом с классом, который вы хотите. Например, чтобы использовать классы памяти от встроенного пакета mpt, установите флажок рядом с mpt.Signal. Нажмите OK.

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

  3. Из выпадающего списка выберите опцию, которая соответствует тому, что вы выбрали. Например, выберите mpt.Signal.

Примените класс памяти от определенного пакета, чтобы сигнализировать, состояние или блок Data Store Memory Используя Model Data Editor

Когда вы будете использовать Model Data Editor, чтобы применить классы памяти от определенного пакета, используйте Model Explorer, чтобы создать объект сигнала из целевого пакета. Затем когда вы открываете Model Data Editor, классы памяти отображений столбца Storage class от целевого пакета.

  1. В панели Model Hierarchy Model Explorer выберите Base Workspace.

  2. На панели инструментов кликните по стреле рядом с кнопкой Add Signal.

  3. В выпадающем списке выберите Customize class lists.

  4. В диалоговом окне Customize class lists выберите класс сигнала из целевого пакета. Нажмите OK.

  5. На панели инструментов Model Explorer кликните по стреле рядом с кнопкой Add Signal.

  6. В выпадающем списке выберите целевой класс сигнала.

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

  7. Используйте Model Data Editor, чтобы применить классы памяти от целевого пакета до других элементов данных. В Model Data Editor, в столбце Storage class, выпадающий список позволяет вам выбирать классы памяти из целевого пакета.

Чтобы изучить, как использовать Model Data Editor, чтобы сконфигурировать интерфейс данных, смотрите Интерфейс Данных проектирования путем Конфигурирования Блоков Inport и Выходного порта (Simulink Coder).

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

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

  1. Создайте сигнал или объект данных параметра от целевого пакета. Например, создайте Simulink.Signal возразите или myPackage.Parameter объект.

    myParam = Simulink.Parameter(5.2);

  2. Во вложенном Simulink.CoderInfo объект, набор StorageClass свойство к 'Custom'. Затем используйте CustomStorageClass свойство задать класс памяти.

    myParam.CoderInfo.StorageClass = 'Custom';
    myParam.CoderInfo.CustomStorageClass = 'ExportToFile';

  3. Если класс памяти позволяет вам задавать дополнительные настройки, такие как Header file (см., Указание имени файла и Другие Атрибуты Данных С Классом памяти (Embedded Coder)), во вложенном Simulink.CoderInfo объект, используйте CustomAttributes свойство задать значения для дополнительных настроек.

    myParam.CoderInfo.CustomAttributes.HeaderFile = 'myHeader.h';

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

    • Чтобы применить класс памяти непосредственно к сигналу, состояние или блок Data Store Memory, называет сигнал или состояние. Затем используйте объект данных, который вы создали, чтобы установить SignalObject свойство сигнала, SignalObject параметры блоков (для блока Outport), или StateSignalObject параметры блоков. Очистите объект данных, который вы создали. Для примера смотрите, Применяют Класс памяти Непосредственно к Сигнальной линии Программно.

    • Чтобы применить класс памяти путем хранения объекта данных, вы создали (требуемый для параметров), сопоставьте объект данных с элементом данных в модели. Чтобы сделать эту ассоциацию, смотрите Объекты данных Использования в Моделях 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. В базовом рабочем пространстве создайте объект сигнала и задайте класс памяти и соответствующие дополнительные настройки, такие как HeaderFile.

    tempObj = Simulink.Signal;
    tempObj.CoderInfo.StorageClass = 'Custom';
    tempObj.CoderInfo.CustomStorageClass = 'ExportToFile';
    tempObj.CoderInfo.CustomAttributes.HeaderFile = 'myHdrFile.h';

    Можно создать объект из пакета класса данных Simulink, или от любого другого пакета, такого как пакет, который вы создаете.

  5. Встройте объект сигнала в целевую сигнальную линию путем присоединения копии временного объекта рабочей области.

    set_param(outportHandle,'SignalObject',tempObj);

  6. Очистите объект от базового рабочего пространства. Сигнал теперь использует встроенную копию объекта.

    clear tempObj
    

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

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

  1. Скопируйте существующий встроенный объект сигнала в базовое рабочее пространство.

    tempObj = get_param(outportHandle,'SignalObject');

  2. Измените свойства объекта в рабочей области.

    tempObj.CoderInfo.CustomStorageClass='ImportFromFile';
    tempObj.CoderInfo.CustomAttributes.HeaderFile = 'myOtherHdrFile.h';

  3. Повторно прикрепите копию объекта сигнала.

    set_param(outportHandle,'SignalObject',tempObj);
    clear tempObj

Организуйте данные о параметре в структуру при помощи Struct Класс памяти

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

Чтобы создать пользовательскую структуру данных о параметре в сгенерированном коде, рассмотрите создание соответствующей структуры в Simulink®. Смотрите Организуют Данные в Структуры в Сгенерированном коде.

  1. Создайте ex_struct_param модель с тремя блоками Constant и тремя блоками Outport.

  2. На вкладке Modeling нажмите Model Data Editor.

  3. В Model Data Editor выберите вкладку Parameters.

  4. В модели выберите верхний блок Constant.

  5. В Model Data Editor используйте столбец Value, чтобы установить постоянное значение к p1.

  6. Рядом с p1, кликните по кнопке действий и выберите Create.

  7. В диалоговом окне Create New Data, набор Value к Simulink.Parameter(1.0) и нажмите Create.

    Simulink.Parameter возразите названному p1 появляется в базовом рабочем пространстве.

  8. В диалоговом окне свойства для p1, нажмите OK.

  9. Используйте Model Data Editor, чтобы установить другие постоянные значения при помощи объектов параметра под названием p2 (значение 2.0) и p3 (значение 3.0).

  10. В Model Data Editor, набор Change view выпадающий список к Code.

  11. Нажмите кнопку Show/refresh additional information.

    Таблица данных теперь содержит строки, которые соответствуют новым объектам параметра.

  12. Используйте столбец Storage Class, чтобы применить класс памяти Struct ко всем трем объектам параметра.

  13. Используйте столбец Struct Name, чтобы определить имя структуры к my_struct.

  14. Нажмите Ctrl+B, чтобы сгенерировать код.

Файл ex_struct_param.h задает тип структуры, my_struct_type.

/* Type definition for custom storage class: Struct */
   typedef struct my_struct_tag {
      real_T p1;
      real_T p2;
      real_T p3;
   } my_struct_type;

Файл ex_struct_param.c задает глобальную переменную my_struct.

/* Definition for custom storage class: Struct */
my_struct_type my_struct = {
     /* p1 */
     1.0,

     /* p2 */
     2.0,

     /* p3 */
     3.0
};

Ограничения класса памяти

Для получения информации об ограничениях смотрите Ограничения Класса памяти.

Похожие темы