Сконфигурируйте сгенерированный код согласно интерфейсному документу управления в интерактивном режиме

Этот пример показывает, как сконфигурировать настройки генерации кода для модели согласно спецификациям в интерфейсном документе управления (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

Сконфигурируйте модель согласно ICD

Перейдите к корневому уровню моделей контроллеров и выберите 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);

Похожие темы