В этом примере показано, как настроить параметры генерации кода для модели в соответствии со спецификациями в документе управления интерфейсом (ICD). В примере также показано, как хранить общие переменные Simulink и объекты данных в словаре данных.
ICD описывает интерфейс данных между компонентами программного обеспечения. Для обмена данными и их совместного использования компоненты объявляют и определяют глобальные переменные, в которых хранятся значения сигналов и параметров в соответствии с МКБ. ICD присваивает имена переменным и перечисляет такие характеристики, как тип данных, физические единицы и значения параметров. При создании моделей компонентов в Simulink можно настроить модели таким образом, чтобы сгенерированный код соответствовал ICD. Например, можно использовать ICD в качестве ссылочного источника при интерактивной настройке моделей или можно автоматизировать настройку с помощью сценария для импорта данных из ICD.
В Microsoft ® Excel ® или другой совместимой программе откройте ex_ICD_PCG.xlsx и просмотрите содержимое листов.
open ex_ICD_PCG.xlsxSignals лист. Каждая строка представляет сигнал, пересекающий границу интерфейса. Проверьте значения ячеек в документе. Owner определяет имя компонента, который выделяет память для сигнала. DataType именует тип данных сигнала в памяти. Например, лист использует выражение Bus: EngSensors для присвоения имени типу структуры EngSensors.
Parameters лист. Value в столбце указано значение каждого параметра. Если значение параметра не является скалярным, значение сохраняется в отдельном документе, который имеет то же имя, что и параметр.
Numeric Types лист. Каждая строка представляет именованный числовой тип данных. В этом ICD данные используют типы данных с фиксированной точкой (Fixed-Point Designer). IsAlias указывает, использует ли код C имя типа данных (например, 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л.
open_system('rtwdemo_fuelsys_dd_controller')Некоторые сигналы в модели контроллера имеют имена, например, входной сигнал sensors. Некоторые параметры блока в модели относятся к Simulink.Parameter объектов в словаре данных. Например, в airflow_calc подсистема, Pumping Constant блок использует объекты параметров PumpCon, SpeedVect, и PressVect. Эти объекты параметров задают значения соответствующих параметров блока. К сигналам и объектам параметров можно применить настройки генерации кода.
Модель контроллера связана со словарем данных rtwdemo_fuelsys_dd_controller.sldd. Изучите словарь данных.
В левом нижнем углу модели контроллера щелкните значок данных модели.
Щелкните ссылку Внешние данные.
На панели «Иерархия моделей» проводника моделей разверните узлы «rtwdemo_fuelsys_dd_controller», «Внешние данные» и «rtwdemo_fuelsys_dd_controller».
Выберите «Конструкторские данные».
Словарь хранит:
Объекты параметров
Simulink.NumericType объекты, такие как u8En7
Simulink.Bus объект, EngSensors
Откройте электронную таблицу ICD, если она еще не открыта.
В окне Simulink Editor для модели контроллера перейдите к корневому уровню модели.
На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).
В редакторе данных модели нажмите кнопку Изменить область (Change scope). Редактор данных модели отображает информацию об элементах данных в подсистемах модели.
Нажмите кнопку Показать/обновить дополнительную информацию. Редактор данных модели отображает информацию об объектах данных ( Simulink.Parameter объекты в словаре данных), который используется моделью.
В ICD перейдите на вкладку Signals (Сигналы).
В Редакторе данных модели (Model Data Editor) перейдите на вкладку Ввод/вывод (Inports/Outports).
Убедитесь, что параметры конфигурации для блока Inport sensors соответствует спецификации ICD. Тип данных должен иметь значение Bus: EngSensors.
Убедитесь, что параметры конфигурации для блока исходящего порта fuel_rate соответствует спецификации ICD. Тип данных должен иметь значение s16En7. Для параметра Min должно быть установлено значение 0.8000. Для параметра Max должно быть установлено значение 1.7000. Для единицы измерения должно быть установлено значение g/s.
Убедитесь, что настройки конфигурации для сигнала fuel_mode соответствует спецификации ICD. Поскольку fuel_mode является выходным сигналом диаграммы Stateflow, для настройки параметров конструкции необходимо использовать обозреватель моделей. В модели перейдите в диаграмму Stateflow. Откройте обозреватель моделей. На панели Содержимое проводника моделей (Model Explorer Contents) (средняя панель) выберите fuel_mode. Тип данных должен иметь значение Enum:sld_FuelModes.
В ICD перейдите на вкладку Параметры.
Перейдите к корневому уровню управляющей модели.
В редакторе данных модели перейдите на вкладку Параметры (Parameters).
Используйте поле Содержимое фильтра (Filter contents) для поиска параметра PressEst. Редактор данных модели показывает две строки: одну строку, соответствующую объекту параметра PressEst и одну строку, соответствующую параметру блока, использующему PressEst.
Убедитесь, что параметры конфигурации для параметра PressEst соответствует спецификации ICD. Тип данных должен быть u8En7. Значение должно быть матрицей числовых значений 19x45.
Убедитесь, что параметры «Тип данных» и «Значение» PumpCon, SpeedEst, ThrotEst, и RampRateKiz соответствует спецификации ICD.
В ICD перейдите на вкладку Числовые типы.
Если обозреватель моделей не открыт, откройте его.
На панели «Иерархия модели» перейдите к данным конструкции в словаре данных модели контроллера (rtwdemo_fuelsys_dd_controller > Внешние данные > rtwdemo _ fuelsys _ dd _ controller > Данные конструкции).
На панели «Содержимое» (середина) выберите Simulink.NumericType объект u8En7. Этот объект представляет один из typedef операторы в ex_inter_types.h.
На правой панели на вкладке «Конструктор» убедитесь, что параметр режима «Тип данных» совпадает со спецификацией ICD.
Убедитесь, что конфигурация проекта для числовых типов s16En3, s16En7, и s16En15 соответствует спецификации ICD.
В ICD перейдите на вкладку Типы структуры.
На панели Содержимое проводника моделей (Model Explorer Contents) выберите EngSensors. Это Simulink.Bus объект представляет тип структуры, определенный в ex_inter_types.h.
Убедитесь, что конфигурация типа данных соответствует спецификации ICD. На правой панели на вкладке «Модель» или в редакторе шин настройте конфигурации сигналов шины (например, параметры «Мин» и «Макс») в соответствии со спецификацией ICD.
В ICD перейдите на вкладку Перечисляемые типы.
Открыть файл sld_FuelModes.m, который определяет класс для энмерированного типа sld_FuelModes.
Убедитесь, что определение класса соответствует спецификации 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. Убедитесь, что для параметра «Source files» (Исходные файлы) для создания кода задано значение ex_inter_sigs.c.
В редакторе Simulink на вкладке «Код C» выберите «Интерфейс кода» > «Сопоставления кодов отдельных элементов ».
В редакторе сопоставлений кодов перейдите на вкладку «Inports».
Выберите строку для sensors. Поскольку определение исходного кода содержится во внешнем файле ex_inter_sigs.c, который был настроен на шаге 2, класс Storage должен иметь значение ImportFromFile.
В Инспекторе свойств разверните узел «Код». Проверьте, что параметр свойства HeireFile соответствует спецификации ICD. ex_inter_sigs.h. Убедитесь, что для свойства Identifier указано значение. Это свойство определяет имя переменной для элемента данных в сгенерированном коде.
В редакторе сопоставлений кодов перейдите на вкладку «Выходы».
Выберите строку для fuel_rate. Потому что ICD определяет rtwdemo_fuelsys_dd_controller как владелец fuel_rate, класс хранения должен иметь значение ExportToFile.
В Инспекторе свойств разверните узел «Код». Убедитесь, что параметры свойств HeireFile, DefinityFile и Owner соответствуют спецификациям ICD global_data.h, signals.c, и rtwdemo_fuelsys_dd_controllerсоответственно. Убедитесь, что для свойства Identifier указано значение.
В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния». Третий сигнал, указанный на вкладке Signals ICD, - fuel_mode.
Добавить fuel_mode сигнал для отображения кода модели. На схеме модели выберите сигнал fuel_mode. Поместите курсор на многоточие, которое появляется выше или ниже сигнальной линии, чтобы открыть панель действий. Нажмите кнопку Add selected signals to code mappings (Добавить выбранные сигналы в сопоставления кода). В редакторе сопоставлений кодов узел «Сигналы» расширяется и отображает добавленный сигнал. Параметр Storage Class должен указывать, что сигнал разрешается в сигнальный объект и что класс хранения для объекта имеет значение ExportToFile. Поскольку сигнал связан с объектом сигнала, необходимо использовать обозреватель моделей для подтверждения соответствия конфигурации генерации кода спецификации ICD.
Откройте обозреватель моделей. На панели «Иерархия моделей» перейдите к данным конструкции в словаре данных модели контроллера (rtwdemo_fuelsys_dd_controller > Внешние данные > rtwdemo_fuelsys_dd_controller > Данные конструкции). На панели «Содержимое» выберитеfuel_mode.
На правой панели перейдите на вкладку Создание кода. Класс хранилища должен иметь значение ExportToFile. Убедитесь, что свойства HeaseFile, DefinityFile и Owner соответствуют спецификациям ICD global_data.h, signals.c, и rtwdemo_fuelsys_dd_controllerсоответственно.
В ICD перейдите на вкладку Параметры.
В редакторе сопоставлений кодов перейдите на вкладку «Параметры».
Используйте поле Содержимое фильтра (Filter contents) для поиска параметра PressEst. В редакторе сопоставлений кодов отображается строка, соответствующая объекту параметра PressEst. Потому что ICD определяет rtwdemo_fuelsys_dd_controller как владелец PressEst, класс хранения должен быть установлен в ExportToFile.
В Инспекторе свойств разверните узел «Код». Убедитесь, что параметры свойств HeaseFile, DefinityFile и Owner соответствуют спецификациям ICD. global_data.h, парамs.c, и rtwdemo_fuelsys_dd_controllerсоответственно. Кроме того, убедитесь, что для свойства Identifier указано значение.
Проверьте Класс Хранения, HeaderFile, DefinitionFile, Идентификатор и параметры настройки Владельца для параметров PumpCon, SpeedEst, ThrotEst, и RampRateKiz.
В ICD перейдите на вкладку Числовые типы.
Если обозреватель моделей не открыт, откройте его.
На панели «Иерархия моделей» перейдите к данным конструкции в словаре данных модели контроллера (rtwdemo_fuelsys_dd_controller > Внешние данные > rtwdemo_fuelsys_dd_controller > Данные конструкции).
На панели «Содержимое» выберите Simulink.NumericType объект u8En7. Этот объект представляет один из typedef операторы в ex_inter_types.h.
На правой панели перейдите на вкладку Создание кода. Убедитесь, что настройки области данных и файла заголовка соответствуют спецификациям распределения входящих вызовов. Imported и ex_inter_types.hсоответственно.
Проверка и корректировка конфигурации генерации кода для числовых типов s16En3, s16En7, и s16En15.
В ICD перейдите на вкладку Типы структуры.
На панели Содержимое проводника моделей (Model Explorer Contents) выберите EngSensors. Это Simulink.Bus объект представляет тип структуры, определенный в ex_inter_types.h.
На правой панели перейдите на вкладку Создание кода. Убедитесь, что настройки области данных и файла заголовка соответствуют спецификациям распределения входящих вызовов. 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')
Сценарий 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 объекты сохраняют настройки конфигурации вне файла модели. Можно также сохранить настройки конфигурации в файле модели с помощью параметров блока и порта, доступ к которым можно получить через редактор данных модели, инспектор свойств и другие диалоговые окна. См. раздел Сохранение атрибутов конструкции сигналов и состояний.