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

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

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

Создайте модель ex_paramdt_contexts.

ex_paramdt_contexts

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

В Model Data Editor на вкладке Inports/Outports используйте столбец Data Type, чтобы задать тип данных In1 Входящий блок в single и тип данных In2 блокировать в int8.

На вкладке Signals установите типы данных выходов блока Gain равными Inherit: Same as input.

На вкладке Parameters, для параметров Gain блоков Gain, установите Тип данных Inherit: Same as input.

Для параметров Gain установите Значение равным 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')

В Model Data Editor для любых параметров блоков Gain щелкните по камере в столбце Значения. Рядом с myGainParam, нажмите кнопку действия (с тремя вертикальными точками) и выберите Create.

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

В диалоговом окне свойства myGainParam установите тип данных int8.

На Code Generation на вкладке, нажмите Configure in Coder App.

В редакторе Отображения установите класс памяти 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');

В Model Data Editor на вкладке Inports/Outports установите тип данных In2 Входящий блок в sharedType_int8.

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

Используйте столбец Data Type, чтобы задать тип данных объекта параметра 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 вычислить выходы двух блоков Gain. В случае блока Gain, входной сигнал которого использует тип данных 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);
}

Похожие темы