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

По умолчанию сгенерированный код использует псевдонимы типа данных 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

  • int n*

int_T

int n*

uint_T

uint n*

char_T

int n*

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

Примечание

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

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

myType.BaseType = 'int8';

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Имена элементов управления 64-битных Целых чисел

Чтобы переименовать тип данных Simulink Coder, такой как uint64 и int64, создайте объект Simulink.NumericType. Имя объекта должно совпадать с именем типа, которое вы хотите, чтобы сгенерированный код использовал. Например, чтобы создать тип под названием myType, в командной строке, введите:

myType = Simulink.NumericType;
Установите эти свойства:

  • DataTypeMode - Fixed-point: binary point scaling

  • WordLength - 64

  • IsAlias - true

Значением для Signedness может быть Signed или Unsigned в зависимости от того, подписывается ли целое число или без знака соответственно.

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

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

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

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

boolean_T

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

  • boolean

  • uint8

  • int8

  • int n*

int_T

int n*

uint_T

uint n*

char_T

int n*

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

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

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

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

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

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

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

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

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

  • Типы с общим предком могут быть смешаны, посредством чего общий предок распространен (например, вывод 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 создает по умолчанию, чтобы хранить данные (model_P для данных о параметре, например), Configuration Parameters использования> Code Generation> Symbols> Global types, чтобы задать правило именования. Для получения дополнительной информации смотрите, Настраивают Сгенерированные Идентификаторы.

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

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

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

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

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

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

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

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

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

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

  AliasType with properties:

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

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

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

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

open_system('rtwdemo_basicsc')

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

set_param('rtwdemo_basicsc','HideAutomaticNames','off')

В модели выберите View> Model Data Editor.

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

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

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

В модели, Параметры конфигурации набора> Генерация кода> Системный конечный файл к ert.tlc. Генератор кода соблюдает псевдонимы типа данных, такие как mySingleAlias, только если вы выбираете ERT-based system target file.

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

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

rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc
### Successful completion of build procedure for model: rtwdemo_basicsc

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

file = fullfile('rtwdemo_basicsc_ert_rtw','rtwdemo_basicsc_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('rtwdemo_basicsc_ert_rtw','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_basicsc.h. Код использует псевдоним типа данных mySingleAlias, чтобы задать поле input1 структуры, которое соответствует блоку Inport, маркировал In1.

file = fullfile('rtwdemo_basicsc_ert_rtw','rtwdemo_basicsc.h');
rtwdemodbtype(file,...
    '/* External inputs (root inport signals with default storage) */',...
    '} ExtU_rtwdemo_basicsc_T;',1,1)
/* External inputs (root inport signals with default storage) */
typedef struct {
  mySingleAlias input1;                /* '<Root>/In1' */
  real32_T input2;                     /* '<Root>/In2' */
  real32_T input3;                     /* '<Root>/In3' */
  real32_T input4;                     /* '<Root>/In4' */
} ExtU_rtwdemo_basicsc_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_basicsc.

open_system('rtwdemo_basicsc')

В модели выберите View> Model Data Editor.

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

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

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

В модели, Параметры конфигурации набора> Генерация кода> Системный конечный файл к ert.tlc. Генератор кода соблюдает псевдонимы типа данных, такие как mySingleAlias, только если вы выбираете ERT-based system target file.

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

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

rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc
### Successful completion of build procedure for model: rtwdemo_basicsc

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

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

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

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

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

Когда вы отображаете типы данных сигнала на диаграмме модели путем выбора Display> Signals и Ports> Port Data Types, по умолчанию, схема отображает псевдонимы (такие как myTypeAlias) вместо базовых типов данных (таких как int16). Чтобы отобразить базовые типы, выберите опцию для Отображения> Сигналы и Порты> Формат отображения Типа Данных порта. Для получения дополнительной информации смотрите Типы Данных порта (Simulink).

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

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

Модель 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')

В модели выберите View> 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 model: rtwdemo_fixpt1
### Successful completion of code generation for model: rtwdemo_fixpt1

В отчете генерации кода просмотрите файл 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. Для получения дополнительной информации смотрите, Переименовывают Переменные (Simulink).

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

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

Ограничения

  • Вы не можете сконфигурировать сгенерированный код, чтобы использовать эти пользовательские типы данных 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 только в непосредственных заменах типа данных.

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

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

Похожие темы