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

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

Чтобы достигнуть шаблонов кода С, таких как группирующие переменные в плоские структуры и управлять объявлением и размещением файла определения, можно использовать пользовательские классы памяти от встроенного пакета 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.

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

    • Чтобы применить пользовательский класс памяти непосредственно к сигналу, состояние или Блок памяти Хранилища данных, называет сигнал или состояние. Затем используйте объект данных, который вы создали, чтобы установить свойство сигнала 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 с тремя блоками Константа и тремя блоками Выходного порта.

  2. В модели выберите View> 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
};

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

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

Похожие темы