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

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

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

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

В Microsoft ® Excel ® или другой совместимой программе откройте ex_ICD_PCG.xlsx и просмотрите содержимое таблиц.

open ex_ICD_PCG.xlsx
  • Signals лист. Каждая строка представляет сигнал, который пересекает контур интерфейса. Проверьте значения камер в листе. The Owner столбец определяет имя компонента, который выделяет память для сигнала. The DataType столбец называет тип сигнальных данных в памяти. Для примера в листе используется выражение Bus: EngSensors для присвоения имени типу структуры EngSensors.

  • Parameters лист. The Value в столбце указывается значение каждого параметра. Если значение параметра нескалярно, значение хранится в собственном отдельном листе, который имеет то же имя, что и параметр.

  • Numeric Types лист. Каждая строка представляет именованный тип числовых данных. В этом ICD данные используют типы данных с фиксированной точкой (Fixed-Point Designer). The IsAlias столбец указывает, использует ли Код С имя типа данных (для примера, s16En3) или использует имя примитивного целочисленного типа данных, которое соответствует размеру слова (например short). The 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. Откройте копию modeл.

open_system('rtwdemo_fuelsys_dd_controller')

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

Модели контроллеров связаны со словарем данных rtw demo_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. В окне Редактор для моделей контроллеров перейдите к корневому уровню модели.

  3. На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).

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

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

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

  1. В окне ICD перейдите на вкладку Signals (Сигналы).

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

  3. Убедитесь, что настройки строения для блока Inport sensors соответствует спецификации ICD. Тип данных должен быть установлен на Шина: E ngSensors.

  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 щелкните вкладку Параметры.

  4. Используйте поле Filter contents (Содержимое фильтра) для поиска параметров PressEst. В Model Data Editor показаны две строки: одна строка, которая соответствует объекту параметра PressEst и одна строка, которая соответствует параметрам блоков, которая использует PressEst.

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

  6. Убедитесь, что для параметров заданы значения и тип данных PumpCon, SpeedEst, ThrotEst, и RampRateKiz соответствует спецификации ICD.

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

  1. В окне ICD перейдите на вкладку Числовые типы.

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

  3. На панели Иерархия модели перейдите к проектным данным в словаре данных для моделей контроллеров (rtwdemo_fuelsys_dd_controller > Внешние данные > rtwdemo _ fuelsys _ dd _ controller > Design Data).

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

  5. На правой панели на вкладке Design подтвердите, что значение параметра Data type mode совпадает со спецификацией ICD.

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

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

  1. В окне ICD перейдите на вкладку Типы структур.

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

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

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

  1. В окне ICD перейдите на вкладку Перечисленные типы.

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

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

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

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

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

Настройте настройки генерации кода для блоков Inport и Outport

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

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

  3. В редакторе Simulink на вкладке Код С выберите Code Interface > Individual Element Code Mappings .

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

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

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

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

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

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

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

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

  2. Добавьте fuel_mode сигнал к отображениям кода модели. В диаграмму модели выберите сигнал fuel_mode. Поместите курсор на эллипсис, который появляется выше или ниже сигнальной линии, чтобы открыть панель действий. Нажмите кнопку Добавить выбранные сигналы к отображениям кода. В редакторе Code Mappings узел Signals расширяется и выводит добавленный сигнал. Установка класса памяти должна указывать, что сигнал разрешается к объекту сигнала и что класс памяти для объекта установлен на ExportToFile. Поскольку сигнал связан с объектом сигнала, необходимо использовать Model Explorer, чтобы подтвердить, что строение генерации кода соответствует спецификации ICD.

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

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

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

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

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

  3. Используйте поле Filter contents (Содержимое фильтра) для поиска параметров PressEst. Редактор Code Mappings показывает строку, которая соответствует объекту параметра PressEst. Поскольку ICD задает rtwdemo_fuelsys_dd_controller как владелец PressEst, Класс памяти должен быть установлен на ExportToFile.

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

  5. Проверьте параметры в Класс памяти, HeaderFile, DefinitionFile, Identifier и Owner PumpCon, SpeedEst, ThrotEst, и RampRateKiz.

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

  1. В окне ICD перейдите на вкладку Числовые типы.

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

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

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

  5. На правой панели откройте вкладку Генерация кода. Подтвердите, что настройки для возможностей данных и файла заголовка соответствуют спецификациям ICD, Imported и ex_inter_types.h, соответственно.

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

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

  1. В окне ICD перейдите на вкладку Типы структур.

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

  3. На правой панели откройте вкладку Генерация кода. Подтвердите, что настройки для возможностей данных и файла заголовка соответствуют спецификациям 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. Смотрите сгенерированный код. Сгенерированный заголовочный файл rtw demo_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 функцию в файле rtw demo_fuelsys_dd_controller.c. Алгоритм использует глобальные данные, которые идентифицирует МКБ. Для примера алгоритм использует значение сигнала 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

Сценарий :

  • Импортирует данные из каждого листа 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 и другие диалоговые окна. Смотрите Атрибуты Проекта Хранилища Сигналов и состояний.

Похожие темы