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

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

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

  • Имя

  • Тип данных

  • Класс памяти данных

Для получения информации о примере см. Раздел «Подготовка модели алгоритма управления для генерации кода 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. Нажмите кнопку Показать/обновить дополнительные сведения.

  5. Рядом с полем Содержимое фильтра (Filter contents) переключите Фильтр (Filter) с помощью кнопки выбора.

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

  7. При необходимости, чтобы просмотреть другие свойства объекта сигнала, измените настройку в раскрывающемся списке Change view.

  8. В модели выберите pos_cmd_one сигнальная линия и пауза на многоточии, которая появляется выше или ниже сигнальной линии, чтобы открыть панель действий. Нажмите кнопку Add Signal (добавить сигнал).

  9. Откройте Редактор отображений кода, перейдите на вкладку Сигналы. Осмотрите pos_cmd_one класс памяти сигналов.

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

  • pos_cmd_one

  • pos_rqst

  • P_InErrMap

  • ThrotComm

ThrotComm является сигналом шины, который является экземпляром Simulink.Bus ThrottleCommands объекта. Если сигнал шины является невиртуальным, сигнал появляется как структура в коде С Объекты шины не появляются в Model Data Editor. Однако можно просмотреть объект в обозревателе моделей (View > Model Explorer).

Как и в C, можно использовать определение шины (ThrottleCommands) для создания нескольких образцов структуры. В диаграмму модели сигнал шины появляется как широкая линия с центральными штрихами.

Объект данных имеет свойства, которые вы конфигурируете для симуляции и генерации кода, включая:

  • DataType (тип числовых данных для хранения в сгенерированном коде)

  • StorageClass (класс памяти для генерации кода)

  • Value (значение параметра)

  • InitialValue (начальное значение для сигнала)

  • Alias (альтернативное имя данных, используемое генератором кода)

  • Dimensions (размер и количество размерностей параметра или значения сигналов)

  • Complexity (числовая сложность)

  • Unit (физические единицы измерения, такие как см)

  • Min (минимальное значение)

  • Max (максимальное значение)

Используйте свойство Description для задания пользовательской документации для объектов данных.

Добавление новых объектов данных

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

Инструмент «Мастер объектов данных» находит конструкции, для которых можно создавать объекты данных, а затем создает объекты для вас. Модель примера включает два сигнала, которые не связаны с объектами данных: fbk_1 и pos_cmd_two.

Чтобы найти сигналы и создать для них объекты данных:

1. Откройте мастер объектов данных.

dataobjectwizard('rtwdemo_PCG_Eval_P2')

2. Нажмите кнопку Найти, чтобы найти конструкции кандидата.

3. Щелкните Выбрать все (Select All), чтобы выбрать всех кандидатов.

4. Нажмите кнопку Создать, чтобы создать объекты данных.

Мастер объектов данных выполняет следующие команды:

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

В Model Data Editor смотрите вкладку Сигналы и нажмите кнопку Показать/обновить дополнительную информацию, чтобы отобразить информацию об объектах сигнала, созданных мастером объектов данных. Затем сконфигурируйте эти свойства для объектов:

  • 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.

Чтобы изменить размещение определений параметров и констант, установите опции размещения данных для строения модели. В диалоговом окне Параметры конфигурации настройте опции на панели Генерация кода > Размещение кода.

В модели примера смотрите панель Размещение кода (Code Placement) в диалоговом окне Параметры конфигурации (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
### 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 11.036s

Создайте отчет генерации кода, чтобы легче просмотреть сгенерированные файлы. В редакторе Simulink выберите параметр конфигурации модели Open Model Report.

Вы можете получить доступ к этим сгенерированным файлам:

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

  1. В модели примера, на вкладке Моделирование, в разделе Проекте, нажмите Ссылка на словарь данных.

  2. В диалоговом окне Свойства модели (Model Properties) нажмите кнопку Создать (New).

  3. В диалоговом окне «Создание нового словаря данных» установите значение «имя файла» rtwdemo_PCG_Eval_dict и нажмите «Сохранить».

  4. В диалоговом окне Свойств модели» нажмите «Применить».

  5. Щелкните Миграция данных.

  6. Нажмите Миграция в ответ на сообщение о копировании ссылочных переменных.

  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);

Словарь данных постоянно хранит объекты, которые использует модель. Чтобы просмотреть содержимое словаря, щелкните значок данных моделей в левом нижнем углу модели, затем щелкните ссылку Data Dictionary. На панели иерархии модели Model Explorer выберите узел Данные.

Отделение данных от модели обеспечивает следующие преимущества:

Одна модель, несколько наборов данных

  • Использование различных типов данных для изменения целевого оборудования (для примера, для целей с плавающей и фиксированной точками)

  • Использование различных значений параметров для изменения поведения алгоритма управления (для примера, для переиспользуемых компонентов с различными значениями калибровки)

Несколько моделей, один набор данных

  • Совместное использование данными между моделями Simulink ® в системе

  • Обмен данными между проектами (для примера, трансмиссии, двигателя и контроллеров колес могут использовать один и тот же набор данных сообщений CAN)

Похожие темы