Управляйте именами типов данных в сгенерированном коде

По умолчанию сгенерированный код использует псевдонимы типа данных Simulink® Coder™, чтобы задать скалярные и переменные типа массив. Например, тип Simulink Coder real32_T соответствует типу Simulink single. Код задает эти типы через typedef операторы, которые основываются на типах примитивов C, таких как float и short. Можно сконфигурировать код, чтобы использовать пользовательские имена типов вместо этого.

Код также агрегировал сигнал, параметры блоков и данные состояния в структуры (см., Как Сгенерированный код Обменивается Данными со Средой и Как Хранилища Сгенерированного кода Внутренний Сигнал, состояние и Данные о Параметре), по умолчанию. Можно задать правило именования для этих типов структуры. Можно также поместить элементы данных в отдельные пользовательские структуры, именами типов которых можно управлять.

Управляйте этими именами типов, чтобы помочь вам к:

Для пользовательских типов можно также указать, что повторное использование сгенерированного кода вводит определения, например, typedef операторы, из вашего внешнего кода.

Для получения информации об именах типов данных, которыми вы не можете управлять и о пользовательских типах данных, которые не поддерживает сгенерированный код, смотрите Ограничения.

Сообщать генератору кода о длине в битах типовых типов C, таких как int и short для вашего целевого компьютера используйте параметры конфигурации Hardware Implementation. Смотрите Конфигурируют Опции Среды выполнения.

Имена элементов управления примитивных типов данных

Переименовать примитивный тип данных Simulink Coder, такой как int8_T, создайте Simulink.AliasType возразите, чье имя совпадает с именем типа, которое вы хотите, чтобы сгенерированный код использовал. Например, чтобы создать тип под названием myType, в командной строке, введите:

myType = Simulink.AliasType;

Установите BaseType свойство к имени типа данных Simulink, который соответствует целевому типу данных Simulink Coder. Например, если целевым типом является int8_T, задайте int8. Чтобы идентифицировать тип данных Simulink, используйте информацию в таблице.

Имя типа Simulink CoderСоответствующее имя типа Simulink

real_T

double

real32_T

single

int32_T

int32

int16_T

int16

int8_T

int8

uint32_T

uint32

uint16_T

uint16

uint8_T

uint8

boolean_T

boolean

Для конфигурирования замены типа данных в целой модели (Configuration Parameters> Code Generation> Data Type Replacement), можно альтернативно использовать один из этих типов:

  • uint8

  • int8

  • intn*

int_T

intn*

uint_T

uintn*

char_T

intn*

uint64_T

uint64

int64_T

int64

* заменяют n с количеством битов, отображенных в Configuration Parameters> Hardware Implementation или для Number of bits: int или для Number of bits: char. Используйте соответствующее количество битов для типа данных, который вы хотите переименовать.

Примечание

boolean_T BaseType должен продвинуть int со знаком.

Например, чтобы заменить имя типа uint8_T с myType, установите BaseType свойство Simulink.AliasType возразите против 'int8'.

