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

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

Примечание

The 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-битное целое число со знаком, set BaseType на int32.

    myInt = Simulink.AliasType('int32')

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

Примечание

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

Замена типа данных «многие к одному» не поддерживается для типов данных Simulink Coder разных размеров.

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

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

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

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

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. Скомпилируйте схему, чтобы отобразить типы в этой модели (Debug > Update Model > Update Model или 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 > 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.

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

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

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

На вкладке Кода С выберите Код Интерфейс > По умолчанию Код Отображений.

В редакторе Отображения в разделе 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');

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

slbuild('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.0789s

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

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

В командной строке создайте 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.

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

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

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

slbuild('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.1019s

В отчете о генерации кода просмотрите файл 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. Для отображения базовых типов выберите «Информационные наложения» > «Типы базовых данных». Для получения дополнительной информации см. раздел «Типы данных портов».

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

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

Пример модели 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 выберите вкладку Параметры.

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

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

Нажмите кнопку действия (с тремя вертикальными точками) рядом со значением параметров. Выберите «Создать».

В диалоговом окне «Создание новых данных» установите Value на Simulink.Parameter(8). В этом примере для более легко читаемого кода вы устанавливаете значение параметров 8 вместо -3,2. Нажмите кнопку Создать. A Simulink.Parameter объект с именем myParam появляется в базовом рабочем пространстве. Объект хранит значение реального мира 8, который блок Gain использует для значения параметра Gain.

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

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

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

Используйте столбец Data Type, чтобы задать тип данных 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')

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

slbuild('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.1889s

В отчете о генерации кода просмотрите файл 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
  • Замена типа данных не поддерживается для типов комплексных данных.

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

    Замена типа данных «многие к одному» не поддерживается для типов данных Simulink Coder разных размеров. Для получения дополнительной информации смотрите Замена зависимых от реализации типов на то же имя типа.

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

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

Похожие темы