В Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра, вы управляете объявлением и определением глобальных переменных в сгенерированном коде путем применения классов памяти непосредственно к отдельным элементам данных. С Embedded Coder® и основанным на ERT системным конечным файлом, можно использовать custom storage classes для более точного управления способом, которым данные появляются в сгенерированном коде.
Чтобы достигнуть шаблонов кода С, таких как группирующие переменные в плоские структуры и управлять объявлением и размещением файла определения, можно использовать пользовательские классы памяти от встроенного пакета Simulink
.
Для получения информации о применении классов памяти к категориям данных по умолчанию, при помощи Кода, Сопоставляющего Редактор, видят, Конфигурируют Генерацию кода По умолчанию для Данных.
Для списка встроенных пользовательских классов памяти, которые можно выбрать, смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code.
Если пользовательские классы памяти от пакета Simulink
не удовлетворяют ваши требования, можно задать собственные классы памяти. Для получения информации об определении вашего собственного класса памяти смотрите, Создают Определения Кода, чтобы Заменить Настройки по умолчанию.
Чтобы непосредственно применить пользовательский класс памяти от встроенного пакета Simulink
в интерактивном режиме, используйте те же методы, которые вы используете, чтобы непосредственно применить стандартные классы памяти, описанный в Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.
Чтобы применить пользовательский класс памяти от пакета кроме Simulink
(такого как пакет, который вы создаете):
Чтобы применить пользовательский класс памяти к сигналу, состояние или Блок памяти Хранилища данных (не создавая объект данных), конфигурирует элемент данных, чтобы использовать пользовательские классы памяти от целевого пакета вместо пакета Simulink
. Например, если именем целевого пакета является myPackage
в диалоговом окне Signal Properties или Property Inspector, установите Signal object class на myPackage.Signal
. Если целевой класс не появляется в списке, смотрите, что Целевой Класс Не Появляется в Списке Классов объектов Сигнала.
Если вы используете Model Data Editor, чтобы идентифицировать целевой пакет, необходимо использовать различный метод. Смотрите Применяют Пользовательский Класс памяти от Определенного Пакета, чтобы Сигнализировать, состояние или Блок памяти Хранилища данных Используя Model Data Editor.
Чтобы применить пользовательский класс памяти при помощи объекта данных (требуемый для параметров блоков), вместо того, чтобы создать объект Simulink.Signal
или Simulink.Parameter
, создают объект myPackage.Signal
или myPackage.Parameter
. Чтобы создать объекты данных из вашего пакета, смотрите, Создают Объекты данных из Другого Пакета Класса Данных (Simulink). Для примера, который показывает, как создать и применить ваш собственный класс памяти, смотрите, Создают и Применяют Пользовательский Класс памяти.
Когда вы используете Signal object class выпадающий список в диалоговом окне или в Property Inspector, если класс, который вы хотите, не появляется в списке:
Из списка выберите Customize class lists
.
В диалоговом окне, под Signal classes, устанавливают флажок рядом с классом, который вы хотите. Например, чтобы использовать пользовательские классы памяти от встроенного пакета mpt
, установите флажок рядом с mpt.Signal
. Нажмите OK.
Если вы создали свой собственный пакет, классы, которые задает пакет, появляются в диалоговом окне, только если вы помещаете папку пакета в свою текущую папку или помещаете родительскую папку папки пакета на пути MATLAB®.
Из выпадающего списка выберите опцию, которая соответствует тому, что вы выбрали. Например, выберите mpt.Signal
.
Когда вы будете использовать Model Data Editor, чтобы применить пользовательские классы памяти от определенного пакета, используйте Model Explorer, чтобы создать объект сигнала из целевого пакета. Затем когда вы открываете Model Data Editor, отображения столбца Storage class пользовательские классы памяти от целевого пакета.
В панели Model Hierarchy Model Explorer выберите Base Workspace.
На панели инструментов кликните по стрелке рядом с кнопкой Add Signal.
В выпадающем списке выберите Customize class lists
.
В диалоговом окне Customize class lists выберите класс сигнала из целевого пакета. Нажмите OK.
На панели инструментов Model Explorer кликните по стрелке рядом с кнопкой Add Signal.
В выпадающем списке выберите целевой класс сигнала.
Объект целевого класса сигнала появляется в базовом рабочем пространстве. Опционально, удалите этот лишний объект.
Используйте Model Data Editor, чтобы применить пользовательские классы памяти от целевого пакета до других элементов данных. В Model Data Editor, в столбце Storage class, выпадающий список позволяет вам выбирать пользовательские классы памяти из целевого пакета.
Чтобы изучить, как использовать Model Data Editor, чтобы сконфигурировать интерфейс данных, смотрите Интерфейс Данных проектирования путем Конфигурирования Блоков Inport и Выходного порта (Simulink Coder).
Применять пользовательский класс памяти к отдельному элементу данных программно:
Создайте сигнал или объект данных параметра от целевого пакета. Например, создайте объект Simulink.Signal
или объект myPackage.Parameter
.
myParam = Simulink.Parameter(5.2);
Во вложенном объекте Simulink.CoderInfo
, набор свойство StorageClass
к 'Custom'
. Затем используйте свойство CustomStorageClass
задать пользовательский класс памяти.
myParam.CoderInfo.StorageClass = 'Custom'; myParam.CoderInfo.CustomStorageClass = 'ExportToFile';
Если пользовательский класс памяти позволяет вам задавать дополнительные настройки, такие как Header file (см., Указание имени файла и Другие Атрибуты Данных С Классом памяти (Embedded Coder)), во вложенном объекте Simulink.CoderInfo
, используйте свойство CustomAttributes
задать значения для дополнительных настроек.
myParam.CoderInfo.CustomAttributes.HeaderFile = 'myHeader.h';
Выберите один из этих методов, чтобы применить пользовательский класс памяти к элементу данных в модели:
Чтобы применить пользовательский класс памяти непосредственно к сигналу, состояние или Блок памяти Хранилища данных, называет сигнал или состояние. Затем используйте объект данных, который вы создали, чтобы установить свойство сигнала SignalObject
, параметры блоков SignalObject
(для блока Outport) или параметры блоков StateSignalObject
. Очистите объект данных, который вы создали. Для примера смотрите, Применяют Пользовательский Класс памяти Непосредственно к Сигнальной линии Программно.
Чтобы применить пользовательский класс памяти путем хранения объекта данных, вы создали (требуемый для параметров), сопоставьте объект данных с элементом данных в модели. Чтобы сделать эту ассоциацию, смотрите Объекты данных Использования в Моделях Simulink (Simulink).
Этот пример показывает, как применить пользовательский класс памяти непосредственно к сигнальной линии в модели без внешнего объекта данных.
Откройте модель rtwdemo_secondOrderSystem
в качестве примера.
rtwdemo_secondOrderSystem
Создайте указатель на вывод блока под названием Сила: f (t).
portHandles = get_param('rtwdemo_secondOrderSystem/Force: f(t)','PortHandles'); outportHandle = portHandles.Outport;
Определите имя соответствующего сигнала к ForceSignal
.
set_param(outportHandle,'Name','ForceSignal')
В базовом рабочем пространстве создайте объект сигнала и задайте пользовательский класс памяти и соответствующие дополнительные настройки, такие как HeaderFile
.
tempObj = Simulink.Signal; tempObj.CoderInfo.StorageClass = 'Custom'; tempObj.CoderInfo.CustomStorageClass = 'ExportToFile'; tempObj.CoderInfo.CustomAttributes.HeaderFile = 'myHdrFile.h';
Можно создать объект из пакета класса данных Simulink
, или из любого другого пакета, такого как пакет, который вы создаете.
Встройте объект сигнала в целевую сигнальную линию путем присоединения копии временного объекта рабочей области.
set_param(outportHandle,'SignalObject',tempObj);
Очистите объект от базового рабочего пространства. Сигнал теперь использует встроенную копию объекта.
clear tempObj
Чтобы изменить существующий встроенный объект сигнала, скопируйте объект в базовое рабочее пространство, измените копию и повторно прикрепите копию к сигналу или состоянию. Например, чтобы изменить пользовательский класс памяти встроенного объекта сигнала, в котором вы присоединили к ForceSignal
сигнала, Применяют Пользовательский Класс памяти Непосредственно к Сигнальной линии Программно:
Скопируйте существующий встроенный объект сигнала в базовое рабочее пространство.
tempObj = get_param(outportHandle,'SignalObject');
Измените свойства объекта в рабочей области.
tempObj.CoderInfo.CustomStorageClass='ImportFromFile'; tempObj.CoderInfo.CustomAttributes.HeaderFile = 'myOtherHdrFile.h';
Повторно прикрепите копию объекта сигнала.
set_param(outportHandle,'SignalObject',tempObj); clear tempObj
Struct
пользовательский класс памятиЭтот пример показывает, как использовать Struct
пользовательский класс памяти, чтобы организовать значения параметров блоков в структуру в сгенерированном коде. Вы применяете класс памяти непосредственно к отдельным элементам данных в модели.
Чтобы создать пользовательскую структуру данных о параметре в сгенерированном коде, рассмотрите создание соответствующей структуры в Simulink®. Смотрите Организуют Данные в Структуры в Сгенерированном коде.
Создайте модель ex_struct_param
с тремя блоками Константа и тремя блоками Выходного порта.
В модели выберите View> Model Data Editor.
В Model Data Editor выберите вкладку Parameters.
В модели выберите верхний блок Constant.
В Model Data Editor используйте столбец Value, чтобы установить постоянное значение к p1
.
Рядом с p1
кликните по кнопке действий и выберите Create.
В диалоговом окне Create New Data, набор Value к Simulink.Parameter(1.0)
и нажимают Create.
Объект Simulink.Parameter
под названием p1
появляется в базовом рабочем пространстве.
В диалоговом окне свойства для p1
нажмите OK.
Используйте Model Data Editor, чтобы установить другие постоянные значения при помощи объектов параметра под названием p2
(значение 2.0
) и p3
(значение 3.0
).
В Model Data Editor, набор Change view выпадающий список к Code
.
Нажмите кнопку Show/refresh additional information.
Таблица данных теперь содержит строки, которые соответствуют новым объектам параметра.
Используйте столбец Storage Class, чтобы применить пользовательский класс памяти Struct
ко всем трем объектам параметра.
Используйте столбец Struct Name, чтобы определить имя структуры к my_struct
.
Нажмите 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 };
Для получения информации об ограничениях смотрите Ограничения Класса памяти.