myType.BaseType = 'int8';

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

  • Сконфигурируйте замены типа данных. В коде, который вы генерируете из модели, можно заменить имя типа данных Simulink Coder на имя Simulink.AliasType объект. Вы конфигурируете замены типа данных через параметры конфигурации модели (Configuration Parameters> Code Generation> Data Type Replacement.

    Для примера, который показывает, как использовать замену типа данных, смотрите Замену и Переименуйте Типы данных, чтобы Соответствовать Кодированию Стандартов.

  • Используйте имя Simulink.AliasType объект задать тип данных отдельного сигнала, то есть, блок выход или параметры блоков. По умолчанию, из-за распространения типа данных и наследования (см. Правила Наследования Типа данных), сигналы, состояния и параметры других нисходящих блоков обычно наследовали совпадающий тип данных. Опционально, можно сконфигурировать элементы данных в восходящих блоках, чтобы наследовать тип (Inherit: Inherit via back propagation) или остановите распространение в произвольном блоке путем определения ненаследованной установки типа данных.

    Чтобы задать тип данных для отдельного элемента данных, используйте Model Data Editor (на вкладке Modeling, нажмите Model Data Editor). Можно использовать имя того же Simulink.AliasType объект задать типы данных нескольких элементов данных.

    Для примера, который показывает, как использовать Simulink.AliasType возразите непосредственно в модели, смотрите, Создают Псевдоним Типа данных в Сгенерированном коде.

Имена элементов управления типов примитивовМетод
Поменяйте имя типа примитива что использование сгенерированного кода, чтобы задать переменные по умолчанию (например, int8_T).

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

Заменять имя типа данных Simulink Coder по умолчанию на соответствующее имя типа Simulink, например, заменять int8_T с int8, вы не должны создавать Simulink.AliasType объект. Смотрите Использование Имена типов данных Simulink Вместо Имен типов данных Simulink Coder.

Чтобы осуществлять обмен данными замены типа в иерархии модели - ссылки, используйте конфигурации модели, на которые ссылаются (см. Долю Настройка Через Модели, на которые Ссылаются).

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

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

При необходимости, чтобы предотвратить другие элементы данных в восходящих и нисходящих блоках из использования того же имени типа, сконфигурируйте те элементы, чтобы использовать тип данных, устанавливающий, который не наследован. По умолчанию большинство сигналов использует наследованный тип Inherit: Inherit via internal rule.

Используйте то же имя типа для нескольких сигналов и других элементов данных в информационном канале, который является серией связанных блоков.

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

Обычно, неважно, где на информационном канале вы задаете тип, нисходящие элементы данных наследовали тип. Можно сконфигурировать восходящие элементы данных, чтобы наследовать тип, также. Рассмотрите определение типа в блоке, который вы не ожидаете удалять или изменять часто.

Сконфигурируйте сгенерированный код, чтобы заменить зависящий от реализации тип, такой как char_T или boolean_T, и другой тип эквивалентной длины в битах с одним именем типа, которое вы задаете.Используйте имя Simulink.AliasType объект сконфигурировать несколько замен типа данных одновременно. Смотрите Замену Зависящие от реализации Типы с Тем же Именем типа.

Используйте имена типов данных Simulink вместо имен типов данных Simulink Coder

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

Заменять boolean_T, int_T, или uint_T, используйте информацию в таблице.

Имя типа Simulink CoderЗаменяющие имена к использованию

boolean_T

Одно из этих имен:

  • boolean

  • uint8

  • int8

  • intn*

int_T

intn*

uint_T

uintn*

char_T

intn*

* заменяют n с количеством битов, отображенных в Configuration Parameters> Hardware Implementation или для Number of bits: int или для Number of bits: char. Используйте соответствующее количество битов для типа данных, который вы хотите заменить.

Вы не можете использовать этот метод, чтобы заменить real_T с double или real32_T с single.

Замените зависящие от реализации типы на то же имя типа

Некоторые имена типов Simulink Coder сопоставляют с примитивами C, которые являются зависящими от реализации. Например, тип Simulink Coder int_T карты к C вводят int, чья длина в битах зависит от нативного целочисленного размера вашего целевого компьютера. Другие зависящие от реализации типы включают boolean_T, char_T, и uint_T.

Для большего количества читаемого, более простого кода можно использовать то же имя типа, чтобы заменить несколько типов Simulink Coder, одного размера. Например, если нативный целочисленный размер вашего оборудования составляет 32 бита, можно заменить int_T и int32_T с тем же именем типа, скажем, myInt.

  1. Сконфигурируйте свои настройки целевого компьютера в Configuration Parameters> Hardware Implementation.

  2. Создайте Simulink.AliasType возразите названному myInt. В этом случае, потому что int_T и int32_T представляйте 32-битное целое число со знаком, установите BaseType к int32.

    myInt = Simulink.AliasType('int32')

  3. Сконфигурируйте замену совпадающего типа данных для int32_T и int_T.

Примечание

Замена типа данных Many-one не поддерживает char (char_T) встроенный тип данных. Используйте char только в непосредственных заменах типа данных.

Замена типа данных Many-one не поддерживается для типов данных Simulink Coder различных размеров.

Задайте абстрактные числовые типы и переименуйте типы

Эта модель показывает пользовательские типы, состоя из типов псевдонима и числовых. Числовые типы позволяют вам задавать абстрактные числовые типы, который особенно полезен для фиксированных точек. Типы псевдонима позволяют вам переименовывать типы, который позволяет вам, создают отношение для типов.

Исследуйте модель в качестве примера

Откройте модель в качестве примера и сконфигурируйте ее, чтобы показать сгенерированные имена блоков.

load_system('rtwdemo_udt')
set_param('rtwdemo_udt','HideAutomaticNames','off')
open_system('rtwdemo_udt')

Ключевые возможности пользовательских типов

  • Отображенный и распространенный на сигнальных линиях

  • Используемый, чтобы параметрировать модель типом (например, In1 задает свой тип Выходных данных как ENG_SPEED)

  • Типы с общим предком могут быть смешаны, посредством чего общий предок распространен (e.g., выход Sum1)

  • Внутренне поддерживаемый Simulink Model Explorer

  • Включайте дополнительный атрибут заголовочного файла, который идеален для импорта устаревших типов (проигнорированный для целей GRT)

  • Типы используются в сгенерированном коде (проигнорированные для целей GRT)

Инструкции

  1. Смотрите пользовательские типы в Model Explorer путем двойного клика по первой желтой кнопке ниже.

  2. Смотрите заменяющее отображение типа данных путем двойного клика по второй желтой кнопке ниже.

  3. Скомпилируйте схему, чтобы отобразить типы в этой модели (Отладка> Модель Обновления> Модель Обновления или Ctrl+D).

  4. Сгенерируйте код с синей кнопкой ниже и смотрите файлы модели, чтобы видеть, как пользовательские типы появляются в сгенерированном коде.

  5. Измените атрибуты ENG_SPEED и ENG_SPEED_OFFSET и повторите шаги 1-4.

Примечания

  • Пользовательские типы являются функцией Simulink, которые упрощают параметризацию типов данных в модели. Консервы Embedded Coder искажают имена типов данных (например, ENG_SPEED) в сгенерированном коде, тогда как Simulink Coder реализует пользовательские типы как их базовый тип (например, real32_T).

  • Embedded Coder также позволяет вам заменить встроенные типы данных на пользовательские типы данных в сгенерированном коде.

Имена элементов управления типов структуры

Управлять именами стандартных структур, которые Simulink Coder создает по умолчанию, чтобы хранить данные (modelP для данных о параметре, например), Configuration Parameters использования> Code Generation> Identifiers> Global types, чтобы задать правило именования. Для получения дополнительной информации смотрите, Настраивают Сгенерированные Идентификаторы.

Когда вы используете невиртуальные шины и структуры параметра к совокупным сигналам и параметрам блоков в пользовательскую структуру в сгенерированном коде, управляете именем типа структуры путем создания Simulink.Bus объект. Для получения дополнительной информации смотрите, Организуют Данные в Структуры в Сгенерированном коде.

Сгенерируйте код что типы данных повторных использований из внешнего кода

Чтобы сгенерировать код, который снова использует определение типов от вашего внешнего кода С, задайте осциллограф данных соответствующего объекта типа данных или перечисления в Simulink как Imported. С этой установкой сгенерированный код включает (#include) определение из вашего кода. Для получения дополнительной информации об управлении размещением файла пользовательского типа данных, смотрите Размещение Файла Управления Пользовательских типов данных.

Вместо того, чтобы создать отдельные объекты типа данных и перечислимые типы, и затем сконфигурировать их, рассматривают создание объектов и типов при помощи Simulink.importExternalCTypes функция. По умолчанию функция конфигурирует новые объекты и типы так, чтобы сгенерированный код импортировал (повторные использования) определения типа из вашего кода. Можно затем использовать объекты и типы, чтобы установить типы данных в модели и сконфигурировать замены типа данных. Для получения дополнительной информации смотрите Simulink.importExternalCTypes и обменивайтесь структурированными и перечислимыми данными между сгенерированным и внешним кодом.

Создайте псевдоним типа данных в сгенерированном коде

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

Экспортируйте определение типа

Когда вы интегрируете код, сгенерированный из модели с кодом из других источников, ваш типовой кодекс может создать экспортируемый typedef оператор. Поэтому весь интегрированный код может использовать тип. В этом примере показано, как экспортировать определение типа данных к сгенерированному заголовочному файлу.

Создайте Simulink.AliasType возразите названному mySingleAlias это действует как псевдоним для встроенного типа данных single.

mySingleAlias = Simulink.AliasType('single');

Сконфигурируйте объект экспортировать его определение заголовочному файлу под названием myHdrFile.h.

mySingleAlias.DataScope = 'Exported';
mySingleAlias.HeaderFile = 'myHdrFile.h';

Откройте модель rtwdemo_configinterface.

open_system('rtwdemo_configinterface')

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

set_param('rtwdemo_configinterface','HideAutomaticNames','off')

На вкладке Modeling нажмите Model Data Editor.

В модели блок Inport выбор, пометил In1.

Используйте столбец Типа данных, чтобы установить тип данных на mySingleAlias.

set_param('rtwdemo_configinterface/In1','OutDataTypeStr','mySingleAlias')

Сконфигурируйте In1 использовать устройство хранения данных по умолчанию.

Во вкладке C Code выберите Code Interface> Default Code Mappings.

В редакторе Отображений Кода, под Inports и Outports, избранной категорией Inports. Установите класс памяти по умолчанию на Default.

На вкладке Inports, Классе памяти набора к Model default.

cm = coder.mapping.api.get('rtwdemo_configinterface');
setDataDefault(cm,'Inports','StorageClass','Default');
setInport(cm,'In1','StorageClass','Model default');

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

rtwbuild('rtwdemo_configinterface')
### Starting build procedure for: rtwdemo_configinterface
### Successful completion of code generation for: rtwdemo_configinterface

Build Summary

Top model targets built:

Model                    Action          Rebuild Reason                                    
===========================================================================================
rtwdemo_configinterface  Code generated  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 7.1809s

В отчете генерации кода просмотрите файл rtwdemo_configinterface_types.h. Код создает #include директива для сгенерированного файла myHdrFile.h.

file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface_types.h');
rtwdemodbtype(file,'#include "myHdrFile.h"',...
    '#include "myHdrFile.h"',1,1)
#include "myHdrFile.h"

Просмотрите файл myHdrFile.h. Код использует идентификатор mySingleAlias как псевдоним для типа данных real32_T. По умолчанию сгенерированный код представляет тип данных Simulink single при помощи идентификатора real32_T.

Код также предоставляет макро-защиту формы RTW_HEADER_filename_h_. Когда вы экспортируете определение типов, чтобы интегрировать сгенерированный код с кодом из других источников, можно использовать макро-защиту этой формы, чтобы предотвратить неумышленные столкновения идентификатора.

file = fullfile('slprj','ert','_sharedutils','myHdrFile.h');
rtwdemodbtype(file,'#ifndef RTW_HEADER_myHdrFile_h_',...
    ' * File trailer for generated code.',1,0)
#ifndef RTW_HEADER_myHdrFile_h_
#define RTW_HEADER_myHdrFile_h_
#include "rtwtypes.h"

typedef real32_T mySingleAlias;
typedef creal32_T cmySingleAlias;

#endif                                 /* RTW_HEADER_myHdrFile_h_ */

/*

Просмотрите файл rtwdemo_configinterface.h. Код использует псевдоним типа данных mySingleAlias задавать поле input1 структуры, то, которое соответствует блоку Inport, пометило In1.

file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface.h');
rtwdemodbtype(file,...
    '/* External inputs (root inport signals with default storage) */',...
    '} ExtU_rtwdemo_configinterface_T;',1,1)
/* External inputs (root inport signals with default storage) */
typedef struct {
  mySingleAlias input1;                /* '<Root>/In1' */
  MYTYPE input2;                       /* '<Root>/In2' */
  MYTYPE input3;                       /* '<Root>/In3' */
  MYTYPE input4;                       /* '<Root>/In4' */
} ExtU_rtwdemo_configinterface_T;

Импортируйте определение типа

Когда вы объединяетесь, код сгенерировал из модели с кодом из других источников, чтобы избежать избыточного typedef операторы, можно импортировать определение типов из внешнего кода. В этом примере показано, как импортировать ваше собственное определение типа данных от заголовочного файла, который вы создаете.

Используйте текстовый редактор, чтобы создать заголовочный файл, чтобы импортировать. Назовите файл ex_myImportedHdrFile.h. Поместите его в свою рабочую папку. Скопируйте следующий код в файл.

#ifndef HEADER_myImportedHdrFile_h_
#define HEADER_myImportedHdrFile_h_

typedef float myTypeAlias;

#endif 

Код использует идентификатор myTypeAlias создать псевдоним для типа данных float. Код также использует макро-защиту формы HEADER_filename_h. Когда вы импортируете определение типов, чтобы интегрировать сгенерированный код с кодом из других источников, можно использовать макро-защиту этой формы, чтобы предотвратить неумышленные столкновения идентификатора.

В командной строке создайте Simulink.AliasType возразите названному myTypeAlias это создает псевдоним для встроенного типа single. Тип данных Simulink single соответствует типу данных C float.

myTypeAlias = Simulink.AliasType('single')
myTypeAlias = 

  AliasType with properties:

    Description: ''
      DataScope: 'Auto'
     HeaderFile: ''
       BaseType: 'single'

Сконфигурируйте объект так, чтобы сгенерированный код импортировал определение типа из заголовочного файла ex_myImportedHdrFile.h.

myTypeAlias.DataScope = 'Imported';
myTypeAlias.HeaderFile = 'ex_myImportedHdrFile.h';

Откройте модель rtwdemo_configinterface.

open_system('rtwdemo_configinterface')

На вкладке Modeling нажмите Model Data Editor.

В модели блок Inport выбор, пометил In1.

Используйте столбец Типа данных, чтобы установить тип данных на myTypeAlias.

set_param('rtwdemo_configinterface/In1','OutDataTypeStr','myTypeAlias')

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

rtwbuild('rtwdemo_configinterface')
### Starting build procedure for: rtwdemo_configinterface
### Successful completion of code generation for: rtwdemo_configinterface

Build Summary

Top model targets built:

Model                    Action          Rebuild Reason                   
==========================================================================
rtwdemo_configinterface  Code generated  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 7.1252s

В отчете генерации кода просмотрите файл rtwdemo_configinterface_types.h. Код создает #include директива для вашего заголовочного файла ex_myImportedHdrFile.h.

file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface_types.h');
rtwdemodbtype(file,'#include "ex_myImportedHdrFile.h',...
    '/* Forward declaration for rtModel */',1,0)
#include "ex_myImportedHdrFile.h"
#include "MYTYPE.h"

/* Model Code Variants */
#ifndef DEFINED_TYPEDEF_FOR_Table1_Type_
#define DEFINED_TYPEDEF_FOR_Table1_Type_

typedef struct {
  MYTYPE BP[11];
  MYTYPE Table[11];
} Table1_Type;

#endif

#ifndef DEFINED_TYPEDEF_FOR_Table2_Type_
#define DEFINED_TYPEDEF_FOR_Table2_Type_

typedef struct {
  MYTYPE BP1[3];
  MYTYPE BP2[3];
  MYTYPE Table[9];
} Table2_Type;

#endif
#endif                         /* RTW_HEADER_rtwdemo_configinterface_types_h_ */

/*
 * File trailer for generated code.
 *
 * [EOF]
 */

Просмотрите файл rtwdemo_configinterface.h. Код использует псевдоним типа данных myTypeAlias задавать поле input1 структуры, то, которое соответствует блоку Inport, пометило In1.

file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface.h');
rtwdemodbtype(file,...
    '/* External inputs (root inport signals with default storage) */',...
    '} ExtU_rtwdemo_configinterface_T;',1,1)
/* External inputs (root inport signals with default storage) */
typedef struct {
  myTypeAlias input1;                  /* '<Root>/In1' */
  MYTYPE input2;                       /* '<Root>/In2' */
  MYTYPE input3;                       /* '<Root>/In3' */
  MYTYPE input4;                       /* '<Root>/In4' */
} ExtU_rtwdemo_configinterface_T;

Отобразите базовые типы данных и псевдонимы на диаграмме модели

Когда вы отображаете типы данных сигнала на диаграмме модели, можно принять решение отобразить псевдонимы (такие как myTypeAlias) и базовые типы данных (такие как int16). Чтобы отобразить псевдонимы, на вкладке Debug, выбирают Information Overlays> Alias Data Types. Чтобы отобразить базовые типы, выберите Information Overlays> Base Data Types. Для получения дополнительной информации смотрите Типы Данных порта.

Создайте именованный тип данных с фиксированной точкой в сгенерированном коде

В этом примере показано, как создать и назвать тип данных с фиксированной точкой в сгенерированном коде. Можно использовать имя типа, чтобы задать параметр и типы данных сигнала в модели и в сгенерированном коде.

Модель rtwdemo_fixpt1 в качестве примера типы данных с фиксированной точкой использования. Так, чтобы можно было более легко видеть тип данных с фиксированной точкой в сгенерированном коде в этом примере, вы создаете Simulink.Parameter объект, который появляется в коде как глобальная переменная.

Создайте Simulink.AliasType объект, который задает тип данных с фиксированной точкой. Назовите объект myFixType. Сгенерированный код использует имя объекта как тип данных.

myFixType = Simulink.AliasType('fixdt(1,16,4)');

Откройте модель rtwdemo_fixpt1.

open_system('rtwdemo_fixpt1')

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

set_param('rtwdemo_fixpt1','HideAutomaticNames','off')

На вкладке Modeling нажмите Model Data Editor.

В Model Data Editor выберите вкладку Parameters.

В модели выберите блок Gain.

В Model Data Editor, для строки, которая представляет параметр Усиления блока Gain в Столбце значений, задают myParam.

Кликните по кнопке действий (с тремя вертикальными точками) рядом со значением параметров. Выберите Create.

В диалоговом окне Create New Data, набор Value к Simulink.Parameter(8). В этом примере, для более легко читаемого кода, вы устанавливаете значение параметров на 8 вместо-3.2. Нажмите Create. Simulink.Parameter возразите названному myParam появляется в базовом рабочем пространстве. Объектно-ориентированная память реальное значение 8, который блок Gain использует для значения параметра Усиления.

В Simulink. Диалоговое окно свойства Parameter, Класс памяти набора к ExportedGlobal. Нажать ОК. С этой установкой, myParam появляется в сгенерированном коде как отдельная глобальная переменная.

В Model Data Editor используйте столбец Типа данных, чтобы установить тип данных параметра Усиления блока Gain к myFixType.

На вкладке Signals используйте столбец Типа данных, чтобы установить тип данных блока Gain выход к myFixType.

Используйте столбец Типа данных, чтобы установить тип данных Conversion блокируйте выход к myFixType.

В качестве альтернативы можно использовать эти команды в командной строке, чтобы сконфигурировать блоки и создать объект:

set_param('rtwdemo_fixpt1/Gain','Gain','myParam','OutDataTypeStr','myFixType',...
    'ParamDataTypeStr','myFixType')
myParam = Simulink.Parameter(8);
myParam.StorageClass = 'ExportedGlobal';
set_param('rtwdemo_fixpt1/Conversion','OutDataTypeStr','myFixType')

В модели, Параметры конфигурации набора> Генерация кода> Системный конечный файл к ert.tlc. С этой установкой генератор кода соблюдает псевдонимы типа данных, такие как myFixType.

set_param('rtwdemo_fixpt1','SystemTargetFile','ert.tlc')

Выбор параметр конфигурации Генерирует код только.

set_param('rtwdemo_fixpt1','GenCodeOnly','on')

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

rtwbuild('rtwdemo_fixpt1')
### Starting build procedure for: rtwdemo_fixpt1
### Successful completion of code generation for: rtwdemo_fixpt1

Build Summary

Top model targets built:

Model           Action          Rebuild Reason                                    
==================================================================================
rtwdemo_fixpt1  Code generated  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 9.8543s

В отчете генерации кода просмотрите файл rtwdemo_fixpt1_types.h. Код задает тип myFixType на основе целочисленного типа заданного размера слова (16).

file = fullfile('rtwdemo_fixpt1_ert_rtw','rtwdemo_fixpt1_types.h');
rtwdemodbtype(file,'#ifndef DEFINED_TYPEDEF_FOR_myFixType_',...
    '/* Forward declaration for rtModel */',1,0)
#ifndef DEFINED_TYPEDEF_FOR_myFixType_
#define DEFINED_TYPEDEF_FOR_myFixType_

typedef int16_T myFixType;
typedef cint16_T cmyFixType;

#endif

Просмотрите файл rtwdemo_fixpt1.c. Код использует тип myFixType, который является псевдонимом целочисленного типа int16, задавать переменную myParam.

file = fullfile('rtwdemo_fixpt1_ert_rtw','rtwdemo_fixpt1.c');
rtwdemodbtype(file,'myFixType myParam = 128;','myFixType myParam = 128;',1,1)
myFixType myParam = 128;               /* Variable: myParam

Сохраненное целочисленное значение 128 из myParam различный как реальное значение 8 из-за масштабирования, что тип данных с фиксированной точкой myFixType задает. Для получения дополнительной информации смотрите Масштабирующийся (Fixed-Point Designer) в документации Fixed-Point Designer.

Строка кода, которая представляет блок Gain, применяет правильный сдвиг разряда, соответствующий дробной длине, заданной myFixType.

rtwdemodbtype(file,...
    'rtwdemo_fixpt1_Y.Out1 = (myFixType)((myParam * rtb_Conversion) >> 4);',...
    'rtwdemo_fixpt1_Y.Out1 = (myFixType)((myParam * rtb_Conversion) >> 4);',1,1)
  rtwdemo_fixpt1_Y.Out1 = (myFixType)((myParam * rtb_Conversion) >> 4);

Переименуйте объект типа данных

Переименовать объект типа данных, такой как Simulink.AliasType или Simulink.Bus после того, как вы создаете его (например, чтобы переименовать псевдоним при кодировании изменения стандартов или когда вы сталкиваетесь с конфликтом по совпадению имен), можно позволить Simulink переименовывать объект и корректировать все ссылки на объект, которые появляются в модели или моделях. В Model Explorer щелкните правой кнопкой по переменной и выберите Rename All. Для получения дополнительной информации смотрите, Переименовывают Переменные.

Отобразите типы данных сигнала на блок-схеме

Для удобочитаемости можно отобразить типы данных сигнала непосредственно на блок-схеме. Когда вы используете пользовательские имена для примитивных типов данных, можно принять решение отобразить пользовательское имя (псевдоним), базовый примитив, или оба. Смотрите Типы Данных порта.

Ограничения

  • Вы не можете сконфигурировать сгенерированный код, чтобы использовать эти пользовательские типы данных C:

    • Типы массива

    • Типы указателей

    • const или volatile типы

  • Вы не можете сконфигурировать сгенерированный код, чтобы использовать типовые типы примитивов C, такие как int и short.

Заменяющие ограничения типа данных

Когда вы выбираете параметр конфигурации модели Replace data type names in the generated code на Code Generation> панель Data Type Replacement диалогового окна Configuration Parameters, эти ограничения применяются:

  • Замена типа данных не поддерживает несколько уровней отображения. Каждое заменяющее имя типа данных сопоставляет непосредственно с одним или несколькими встроенными типами данных.

  • Замена типа данных не поддерживается для целевой генерации кода симуляции для моделей, на которые ссылаются.

  • Если вы выбираете параметр конфигурации Classic call interface для своей модели, замена типа данных не поддерживается.

  • Генерация кода выполняет замены типа данных при генерации .c, .cpp, и .h файлы. Генерация кода помещает эти файлы в папки сборки (включая главные и папки сборки модели, на которые ссылаются) и в _sharedutils папка. Исключения следующие:

    rtwtypes.h
    multiword_types.h
    model_reference_types.h
    builtin_typeid_types.h
    model_sf.c или .cpp (Обертка S-функции ERT)
    model_dt.h (C заголовочный файл, поддерживающий режим external mode)
    model_capi.c или .cpp
    model_capi.h
  • Замена типа данных не поддерживается для сложных типов данных.

  • Замена типа данных Many-one не поддерживается для char тип данных. Попытка использовать char когда часть отображения many-one с пользовательским типом данных представляет нарушение спецификации MISRA C®. Например, если вы сопоставляете char (char_T) и любой int8 (int8_T) или uint8 (uint8_T) к тому же заменяющему типу результатом является MISRA C нарушение. При попытке сгенерировать Код С++, генератор кода делает недопустимые неявные броски типа, приводящие к ошибкам времени компиляции. Используйте char только в непосредственных заменах типа данных.

    Замена типа данных Many-one не поддерживается для типов данных Simulink Coder различных размеров. Для получения дополнительной информации смотрите Замену Зависящие от реализации Типы с Тем же Именем типа.

  • Для S-функций ERT замените boolean тип данных только с 8-битным целым числом, int8, или uint8.

  • Установите DataScope свойство Simulink.AliasType возразите против Auto (значение по умолчанию) или Imported.

Похожие темы