В этом примере показано, как сконфигурировать настройки генерации кода для модели согласно техническим требованиям в интерфейсном документе управления (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
. Откройте свою копию mode
l.
open_system('rtwdemo_fuelsys_dd_controller')
Некоторые сигналы в моделях контроллеров имеют имена, например, входной сигнал sensors
. Некоторые параметры блоков в модели относятся к Simulink.Parameter
объекты в словаре данных. Например, в airflow_calc
подсистема, Pumping Constant
блок использует объекты параметра PumpCon
, SpeedVect
, и PressVect
. Эти объекты параметра устанавливают значения соответствующих параметров блоков. Можно применить настройки генерации кода к сигналам и объектам параметра.
Модели контроллеров соединяются со словарем данных rtwdemo_fuelsys_dd_controller.sldd
. Исследуйте словарь данных.
В нижнем левом углу моделей контроллеров кликните по значку данных модели.
Кликните по Внешнему Каналу передачи данных.
В панели Иерархии модели Model Explorer расширьте узлы rtwdemo_fuelsys_dd_controller, Внешние данные и rtwdemo_fuelsys_dd_controller.
Выберите Design Data.
Хранилища словаря:
Объекты параметра
Simulink.NumericType
объекты, такие как u8En7
Simulink.Bus
объект, EngSensors
Уже откройте электронную таблицу ICD, если не открытый.
В окне Simulink Editor для моделей контроллеров перейдите к корневому уровню модели.
На вкладке Modeling нажмите Model Data Editor.
В Model Data Editor кликните по кнопке Change scope. Model Data Editor показывает информацию об элементах данных в подсистемах модели.
Нажмите кнопку дополнительной информации Show/refresh. Model Data Editor показывает информацию об объектах данных (Simulink.Parameter
объекты в словаре данных), который использует модель.
В ICD кликните по вкладке Signals.
В Model Data Editor кликните по вкладке Inports/Outports.
Убедитесь что параметры конфигурации для Inport блока sensors
совпадает со спецификацией ICD. Тип данных должен собираться Соединить шиной: EngSensors
.
Убедитесь что параметры конфигурации для блока Outport fuel_rate
совпадайте со спецификацией ICD. Тип данных должен быть установлен в s16En7.
Min должен быть установлен в 0.8000.
Max должен быть установлен в 1.7000.
Модуль должен быть установлен в g/s
.
Убедитесь что параметры конфигурации для fuel_mode
сигнала совпадайте со спецификацией ICD. Поскольку
fuel_mode
выходной сигнал диаграммы Stateflow, необходимо использовать Model Explorer, чтобы сконфигурировать настройки проекта. В модели перейдите в диаграмму Stateflow. Открытый Model Explorer. В панели Содержимого Model Explorer (средняя панель), выберите fuel_mode
. Тип данных должен быть установлен в Enum:sld_FuelModes
.
В ICD кликните по вкладке Parameters.
Перейдите к корневому уровню модели управления.
В Model Data Editor кликните по вкладке Parameters.
Используйте поле содержимого Фильтра, чтобы искать параметр PressEst
. Model Data Editor показывает две строки: одна строка, которая соответствует объекту параметра PressEst
и одна строка, которая соответствует параметрам блоков, которые используют PressEst
.
Убедитесь что параметры конфигурации для параметра PressEst
совпадайте со спецификацией ICD. Типом данных должен быть u8En7.
Значение должно быть 19x45 матрица числовых значений.
Убедитесь что настройки Data Type и Value для параметров PumpCon
, SpeedEst
, ThrotEst
, и RampRateKiz
совпадайте со спецификацией ICD.
В ICD кликните по вкладке Numeric Types.
Если Model Explorer не открыт, откройте его.
В панели Иерархии модели перейдите к данным проектирования в словаре данных для моделей контроллеров (rtwdemo_fuelsys_dd_controller> Внешние Данные> rtwdemo_fuelsys_dd_controller> Данные проектирования).
В Содержимом (средняя) панель выберите Simulink.NumericType
объект u8En7
. Этот объект представляет один из typedef
операторы в ex_inter_types.h
.
На правой панели, на вкладке Design, подтверждают, что установка для режима Типа данных выравнивается со спецификацией ICD.
Убедитесь что настройка проекта для числовых типов s16En3
, s16En7
, и s16En15
совпадает со спецификацией ICD.
В ICD кликните по вкладке Structure Types.
В панели Содержимого Model Explorer выберите EngSensors
. Этот Simulink.Bus
объект представляет тип структуры, заданный в ex_inter_types.h
.
Подтвердите, что настройка типа данных выравнивается со спецификацией ICD. На правой панели, на вкладке Design, или в Редакторе Шины, настраивают настройки сигнала шины (например, настройки в течение Min и Max), чтобы выровняться со спецификацией ICD.
В ICD кликните по вкладке Enumerated Types.
Откройте файл sld_FuelModes.m
, который задает класс для типа enmerated sld_FuelModes
.
Подтвердите, что класс definitnion выравнивается со спецификацией ICD. В файле sld_FuelModes.m, настройте имена элемента и базовые целочисленные значения, чтобы выровняться со спецификацией ICD.
Уже откройте электронную таблицу ICD, если не открытый.
Откройте приложение Embedded Coder.
В ICD кликните по вкладке Signals. Столбец Владельца в ICD подразумевает что различный компонент (other_componnent
), не rtwdemo_fuelsys_dd_controller
, предоставляет определение кода sensors
переменная.
Включайте файл исходного кода C, который задает переменную sensors
. В Редакторе Simulink, на вкладке C Code, выбирают Settings> C/C ++ Code generation settings. Убедитесь, что Исходные файлы параметра пользовательского кода генерации кода установлены в ex_inter_sigs.c
.
В Редакторе Simulink, на вкладке C Code, выбирают Code Interface> Individual Element Code Mappings.
В редакторе Отображений Кода кликните по вкладке Inports.
Выберите строку для sensors
. Поскольку определение исходного кода предоставлено во внешнем файле ex_inter_sigs.c
, который вы сконфигурировали на шаге 2, Класс памяти должен быть установлен в ImportFromFile
.
Кликните по значку. Проверяйте, что установка свойства HeaderFile совпадает со спецификацией ICD, ex_inter_sigs.h
. Убедитесь, что значение задано для свойства Identifier. Это свойство задает имя переменной для элемента данных в сгенерированном коде.
В редакторе Отображений Кода кликните по вкладке Outports.
Выберите строку для fuel_rate
. Поскольку ICD задает rtwdemo_fuelsys_dd_controller
как владелец fuel_rate
, Класс памяти должен быть установлен в ExportToFile
.
Кликните по значку. Убедитесь, что настройки для свойств HeaderFile, DefinitionFile и Владельца совпадают с техническими требованиями ICD global_data.h
, signals.c
, и rtwdemo_fuelsys_dd_controller
, соответственно. Убедитесь, что значение задано для свойства Identifier.
В редакторе Отображений Кода кликните по вкладке Signals/States. Третьим сигналом, перечисленным на вкладке Signals ICD, является fuel_mode
.
Добавьте fuel_mode
предупредите к отображениям типового кодекса. В диаграмме модели выберите fuel_mode
сигнала. Установите свой курсор на замещающий знак, который, кажется, выше или ниже сигнальной линии открывает строку меню. Нажмите Add выбрал сигналы закодировать кнопку отображений. В редакторе Отображений Кода узел Сигналов расширяет и перечисляет сигнал, что вы добавили. Установка Storage Class должна указать, что сигнал решает к объекту сигнала и что класс памяти для объекта установлен в
ExportToFile
. Поскольку сигнал сопоставлен с объектом сигнала, необходимо использовать Model Explorer, чтобы подтвердить, что настройка генерации кода выравнивается со спецификацией ICD.
Откройте Model Explorer. В панели Иерархии модели перейдите к данным проектирования в словаре данных для моделей контроллеров (rtwdemo_fuelsys_dd_controller> Внешние Данные> rtwdemo_fuelsys_dd_controller> Данные проектирования). В панели Содержимого выберите fuel_mode
.
На правой панели кликните по вкладке Code Generation. Класс памяти должен быть установлен в ExportToFile
. Подтвердите, что свойства HeaderFile, DefintionFile и Владелец совпадают с техническими требованиями ICD global_data.h
, signals.c
, и rtwdemo_fuelsys_dd_controller
, соответственно.
В ICD кликните по вкладке Parameters.
В редакторе Отображений Кода кликните по вкладке Paramters.
Используйте поле содержимого Фильтра, чтобы искать параметр PressEst
. Редактор Отображений Кода показывает строку, которая соответствует объекту параметра PressEst
. Поскольку ICD задает rtwdemo_fuelsys_dd_controller
как владелец PressEst
, Класс памяти должен быть установлен в ExportToFile
.
Кликните по значку. Проверяйте, что настройки для свойств HeaderFile, DefinitionFile и Владельца совпадают с техническими требованиями ICD global_data.h
, params.c
, и rtwdemo_fuelsys_dd_controller
, соответственно. Кроме того, убедитесь, что значение задано для свойства Identifier.
Проверяйте Класс памяти, HeaderFile, DefinitionFile, Идентификатор и настройки Owner для параметров PumpCon
, SpeedEst
, ThrotEst
, и RampRateKiz
.
В ICD кликните по вкладке Numeric Types.
Если Model Explorer не открыт, откройте его.
В панели Иерархии модели перейдите к данным проектирования в словаре данных для моделей контроллеров (rtwdemo_fuelsys_dd_controller> Внешние Данные> rtwdemo_fuelsys_dd_controller> Данные проектирования).
В панели Содержимого выберите Simulink.NumericType
объект u8En7
. Этот объект представляет один из typedef
операторы в ex_inter_types.h
.
На правой панели кликните по вкладке Code Generation. Подтвердите, что настройки для осциллографа Данных и Заголовочного файла выравниваются с техническими требованиями ICD, Imported
и ex_inter_types.h
, соответственно.
Проверяйте и настройте настройку генерации кода для числовых типов s16En3
, s16En7
, и s16En15
.
В ICD кликните по вкладке Structure Types.
В панели Содержимого Model Explorer выберите EngSensors
. Этот Simulink.Bus
объект представляет тип структуры, заданный в ex_inter_types.h
.
На правой панели кликните по вкладке 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 Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 3m 1.371s
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')
Можно использовать скрипт 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 1m 36.732s
Когда вы вносите изменения в ICD, можно снова использовать скрипт импорта, чтобы реконфигурировать модель.
Если вы используете скрипт, чтобы импортировать данные от ICD до базового рабочего пространства, рассмотрите миграцию объектов данных и переменных к словарю данных. Словарь данных постоянно хранит и отслеживает изменения к объектам данных и переменным. Например, можно импортировать определение перечислимого типа sld_FuelModes
в словарь моделей контроллеров. Смотрите Данные о Словаре Импорта и экспорта и Перечисления в Словаре Данных.
Можно сохранить параметры конфигурации для элементов данных состояния и сигнала, таких как типы данных, минимальные и максимальные значения и физические единицы измерения внутри или снаружи файлов модели. Simulink.Signal
объекты хранят параметры конфигурации за пределами файла модели. В качестве альтернативы можно сохранить параметры конфигурации в файле модели при помощи параметров блоков и параметров порта, к которым можно получить доступ через Model Data Editor, Property Inspector и другие диалоговые окна. Смотрите Атрибуты Проекта Хранилища Сигналов и состояний.