По умолчанию сгенерированный код использует псевдонимы типа данных, такие как real_T
и int32_T
. Код использует эти псевдонимы, чтобы задать глобальные и локальные переменные. Если ваши стандарты кодирования требуют, чтобы вы использовали другие псевдонимы типа данных, включая псевдонимы, которые задает ваш существующий код, вы можете:
Сконфигурируйте замену типа данных для целой модели.
Сконфигурируйте отдельные элементы данных (такие как сигналы, параметры и состояния), чтобы использовать определенные псевдонимы типа данных.
Для получения информации об управлении типами данных в модели смотрите Типы данных Управляющего сигнала (Simulink).
Сохраните этот код С в файл с именем my_types.h
в вашей текущей папке. Этот файл представляет заголовочный файл в вашем существующем коде, который задает псевдонимы пользовательского типа данных при помощи операторов typedef
.
#include <stdbool.h> typedef double my_dblPrecision; typedef short my_int16; typedef bool my_bool;
Откройте модель в качестве примера ex_data_type_replacement.
open_system(fullfile(docroot,'toolbox','ecoder','examples',... 'ex_data_type_replacement'))
В модели выберите View> Model Data Editor.
В Model Data Editor осмотрите вкладку Signals.
Установите Change view выпадающий список на Code
. В таблице данных столбец Storage Class показывает, что именованные сигнальные линии, такие как temp
используют класс памяти ExportedGlobal
. С этой установкой сигнальные линии появляются в сгенерированном коде как отдельные глобальные переменные.
Установите Change view выпадающий список на Design
.
Обновите блок-схему.
Simulink присваивает определенный тип данных каждому сигналу, который использует наследованный тип данных, устанавливающий, такой как Inherit: Inherit via internal rule
.
В таблице данных расширьте ширину столбца Data Type. Столбец показывает, что сигналы в модели используют соединение типов данных int16
, double
и boolean
. Можно также видеть эти типы данных в модели.
Сгенерируйте код из модели.
В отчете генерации кода осмотрите совместно использованный служебный файл rtwtypes.h
. Код использует операторы typedef
, чтобы переименовать примитивные типы данных C при помощи стандартных псевдонимов Simulink® Coder™. Например, код переименовывает тип примитива double
при помощи псевдонима real_T
.
typedef double real_T;
Осмотрите файл ex_data_type_replacement.c
. Код использует псевдонимы типа данных по умолчанию для переменных declare и define. Например, код использует типы данных real_T
, int16_T
и boolean_T
, чтобы задать глобальные переменные flowIn
, temp
и intlk
.
real_T flowIn; /* '<Root>/In3' */ int16_T temp; /* '<Root>/Add2' */ boolean_T intlk; /* '<S1>/Compare' */
Функция модели step
задает локальные переменные при помощи псевдонимов совпадающего типа данных.
real_T rtb_Add; real_T rtb_FilterCoefficient;
Сконфигурируйте сгенерированный код, чтобы задать переменные при помощи пользовательских типов данных, заданных в my_types.h
вместо имен типов по умолчанию.
В командной строке создайте объект Simulink.AliasType
для каждого псевдонима типа данных, который задает ваш внешний код.
Simulink.importExternalCTypes('my_types.h');
В базовом рабочем пространстве функция Simulink.importExternalCTypes
создает объекты my_dblPrecision
, my_int16
и my_bool
.
Для каждого объекта функция устанавливает свойство DataScope
на 'Imported'
и свойство HeaderFile
к 'my_types.h'
. С этими настройками генератор кода не создает оператор typedef
для каждого объекта, но вместо этого сгенерированный код снова использует операторы от my_types.h
включением (#include
) файл.
В модели, в диалоговом окне Configuration Parameters, на Code Generation> панель Data Type Replacement, выбирают Replace data type names in the generated code.
Задайте опции в столбце Replacement Name согласно таблице.
Имя Simulink | Заменяющее имя |
---|---|
double | my_dblPrecision |
int16 | my_int16 |
boolean | my_bool |
Сгенерируйте код из модели.
В отчете генерации кода осмотрите файл rtwtypes.h
. Теперь, код использует директиву #include
, чтобы импортировать содержимое внешнего заголовочного файла my_types.h
, который содержит псевдонимы пользовательского типа данных.
#include "my_types.h" /* User defined replacement datatype for int16_T real_T boolean_T */
Осмотрите файл ex_data_type_replacement.c
. Код использует псевдонимы пользовательского типа данных my_dblPrecision
, my_int16
и my_bool
, чтобы задать глобальные переменные, такие как flowIn
, temp
и intlk
.
my_dblPrecision flowIn; /* '<Root>/In3' */ my_int16 temp; /* '<Root>/Add2' */ my_bool intlk; /* '<S1>/Compare' */
Функция модели step
задает локальные переменные при помощи псевдонимов пользовательского типа данных.
my_dblPrecision rtb_Add; my_dblPrecision rtb_FilterCoefficient;
Предположим, что ваши стандарты кодирования требуют, чтобы важные элементы данных использовали тип данных, имя которого указывает на реальное значение. Можно создать больше объектов Simulink.AliasType
представлять эти псевдонимы пользовательского типа данных. Используйте объекты установить типы данных элементов данных в модели.
В столбце Data Type Model Data Editor используйте объекты Simulink.AliasType
установить типы данных их, блокируют выходные параметры. Можно выбрать сигнальную линию в модели, которая подсвечивает соответствующую строку в Model Data Editor, или ищите сигналы в Model Data Editor при помощи поля Filter contents.
Блок | Тип выходных данных |
---|---|
Заданное значение потока | flow_T |
Add2 (который питает блок Compare), | diffTemp_T |
Используйте вкладку Model Data Editor Inports/Outports, чтобы установить тип данных третьего блока Inport к flow_T
.
В модели выберите View> Property Inspector.
Выбор блок маркировал Flow Controller. В Property Inspector нажмите Open, чтобы открыть диалоговое окно блока.
На вкладке Data Types, набор Sum output к ctrl_T
. Нажмите OK.
С этими настройками типа данных некоторые именованные сигналы, такие как temp
и flowIn
, используют типы данных, которые вызывают реальные количества, такие как жидкая скорость потока жидкости и температура.
В командной строке создайте объекты Simulink.AliasType
представлять эти новые псевдонимы пользовательского типа данных.
flow_T = Simulink.AliasType('double'); diffTemp_T = Simulink.AliasType('int16'); ctrl_T = Simulink.AliasType('double');
В модели сигналы flowIn
и flowSetPt
используют примитивный тип данных double
, таким образом, псевдоним типа данных flow_T
сопоставляет с double
.
Обновите блок-схему.
Из-за наследования типа данных, другие сигналы также используют псевдонимы пользовательского типа данных. Например, тип выходных данных блока Add, питаемого третьим блоком Inport, установлен в Inherit: Inherit via internal rule
. Внутреннее правило выбирает совпадающий тип данных, что блок вводит использование, flow_T
.
Сгенерируйте код из модели.
Файл ex_data_type_replacement_types.h
задает новые типы данных flow_T
, diffTemp_T
и ctrl_T
как псевдонимы my_dblPrecision
и my_int16
.
typedef my_dblPrecision flow_T; typedef my_int16 diffTemp_T; typedef my_dblPrecision ctrl_T;
В файле ex_data_type_replacement.c
код задает глобальные переменные при помощи новых имен типов.
flow_T flowIn; /* '<Root>/In3' */ flow_T flowSetPt; /* '<Root>/Flow Setpoint' */ ctrl_T flowCtrl; /* '<Root>/Interlock' */ diffTemp_T temp; /* '<Root>/Add2' */
Для блоков, которые не используют новые типы данных, соответствующий сгенерированный код продолжает использовать заменяющие типы, которые вы задали ранее. Например, в файле ex_data_type_replacement.h
, выходные параметры блоков In1 и In2 появляются как поля структуры, которые используют заменяющий тип my_int16
.
/* External inputs (root inport signals with auto storage) */ typedef struct { my_int16 In1; /* '<Root>/In1' */ my_int16 In2; /* '<Root>/In2' */ } ExtU_ex_data_type_replacement_T;
Пользовательский тип данных искажает flow_T
, и ctrl_T
сопоставляют с примитивным типом данных double
. Если вы хотите изменить этот базовый тип данных от double
до single
(float
), необходимо не забыть изменять свойство BaseType
обоих объектов Simulink.AliasType
.
Чтобы более легко внести это изменение, можно создать объект Simulink.NumericType
и сконфигурировать оба объекта Simulink.AliasType
относиться к нему. Затем необходимо изменить только объект Simulink.NumericType
. Объект Simulink.NumericType
позволяет вам совместно использовать тип данных, не создавая псевдоним типа данных.
В командной строке создайте объект Simulink.NumericType
представлять примитивный тип данных single
.
sharedType = Simulink.NumericType;
sharedType.DataTypeMode = 'Single';
Сконфигурируйте объекты Simulink.AliasType
flow_T
и ctrl_T
, чтобы получить базовый тип данных от этого нового объекта.
flow_T.BaseType = 'sharedType'; ctrl_T.BaseType = 'sharedType';
В модели выберите Display> Signals and Ports> Port Data Type Display Format> Base and Alias Types (см. Типы Данных порта (Simulink)). Обновите блок-схему.
Индикаторы типа данных в модели show, что псевдонимы flow_T
и ctrl_T
сопоставляют с типом примитива single
. Чтобы изменить этот базовый тип примитива, можно изменить свойство DataTypeMode
объекта Simulink.NumericType
, sharedType
.
По умолчанию объект Simulink.NumericType
не заставляет другой оператор typedef
появляться в сгенерированном коде.
Если вы генерируете код из модели, в то время как объект Simulink.NumericType
представляет тип данных single
, сгенерированный код сопоставляет flow_T
, и ctrl_T
к типу данных Simulink Coder по умолчанию искажают real32_T
, который сопоставляет с типом данных C float
. Можно заменить real32_T
таким же образом, что вы заменили real_T
, int16_T
и boolean_T
(Configuration Parameters> Code Generation> Data Type Replacement).
Simulink.NumericType
и объекты Simulink.AliasType
в базовом рабочем пространстве не сохраняются, если вы заканчиваете свой текущий сеанс MATLAB®. Чтобы постоянно хранить эти объекты, рассмотрите миграцию вашей модели к словарю данных. Смотрите Перемещают Модели, чтобы Использовать Словарь Данных Simulink (Simulink).
typedef
CЧтобы создать объекты Simulink.AliasType
для большого количества операторов typedef
в вашем внешнем коде С, рассмотрите использование функции Simulink.importExternalCTypes
.