По умолчанию сгенерированный код использует псевдонимы типа данных 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 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Для конфигурирования замены типа данных в целой модели (Configuration Parameters> Code Generation> Data Type Replacement), можно альтернативно использовать один из этих типов:
|
|
|
|
|
|
|
* Замена 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, например, заменить Чтобы осуществлять обмен данными замены типа в иерархии модели - ссылки, используйте конфигурации модели, на которые ссылаются (см. Долю Настройка Через Модели, на которые Ссылаются (Simulink)). |
Сконфигурируйте сгенерированный код, чтобы задать конкретный элемент данных, такой как переменная, при помощи определенного, значимого имени типа. |
В модели найдите элемент данных, который соответствует переменной. Например, проследите от генерации кода, сообщают модели. Используйте имя объекта При необходимости, чтобы предотвратить другие элементы данных в восходящих и нисходящих блоках от использования того же имени типа, сконфигурируйте те элементы, чтобы использовать тип данных, устанавливающий, который не наследован. По умолчанию большинство сигналов использует наследованный тип |
Используйте то же имя типа для нескольких сигналов и других элементов данных в информационном канале, который является серией связанных блоков. | В модели используйте имя объекта Обычно, неважно, где на информационном канале вы задаете тип, нисходящие элементы данных наследовали тип. Можно сконфигурировать восходящие элементы данных, чтобы наследовать тип, также. Рассмотрите определение типа в блоке, который вы не ожидаете удалять или изменять часто. |
Сконфигурируйте сгенерированный код, чтобы заменить зависящий от реализации тип, такой как char_T или boolean_T и другой тип эквивалентной длины в битах с одним именем типа, которое вы задаете. | Используйте имя объекта Simulink.AliasType сконфигурировать несколько замен типа данных одновременно. Смотрите Замену Зависящие от реализации Типы с Тем же Именем типа. |
Чтобы переименовать тип данных 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 Coder, который вы хотите переименовать, используйте имя типа данных Simulink, чтобы задать заменяющее имя. Вы не должны создавать объекты Simulink.AliasType
.
Чтобы заменить boolean_T
, int_T
или uint_T
, использует информацию в таблице.
Имя типа Simulink Coder | Заменяющие имена к использованию |
---|---|
|
Одно из этих имен:
|
|
|
|
|
|
|
* Замена 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
.
Сконфигурируйте свои настройки целевого компьютера в Configuration Parameters> Hardware Implementation.
Создайте объект Simulink.AliasType
под названием myInt
. В этом случае, потому что int_T
и int32_T
представляют 32-битное целое число со знаком, устанавливают BaseType
на int32
.
myInt = Simulink.AliasType('int32')
Сконфигурируйте замену совпадающего типа данных для 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)
Инструкции
Осмотрите пользовательские типы в Model Explorer путем двойного клика по первой желтой кнопке ниже.
Осмотрите заменяющее отображение типа данных путем двойного клика по второй желтой кнопке ниже.
Скомпилируйте схему, чтобы отобразить типы в этой модели (Симуляция> Схема Обновления или Ctrl+D).
Сгенерируйте код с синей кнопкой ниже и осмотрите образцовые файлы, чтобы видеть, как пользовательские типы появляются в сгенерированном коде.
Измените атрибуты ENG_SPEED
и ENG_SPEED_OFFSET
и повторных шагов 1-4.
Примечания
Пользовательские типы являются функцией Simulink, которые упрощают параметризацию типов данных в модели. Консервы Embedded Coder искажают имена типов данных (например, ENG_SPEED
) в сгенерированном коде, тогда как Simulink Coder реализует пользователя - задают типы как их базовый тип (например, real32_T
).
Embedded Coder также позволяет вам заменить встроенные типы данных на пользовательские типы данных в сгенерированном коде.
Управлять именами стандартных структур, которые Simulink Coder создает по умолчанию, чтобы хранить данные (
для данных о параметре, например), Configuration Parameters использования> Code Generation> Symbols> Global types, чтобы задать правило именования. Для получения дополнительной информации смотрите, Настраивают Сгенерированные Идентификаторы.model_P
Когда вы используете невиртуальные шины и структуры параметра к совокупным сигналам и параметрам блоков в пользовательскую структуру в сгенерированном коде, управляете именем типа структуры путем создания объекта 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
.