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

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

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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте