Этот пример показывает, как сконфигурировать настройки генерации кода для модели согласно спецификациям в интерфейсном документе управления (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. Затем в панели Иерархии модели Model Explorer выберите узел Данных проектирования.
Словарь уже хранит:
Объекты параметра
Объекты Simulink.NumericType
, такие как u8En7
Объект Simulink.Bus
, EngSensors
Определение перечислимого типа данных, sldemo_FuelModes
Перейдите к корневому уровню моделей контроллеров и выберите View> 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. В модели перейдите в график.
Выберите View> Model Explorer> 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]; extern s16En15 PumpCon[551]; extern s16En15 RampRateKiZ[25]; extern s16En3 SpeedEst[1305]; extern s16En7 ThrotEst[551]; extern sldemo_FuelModes fuel_mode; extern s16En7 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 } ;
Алгоритм находится в функции модели 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);