exponenta event banner

Замена и переименование типов данных в соответствии со стандартами кодирования

По умолчанию созданный код использует псевдонимы типа данных, такие как real_T и int32_T. Код использует эти псевдонимы для определения глобальных и локальных переменных. Если стандарты кодирования требуют использования других псевдонимов типов данных, включая псевдонимы, определяемые существующим кодом, можно:

  • Настройка замены типа данных для всей модели.

  • Настройте отдельные элементы данных (например, сигналы, параметры и состояния) для использования определенных псевдонимов типов данных.

Сведения об управлении типами данных в модели см. в разделе Типы данных управляющих сигналов.

Проверка внешнего кода C

Сохранить этот код C в файл с именем my_types.h в текущей папке. Этот файл представляет файл заголовка в существующем коде, который определяет псевдонимы пользовательских типов данных с помощью typedef заявления.

#include <stdbool.h>

typedef double my_dblPrecision;
typedef short my_int16;
typedef bool my_bool;

Изучение модели примера и кода, созданного по умолчанию

  1. Откройте пример ex_data_type_replacement модели.

    open_system(fullfile(docroot,'toolbox','ecoder','examples',...
    'ex_data_type_replacement'))

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

  3. В Редакторе данных модели (Model Data Editor) проверьте вкладку Сигналы (Signals).

  4. Установите в раскрывающемся списке Изменить представление значение Code. В таблице данных столбец Storage Class показывает именованные сигнальные линии, такие как temp использовать класс хранения ExportedGlobal. При этой настройке сигнальные линии отображаются в сгенерированном коде как отдельные глобальные переменные.

  5. Установите в раскрывающемся списке Изменить представление значение Design.

  6. Обновите блок-схему.

    Simulink назначает определенный тип данных каждому сигналу, использующему наследуемый тип данных, такой как Inherit: Inherit via internal rule.

  7. В таблице данных разверните столбец «Тип данных». В столбце показано, что сигналы в модели используют сочетание типов данных. int16, double, и boolean. Эти типы данных также можно просмотреть в модели.

  8. Создайте код из модели.

  9. В отчете о создании кода проверьте общий файл утилиты. rtwtypes.h. Код использует typedef для переименования примитивных типов данных C с помощью стандартных псевдонимов Simulink ® Coder™. Например, код переименовывает примитивный типdouble с помощью псевдонима real_T.

    typedef double real_T;

  10. Проверка файла ex_data_type_replacement.c. Код использует псевдонимы типов данных по умолчанию для объявления и определения переменных. Например, код использует типы данных real_T, int16_T, и boolean_T для определения глобальных переменных flowIn, temp, и intlk.

    real_T flowIn;                         /* '<Root>/In3' */
    int16_T temp;                          /* '<Root>/Add2' */
    boolean_T intlk;                       /* '<S1>/Compare' */

    Модель step определяет локальные переменные с помощью псевдонимов одного типа данных.

    real_T rtb_Add;
    real_T rtb_FilterCoefficient;

Повторное использование определений внешних типов данных

