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

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

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

  • Имя

  • Тип данных

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

Для получения информации о модели в качестве примера и других примерах в этом ряду, смотрите, Генерируют код С от Алгоритма управления для Встраиваемой системы.

Открытая модель в качестве примера

Откройте модель в качестве примера, rtwdemo_PCG_Eval_P2.

open_system('rtwdemo_PCG_Eval_P2')

Объявление данных

Большинство языков программирования требует, чтобы вы объявили данные и функции перед использованием их. Объявление задает:

  • Осциллограф: область программы, которая имеет доступ к данным

  • Длительность: период, в который данные существуют в памяти

  • Тип данных: объем памяти выделяется для данных

  • Инициализация: значение, указатель на память или NULL

Комбинация осциллографа и длительности является классом памяти. Если вы не обеспечиваете начальное значение, большинство компиляторов присваивает нулевое значение или нулевого указателя.

Поддерживаемые типы данных включают:

  • 'double': Плавающая точка двойной точности

  • единственный: Плавающая точка с одинарной точностью

  • 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. В модели выберите View> Model Data Editor.

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

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

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

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

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

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

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

Объявите параметры блоков, настраиваемые или встроенные

Можно управлять приспособляемостью по умолчанию параметров блоков в сгенерированном коде. В диалоговом окне Configuration Parameters, на панели Оптимизации, настраивают установку для поведения параметра По умолчанию.

Для модели в качестве примера поведение параметра по умолчанию установлено в Inlined. По умолчанию параметры блоков появляются в коде как числовые литеральные значения, не как переменные, сохраненные в памяти. Можно использовать объекты Simulink.Parameter заменить встраивание и приспособляемость заповедника для отдельных параметров.

Включите объекты данных сигнала в сгенерированном коде

Убедитесь, что объекты данных сигнала (Simulink.Signal) появляются в сгенерированном коде. Для отдельных сигнальных линий в модели выбор опция имя Сигнала, должен решить к объекту Сигнала Simulink явным образом разрешить имя сигнала к объекту Simulink.Signal в словаре данных или рабочей области. В Model Data Editor, представлении Change набора к Code и устанавливают флажок в столбце Твердости.

Также можно выбрать опцию для всех сигналов в модели. В командной строке используйте функцию disableimplicitsignalresolution.

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

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

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

Создайте отчет генерации кода более легко просмотреть сгенерированные файлы. В Редакторе Simulink выберите Code> C/C ++ Code> Code Generation Report> 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 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'
   */
  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;

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

  • Встраивает инвариантные сигналы и параметры блоков, когда вы выбираете эту оптимизацию в образцовых параметрах конфигурации

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

  • Не создает глобальные переменные, которые соответствуют переменным MATLAB®

Напротив, пример кода показывает, что большинство структур данных по умолчанию было заменено пользовательскими объектами данных. Например, эти сигналы и параметры появляются как глобальные переменные в коде:

  • pos_rqst

  • fbk_1

  • I_Gain

  • I_OutMap

  • I_InErrMap

Однако локальная переменная rtb_IntegralGainShape и переменная состояния rtwdemo_PCG_Eval_P2_DWork.Discrete_Time_Integrator1_DSTAT все еще использует структуры данных Simulink® Coder™. Объекты данных не существуют для этих сущностей.

Сохраните данные модели в словаре данных

Когда вы заканчиваете свой сеанс работы с MATLAB, переменные, которые вы создаете в базовом рабочем пространстве, не сохраняются. Чтобы постоянно сохранить объекты данных и объекты шины, рассмотрите соединение модели со словарем данных.

  1. В модели в качестве примера выберите File> Model Properties> 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);

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

Разделение данных из модели предоставляет эти преимущества:

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

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

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

Многоуровневые модели, один набор данных

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

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

Для следующего примера в этом ряду смотрите Функции Раздела в Сгенерированном коде.

Похожие темы