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

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

ICD описывает интерфейс данных между компонентами программного обеспечения. Чтобы обмениваться и осуществлять обмен данными, компоненты объявляют и задают глобальные переменные, которые хранят значения сигналов и значения параметров согласно ICD. ICD называет переменные и перечисляет характеристики, такие как тип данных, физические единицы измерения и значения параметров. Когда вы создаете модели компонента в Simulink, можно сконфигурировать модели, таким образом, что сгенерированный код соответствует ICD. Например, можно использовать ICD в качестве ссылочного источника при конфигурировании моделей interfactively, или можно автоматизировать configuraiton при помощи скрипта, чтобы импортировать данные от ICD.

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

В Microsoft® Excel® или другой совместимой программе, откройте ex_ICD_PCG.xlsx рабочая книга и анализ содержимое рабочих листов.

open ex_ICD_PCG.xlsx
  • 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. Откройте и исследуйте содержимое этих файлов в качестве примера, которые задают и объявляют внешние данные:

edit ex_inter_types.h
edit ex_inter_sigs.c
edit ex_inter_sigs.h

Исследуйте модель в качестве примера

В этом примере вы генерируете код от моделей контроллеров rtwdemo_fuelsys_dd_controller. Откройте свою копию model.

open_system('rtwdemo_fuelsys_dd_controller')

Некоторые сигналы в моделях контроллеров имеют имена, например, входной сигнал sensors. Некоторые параметры блоков в модели относятся к Simulink.Parameter объекты в словаре данных. Например, в airflow_calc подсистема, Pumping Constant блок использует объекты параметра PumpCon, SpeedVect, и PressVect. Эти объекты параметра устанавливают значения соответствующих параметров блоков. Можно применить настройки генерации кода к сигналам и объектам параметра.

Модели контроллеров соединяются со словарем данных rtwdemo_fuelsys_dd_controller.sldd. Исследуйте словарь данных.

  1. В нижнем левом углу моделей контроллеров кликните по значку данных модели.

  2. Кликните по Внешнему Каналу передачи данных.

  3. В панели Иерархии модели Model Explorer расширьте узлы rtwdemo_fuelsys_dd_controller, Внешние данные и rtwdemo_fuelsys_dd_controller.

  4. Выберите Design Data.

Хранилища словаря:

  • Объекты параметра

  • Simulink.NumericType объекты, такие как u8En7

  • Simulink.Bus объект, EngSensors

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

  1. Уже откройте электронную таблицу ICD, если не открытый.

  2. В окне Simulink Editor для моделей контроллеров перейдите к корневому уровню модели.

  3. На вкладке Modeling нажмите Model Data Editor.

  4. В Model Data Editor кликните по кнопке Change scope. Model Data Editor показывает информацию об элементах данных в подсистемах модели.

  5. Нажмите кнопку дополнительной информации Show/refresh. Model Data Editor показывает информацию об объектах данных (Simulink.Parameter объекты в словаре данных), который использует модель.

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

  1. В ICD кликните по вкладке Signals.

  2. В Model Data Editor кликните по вкладке Inports/Outports.

  3. Убедитесь что параметры конфигурации для блока Inport sensors совпадает со спецификацией ICD. Тип данных должен собираться Соединить шиной: EngSensors.

  4. Убедитесь что параметры конфигурации для блока Outport fuel_rate совпадайте со спецификацией ICD. Тип данных должен быть установлен в s16En7. Min должен быть установлен в 0.8000. Max должен быть установлен в 1.7000. Модуль должен быть установлен в g/s.

  5. Убедитесь что параметры конфигурации для fuel_mode сигнала совпадайте со спецификацией ICD. Поскольку fuel_mode выходной сигнал диаграммы Stateflow, необходимо использовать Model Explorer, чтобы сконфигурировать настройки проекта. В модели перейдите в диаграмму Stateflow. Открытый Model Explorer. В панели Содержимого Model Explorer (средняя панель), выберите fuel_mode. Тип данных должен быть установлен в Enum:sld_FuelModes.

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

  1. В ICD кликните по вкладке Parameters.

  2. Перейдите к корневому уровню модели управления.

  3. В Model Data Editor кликните по вкладке Parameters.

  4. Используйте поле содержимого Фильтра, чтобы искать параметр PressEst. Model Data Editor показывает две строки: одна строка, которая соответствует объекту параметра PressEst и одна строка, которая соответствует параметрам блоков, которые используют PressEst.

  5. Убедитесь что параметры конфигурации для параметра PressEst совпадайте со спецификацией ICD. Типом данных должен быть u8En7. Значение должно быть 19x45 матрица числовых значений.

  6. Убедитесь что настройки Data Type и Value для параметров PumpCon, SpeedEst, ThrotEst, и RampRateKiz совпадайте со спецификацией ICD.

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

  1. В ICD кликните по вкладке Numeric Types.

  2. Если Model Explorer не открыт, откройте его.

  3. В панели Иерархии модели перейдите к данным проектирования в словаре данных для моделей контроллеров (rtwdemo_fuelsys_dd_controller> Внешние Данные> rtwdemo_fuelsys_dd_controller> Данные проектирования).

  4. В Содержимом (средняя) панель выберите Simulink.NumericType объект u8En7. Этот объект представляет один из typedef операторы в ex_inter_types.h.

  5. На правой панели, на вкладке Design, подтверждают, что установка для режима Типа данных выравнивается со спецификацией ICD.

  6. Убедитесь что настройка проекта для числовых типов s16En3, s16En7, и s16En15 совпадает со спецификацией ICD.

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

  1. В ICD кликните по вкладке Structure Types.

  2. В панели Содержимого Model Explorer выберите EngSensors. Этот Simulink.Bus объект представляет тип структуры, заданный в ex_inter_types.h.

  3. Подтвердите, что настройка типа данных выравнивается со спецификацией ICD. На правой панели, на вкладке Design, или в Редакторе Шины, настраивают настройки сигнала шины (например, настройки в течение Min и Max), чтобы выровняться со спецификацией ICD.

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

  1. В ICD кликните по вкладке Enumerated Types.

  2. Откройте файл sld_FuelModes.m, который задает класс для типа enmerated sld_FuelModes.

  3. Подтвердите, что класс definitnion выравнивается со спецификацией ICD. В файле sld_FuelModes.m, настройте имена элемента и базовые целочисленные значения, чтобы выровняться со спецификацией ICD.

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

  1. Уже откройте электронную таблицу ICD, если не открытый.

  2. Откройте приложение Embedded Coder.