Настройте созданный код для определения переменных с помощью пользовательских типов данных, определенных в my_types.h вместо имен типов по умолчанию.

  1. В командной строке создайте Simulink.AliasType для каждого псевдонима типа данных, определяемого внешним кодом.

    Simulink.importExternalCTypes('my_types.h');
    

    В базовой рабочей области Simulink.importExternalCTypes функция создает объекты my_dblPrecision, my_int16, и my_bool.

    Для каждого объекта функция устанавливает DataScope свойство для 'Imported' и HeaderFile свойство для 'my_types.h'. С этими настройками генератор кода не создает typedef оператор для каждого объекта, но вместо этого созданный код повторно использует операторы из my_types.h путем включения (#include) файл.

  2. В модели в диалоговом окне Параметры конфигурации на панели Создание кода > Замена типа данных выберите Заменить имена типов данных в созданном коде.

  3. Задайте параметры в столбце Имя замены (Replacement Name) в соответствии с таблицей.

    Имя симулятораИмя замены
    doublemy_dblPrecision
    int16my_int16
    booleanmy_bool

  4. Создайте код из модели.

  5. В отчете о создании кода проверьте файл. rtwtypes.h. Теперь код использует #include директива на импорт содержимого внешнего файла заголовка my_types.h, который содержит псевдонимы пользовательских типов данных.

    #include "my_types.h"     /* User defined replacement datatype for int16_T real_T boolean_T  */

  6. Проверка файла ex_data_type_replacement.c. Код использует псевдонимы пользовательских типов данных my_dblPrecision, my_int16, и my_bool для определения глобальных переменных, таких как flowIn, temp, и intlk.

    my_dblPrecision flowIn;                /* '<Root>/In3' */
    my_int16 temp;                         /* '<Root>/Add2' */
    my_bool intlk;                         /* '<S1>/Compare' */

    Модель step определяет локальные переменные с помощью псевдонимов пользовательских типов данных.

    my_dblPrecision rtb_Add;
    my_dblPrecision rtb_FilterCoefficient;

Создание значимых псевдонимов типов данных для отдельных элементов данных

Предположим, что стандарты кодирования требуют, чтобы важные элементы данных использовали тип данных, имя которого указывает на реальное значение. Вы можете создать больше Simulink.AliasType для представления этих псевдонимов пользовательских типов данных. Используйте объекты для задания типов данных элементов данных в модели.

  1. В столбце «Тип данных редактора данных модели» используйте Simulink.AliasType объекты для установки типов данных этих блочных выходов. Можно выбрать сигнальную линию в модели, которая подсвечивает соответствующую строку в редакторе данных модели, или выполнить поиск сигналов в редакторе данных модели с помощью поля Содержимое фильтра (Filter contents).

    БлокТип выходных данных
    Уставка расходаflow_T
    Add2 (который подает блок сравнения)diffTemp_T

  2. Используйте вкладку «Ввод/вывод» редактора данных модели, чтобы задать тип данных третьего блока «Ввод» равным flow_T.

  3. На вкладке «Моделирование» в группе «Проект» выберите «Инспектор свойств».

  4. Выберите блок «Контроллер расхода». В Инспекторе свойств нажмите кнопку «Открыть», чтобы открыть диалоговое окно блока.

  5. На вкладке «Типы данных» задайте для параметра «Вывод суммы» значение ctrl_T. Нажмите кнопку ОК.

    С помощью этих настроек типа данных некоторые из именованных сигналов, например, temp и flowIn, использовать типы данных, которые вызывают реальные величины, такие как расход жидкости и температура.

  6. В командной строке создайте Simulink.AliasType для представления этих новых псевдонимов пользовательских типов данных.

    flow_T = Simulink.AliasType('double');
    diffTemp_T = Simulink.AliasType('int16');
    ctrl_T = Simulink.AliasType('double');

    В модели сигналы flowIn и flowSetPt использовать примитивный тип данных double, таким образом, псевдоним типа данных flow_T сопоставляет с double.

  7. Обновите блок-схему.

    Из-за наследования типов данных другие сигналы также используют пользовательские псевдонимы типов данных. Например, тип выходных данных блока Add, подаваемого третьим блоком Inport, имеет значение Inherit: Inherit via internal rule. Внутреннее правило выбирает тот же тип данных, что и входные данные блока. flow_T.

  8. Создайте код из модели.

  9. Файл ex_data_type_replacement_types.h определяет новые типы данных flow_T, diffTemp_T, и ctrl_T как псевдонимы my_dblPrecision и my_int16.

    typedef my_dblPrecision flow_T;
    typedef my_int16 diffTemp_T;
    typedef my_dblPrecision ctrl_T;

  10. В файле ex_data_type_replacement.cкод определяет глобальные переменные с помощью новых имен типов.

    flow_T flowIn;                         /* '<Root>/In3' */
    flow_T flowSetPt;                      /* '<Root>/Flow Setpoint' */
    ctrl_T flowCtrl;                       /* '<Root>/Interlock' */
    diffTemp_T temp;                           /* '<Root>/Add2' */
    

  11. Для блоков, не использующих новые типы данных, соответствующий сгенерированный код продолжает использовать типы замены, указанные ранее. Например, в файле ex_data_type_replacement.h, выходы блоков In1 и In2 отображаются как поля структуры, которые используют тип замены my_int16.

    /* External inputs (root inport signals with auto storage) */
    typedef struct {
      my_int16 In1;                        /* '<Root>/In1' */
      my_int16 In2;                        /* '<Root>/In2' */
    } ExtU_ex_data_type_replacement_T;

Создание единой точки определения для типов примитивов

Псевдонимы пользовательских типов данных flow_T и ctrl_T сопоставить с примитивным типом данных double. Если вы хотите изменить этот базовый тип данных с double кому single (float), не забудьте изменить BaseType собственность обоих Simulink.AliasType объекты.

Чтобы упростить внесение этого изменения, можно создать Simulink.NumericType объект и сконфигурировать оба Simulink.AliasType объекты для ссылки на него. Затем необходимо изменить только Simulink.NumericType объект. A Simulink.NumericType позволяет совместно использовать тип данных без создания псевдонима типа данных.

  1. В командной строке создайте Simulink.NumericType объект для представления примитивного типа данных single.

    sharedType = Simulink.NumericType;
    sharedType.DataTypeMode = 'Single';

  2. Сконфигурируйте Simulink.AliasType объекты flow_T и ctrl_T для получения базового типа данных из этого нового объекта.

    flow_T.BaseType = 'sharedType';
    ctrl_T.BaseType = 'sharedType';

  3. На вкладке «Отладка» выберите «Информационные наложения» > «Базовые типы данных » «Информационные наложения» > «Типы данных псевдонимов» (см. «Типы данных портов»). Обновите блок-схему.

    Индикаторы типа данных в модели показывают, что псевдонимы flow_T и ctrl_T сопоставить с примитивным типом single. Чтобы изменить этот базовый тип примитива, можно изменить DataTypeMode имущества Simulink.NumericType объект, sharedType.

По умолчанию Simulink.NumericType объект не вызывает другого typedef для отображения в созданном коде.

При создании кода из модели во время Simulink.NumericType объект представляет тип данных single, сгенерированные карты кодов flow_T и ctrl_T к псевдониму типа данных Simulink Coder по умолчанию real32_T, который сопоставляется с типом данных C float. Вы можете заменить real32_T таким же образом, как вы заменили real_T, int16_T, и boolean_T (Параметры конфигурации > Создание кода > Замена типа данных).

Постоянное сохранение объектов типа данных

Simulink.NumericType и Simulink.AliasType объекты в базовой рабочей области не сохраняются при завершении текущей сессии MATLAB ®. Для постоянного хранения этих объектов рекомендуется перенести модель в словарь данных. См. раздел Перенос моделей для использования словаря данных Simulink.

Создание и ведение объектов, соответствующих нескольким C typedef Заявления

Создать Simulink.AliasType объекты для большого количества typedef операторы во внешнем коде C, рассмотрите возможность использования Simulink.importExternalCTypes функция.

Связанные темы