Замените и переименуйте типы данных, чтобы соответствовать кодированию стандартов

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

  • Сконфигурируйте замену типа данных для целой модели.

  • Сконфигурируйте отдельные элементы данных (такие как сигналы, параметры и состояния), чтобы использовать определенные псевдонимы типа данных.

Для получения информации об управлении типами данных в модели смотрите Типы данных Управляющего сигнала (Simulink).

Осмотрите внешний код С

Сохраните этот код С в файл с именем 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. В модели выберите View> Model Data Editor.

  3. В Model Data Editor осмотрите вкладку Signals.

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

  5. Установите Change view выпадающий список на Design.

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

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

  7. В таблице данных расширьте ширину столбца Data Type. Столбец показывает, что сигналы в модели используют соединение типов данных int16, double и boolean. Можно также видеть эти типы данных в модели.

  8. Сгенерируйте код из модели.

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

    typedef double real_T;

  10. Осмотрите файл ex_data_type_replacement.c. Код использует псевдонимы типа данных по умолчанию для переменных declare и define. Например, код использует типы данных 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. В модели, в диалоговом окне Configuration Parameters, на Code Generation> панель Data Type Replacement, выбирают Replace data type names in the generated code.

  3. Задайте опции в столбце Replacement Name согласно таблице.

    Имя SimulinkЗаменяющее имя
    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. В столбце Data Type Model Data Editor используйте объекты Simulink.AliasType установить типы данных их, блокируют выходные параметры. Можно выбрать сигнальную линию в модели, которая подсвечивает соответствующую строку в Model Data Editor, или ищите сигналы в Model Data Editor при помощи поля Filter contents.

    БлокТип выходных данных
    Заданное значение потокаflow_T
    Add2 (который питает блок Compare),diffTemp_T

  2. Используйте вкладку Model Data Editor Inports/Outports, чтобы установить тип данных третьего блока Inport к flow_T.

  3. В модели выберите View> Property Inspector.

  4. Выбор блок маркировал Flow Controller. В Property Inspector нажмите Open, чтобы открыть диалоговое окно блока.

  5. На вкладке Data Types, набор Sum output к ctrl_T. Нажмите OK.

    С этими настройками типа данных некоторые именованные сигналы, такие как 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. Объект 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. В модели выберите Display> Signals and Ports> Port Data Type Display Format> Base and Alias Types (см. Типы Данных порта (Simulink)). Обновите блок-схему.

    Индикаторы типа данных в модели show, что псевдонимы 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 (Configuration Parameters> Code Generation> Data Type Replacement).

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

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

Создайте и поддержите объекты, соответствующие нескольким операторам typedef C

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

Похожие темы