Сконфигурируйте настройки генерации кода для Inport и Outport Blocks

  1. В ICD кликните по вкладке Signals. Столбец Владельца в ICD подразумевает что различный компонент (other_componnent), не rtwdemo_fuelsys_dd_controller, предоставляет определение кода sensors переменная.

  2. Включайте файл исходного кода C, который задает переменную sensors. В Редакторе Simulink, на вкладке C Code, выбирают Settings> C/C ++ Code generation settings. Убедитесь, что Исходные файлы параметра пользовательского кода генерации кода установлены в ex_inter_sigs.c.

  3. В Редакторе Simulink, на вкладке C Code, выбирают Code Interface> Individual Element Code Mappings.

  4. В редакторе Отображений Кода кликните по вкладке Inports.

  5. Выберите строку для sensors. Поскольку определение исходного кода предоставлено во внешнем файле ex_inter_sigs.c, который вы сконфигурировали на шаге 2, Класс памяти должен быть установлен в ImportFromFile.

  6. В Property Inspector расширьте Код. Проверяйте, что установка свойства HeaderFile совпадает со спецификацией ICD, ex_inter_sigs.h. Убедитесь, что значение задано для свойства Identifier. Это свойство задает имя переменной для элемента данных в сгенерированном коде.

  7. В редакторе Отображений Кода кликните по вкладке Outports.

  8. Выберите строку для fuel_rate. Поскольку ICD задает rtwdemo_fuelsys_dd_controller как владелец fuel_rate, Класс памяти должен быть установлен в ExportToFile.

  9. В Property Inspector расширьте Код. Убедитесь, что настройки для свойств HeaderFile, DefinitionFile и Владельца совпадают с техническими требованиями ICD global_data.h, signals.c, и rtwdemo_fuelsys_dd_controller, соответственно. Убедитесь, что значение задано для свойства Identifier.

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

  1. В редакторе Отображений Кода кликните по вкладке Signals/States. Третьим сигналом, перечисленным на вкладке Signals ICD, является fuel_mode.

  2. Добавьте fuel_mode предупредите к отображениям типового кодекса. В диаграмме модели выберите fuel_mode сигнала. Установите свой курсор на замещающий знак, который, кажется, выше или ниже сигнальной линии открывает строку меню. Нажмите Add выбрал сигналы закодировать кнопку отображений. В редакторе Отображений Кода узел Сигналов расширяет и перечисляет сигнал, что вы добавили. Установка Storage Class должна указать, что сигнал решает к объекту сигнала и что класс памяти для объекта установлен в ExportToFile. Поскольку сигнал сопоставлен с объектом сигнала, необходимо использовать Model Explorer, чтобы подтвердить, что настройка генерации кода выравнивается со спецификацией ICD.

  3. Откройте Model Explorer. В панели Иерархии модели перейдите к данным проектирования в словаре данных для моделей контроллеров (rtwdemo_fuelsys_dd_controller> Внешние Данные> rtwdemo_fuelsys_dd_controller> Данные проектирования). В панели Содержимого выберите fuel_mode.

  4. На правой панели кликните по вкладке Code Generation. Класс памяти должен быть установлен в ExportToFile. Подтвердите, что свойства HeaderFile, DefintionFile и Владелец совпадают с техническими требованиями ICD global_data.h, signals.c, и rtwdemo_fuelsys_dd_controller, соответственно.

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

  1. В ICD кликните по вкладке Parameters.

  2. В редакторе Отображений Кода кликните по вкладке Paramters.

  3. Используйте поле содержимого Фильтра, чтобы искать параметр PressEst. Редактор Отображений Кода показывает строку, которая соответствует объекту параметра PressEst. Поскольку ICD задает rtwdemo_fuelsys_dd_controller как владелец PressEst, Класс памяти должен быть установлен в ExportToFile.

  4. В Property Inspector расширьте Код. Проверяйте, что настройки для свойств HeaderFile, DefinitionFile и Владельца совпадают с техническими требованиями ICD global_data.h, params.c, и rtwdemo_fuelsys_dd_controller, соответственно. Кроме того, убедитесь, что значение задано для свойства Identifier.

  5. Проверяйте Класс памяти, HeaderFile, DefinitionFile, Идентификатор и настройки Owner для параметров PumpCon, SpeedEst, ThrotEst, и RampRateKiz.

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

  1. В ICD кликните по вкладке Numeric Types.

  2. Если Model Explorer не открыт, откройте его.

  3. В панели Иерархии модели перейдите к данным проектирования в словаре данных для моделей контроллеров (rtwdemo_fuelsys_dd_controller> Внешние Данные> rtwdemo_fuelsys_dd_controller> Данные проектирования).

  4. В панели Содержимого выберите Simulink.NumericType объект u8En7. Этот объект представляет один из typedef операторы в ex_inter_types.h.

  5. На правой панели кликните по вкладке Code Generation. Подтвердите, что настройки для осциллографа Данных и Заголовочного файла выравниваются с техническими требованиями ICD, Imported и ex_inter_types.h, соответственно.

  6. Проверяйте и настройте настройку генерации кода для числовых типов s16En3, s16En7, и s16En15.

