В этом примере показано, как сконфигурировать настройки генерации кода для модели согласно спецификациям в интерфейсном документе управления (ICD). Сохраните необходимые переменные Simulink и объекты, такие как Simulink.Parameter
объекты, в словаре данных.
ICD описывает интерфейс данных между двумя компонентами программного обеспечения. Чтобы обмениваться и осуществлять обмен данными, компоненты объявляют и задают глобальные переменные, которые хранят значения сигналов и значения параметров. ICD называет переменные и перечисляет характеристики, такие как тип данных, физические единицы измерения и значения параметров. Когда вы создаете модели компонентов в Simulink, можно сконфигурировать сгенерированный код, чтобы соответствовать интерфейсной спецификации.
В этом примере ICD является рабочей книгой Microsoft® Excel®.
Перейдите к папке matlabroot/examples/ecoder
открытый. Скопируйте этот файл в перезаписываемую, рабочую папку:
ex_ICD_PCG_inter.xls
В Microsoft® Excel® или другой совместимой программе, откройте ex_ICD_PCG_inter.xls
рабочая книга и представление первый рабочий лист, Signals
. Каждая строка рабочего листа описывает сигнал, который пересекает интерфейсный контур.
Смотрите значения ячеек в рабочем листе. Owner
столбец указывает на имя компонента, который выделяет память для каждого сигнала. DataType
столбец указывает на тип данных сигнала в памяти. Например, рабочий лист использует выражение Bus: EngSensors
чтобы указать на структуру вводят названный EngSensors
.
В Parameters
рабочий лист, Value
столбец указывает на значение каждого параметра. Если значение параметра является нескалярным, значение хранится в своем собственном отдельном рабочем листе, который имеет то же имя как параметр.
В Numeric Types
рабочий лист, каждая строка представляет именованный тип числовых данных. В этом ICD данные используют типы данных с фиксированной точкой (Fixed-Point Designer). IsAlias
столбец указывает, использует ли код С имя типа данных (например, s16En3
) или использует имя примитивного целочисленного типа данных, который соответствует размеру слова (такому как short
). 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_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
Создайте исходный файл 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. */
Запустите скрипт prepare_sldemo_fuelsys_dd_inter
. В данном примере скрипт готовит системную модель, sldemo_fuelsys_dd
.
run(fullfile(matlabroot,'examples','ecoder','main','prepare_sldemo_fuelsys_dd_inter'))
Откройте системную модель sldemo_fuelsys_dd
.
sldemo_fuelsys_dd
Эта системная модель ссылается на модели контроллеров. В этом примере вы генерируете код от моделей контроллеров.
Откройте модели контроллеров sldemo_fuelsys_dd_controller
.
sldemo_fuelsys_dd_controller
Некоторые сигналы в моделях контроллеров имеют имена, например, входной сигнал sensors
. Некоторые параметры блоков в модели относятся к Simulink.Parameter
объекты в словаре данных. Например, в airflow_calc
подсистема, Pumping Constant
блок использует объекты параметра PumpCon
, SpeedVect
, и PressVect
. Эти объекты параметра устанавливают значения соответствующих параметров блоков. Можно применить настройки генерации кода к сигналам и объектам параметра.
Модели контроллеров соединяются со словарем данных, sldemo_fuelsys_dd_controller.sldd
. В нижнем левом углу модели кликните по значку данных модели, затем щелкните по ссылке Словаря Данных. В панели Иерархии модели Model Explorer выберите узел Данных проектирования.
Словарь уже хранит:
Объекты параметра
Simulink.NumericType
возражает, такие как u8En7
Simulink.Bus
объект, EngSensors
Определение перечислимого типа данных, sldemo_FuelModes
Перейдите к корневому уровню моделей контроллеров затем, на вкладке Modeling, нажмите Model Data Editor.
В Model Data Editor активируйте кнопку Change scope. Model Data Editor теперь показывает информацию об элементах данных в подсистемах.
Нажмите кнопку дополнительной информации Show/refresh. Model Data Editor теперь показывает информацию об объектах данных (Simulink.Parameter
объекты в словаре данных), который использует модель.
Выберите вкладку Inports/Outports (который выбран по умолчанию).
В модели блок Inport выбор, пометил sensors
. Model Data Editor подсвечивает соответствующую строку.
В ICD выберите вкладку Signals.
Используйте Model Data Editor, чтобы сконфигурировать сигнал согласно информации в ICD:
Установите значение в столбце Типа данных к Bus: EngSensors
. В этом случае значение уже установлено.
Установите представление Change выпадающий список на Code
и, для sensors
, установите Класс памяти на ImportFromFile
. Используйте этот класс памяти, потому что столбец Владельца в ICD подразумевает что различный компонент, не sldemo_fuelsys_dd_controller
, предоставляет определение кода С sensors
переменная. С этим классом памяти сгенерированный код не задает переменную.
Установите заголовочный файл на ex_inter_sigs.h
. Когда вы используете класс памяти, который представляет импортированные данные, такие как ImportFromFile
, вы не можете задать Файл Определения в Model Data Editor. Вместо этого включайте файл определения (в этом случае, ex_inter_sigs.c
) в генерации кода и процессе сборки при помощи Исходных файлов параметра конфигурации модели.
В модели блок Outport выбор, пометил fuel_rate
.
Используйте Model Data Editor, чтобы сконфигурировать fuel_rate
согласно ICD. К свойствам проекта доступа, таким как минимальное значение (Min) и физическая единица измерения (Модуль), представление Change набора к Design
. Для настроек генерации кода, потому что ICD задает sldemo_fuelsys_dd_controller
как владелец других сигналов, Класса памяти набора к ExportToFile
.
Смотрите вкладку Signals.
Установите представление Change на Code
и сконфигурируйте настройки генерации кода для fuel_mode
сигнала.
Вы не можете использовать Model Data Editor, чтобы сконфигурировать свойства проекта для fuel_mode
(такие как тип данных), потому что fuel_mode
выход диаграммы Stateflow. В модели перейдите в график.
На вкладке Modeling нажмите Model Explorer.
В панели Содержимого Model Explorer (средняя панель), выберите fuel_mode
элемент данных.
В Диалоговой панели (правая панель), сконфигурируйте fuel_mode
согласно ICD. В этом случае тип данных сигнала уже установлен, таким образом, можно задать только описание.
Перейдите к корневому уровню модели.
В ICD и Model Data Editor, выберите вкладку Parameters. В Model Data Editor, представлении Change набора к Design
.
В Model Data Editor используйте поле содержимого Фильтра, чтобы искать первый параметр, PressEst
. Model Data Editor показывает две строки: Одна строка, которая соответствует объекту параметра PressEst
и одна строка, которая соответствует параметрам блоков, которые используют PressEst
.
Используйте Model Data Editor, чтобы сконфигурировать PressEst
согласно ICD. Значение параметров (Столбец значений) уже установлено. Поскольку ICD задает sldemo_fuelsys_dd_controller
как владелец PressEst
, установите Класс памяти на ExportToFile
.
Используйте Model Data Editor, чтобы сконфигурировать другие параметры. Опционально, чтобы применить изменение в нескольких параметрах целиком, выберите несколько строк в таблице данных.
В нижнем левом углу модели кликните по значку данных модели, затем щелкните по ссылке Словаря Данных, чтобы открыть словарь данных в Model Explorer.
В панели Иерархии модели выберите узел Данных проектирования.
В панели Содержимого (средняя панель), выберите Simulink.NumericType
объект u8En7
. Этот объект представляет один из примитивного typedef
операторы в ex_inter_types.h
.
В ICD выберите вкладку Numeric Types.
Используйте Диалоговую панель Model Explorer (правая панель), чтобы сконфигурировать объект согласно ICD.
Используйте Model Explorer, чтобы сконфигурировать другой Simulink.NumericType
объекты. Можно использовать панель Содержимого, чтобы выполнить пакетные обработки.
В панели Содержимого нажмите Simulink.Bus
объект EngSensors
. Этот объект представляет тип структуры что ex_inter_types.h
задает.
В Диалоговой панели (правая панель), нажмите Launch Bus Editor.
В ICD выберите вкладку Structure Types.
Используйте Редактор Шины, чтобы сконфигурировать объект шины и элементы сигнала в шине (такие как throttle
) согласно ICD.
В ICD выберите вкладку Enumerated Types.
В панели Содержимого Model Explorer кликните по определению перечислимого типа sldemo_FuelModes
.
Используйте Диалоговую панель, чтобы сконфигурировать тип согласно ICD. Установите Тип хранения на Native Integer
и осциллограф данных к Exported
.
Сконфигурируйте модели контроллеров, чтобы скомпилировать сгенерированный код в исполняемую программу путем очистки параметра конфигурации модели, Генерируют код только.
Сгенерируйте код от моделей контроллеров.
### 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' */ extern s16En15 PumpCon[551]; /* Referenced by: '<S1>/Pumping Constant' */ extern s16En15 RampRateKiZ[25]; /* Referenced by: '<S1>/Ramp Rate Ki' */ extern s16En3 SpeedEst[1305]; /* Referenced by: '<S7>/Speed Estimation' */ extern s16En7 ThrotEst[551]; /* Referenced by: '<S8>/Throttle Estimation' */ extern sldemo_FuelModes fuel_mode; /* '<Root>/control_logic' */ extern s16En7 fuel_rate; /* '<Root>/fuel_rate' */
Определения данных (выделение памяти) появляются в исходных файлах, которые задает 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' */ 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);