exponenta event banner

Повторное использование данных параметров в контекстах различных типов данных

При использовании Simulink.Parameter объект или числовая переменная MATLAB для установки двух или более значений параметров блока, если параметры блока имеют различные типы данных, необходимо явно указать тип данных объекта или переменной. Например, нельзя оставить тип данных объекта параметра значением по умолчанию, auto.

Создание и настройка примерной модели

Создание модели ex_paramdt_contexts.

ex_paramdt_contexts

На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).

В редакторе данных модели на вкладке Ввод/вывод (Inports/Outports) используйте столбец Тип данных (Data Type), чтобы задать тип данных In1 Блок ввода в single и тип данных In2 блок в int8.

На вкладке «Сигналы» установите типы данных выходных сигналов блока усиления в значение Inherit: Same as input.

На вкладке «Параметры» для параметров усиления блоков усиления задайте для параметра «Тип данных» значение Inherit: Same as input.

Для параметров усиления установите значение Value равным myGainParam.

Для настройки блоков можно также использовать следующие команды в командной строке:

set_param('ex_paramdt_contexts/In1','OutDataTypeStr','single')
set_param('ex_paramdt_contexts/In2','OutDataTypeStr','int8')
set_param('ex_paramdt_contexts/Gain - single','Gain','myGainParam',...
    'OutDataTypeStr','Inherit: Same as input',...
    'ParamDataTypeStr','Inherit: Same as input')
set_param('ex_paramdt_contexts/Gain - int8','Gain','myGainParam',...
    'OutDataTypeStr','Inherit: Same as input',...
    'ParamDataTypeStr','Inherit: Same as input')

В редакторе данных модели для параметра блока «Усиление» щелкните ячейку в столбце «Значение». Рядом с myGainParamнажмите кнопку действия (с тремя вертикальными точками) и выберите «Создать».

В диалоговом окне «Создание новых данных» задайте для параметра «Значение» значение Simulink.Parameter(3) и нажмите кнопку «Создать». A Simulink.Parameter объект со значением 3 появляется в рабочем пространстве модели.

В диалоговом окне свойств myGainParam задайте для параметра «Тип данных» значение int8.

На Code Generation щелкните Настроить в приложении Coder.

В редакторе сопоставлений кодов задайте класс хранения myGainParam кому ExportedGlobal. С классом хранения ExportedGlobalобъект отображается в созданном коде как глобальная переменная.

Кроме того, чтобы создать и настроить объект параметра, используйте следующие команды в командной строке:

mws = get_param('ex_paramdt_contexts', 'modelworkspace');
mws.assignin('myGainParam',Simulink.Parameter(3));
setVariablePart(mws,'myGainParam.DataType','int8');
cm = coder.mapping.utils.create('ex_paramdt_contexts');
setModelParameter(cm,'myGainParam','StorageClass','ExportedGlobal');

В этой модели используется объект параметра myGainParam для установки двух значений параметров блока. Параметры блока наследуют различные типы данных из входных сигналов блока (single или int8). Использовать myGainParam в этих контекстах различных типов данных явно указывается тип данных объекта параметра путем установки DataType свойство для int8.

Сопоставление типа данных объекта параметра с типом данных сигнала

При необходимости используйте Simulink.NumericType или Simulink.AliasType для установки типа данных объекта параметра и одного из типов данных сигнала. Этот метод исключает ненужные типы и сдвиги в генерируемом коде из-за несоответствия между типом данных объекта параметра и типом данных сигнала.

В командной строке создайте Simulink.NumericType объект для представления типа данных int8.

sharedType_int8 = fixdt('int8');

В редакторе данных модели на вкладке «Ввод/вывод» задайте тип данных In2 Блок ввода в sharedType_int8.

На вкладке «Параметры» обновите блок-схему. Таблица данных теперь содержит строку, представляющую объект параметра, myGainParam.

Используйте столбец «Тип данных», чтобы задать тип данных объекта параметра равным sharedType_int8.

Кроме того, чтобы настроить блок и объект, используйте следующие команды в командной строке:

myGainParam.DataType = 'sharedType_int8';
set_param('ex_paramdt_contexts/In2','OutDataTypeStr','sharedType_int8')

Объект параметра и сигнал используют тип данных int8. Чтобы изменить этот тип данных, настройте свойства объекта типа данных sharedType_int8.

Создание и проверка кода

Создайте код из модели.

slbuild('ex_paramdt_contexts')
### Starting build procedure for: ex_paramdt_contexts
### Successful completion of build procedure for: ex_paramdt_contexts

Build Summary

Top model targets built:

Model                Action                       Rebuild Reason                                    
====================================================================================================
ex_paramdt_contexts  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 5.464s

Созданный файл ex_paramdt_contexts.c определяет глобальную переменную myGainParam с использованием типа данных int8_T, который соответствует типу данных int8 в Simulink.

file = fullfile('ex_paramdt_contexts_grt_rtw','ex_paramdt_contexts.c');
rtwdemodbtype(file,'/* Exported block parameters */','int8_T myGainParam = 3;',1,1)
/* Exported block parameters */
int8_T myGainParam = 3;                /* Variable: myGainParam

Сгенерированный алгоритм кода в модели step функции использует myGainParam для вычисления выходных сигналов двух блоков усиления. В случае блока усиления, входной сигнал которого использует тип данных single, алгоритм кода выдает myGainParam к типу данных real32_T, который соответствует типу данных single в Simulink.

rtwdemodbtype(file,'/* Model step function */',...
    '/* Model initialize function */',1,0)
/* Model step function */
void ex_paramdt_contexts_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/Gain - single'
   *  Inport: '<Root>/In1'
   */
  ex_paramdt_contexts_Y.Out1 = (real32_T)myGainParam * ex_paramdt_contexts_U.In1;

  /* Outport: '<Root>/Out2' incorporates:
   *  Gain: '<Root>/Gain - int8'
   *  Inport: '<Root>/In2'
   */
  ex_paramdt_contexts_Y.Out2 = (int8_T)(myGainParam * ex_paramdt_contexts_U.In2);
}

Связанные темы