Сконфигурируйте генерацию кода для структур

  1. В ICD кликните по вкладке Structure Types.

  2. В панели Содержимого Model Explorer выберите EngSensors. Этот Simulink.Bus объект представляет тип структуры, заданный в ex_inter_types.h.

  3. На правой панели кликните по вкладке Code Generation. Подтвердите, что настройки для осциллографа Данных и Заголовочного файла выравниваются с техническими требованиями ICD, Imported и ex_inter_types.h, соответственно.

Сгенерируйте и смотрите код

1. Сгенерируйте код для моделей контроллеров.

slbuild('rtwdemo_fuelsys_dd_controller')
### Starting build procedure for: rtwdemo_fuelsys_dd_controller
### Successful completion of build procedure for: rtwdemo_fuelsys_dd_controller

Build Summary

Top model targets built:

Model                          Action                       Rebuild Reason                   
=============================================================================================
rtwdemo_fuelsys_dd_controller  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 1m 21.119s

2. Смотрите сгенерированный код. Сгенерированный заголовочный файл rtwdemo_fuelsys_dd_controller_types.h:

  • Включает (#include) внешний заголовочный файл ex_inter_types.h, который задает типы числовых данных u8En7, s16En3, и s16En7 и структура вводит EngSensors

  • Задает перечисление sld_FuelModes

file = fullfile('rtwdemo_fuelsys_dd_controller_ert_rtw',...
    'rtwdemo_fuelsys_dd_controller_types.h');
rtwdemodbtype(file,'#include "ex_inter_types.h"','} sld_FuelModes;',1,1)
#include "ex_inter_types.h"

/* Model Code Variants */
#ifndef DEFINED_TYPEDEF_FOR_sld_FuelModes_
#define DEFINED_TYPEDEF_FOR_sld_FuelModes_

typedef enum {
  LOW = 1,                             /* Default value */
  RICH,
  DISABLED
} sld_FuelModes;

Файл rtwdemo_fuelsys_dd_controller_private.h включает заголовочный файл ex_inter_sigs.h. Этот внешний заголовочный файл содержит extern объявление sensors сигнала, которым владеет различный компонент программного обеспечения.

Заголовочный файл данных global_data.h объявляет экспортируемые параметры и сигнализирует, что ICD задает. Чтобы совместно использовать эти данные, другие компоненты могут включать этот заголовочный файл.

file = fullfile('rtwdemo_fuelsys_dd_controller_ert_rtw','global_data.h');
rtwdemodbtype(file,'/* Exported data declaration */',...
    'fuel_rate',1,1)
/* Exported data declaration */

/* Declaration for custom storage class: ExportToFile */
extern real32_T PressEst[855];   /* Referenced by: '<S6>/Pressure Estimation' */
extern real32_T PumpCon[551];       /* Referenced by: '<S1>/Pumping Constant' */
extern real32_T RampRateKiz[25];       /* Referenced by: '<S1>/Ramp Rate Ki' */
extern real32_T SpeedEst[1305];     /* Referenced by: '<S7>/Speed Estimation' */
extern real32_T ThrotEst[551];   /* Referenced by: '<S8>/Throttle Estimation' */
extern sld_FuelModes fuel_mode;        /* '<Root>/control_logic' */
extern real32_T fuel_rate;             /* '<Root>/fuel_rate' */

Код алгоритма находится в модели step функция в файле rtwdemo_fuelsys_dd_controller.c. Алгоритм использует глобальные данные, которые идентифицирует ICD. Например, алгоритм использует значение fuel_mode сигнала в switch блокируйтесь, чтобы управлять потоком выполнения.

file = fullfile('rtwdemo_fuelsys_dd_controller_ert_rtw',...
    'rtwdemo_fuelsys_dd_controller.c');
rtwdemodbtype(file,'/* End of MultiPortSwitch: ''<S9>/Multiport Switch'' */',...
    '/* Outport: ''<Root>/fuel_rate'' incorporates:',0,0)
  /* 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'
     */
    denAccum = rtDWork.DiscreteIntegrator_DSTATE - -0.7408F *
      rtDWork.DiscreteFilter_states_g;
bdclose('rtwdemo_fuelsys_dd_controller')
Simulink.data.dictionary.closeAll('rtwdemo_fuelsys_dd_controller.sldd','-discard')

Импортируйте технические требования ICD в Simulink

Можно использовать скрипт MATLAB, чтобы импортировать настройки данных из ICD в переменные в базовом рабочем пространстве Simulink.

1. Откройте и смотрите скрипт в качестве примера ex_importICD_PCG.m.

edit ex_importICD_PCG

script:

  • Импортирует данные из каждого рабочего листа ICD в переменные в базовом рабочем пространстве.

  • Использует импортированные данные, чтобы сконфигурировать проект и свойства генерации кода Simulink.Signal и Simulink.Parameter объекты в базовом рабочем пространстве.

Если базовое рабочее пространство уже содержит объект данных, который соответствует элементу данных в ICD, скрипт конфигурирует свойства существующего объекта. Если объект не существует, скрипт создает объект.

2. Загрузите модель и запустите скрипт.

load_system('rtwdemo_fuelsys_dd_controller')
run('ex_importICD_PCG')

3. Регенерируйте и смотрите код.

slbuild('rtwdemo_fuelsys_dd_controller')
### Starting build procedure for: rtwdemo_fuelsys_dd_controller
### Successful completion of build procedure for: rtwdemo_fuelsys_dd_controller

Build Summary

Top model targets built:

Model                          Action                       Rebuild Reason                   
=============================================================================================
rtwdemo_fuelsys_dd_controller  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 39.824s

Факторы

  • Когда вы вносите изменения в ICD, можно снова использовать скрипт импорта, чтобы реконфигурировать модель.

  • Если вы используете скрипт, чтобы импортировать данные от ICD до базового рабочего пространства, рассмотрите миграцию объектов данных и переменных к словарю данных. Словарь данных постоянно хранит и отслеживает изменения к объектам данных и переменным. Например, можно импортировать определение перечислимого типа sld_FuelModes в словарь моделей контроллеров. Смотрите Данные о Словаре Импорта и экспорта и Перечисления в Словаре Данных.

  • Можно сохранить параметры конфигурации для элементов данных состояния и сигнала, таких как типы данных, минимальные и максимальные значения и физические единицы измерения внутри или снаружи файлов модели. Simulink.Signal объекты хранят параметры конфигурации за пределами файла модели. В качестве альтернативы можно сохранить параметры конфигурации в файле модели при помощи параметров блоков и параметров порта, к которым можно получить доступ через Model Data Editor, Property Inspector и другие диалоговые окна. Смотрите Атрибуты Проекта Хранилища Сигналов и состояний.

Похожие темы