Чтобы сгенерировать более эффективный код, совпадайте с типами данных параметров блоков (такими как параметр Gain блока Gain) с типами данных сигнала. В качестве альтернативы можно сохранить параметры в меньших типах данных.
Эти примеры показывают, как сгенерировать эффективный код путем конфигурирования параметров блоков, чтобы использовать совпадающий тип данных в качестве сигнала, что блок работает с.
Храните информацию типа данных в модели
Откройте модель rtwdemo_basicsc
в качестве примера и сконфигурируйте его, чтобы показать сгенерированные имена блоков.
load_system('rtwdemo_basicsc') set_param('rtwdemo_basicsc','HideAutomaticNames','off') open_system('rtwdemo_basicsc')
Идентифицируйте блок Gain в модели, которая использует переменную K1
базового рабочего пространства устанавливать значение параметра Усиления. Входной сигнал этого блока использует тип данных
single
.
На вкладке Modeling нажмите Model Data Editor.
В Model Data Editor выберите вкладку Parameters.
В модели выберите блок Gain. В Model Data Editor столбец Типа данных показывает, что тип данных параметра Усиления блока установлен в Inherit: Same as input
. С этой установкой параметр Усиления этого блока использует совпадающий тип данных в качестве входного сигнала.
В Model Data Editor, набор представление Change выпадающий список к Code
.
Обновите блок-схему. Теперь в Model Data Editor, таблица данных показывает строки, которые соответствуют переменным рабочей области, которые модель использует, включая K1
.
В Model Data Editor найдите строку, которая соответствует K1
. Для той строки, в столбце Класса памяти, выбирают Convert to parameter object
. Simulink преобразует K1
к Simulink.Parameter
объект.
Используйте столбец Класса памяти, чтобы применить класс памяти ExportedGlobal
. С этой установкой объект появляется в сгенерированном коде как глобальная переменная.
В Model Data Editor, представлении Change набора к Design
.
В таблице данных, для строки, которая представляет K1
, в столбце Типа данных выберите auto
. С этой установкой объект параметра получает свой тип данных от параметров блоков, которые используют объект (в этом случае, параметры блоков Усиления).
В качестве альтернативы, чтобы создать и сконфигурировать объект, используйте эти команды в командной строке:
K1 = Simulink.Parameter(2);
K1.CoderInfo.StorageClass = 'ExportedGlobal';
Сгенерируйте код из модели.
rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc ### Successful completion of build procedure for model: rtwdemo_basicsc
Сгенерированный файл rtwdemo_basicsc.c
задает глобальную переменную K1
при помощи типа данных real32_T
, который соответствует типу данных single
в Simulink.
file = fullfile('rtwdemo_basicsc_grt_rtw','rtwdemo_basicsc.c'); rtwdemodbtype(file,'/* Exported block parameters */','real32_T K1 = 2.0F;',1,1)
/* Exported block parameters */ real32_T K1 = 2.0F; /* Variable: K1
Алгоритм сгенерированного кода в модели step
функционируйте использует K1
непосредственно без преобразования типа.
rtwdemodbtype(file,' rtwdemo_basicsc_DW.X = K1',... ' rtCP_Table1_bp01Data, rtCP_Table1_tableData,',1,1)
rtwdemo_basicsc_DW.X = K1 * look1_iflf_binlx(rtwdemo_basicsc_U.input2, rtCP_Table1_bp01Data, rtCP_Table1_tableData, 10U);
На вкладке Model Data Editor Parameters можно опционально установить тип данных параметров блоков Усиления к Inherit: Inherit via internal rule
(значение по умолчанию). В этом случае параметры блоков выбирают совпадающий тип данных в качестве входного сигнала, single
. Однако, когда вы используете Inherit: Inherit via internal rule
, при других обстоятельствах (например, когда вы используете типы данных с фиксированной точкой), параметры блоков могут выбрать другой тип данных.
Храните информацию типа данных в объекте параметра
Когда вы используете Simulink.Parameter
возразите, чтобы экспортировать или импортировать данные о параметре от сгенерированного кода до вашего внешнего кода, например, путем применения класса памяти ImportedExtern
, можно указать информацию типа данных в объекте параметра. Чтобы совпадать с типом данных объекта параметра с типом данных сигнала, создайте Simulink.NumericType
или Simulink.AliasType
объект. Можно строго управлять типом данных, который объект параметра использует в сгенерированном коде, устраняя риск, что Simulink выбирает другой тип данных, когда вы вносите изменения в модель.
В командной строке создайте Simulink.NumericType
объект, который представляет тип данных single
.
myType = Simulink.NumericType;
myType.DataTypeMode = 'Single';
Используйте столбец Типа данных Model Data Editor, чтобы установить эти типы данных на myType
:
Объект параметра. Используйте вкладку Parameters.
Блок Inport под названием In2
. Используйте вкладку Inports/Outports. Из-за распространения типа данных, входной сигнал блока Gain также использует myType
.
Используйте вкладку Model Data Editor Parameters, чтобы установить тип данных параметров блоков Усиления к Inherit: Inherit from 'Gain'
. Используйте этот объект типа данных в качестве типа данных объекта параметра.
В качестве альтернативы, чтобы сконфигурировать объект и блоки, используйте эти команды в командной строке:
K1.DataType = 'myType'; set_param('rtwdemo_basicsc/In2','OutDataTypeStr','myType') set_param('rtwdemo_basicsc/Gain','ParamDataTypeStr','Inherit: Inherit from ''Gain''')
Сгенерируйте код из модели.
rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc ### Successful completion of build procedure for model: rtwdemo_basicsc
Глобальная переменная K1
продолжает использовать тип данных real32_T
.
file = fullfile('rtwdemo_basicsc_grt_rtw','rtwdemo_basicsc.c'); rtwdemodbtype(file,'/* Exported block parameters */','real32_T K1 = 2.0F;',1,1)
/* Exported block parameters */ real32_T K1 = 2.0F; /* Variable: K1
Когда вы используете объект параметра (например, Simulink.Parameter
) чтобы установить значения параметров блоков, можно сконфигурировать объект появиться в сгенерированном коде как настраиваемая глобальная переменная. По умолчанию объект параметра и соответствующая глобальная переменная обычно используют совпадающий тип данных в качестве сигнала или сигнализируют, с которым работает блок. Например, если входной сигнал блока Gain использует тип данных int16
, объект параметра обычно использует совпадающий тип данных. Чтобы уменьшать объем памяти, который использует эта переменная, укажите, что переменная использует меньший целочисленный тип данных, такой как int8
.
Сохраните значение параметров в целочисленном типе данных
Запустите скрипт prepare_rtwdemo_basicsc_2
, который готовит модель rtwdemo_basicsc
для этого примера.
run(fullfile(matlabroot,'examples','simulinkcoder',... 'main','prepare_rtwdemo_basicsc_2'))
Многие сигналы в модели используют тип данных single
.
На вкладке Modeling нажмите Model Data Editor.
В Model Data Editor смотрите вкладку Parameters.
Нажмите кнопку дополнительной информации Show/refresh.
Рядом с полем содержимого Фильтра активируйте Фильтр с помощью кнопки выбора.
В модели кликните по блоку Gain. Model Data Editor показывает одну строку, которая соответствует параметру Усиления блока и одной строки, которая соответствует переменной MATLAB K1
, который устанавливает значение параметров на 2
. K1
находится в базовом рабочем пространстве.
В Model Data Editor, набор представление Change выпадающий список к Code
.
В таблице данных, для строки, которая соответствует K1
, в столбце Класса памяти, из выпадающего списка, выбирают Convert to parameter object
. Simulink преобразует K1
к Simulink.Parameter
объект.
K1 = Simulink.Parameter(K1);
Используйте столбец Класса памяти, чтобы применить класс памяти ExportedGlobal
к K1
. С этой установкой, K1
появляется в сгенерированном коде как глобальная переменная.
K1.CoderInfo.StorageClass = 'ExportedGlobal';
В Model Data Editor, представлении Change набора к Design
и используйте столбец Типа данных, чтобы применить тип данных int8
к K1
.
K1.DataType = 'int8';
Для строки, которая представляет параметры блоков Усиления в столбце Типа данных, устанавливает выпадающий список на Inherit: Inherit from 'Gain'
. С этой установкой параметр Усиления блока наследовал int8
тип данных от объекта параметра.
set_param('rtwdemo_basicsc/Gain','ParamDataTypeStr',... 'Inherit: Inherit from ''Gain''')
Сгенерируйте код из модели.
rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc ### Successful completion of build procedure for model: rtwdemo_basicsc
Сгенерированный файл rtwdemo_basicsc.c
задает глобальную переменную K1
при помощи типа данных int8_T
, который соответствует типу данных int8
в Simulink.
file = fullfile('rtwdemo_basicsc_grt_rtw','rtwdemo_basicsc.c'); rtwdemodbtype(file,'/* Exported block parameters */','int8_T K1 = 2;',1,1)
/* Exported block parameters */ int8_T K1 = 2; /* Variable: K1
Алгоритм кода в модели step
функционируйте использует K1
вычислить выход блока Gain. Алгоритм бросает K1
к типу данных real32_T
единственный
) потому что сигналы, вовлеченные в вычисление, используют тип данных real32_T
.
rtwdemodbtype(file,' rtwdemo_basicsc_DW.X =','10U);',1,1)
rtwdemo_basicsc_DW.X = (real32_T)K1 * look1_iflf_binlx (rtwdemo_basicsc_U.input2, rtCP_Table1_bp01Data, rtCP_Table1_tableData, 10U);
Сохраните значение параметров фиксированной точки в меньшем целочисленном типе данных
Предположим, что вы конфигурируете сигналы в своей модели, чтобы использовать типы данных с фиксированной точкой. Вы хотите, чтобы параметр усиления появился в сгенерированном коде как настраиваемая глобальная переменная. Вы знаете область значений реальных значений, которые вы ожидаете, что параметр примет (например, между 0 и 4). Если можно соответствовать требованиям к приложению несмотря на уменьшаемую точность, можно уменьшать потребление памяти путем конфигурирования параметра, чтобы использовать другой тип данных, чем сигналы ввода и вывода блока.
Откройте модель fxpdemo_direct_form2
в качестве примера и сконфигурируйте его, чтобы показать сгенерированные имена блоков.
load_system('fxpdemo_direct_form2') set_param('fxpdemo_direct_form2','HideAutomaticNames','off') open_system('fxpdemo_direct_form2')
Обновите блок-схему. Сигналы в этом использовании модели подписали типы данных с фиксированной точкой с размером слова 16 и единственное двоичной точкой масштабирование.
Откройте диалоговое окно блока Gain5. Параметр Усиления устанавливается на 1.85
. Предположим, что вы хотите сконфигурировать этот параметр.
Установите усиление на myGainParam
и нажмите Apply.
Кликните по кнопке действий (с тремя вертикальными точками) рядом со значением параметров. Выберите Create.
В диалоговом окне Create New Data, установленном Значении к Simulink.Parameter(1.85)
и нажмите Create. Simulink.Parameter
объект myGainParam
появляется в базовом рабочем пространстве.
В myGainParam
диалоговое окно свойства, Класс памяти набора к ExportedGlobal
и нажмите ОК. С этой установкой, myGainParam
появляется в сгенерированном коде как глобальная переменная.
В диалоговом окне блока, на вкладке Parameter Attributes, установленном минимуме Параметра к 0
и максимум Параметра к 4
.
Установите Тип данных параметров на fixdt(0,8)
и нажмите Apply.
Нажмите кнопку Show Data Type Assistant. Ассистент Типа данных показывает что выражение fixdt(0,8)
задает тип данных с фиксированной точкой без знака с размером слова 8 и масштабирование лучшей точности. Когда вы симулируете или генерируете код, параметры блоков выбирают дробную длину (масштабирующуюся), который позволяет типу данных представлять значения между минимумом параметра и максимумом (0 и 4) с самой лучшей точностью.
В Ассистенте Типа данных, набор, Масштабирующийся к Binary point
. Нажмите Calculate Best-Precision Scaling, детали Fixed-point и Детали Обновления. Информация под деталями Фиксированной точки показывает, что дробная длина 5 может представлять значения параметров с точностью 0,03125.
Задержите Масштабирование к Best precision
и нажмите ОК. В этом примере, когда вы симулируете или генерируете код, параметры блоков выбирают дробную длину 5.
В качестве альтернативы можно использовать эти команды в командной строке, чтобы создать объект и сконфигурировать блок:
myGainParam = Simulink.Parameter(1.85); myGainParam.CoderInfo.StorageClass = 'ExportedGlobal'; set_param('fxpdemo_direct_form2/Gain5','Gain','myGainParam') set_param('fxpdemo_direct_form2/Gain5','ParamMin','0','ParamMax','4') set_param('fxpdemo_direct_form2/Gain5','ParamDataTypeStr','fixdt(0,8)')
Сконфигурируйте модель, чтобы представить отчет генерации кода. Чтобы уменьшать помеху в Командном окне, очистите параметр конфигурации Многословная сборка.
set_param('fxpdemo_direct_form2','GenerateReport','on',... 'LaunchReport','on','RTWVerbose','off')
Сгенерируйте код из модели.
evalc('rtwbuild(''fxpdemo_direct_form2'')');
Сгенерированный файл fxpdemo_direct_form2.c
задает глобальную переменную myGainParam
при помощи типа данных uint8_T
, который соответствует заданному размеру слова, 8. Код инициализирует переменную при помощи целочисленного значения, которое, учитывая дробную длину 5, представляет реальное значение параметров 1.85.
file = fullfile('fxpdemo_direct_form2_grt_rtw','fxpdemo_direct_form2.c'); rtwdemodbtype(file,'/* Exported block parameters */','uint8_T myGainParam = 59U;',1,1)
/* Exported block parameters */ uint8_T myGainParam = 59U; /* Variable: myGainParam
Алгоритм кода использует myGainParam
вычислить выход блока Gain5. Алгоритм использует сдвиг C, чтобы масштабировать результат вычисления.
rtwdemodbtype(file,'/* Gain: ''<Root>/Gain5'' */',... '/* Gain: ''<Root>/Gain'' incorporates:',1,0)
/* Gain: '<Root>/Gain5' */ fxpdemo_direct_form2_B.Gain5 = (int16_T)((myGainParam * fxpdemo_direct_form2_B.UnitDelay1) >> 5);