Импортируйте технические требования из интерфейсного документа управления (ICD), сконфигурируйте настройки генерации кода для модели согласно техническим требованиям и сохраните настройки в словарях данных.
ICD описывает интерфейс данных между двумя компонентами программного обеспечения. Чтобы обмениваться и осуществлять обмен данными, компоненты объявляют и задают глобальные переменные, которые хранят значения сигналов и значения параметров. ICD называет переменные и перечисляет характеристики, такие как тип данных, физические единицы измерения и значения параметров. Когда вы создаете модели компонентов в Simulink, можно сконфигурировать сгенерированный код, чтобы соответствовать интерфейсной спецификации.
В этом примере ICD является рабочей книгой Microsoft® Excel®.
Перейдите к папке matlabroot/examples/ecoder
открытый. Скопируйте этот файл в перезаписываемую, рабочую папку:
ex_ICD_PCG.xls
Перейдите к папке matlabroot/examples/ecoder/main
открытый. Скопируйте этот файл в ту же перезаписываемую, рабочую папку:
ex_importICD_PCG.m
В Microsoft® Excel® или другой совместимой программе, откройте ex_ICD_PCG.xls
рабочая книга и представление первый рабочий лист, Signals
. Каждая строка рабочего листа описывает сигнал, который пересекает интерфейсный контур.
Смотрите значения ячеек в рабочем листе. Owner
столбец указывает на имя компонента, который выделяет память для каждого сигнала. DataType
столбец указывает на тип данных сигнала в памяти. Например, рабочий лист использует выражение Bus: EngSensors
чтобы представлять структуру вводят названный EngSensors
.
В Parameters
рабочий лист, Value
столбец указывает на значение каждого параметра. Если значение параметра является нескалярным, значение хранится в своем собственном отдельном рабочем листе, который имеет то же имя как параметр.
В Numeric Types
рабочий лист, каждая строка представляет именованный тип числовых данных. В этом ICD данные используют типы данных с фиксированной точкой (Fixed-Point Designer). IsAlias
столбец указывает, использует ли код С имя типа данных (например, u8En7
) или использует имя примитивного целочисленного типа данных, который соответствует размеру слова. DataScope
столбец указывает, экспортирует ли сгенерированный код или импортирует определение типа.
В Structure Types
рабочий лист, каждая строка представляет или тип структуры или поле типа структуры. Для типов структуры, значения в DataType
столбцом является struct
. Последующие строки, которые не используют struct
представляйте поля предыдущего типа структуры. Этот ICD задает тип структуры, EngSensors
, с четырьмя полями: throttle
, speed
, ego
, и map
.
В Enumerated Types
рабочий лист, похожий на Structure Types
рабочий лист, каждая строка представляет или перечислимый тип или член перечисления. Этот ICD задает перечислимый тип sldemo_FuelModes
.
Некоторые элементы данных в ICD принадлежат other component
, который является компонентом, который существует за пределами MATLAB. Создайте файлы кода, которые задают и объявляют эти внешние данные.
Создайте исходный файл ex_inter_sigs.c
в вашей текущей папке. Этот файл задает импортированный sensors
сигнала.
#include "ex_inter_sigs.h" EngSensors sensors; /* Instrument measurements. */
Создайте заголовочный файл ex_inter_sigs.h
в вашей текущей папке.
#include "ex_inter_types.h" extern EngSensors sensors; /* Instrument measurements. */
Создайте заголовочный файл ex_inter_types.h
в вашей текущей папке. Этот файл задает тип структуры EngSensors
и типы числовых данных, такие как u8En7
.
#ifndef INTER_TYPES_H__ #define INTER_TYPES_H__ typedef short s16En3; typedef short s16En7; typedef unsigned char u8En7; typedef short s16En15; /* Structure type for instrument measurements. */ typedef struct { /* Throttle angle. */ s16En3 throttle; /* Engine speed. */ s16En3 speed; /* EGO sensors. */ s16En7 ego; /* Manifold pressure. */ u8En7 map; } EngSensors; #endif
Запустите скрипт prepare_sldemo_fuelsys_dd
. Скрипт готовит системную модель, sldemo_fuelsys_dd
, для этого примера.
run(fullfile(matlabroot,'examples','ecoder','main','prepare_sldemo_fuelsys_dd'))
Откройте системную модель, sldemo_fuelsys_dd
.
sldemo_fuelsys_dd
Эта системная модель ссылается на модели контроллеров. В этом примере вы генерируете код от моделей контроллеров.
Откройте модели контроллеров, sldemo_fuelsys_dd_controller
.
sldemo_fuelsys_dd_controller
Элементы данных в моделях контроллеров относятся к Simulink.Signal
и Simulink.Parameter
объекты в базовом рабочем пространстве. Например, входной сигнал sensors
относится к Simulink.Signal
объект, который имеет то же имя. Эти объекты хранят настройки, такие как типы данных, значения параметров блоков и физические единицы измерения. Имена этих элементов данных и объектов совпадают с именами сигналов и параметров в ICD.
Чтобы сконфигурировать настройки генерации кода для элементов данных, импортируйте настройки из ICD.
Откройте скрипт в качестве примера ex_importICD_PCG
. Скрипт импортирует данные из каждого рабочего листа ICD в переменные в базовом рабочем пространстве. Это затем конфигурирует свойства Simulink.Signal
и Simulink.Parameter
объекты в базовом рабочем пространстве при помощи импортированных данных.
edit('ex_importICD_PCG')
Если базовое рабочее пространство уже содержит объект данных, который соответствует целевому элементу данных в ICD, скрипт конфигурирует свойства существующего объекта. Если объект не существует, скрипт создает объект.
Запустите ex_importICD_PCG
скрипт.
run('ex_importICD_PCG')
Скрипт конфигурирует объекты данных в базовом рабочем пространстве для генерации кода согласно техническим требованиям в ICD. Simulink.Bus
объект EngSensors
представляет тип структуры от ICD. Simulink.NumericType
объекты, такие как u8En7
, представляйте типы данных с фиксированной точкой.
Сконфигурируйте модели контроллеров, чтобы скомпилировать сгенерированный код в исполняемый файл путем очистки параметра конфигурации модели, Генерируют код только.
Сгенерируйте код от моделей контроллеров.
### Starting build procedure for model: sldemo_fuelsys_dd_controller ### Successful completion of build procedure for model: sldemo_fuelsys_dd_controller
Сгенерированный заголовочный файл sldemo_FuelModes.h
задает перечисление sldemo_FuelModes
.
typedef enum { LOW = 1, /* Default value */ RICH, DISABLED } sldemo_FuelModes;
Файл sldemo_fuelsys_dd_controller_types.h
включает (#include
) внешний заголовочный файл ex_inter_types.h
, который задает типы данных, такие как u8En7
и структура вводит EngSensors
.
#include "ex_inter_types.h"
Файл sldemo_fuelsys_dd_controller_private.h
включает заголовочный файл ex_inter_sigs.h
. Этот внешний заголовочный файл содержит extern
объявление sensors
сигнала, которым владеет различный компонент программного обеспечения.
Заголовочный файл данных global_data.h
объявляет экспортируемые параметры и сигнализирует, что ICD задает. Чтобы совместно использовать эти данные, другие компоненты могут включать этот заголовочный файл.
/* Exported data declaration */ /* Declaration for custom storage class: ExportToFile */ extern u8En7 PressEst[855]; /* Referenced by: '<S6>/Pressure Estimation' */ /* Lookup table to estimate pressure on sensor failure. */ extern s16En15 PumpCon[551]; /* Referenced by: '<S1>/Pumping Constant' */ /* Lookup table to determine pumping constant based on measured engine speed and manifold pressure. */ extern s16En15 RampRateKiZ[25]; /* Referenced by: '<S1>/Ramp Rate Ki' */ /* Lookup table to determine throttle rate. */ extern s16En3 SpeedEst[1305]; /* Referenced by: '<S7>/Speed Estimation' */ /* Lookup table to estimate engine speed on sensor failure. */ extern s16En7 ThrotEst[551]; /* Referenced by: '<S8>/Throttle Estimation' */ /* Lookup table to estimate throttle angle on sensor failure. */ extern sldemo_FuelModes fuel_mode; /* '<Root>/control_logic' */ /* Fueling mode of engine. Enrich air/fuel mixture on sensor failure. */ extern int16_T fuel_rate; /* '<S10>/Merge' */
Определения данных (выделение памяти) появляются в исходных файлах, которые ICD задает, params.c
и signals.c
. Например, params.c
задает и инициализирует параметр RampRateKiZ
.
s16En15 RampRateKiZ[25] = { 393, 786, 1180, 1573, 1966, 786, 1573, 2359, 3146, 3932, 1180, 2359, 3539, 4719, 5898, 1573, 3146, 4719, 6291, 7864, 1966, 3932, 5898, 7864, 9830 } ; /* Referenced by: '<S1>/Ramp Rate Ki' */
Алгоритм находится в модели step
функция в файле sldemo_fuelsys_dd_controller.c
. Алгоритм использует глобальные данные, которые идентифицирует ICD. Например, алгоритм использует значение fuel_mode
сигнала в
switch
блокируйтесь, чтобы управлять потоком выполнения.
/* SwitchCase: '<S10>/Switch Case' incorporates: * Constant: '<S11>/shutoff' */ switch (fuel_mode) { case LOW: /* Outputs for IfAction SubSystem: '<S10>/low_mode' incorporates: * ActionPort: '<S12>/Action Port' */ /* DiscreteFilter: '<S12>/Discrete Filter' incorporates: * DiscreteIntegrator: '<S1>/Discrete Integrator' */ DiscreteFilter_tmp = (int16_T)(int32_T)((int32_T)((int32_T)((int32_T) rtDWork.DiscreteIntegrator_DSTATE << 14) - (int32_T)(-12137 * (int32_T) rtDWork.DiscreteFilter_states_g)) >> 14);
Когда вы вносите изменения в ICD, можно снова использовать ex_importICD_PCG
скрипт, чтобы реконфигурировать модель. Измените владение sensors
сигнала, тип структуры и типы данных с фиксированной точкой от
other_component
к sldemo_fuelsys_dd_controller
.
В ICD, на signals
рабочий лист, для sensors
сигнала, установите эти значения ячеек:
Owner
к sldemo_fuelsys_dd_controller
HeaderFile
к global_data.h
DefinitionFile
к signals.c
На Numeric Types
рабочий лист, для типов данных с фиксированной точкой, набора:
DataScope
к Exported
HeaderFile
к exported_types.h
.
На Structure Types
рабочий лист, для структуры вводят EngSensors
Набор:
DataScope
к Exported
HeaderFile
к exported_types.h
.
Повторно выполните ex_importICD_PCG
скрипт.
Сгенерируйте код из модели.
### Starting build procedure for model: sldemo_fuelsys_dd_controller ### Successful completion of build procedure for model: sldemo_fuelsys_dd_controller
Сгенерированный файл exported_types.h
задает тип структуры EngSensors
и типы данных с фиксированной точкой.
typedef int16_T s16En3; typedef int16_T s16En7; typedef uint8_T u8En7; /* Structure type for instrument measurements. */ typedef struct { /* Throttle angle. */ s16En3 throttle; /* Engine speed. */ s16En3 speed; /* EGO sensors. */ s16En7 ego; /* Manifold pressure. */ u8En7 map; } EngSensors; typedef int16_T s16En15;
Файл signals.c
теперь включает определение sensors
сигнала.
/* Exported data definition */ /* Definition for custom storage class: ExportToFile */ sldemo_FuelModes fuel_mode; /* '<Root>/control_logic' */ /* Fueling mode of engine. Enrich air/fuel mixture on sensor failure. */ int16_T fuel_rate; /* '<S10>/Merge' */ /* Fuel rate setpoint. */ EngSensors sensors; /* '<Root>/sensors' */
Объекты и переменные, которые вы создаете в базовом рабочем пространстве (например, Simulink.Parameter
объекты), не сохранены с моделью. Когда вы заканчиваете свой сеанс работы с MATLAB, объекты и переменные не сохраняются. Чтобы постоянно хранить объекты и переменные, соедините одну или несколько моделей с одним или несколькими словарями данных.
Словари данных также позволяют вам отследить изменения, внесенные в объекты и переменные, который помогает вам к:
Согласуйте данные, хранимые в MATLAB с данными, хранимыми в ICD.
Экспортируйте данные от MATLAB до ICD.
В топ-модели, sldemo_fuelsys_dd
, на вкладке Modeling, в соответствии с Проектом, нажимают Link to Data Dictionary.
В диалоговом окне Model Properties нажмите New.
В Создавании нового диалогового окна Data Dictionary, Имени файла набора к sysDict
и нажмите Save.
Нажмите данные о Migrate.
Нажмите Change все модели в ответ на сообщение об использовании словаря для моделей, на которые ссылаются.
Нажмите Migrate в ответ на сообщение о копировании переменных, на которые ссылаются.
Переменные и объекты, что использование моделей существует в новом словаре данных sysDict.sldd
, который находится в вашей текущей папке. Эти три модели в иерархии модели - ссылки соединены с этим словарем.
Можно импортировать определение перечислимого типа sldemo_FuelModes
в словарь контроллера. Смотрите Перечисления в Словаре Данных (Simulink).
В этом примере вы используете Simulink.Signal
объекты задать атрибуты проекта, такие как типы данных, минимальные и максимальные значения и физические единицы измерения. Объекты сигнала хранят эти технические требования за пределами файла модели.
В качестве альтернативы можно сохранить эти технические требования в файле модели при помощи параметров блоков и параметров порта, к которым можно получить доступ через Model Data Editor, Property Inspector и другие диалоговые окна.
Чтобы решить, где сохранить технические требования, смотрите Атрибуты Проекта Хранилища Сигналов и состояний (Simulink).