Укажите сигналы, состояния и параметры для включения в создаваемый код.
Узнайте, как управлять этими атрибутами данных в сгенерированном коде:
Имя
Тип данных
Класс хранения данных
Сведения о модели примера см. в разделе Подготовка модели алгоритма управления для генерации кода 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. Можно создавать и проверять объекты с помощью команд в командной строке или с помощью редактора данных модели или обозревателя моделей с помощью редактора сопоставлений кодов.
В качестве примера проверьте определение Simulink.Signal объект pos_cmd_one, которую модель создала в базовом рабочем пространстве:
Откройте приложение Embedded Coder.
На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).
В Редакторе данных модели (Model Data Editor) проверьте вкладку Сигналы (Signals).
Нажмите кнопку Показать/обновить дополнительную информацию.
Рядом с полем Содержимое фильтра (Filter contents) переключите кнопку Фильтр с помощью выбора (Filter using selection).
В модели выберите pos_cmd_one сигнальная линия. Теперь таблица данных содержит две строки: одну, соответствующую сигнальной линии в модели, и одну, соответствующую сигнальному объекту в базовой рабочей области. Для строки, соответствующей сигнальной линии, установлен флажок Разрешить (Resolve), что означает, что сигнальная линия получает настройки от сигнального объекта.
При необходимости для проверки других свойств сигнального объекта настройте параметры раскрывающегося списка Изменить представление (Change view).
В модели выберите pos_cmd_one сигнальная линия и пауза на многоточии, которое появляется выше или ниже сигнальной линии, чтобы открыть панель действий. Нажмите кнопку Add Signal (Добавить сигнал).
Откройте редактор сопоставлений кодов и перейдите на вкладку «Сигналы». Осмотрите pos_cmd_one класс хранения сигналов.
Вернитесь в Редактор данных модели (Model Data Editor) и переключите Фильтр (Filter) с помощью кнопки выбора. Теперь таблица данных показывает эти сигнальные линии и сигнальные объекты:
pos_cmd_one
pos_rqst
P_InErrMap
ThrotComm
ThrotComm является сигналом шины, который представляет собой экземпляр Simulink.Bus объект ThrottleCommands. Если сигнал шины не является виртуальным, сигнал появляется как структура в коде C. Объекты шины не отображаются в редакторе данных модели. Однако объект можно проверить в обозревателе моделей («Вид» > «Обозреватель моделей»).
Как и в 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. Нажмите кнопку Найти (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) проверьте вкладку Сигналы (Signals) и нажмите кнопку Показать/обновить дополнительную информацию (Show/refresh additional information), чтобы отобразить информацию об объектах сигнала, созданных Мастером объектов данных (Data Object Wizard). Затем настройте следующие свойства для объектов:
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.
Можно управлять настраиваемостью параметров блока по умолчанию в сгенерированном коде, задав параметр конфигурации модели По умолчанию (Default parameter behavior).
Для примерной модели поведение параметра по умолчанию устанавливается равным Inlined. По умолчанию параметры блока отображаются в коде как числовые литеральные значения, а не как переменные, хранящиеся в памяти. Вы можете использовать Simulink.Parameter объекты для переопределения вложенности и сохранения настраиваемости для отдельных параметров.
Убедитесь, что объекты данных сигнала (Simulink.Signal) появляются в сгенерированном коде. Для отдельных сигнальных линий в модели выберите опцию Имя сигнала должно разрешаться в объект сигнала Simulink для явного разрешения имени сигнала в Simulink.Signal в рабочей области или словаре данных. В редакторе данных модели задайте для параметра «Изменить вид» значение 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 переменные, созданные в базовой рабочей области, не сохраняются. Для постоянного хранения объектов данных и объектов шины рекомендуется связать модель со словарем данных.
В примере модели на вкладке «Моделирование» в разделе «Модель» выберите «Связать со словарем данных».
В диалоговом окне Свойства модели (Model Properties) нажмите кнопку Создать (New).
В диалоговом окне «Создание нового словаря данных» задайте для параметра «Имя файла» значение rtwdemo_PCG_Eval_dict и нажмите кнопку «Сохранить».
В диалоговом окне Свойства модели (Model Properties) нажмите кнопку Применить (Apply).
Щелкните Перенос данных.
Щелкните Перенести в ответ на сообщение о копировании переменных, на которые имеются ссылки.
Нажмите кнопку ОК.
Кроме того, для переноса объектов в словарь данных вручную можно использовать программные команды:
% 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);
В словаре данных постоянно хранятся объекты, используемые моделью. Чтобы просмотреть содержимое словаря, щелкните значок данных модели в левом нижнем углу модели, а затем щелкните ссылку Словарь данных. На панели «Иерархия моделей» обозревателя моделей выберите узел «Конструкторские данные».
Разделение данных и модели обеспечивает следующие преимущества:
Одна модель, несколько наборов данных
Использование различных типов данных для изменения целевого аппаратного обеспечения (например, для целей с плавающей и фиксированной точками)
Использование различных значений параметров для изменения поведения алгоритма управления (например, для многократно используемых компонентов с различными значениями калибровки)
Несколько моделей, один набор данных
Совместное использование данных моделями Simulink ® в системе
Обмен данными между проектами (например, трансмиссия, двигатель и контроллеры колес могут использовать один и тот же набор данных сообщений CAN)