Задайте сигналы, состояния и параметры для включения в сгенерированный код.
Узнать, как управлять этими атрибутами данных в сгенерированном коде:
Имя
Тип данных
Класс хранения данных
Для получения информации о модели в качестве примера смотрите, Готовят Модель Алгоритма управления к генерации кода C.
Откройте модель в качестве примера, rtwdemo_PCG_Eval_P2
.
open_system('rtwdemo_PCG_Eval_P2')
Большинство языков программирования требует, чтобы вы объявили данные и функции перед использованием их. Объявление задает:
Осциллограф: область программы, которая имеет доступ к данным
Длительность: период, в который данные существуют в памяти
Тип данных: объем памяти выделяется для данных
Инициализация: значение, указатель на память или NULL
Комбинация осциллографа и длительности является классом памяти. Если вы не вводите начальное значение, большинство компиляторов присваивает нулевое значение или нулевого указателя.
Поддерживаемые типы данных включают:
double
Плавающая точка двойной точности
single
Плавающая точка с одинарной точностью
int8
: 8-битное целое число со знаком
uint8
: 8-битное целое число без знака
int16
: 16-битное целое число со знаком
uint16
: 16-битное целое число без знака
int32
: 32-битное целое число со знаком
uint32
: 32-битное целое число без знака
Фиксированная точка: 8-, 16-, 32-битные размеры слова
С классами памяти вы можете:
Сгенерируйте экспортируемые файлы с пользовательскими именами, которые содержат объявления глобальной переменной и определения.
Импортируйте пользовательские заголовочные файлы, которые содержат объявления глобальной переменной.
Сгенерируйте const
или volatile
введите спецификаторы в объявлениях.
Представляйте параметр как макрос (#define
или параметр компилятора).
Сигналы пакета или параметры в плоские структуры или битовые поля.
Этот пример использует объекты данных задать настройки генерации кода для данных. В качестве альтернативы можно сохранить настройки в модели при помощи диалоговых окон. Оба метода позволяют полный контроль над типом данных и классом памяти. Можно использовать оба метода в одной модели.
Этот пример фокусируется на этих типах объектов данных:
Сигнал
Параметр
Шина
Генератор кода использует объекты от базового рабочего пространства MATLAB или словаря данных Simulink. Можно создать и смотреть объекты с командами в командной строке или при помощи Model Data Editor или Model Explorer с Редактором Отображений Кода.
Как пример, смотрите определение Simulink.Signal
объект pos_cmd_one
, который модель создала в базовом рабочем пространстве:
Откройте приложение Embedded Coder.
На вкладке Modeling нажмите Model Data Editor.
В Model Data Editor смотрите вкладку Signals.
Нажмите кнопку дополнительной информации Show/refresh.
Рядом с полем содержимого Фильтра переключите Фильтр с помощью кнопки выбора.
В модели выберите pos_cmd_one
сигнальная линия. Теперь таблица данных содержит две строки: Тот, который соответствует сигнальной линии в модели и той, которая соответствует объекту сигнала в базовом рабочем пространстве. Для строки, которая соответствует сигнальной линии, устанавливается флажок Resolve, что означает, что сигнальная линия получает настройки от объекта сигнала.
Опционально, чтобы смотреть другие свойства объекта сигнала, настройте установку для представления Change выпадающий список.
В модели выберите pos_cmd_one
сигнальная линия и делает паузу на замещающем знаке, который, кажется, выше или ниже сигнальной линии открывает строку меню. Нажмите Добавить Сигнальную кнопку.
Откройте Редактор Отображений Кода, кликните по вкладке Signals. Смотрите pos_cmd_one
класс памяти сигнала.
Возвратитесь к Model Data Editor, переключите Фильтр с помощью кнопки выбора. Теперь таблица данных показывает эти сигнальные линии и объекты сигнала:
pos_cmd_one
pos_rqst
P_InErrMap
ThrotComm
ThrotComm
сигнал шины, который является инстанцированием Simulink.Bus
объект ThrottleCommands
. Если сигнал шины является невиртуальным, сигнал появляется как структура в коде С. Объекты шины не появляются в Model Data Editor. Однако можно смотреть объект в Model Explorer (Представление> Model Explorer).
Как в C, можно использовать определение шины (ThrottleCommands
) создать несколько экземпляров структуры. В диаграмме модели сигнал шины появляется как широкая линия с центральными тире.
Объект данных имеет свойства, включая которые вы конфигурируете для симуляции и для генерации кода:
DataType
(тип числовых данных для устройства хранения данных в сгенерированном коде)
StorageClass
(класс памяти для генерации кода)
Value
(значение параметров)
InitialValue
(начальное значение для сигнала)
Alias
(альтернативное имя для данных, которые генератор кода использует),
Dimensions
(размер и количество размерностей параметра или значения сигналов)
Complexity
(числовая сложность)
Unit
(физические единицы измерения, такие как cm)
Min
(минимальное значение)
Max
(максимальное значение)
Используйте свойство Description
задавать пользовательскую документацию для объектов данных.
Можно создать объекты данных для именованных сигналов, состояний и параметров. Чтобы сопоставить объект данных с построением, построение должно иметь имя.
Инструмент Data Object Wizard находит построения, для которых вы можете создать объекты данных, и затем создаете объекты для вас. Модель в качестве примера включает два сигнала, которые не сопоставлены с объектами данных: fbk_1
и pos_cmd_two
.
Найти сигналы и создать объекты данных для них:
1. Откройте мастер объекта данных.
dataobjectwizard('rtwdemo_PCG_Eval_P2')
2. Нажмите Find, чтобы найти построения кандидата.
3. Нажмите Select All, чтобы выбрать всех кандидатов.
4. Нажмите Create, чтобы создать объекты данных.
Мастер Объекта данных выполняет эквивалент следующих команд:
fbk_1 = Simulink.Signal; fbk_1.Dimensions = 1; fbk_1.DataType = 'double'; outport = get_param('rtwdemo_PCG_Eval_P2/fbk_1','PortHandles'); outport = outport.Outport; set_param(outport,'MustResolveToSignalObject','on') pos_cmd_two = Simulink.Signal; pos_cmd_two.Dimensions = 1; pos_cmd_two.DataType = 'double'; outport = get_param('rtwdemo_PCG_Eval_P2/PI_ctrl_2','PortHandles'); outport = outport.Outport; set_param(outport,'MustResolveToSignalObject','on')
Установите тип данных и класс памяти для каждого объекта данных. Чтобы сконфигурировать свойства объекта данных, смотрите соответствующую вкладку в Model Data Editor. Используйте представление Change выпадающий список, чтобы показать свойства проекта (такие как тип данных) и настройки генерации кода (такие как класс памяти).
В Model Data Editor смотрите вкладку Signals и нажмите кнопку дополнительной информации Show/refresh, чтобы отобразиться, информация для сигнала возражает, что Мастер Объекта данных создал. Затем сконфигурируйте эти свойства для объектов:
fbk_1
: Тип данных double
, класс памяти ImportedExtern
pos_cmd_two
: Тип данных double
, класс памяти ExportedGlobal
В качестве альтернативы можно использовать эти команды в командной строке, чтобы сконфигурировать объекты:
fbk_1.DataType = 'double'; fbk_1.StorageClass = 'ImportedExtern'; pos_cmd_two.DataType = 'double'; pos_cmd_two.StorageClass = 'ExportedGlobal';
С Embedded Coder® можно управлять размещением файла определений для параметров и констант. Модель в качестве примера пишет определения параметра файлу eval_data.c
.
Чтобы изменить размещение параметра и постоянных определений, установите опции размещения данных для настройки модели. В диалоговом окне Configuration Parameters сконфигурируйте опции на Генерации кода> панель Размещения Кода.
В модели в качестве примера смотрите панель Размещения Кода в диалоговом окне Configuration Parameters. Модель помещает определения данных в файл eval_data.c
и объявления в файле eval_data.h
.
Можно управлять приспособляемостью по умолчанию параметров блоков в сгенерированном коде путем установки поведения параметра Значения по умолчанию параметра конфигурации модели.
Для модели в качестве примера поведение параметра по умолчанию установлено в Inlined
. По умолчанию параметры блоков появляются в коде как числовые литеральные значения, не как переменные, сохраненные в памяти. Можно использовать Simulink.Parameter
объекты заменить встраивание и приспособляемость заповедника для отдельных параметров.
Убедитесь что объекты данных сигнала (Simulink.Signal
) появитесь в сгенерированном коде. Для отдельных сигнальных линий в модели выбор опция имя Сигнала, должен решить к объекту Сигнала Simulink явным образом разрешить имя сигнала к Simulink.Signal
объект в рабочей области или словаре данных. В Model Data Editor, представлении Change набора к Code
и установите флажок в столбце Твердости.
В качестве альтернативы можно выбрать опцию для всех сигналов в модели. В командной строке используйте disableimplicitsignalresolution
функция.
Сгенерируйте код из модели в качестве примера.
slbuild('rtwdemo_PCG_Eval_P2');
### Starting build procedure for: rtwdemo_PCG_Eval_P2 tf = logical 0 ### Successful completion of code generation for: rtwdemo_PCG_Eval_P2 Build Summary Top model targets built: Model Action Rebuild Reason ======================================================================================= rtwdemo_PCG_Eval_P2 Code generated Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 27.899s
Создайте отчет генерации кода более легко просмотреть сгенерированные файлы. В Редакторе Simulink выберите параметр конфигурации модели Открытый Отчет Модели.
Можно получить доступ к этим сгенерированным файлам:
rtwdemo_PCG_Eval_P2.c
: Задает функции инициализации и шаг. Использует заданные объекты данных.
eval_data.c
: Начальные значения присвоений к заданным параметрам. Настройка модели в частности устанавливает имя файла.
eval_data.h
: Обеспечивает extern
объявления данных о параметре. Настройка модели в частности устанавливает имя файла.
ert_main.c
: Задает функции планирования.
rtwdemo_PCG_Eval_P2.h
: Содержит определения типа структур по умолчанию, которые хранят сигнал, состояние и данные о параметре. Из-за настроек объекта данных, некоторые данные появляются в eval_data.c
вместо этого.
PCG_Eval_p2_private.h
: Объявляет частные (локальные) данные для сгенерированных функций.
rtwdemo_PCG_Eval_P2_types.h
: Объявляет структуру данных модели реального времени.
rtwtypes.h
: Обеспечивает отображение с типами данных, которые задает Simulink® Coder™ (typedef
). Используемый для интеграции с внешними системами.
Например, просмотрите файл eval_data.c
, который выделяет const
память для глобальных переменных, которые соответствуют Simulink.Parameter
объекты в базовом рабочем пространстве.
cfile = fullfile('rtwdemo_PCG_Eval_P2_ert_rtw','eval_data.c'); rtwdemodbtype(cfile,'/* Exported data definition */','* [EOF]',1,1)
/* Exported data definition */ /* Const memory section */ /* Definition for custom storage class: Const */ const real_T I_Gain = -0.03; const real_T I_InErrMap[9] = { -1.0, -0.5, -0.25, -0.05, 0.0, 0.05, 0.25, 0.5, 1.0 } ; const real_T I_OutMap[9] = { 1.0, 0.75, 0.6, 0.0, 0.0, 0.0, 0.6, 0.75, 1.0 } ; const real_T P_Gain = 0.74; const real_T P_InErrMap[7] = { -1.0, -0.25, -0.01, 0.0, 0.01, 0.25, 1.0 } ; const real_T P_OutMap[7] = { 1.0, 0.25, 0.0, 0.0, 0.0, 0.25, 1.0 } ; /* * File trailer for generated code. * * [EOF]
Просмотрите алгоритм кода в модели step
функция в файле rtwdemo_PCG_Eval_P2.c
. Алгоритм использует имена объекта данных непосредственно.
cfile = fullfile('rtwdemo_PCG_Eval_P2_ert_rtw','rtwdemo_PCG_Eval_P2.c'); rtwdemodbtype(cfile,'/* Model step function */',... '/* Sum: ''<S2>/Sum3'' incorporates:',1,0);
/* Model step function */ void rtwdemo_PCG_Eval_P2_step(void) { real_T Discrete_Time_Integrator1; real_T Discrete_Time_Integrator1_i; real_T rtb_IntegralGainShape; /* Sum: '<S2>/Sum2' incorporates: * Inport: '<Root>/fbk_1' * Inport: '<Root>/pos_rqst' */ rtb_IntegralGainShape = *pos_rqst - fbk_1; /* DiscreteIntegrator: '<S2>/Discrete_Time_Integrator1' */ if (rtwdemo_PCG_Eval_P2_DWork.Discrete_Time_Integrator1_SYSTE != 0) { /* DiscreteIntegrator: '<S2>/Discrete_Time_Integrator1' */ Discrete_Time_Integrator1 = rtwdemo_PCG_Eval_P2_DWork.Discrete_Time_Integrator1_DSTAT; } else { /* DiscreteIntegrator: '<S2>/Discrete_Time_Integrator1' incorporates: * Gain: '<S2>/Int Gain1' * Lookup_n-D: '<S2>/Integral Gain Shape' * Lookup_n-D: '<S3>/Integral Gain Shape' * Product: '<S2>/Product3' */ Discrete_Time_Integrator1 = I_Gain * look1_binlx(rtb_IntegralGainShape, (&(I_InErrMap[0])), (&(I_OutMap[0])), 8U) * rtb_IntegralGainShape * 0.001 + rtwdemo_PCG_Eval_P2_DWork.Discrete_Time_Integrator1_DSTAT; } /* End of DiscreteIntegrator: '<S2>/Discrete_Time_Integrator1' */
Без классов памяти и других настроек генерации кода, которые объекты данных задают, сгенерированный код:
Встраивает инвариантные сигналы и параметры блоков, когда вы выбираете эту оптимизацию в параметрах конфигурации модели
Сигналы входа и выхода модели мест, состояния блока и настраиваемые параметры в структурах глобальных данных
Не создает глобальные переменные, которые соответствуют переменным MATLAB®
В отличие от этого пример кода показывает, что большинство структур данных по умолчанию было заменено пользовательскими объектами данных. Например, эти сигналы и параметры появляются как глобальные переменные в коде:
pos_rqst
fbk_1
I_Gain
I_OutMap
I_InErrMap
Однако локальная переменная rtb_IntegralGainShape
и переменная состояния rtwdemo_PCG_Eval_P2_DWork.Discrete_Time_Integrator1_DSTAT
все еще используйте структуры данных генератора кода. Объекты данных не существуют для этих сущностей.
Когда вы заканчиваете свой сеанс работы с MATLAB, переменные, которые вы создаете в базовом рабочем пространстве, не сохраняются. Чтобы постоянно сохранить объекты данных и объекты шины, рассмотрите соединение модели со словарем данных.
В модели в качестве примера, на вкладке Modeling, в соответствии с Проектом, нажимают Link to Data Dictionary.
В диалоговом окне Model Properties нажмите New.
В диалоговом окне Create a New Data Dictionary, Имени файла набора к rtwdemo_PCG_Eval_dict
и нажмите Save.
В диалоговом окне Model Properties нажмите Apply.
Нажмите данные о Migrate.
Нажмите Migrate в ответ на сообщение о копировании переменных, на которые ссылаются.
Нажать ОК.
В качестве альтернативы, чтобы вручную переместить объекты в словарь данных, можно использовать программируемые команды:
% Create a list of the variables and objects that the target % model uses. usedVars = {Simulink.findVars('rtwdemo_PCG_Eval_P2').Name}; % Create a new data dictionary in your current folder. Link the model to % this new dictionary. dictObj = Simulink.data.dictionary.create('rtwdemo_PCG_Eval_dict.sldd'); set_param('rtwdemo_PCG_Eval_P2','DataDictionary','rtwdemo_PCG_Eval_dict.sldd') % Import only the target variables from the base workspace to the data % dictionary. importFromBaseWorkspace(dictObj,'clearWorkspaceVars',true,'varList',usedVars); saveChanges(dictObj);
Словарь данных постоянно хранит объекты, которые использует модель. Чтобы просмотреть содержимое словаря, кликните по значку данных модели в нижнем левом углу модели, затем щелкните по ссылке Словаря Данных. В панели Иерархии модели Model Explorer выберите узел Данных проектирования.
Разделение данных из модели предоставляет эти преимущества:
Одна модель, несколько наборов данных
Использование различных типов данных, чтобы изменить целенаправленное оборудование (например, для целей и фиксированной точки с плавающей точкой)
Использование различных значений параметров, чтобы изменить поведение алгоритма управления (например, для допускающих повторное использование компонентов с различными калибровочными значениями)
Многоуровневые модели, один набор данных
Совместное использование данных между моделями Simulink® в системе
Совместно используя данных между проектами (например, передача, механизм и контроллеры колеса могут все использовать тот же набор данных сообщения CAN),