По умолчанию сгенерированный код использует псевдонимы типа данных, такие как real_T
и int32_T
. Код использует эти псевдонимы, чтобы задать глобальные и локальные переменные. Если ваши стандарты кодирования требуют, чтобы вы использовали другие псевдонимы типа данных, включая псевдонимы, которые задает ваш существующий код, вы можете:
Сконфигурируйте замену типа данных для целой модели.
Сконфигурируйте отдельные элементы данных (такие как сигналы, параметры и состояния), чтобы использовать определенные псевдонимы типа данных.
Для получения информации об управлении типами данных в модели смотрите Типы данных Управляющего сигнала.
Сохраните этот код С в файл с именем 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'))
На вкладке Modeling нажмите 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 Setpoint | flow_T |
Add2 (который питает блок Compare), | diffTemp_T |
Используйте вкладку Model Data Editor Inports/Outports, чтобы установить тип данных третьего блока Inport к flow_T
.
На вкладке Modeling, под Design, нажимают 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';
На вкладке Debug выберите Information Overlays> Base Data Types Information Overlays> Alias Data Types и (см. Типы Данных порта). Обновите блок-схему.
Индикаторы типа данных в модели 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.
typedef
C
ОператорыСоздать Simulink.AliasType
объекты для большого количества typedef
операторы в вашем внешнем коде С, рассмотрите использование Simulink.importExternalCTypes
функция.