Сконфигурируйте интерфейс данных в сгенерированном коде

Задайте сигналы, состояния и параметры для включения в сгенерированный код.

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

  • Имя

  • Тип данных

  • Класс хранения данных

Для получения информации о модели в качестве примера смотрите, Готовят Модель Алгоритма управления к генерации кода 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 или параметр компилятора).

  • Сигналы пакета или параметры в плоские структуры или битовые поля.

Управляйте данными в Simulink® и Stateflow®

Этот пример использует объекты данных задать настройки генерации кода для данных. В качестве альтернативы можно сохранить настройки в модели при помощи диалоговых окон. Оба метода позволяют полный контроль над типом данных и классом памяти. Можно использовать оба метода в одной модели.

Этот пример фокусируется на этих типах объектов данных:

  • Сигнал

  • Параметр

  • Шина

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

Как пример, смотрите определение Simulink.Signal объект pos_cmd_one, который модель создала в базовом рабочем пространстве:

  1. Откройте приложение Embedded Coder.

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

  3. В Model Data Editor смотрите вкладку Signals.

  4. Нажмите кнопку дополнительной информации Show/refresh.

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

  6. Рядом с полем содержимого Фильтра переключите Фильтр с помощью кнопки выбора.

  7. В модели выберите pos_cmd_one сигнальная линия. Теперь таблица данных содержит две строки: Тот, который соответствует сигнальной линии в модели и той, которая соответствует объекту сигнала в базовом рабочем пространстве. Для строки, которая соответствует сигнальной линии, устанавливается флажок Resolve, что означает, что сигнальная линия получает настройки от объекта сигнала.

  8. Опционально, чтобы смотреть другие свойства объекта сигнала, настройте установку для представления Change выпадающий список.

В Model Data Editor переключите Фильтр с помощью кнопки выбора. Теперь таблица данных показывает эти сигнальные линии и объекты сигнала:

  • pos_cmd_one: Выход верхнего уровня, дважды, Экспортируемая Глобальная переменная

  • pos_rqst: Вход верхнего уровня, дважды, Импортированный Указатель Экстерна

  • P_InErrMap: Калибровочный параметр, Автоматический, Постоянный

  • ThrotComm: Структура output верхнего уровня, Автоматическая, Экспортируемая Глобальная переменная

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 функция.

Просмотрите объекты данных в сгенерированном коде

Сгенерируйте код из модели в качестве примера.

rtwbuild('rtwdemo_PCG_Eval_P2');
### Starting build procedure for: rtwdemo_PCG_Eval_P2
### Successful completion of code generation for: rtwdemo_PCG_Eval_P2

Создайте отчет генерации кода более легко просмотреть сгенерированные файлы. В Редакторе 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 rtb_IntegralGainShape;
  real_T Discrete_Time_Integrator1;
  real_T Discrete_Time_Integrator1_i;

  /* Sum: '<S2>/Sum2' incorporates:
   *  Inport: '<Root>/fbk_1'
   *  Inport: '<Root>/pos_rqst'
   */
  rtb_IntegralGainShape = *pos_rqst - fbk_1;

  /* DiscreteIntegrator: '<S2>/Discrete_Time_Integrator1' incorporates:
   *  Gain: '<S2>/Int Gain1'
   *  Lookup_n-D: '<S2>/Integral  Gain Shape'
   *  Product: '<S2>/Product3'
   */
  if (rtwdemo_PCG_Eval_P2_DWork.Discrete_Time_Integrator1_SYSTE != 0) {
    Discrete_Time_Integrator1 =
      rtwdemo_PCG_Eval_P2_DWork.Discrete_Time_Integrator1_DSTAT;
  } else {
    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, переменные, которые вы создаете в базовом рабочем пространстве, не сохраняются. Чтобы постоянно сохранить объекты данных и объекты шины, рассмотрите соединение модели со словарем данных.

  1. В модели в качестве примера, на вкладке Modeling, в соответствии с Проектом, нажимают Link to Data Dictionary.

  2. В диалоговом окне Model Properties нажмите New.

  3. В диалоговом окне Create a New Data Dictionary, Имени файла набора к rtwdemo_PCG_Eval_dict и нажмите Save.

  4. В диалоговом окне Model Properties нажмите Apply.

  5. Нажмите данные о Migrate.

  6. Нажмите Migrate в ответ на сообщение о копировании переменных, на которые ссылаются.

  7. Нажать ОК.

В качестве альтернативы, чтобы вручную переместить объекты в словарь данных, можно использовать программируемые команды:

% 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),

Похожие темы