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

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

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

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

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

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

Сохраните этот код С в файл с именем 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. Установите 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 Setpointflow_T
    Add2 (который питает блок Compare),diffTemp_T

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

  3. На вкладке Modeling, под Design, нажимают 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. На вкладке Debug выберите Information Overlays> Base Data Types Information Overlays> Alias Data Types и (см. Типы Данных порта). Обновите блок-схему.

    Индикаторы типа данных в модели 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.

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

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

Похожие темы