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

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

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

Когда вы вносите изменения в 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.

  1. В топ-модели, sldemo_fuelsys_dd, на вкладке Modeling, в соответствии с Проектом, нажимают Link to Data Dictionary.

  2. В диалоговом окне Model Properties нажмите New.

  3. В Создавании нового диалогового окна Data Dictionary, Имени файла набора к sysDict и нажмите Save.

  4. Нажмите данные о Migrate.

  5. Нажмите Change все модели в ответ на сообщение об использовании словаря для моделей, на которые ссылаются.

  6. Нажмите Migrate в ответ на сообщение о копировании переменных, на которые ссылаются.

Переменные и объекты, что использование моделей существует в новом словаре данных sysDict.sldd, который находится в вашей текущей папке. Эти три модели в иерархии модели - ссылки соединены с этим словарем.

Сохраните определение перечислимого типа в словаре данных

Можно импортировать определение перечислимого типа sldemo_FuelModes в словарь контроллера. Смотрите Перечисления в Словаре Данных (Simulink).

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

В этом примере вы используете Simulink.Signal объекты задать атрибуты проекта, такие как типы данных, минимальные и максимальные значения и физические единицы измерения. Объекты сигнала хранят эти технические требования за пределами файла модели.

В качестве альтернативы можно сохранить эти технические требования в файле модели при помощи параметров блоков и параметров порта, к которым можно получить доступ через Model Data Editor, Property Inspector и другие диалоговые окна.

Чтобы решить, где сохранить технические требования, смотрите Атрибуты Проекта Хранилища Сигналов и состояний (Simulink).

Похожие темы

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