Задайте значения параметров конкретного экземпляра для переиспользуемых ссылочных Моделей

Когда вы используете ссылки на модель, чтобы разбить большую систему на компоненты, каждый компонент является отдельной моделью. Можно повторно использовать компонент путем обращения к нему с несколькими блоками Model. Каждый Model блок является образцом компонента. Затем можно сконфигурировать параметры блоков (такой как параметр Gain блока Gain), чтобы использовать то же значение или другое значение для каждого образца компонента. Чтобы использовать другие значения, создайте и используйте аргумент модели, чтобы задать значение параметров блоков.

Когда вы генерируете код из иерархии модели, которая использует аргументы модели, аргументы появляются в коде как формальные параметры ссылочных функций точки входа модели, таких как выход (step) функцию. Сгенерированный код затем передает значения параметров конкретного экземпляра, которые вы задаете в каждом блоке Model, соответствующим вызовам функции.

Независимо от того, используете вы или не используете аргументы модели, можно использовать классы памяти, чтобы сконфигурировать параметры блоков, которые будут появляться в сгенерированном коде как настраиваемые глобальные переменные. Можно также использовать классы памяти для генерации настраиваемых значений аргументов модели, которые сгенерированный код хранит в памяти и передает вызовам функции. Затем можно изменить значения во время выполнения.

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

Сконфигурируйте модель-ссылку, чтобы принять данные параметра через формальные параметры сгенерированной функции точки входа модели. Этот метод позволяет вам задать разное значение параметров для каждого образца (блока Model) ссылочной модели.

Сконфигурируйте модель-ссылку, чтобы использовать аргументы модели

Откройте модель ex_arg_code_ref. Эта модель представляет переиспользуемый алгоритм.

open_system('ex_arg_code_ref')

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

В редакторе Данных моделей в таблице данных используйте столбец Data Type, чтобы задать тип данных блока Inport равным single. Из-за наследования типа данных другие сигналы в модели используют совпадающий тип данных.

Выберите вкладку Parameters.

В модели выберите блок Gain.

В Model Data Editor используйте столбец Value, чтобы задать значение параметра Gain равным gainArg.

Рядом с gainArg, нажмите кнопку действия (3 вертикальные точки) и выберите Create.

В диалоговом окне «Создание новых данных» установите значение Simulink.Parameter и расположение к Model Workspace. Нажмите кнопку Создать.

В диалоговом окне свойств установите значение в число, например 3.17. Нажмите кнопку ОК.

Используйте Model Data Editor, чтобы задать параметр Numerator при помощи Simulink.Parameter объект с именем coeffArg значение 1.05. Как и в случае gainArg, сохраните объект параметра в рабочем пространстве модели.

В Model Data Editor нажмите кнопку Показать/обновить дополнительную информацию.

Используйте поле Filter contents, чтобы найти каждый объект параметра (gainArg и coeffArg). Для каждого объекта установите флажок в столбце «Аргументе».

Сохраните ex_arg_code_ref модель.

Кроме того, в командной строке можно использовать эти команды для конфигурирования блоков и объектов параметров:

set_param('ex_arg_code_ref/In1','OutDataTypeStr','single')

set_param('ex_arg_code_ref/Gain','Gain','gainArg')
modelWorkspace = get_param('ex_arg_code_ref','ModelWorkspace');
assignin(modelWorkspace,'gainArg',Simulink.Parameter(3.17));

set_param('ex_arg_code_ref/Discrete Filter','Numerator','coeffArg')
assignin(modelWorkspace,'coeffArg',Simulink.Parameter(1.05));

set_param('ex_arg_code_ref','ParameterArgumentNames','coeffArg,gainArg')

save_system('ex_arg_code_ref')

Задайте значения параметров для конкретного экземпляра в блоках Model

Откройте модель ex_arg_code. Эта модель использует несколько образцы (блоки Model) переиспользуемого алгоритма.

open_system('ex_arg_code')

В модели откройте вкладку Параметры Model Data Editor (Моделирование > Model Data Editor). В Model Data Editor показаны четыре строки, которые соответствуют аргументам модели, coeffArg и gainArg, который можно задать для двух блоков Model.

Используйте Model Data Editor, чтобы задать значения для аргументов модели в Model. Для примера используйте значения на рисунке. Для Model1, не задайте значение для аргументов модели. По умолчанию аргумент модели использует последнее значение, заданное ниже него в иерархии модели (обозначено значением from below).

Кроме того, в командной строке можно использовать эту команду, чтобы задать значения для Model:

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('coeffArg','0.98','gainArg','2.98'))

Сгенерируйте код из верхней модели.

slbuild('ex_arg_code')
### Starting serial model reference code generation build
### Successfully updated the model reference code generation target for: ex_arg_code_ref
### Starting build procedure for: ex_arg_code
### Successful completion of build procedure for: ex_arg_code

Build Summary

Code generation targets built:

Model            Action                       Rebuild Reason                     
=================================================================================
ex_arg_code_ref  Code generated and compiled  ex_arg_code_ref.c does not exist.  

Top model targets built:

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

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

Файл ex_arg_code_ref.c определяет функцию точки входа модели-ссылки, ex_arg_code_ref. Функция имеет два формальных параметра, rtp_coeffArg и rtp_gainArg, которые соответствуют аргументам модели, coeffArg и gainArg. Формальные параметры используют тип данных real32_T, что соответствует типу данных single в Simulink.

file = fullfile('slprj','grt','ex_arg_code_ref','ex_arg_code_ref.c');
rtwdemodbtype(file,'/* Output and update for referenced model:',...
    'real32_T rtp_gainArg)',1,1)
/* Output and update for referenced model: 'ex_arg_code_ref' */
void ex_arg_code_ref(const real32_T *rtu_In1, real32_T *rty_Out1, real32_T
                     rtp_coeffArg, real32_T rtp_gainArg, DW_ex_arg_code_ref_f_T *
                     localDW)
{
  real32_T rtb_Sum;

  /* Sum: '<Root>/Sum' incorporates:
   *  UnitDelay: '<Root>/Unit Delay'
   */
  rtb_Sum = *rtu_In1 + localDW->UnitDelay_DSTATE;

  /* Gain: '<Root>/Gain' */
  rtb_Sum *= rtp_gainArg;

  /* DiscreteFilter: '<Root>/Discrete Filter' */
  localDW->DiscreteFilter_tmp = rtb_Sum - 0.5F * localDW->DiscreteFilter_states;
  *rty_Out1 = rtp_coeffArg * localDW->DiscreteFilter_tmp;

  /* Update for UnitDelay: '<Root>/Unit Delay' */
  localDW->UnitDelay_DSTATE = rtb_Sum;

  /* Update for DiscreteFilter: '<Root>/Discrete Filter' */
  localDW->DiscreteFilter_states = localDW->DiscreteFilter_tmp;
}

/* Model initialize function */
void ex_arg_code_ref_initialize(const char_T **rt_errorStatus,
  RT_MODEL_ex_arg_code_ref_T *const ex_arg_code_ref_M, DW_ex_arg_code_ref_f_T
  *localDW)
{
  /* Registration code */

  /* initialize error status */
  rtmSetErrorStatusPointer(ex_arg_code_ref_M, rt_errorStatus);

  /* states (dwork) */
  (void) memset((void *)localDW, 0,
                sizeof(DW_ex_arg_code_ref_f_T));
}

Файл ex_arg_code.c содержит определение функции точки входа верхней модели, ex_arg_code. Эта функция вызывает ссылочную функцию точки входа модели, ex_arg_code_ref, и использует заданные вами значения аргументов модели (такие как 1.11 и 3.34) как значения rtp_coeffArg и rtp_gainArg.

file = fullfile('ex_arg_code_grt_rtw','ex_arg_code.c');
rtwdemodbtype(file,'/* ModelReference: ''<Root>/Model'' incorporates:',...
    '1.05F, 3.17F)',1,1)
  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1, 0.98F, 2.98F,
                  &(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2, 1.05F, 3.17F,
                  &(ex_arg_code_DW.Model1_InstanceData.rtdw));

  /* Matfile logging */
  rt_UpdateTXYLogVars(ex_arg_code_M->rtwLogInfo,
                      (&ex_arg_code_M->Timing.taskTime0));

  /* signal main to stop simulation */
  {                                    /* Sample time: [0.2s, 0.0s] */
    if ((rtmGetTFinal(ex_arg_code_M)!=-1) &&
        !((rtmGetTFinal(ex_arg_code_M)-ex_arg_code_M->Timing.taskTime0) >
          ex_arg_code_M->Timing.taskTime0 * (DBL_EPSILON))) {
      rtmSetErrorStatus(ex_arg_code_M, "Simulation finished");
    }
  }

  /* Update absolute time for base rate */
  /* The "clockTick0" counts the number of times the code of this task has
   * been executed. The absolute time is the multiplication of "clockTick0"
   * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
   * overflow during the application lifespan selected.
   * Timer of this task consists of two 32 bit unsigned integers.
   * The two integers represent the low bits Timing.clockTick0 and the high bits
   * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
   */
  if (!(++ex_arg_code_M->Timing.clockTick0)) {
    ++ex_arg_code_M->Timing.clockTickH0;
  }

  ex_arg_code_M->Timing.taskTime0 = ex_arg_code_M->Timing.clockTick0 *
    ex_arg_code_M->Timing.stepSize0 + ex_arg_code_M->Timing.clockTickH0 *
    ex_arg_code_M->Timing.stepSize0 * 4294967296.0;
}

/* Model initialize function */
void ex_arg_code_initialize(void)
{
  /* Registration code */

  /* initialize non-finites */
  rt_InitInfAndNaN(sizeof(real_T));

  /* initialize real-time model */
  (void) memset((void *)ex_arg_code_M, 0,
                sizeof(RT_MODEL_ex_arg_code_T));
  rtmSetTFinal(ex_arg_code_M, 10.0);
  ex_arg_code_M->Timing.stepSize0 = 0.2;

  /* Setup for data logging */
  {
    static RTWLogInfo rt_DataLoggingInfo;
    rt_DataLoggingInfo.loggingInterval = (NULL);
    ex_arg_code_M->rtwLogInfo = &rt_DataLoggingInfo;
  }

  /* Setup for data logging */
  {
    rtliSetLogXSignalInfo(ex_arg_code_M->rtwLogInfo, (NULL));
    rtliSetLogXSignalPtrs(ex_arg_code_M->rtwLogInfo, (NULL));
    rtliSetLogT(ex_arg_code_M->rtwLogInfo, "tout");
    rtliSetLogX(ex_arg_code_M->rtwLogInfo, "");
    rtliSetLogXFinal(ex_arg_code_M->rtwLogInfo, "");
    rtliSetLogVarNameModifier(ex_arg_code_M->rtwLogInfo, "rt_");
    rtliSetLogFormat(ex_arg_code_M->rtwLogInfo, 0);
    rtliSetLogMaxRows(ex_arg_code_M->rtwLogInfo, 0);
    rtliSetLogDecimation(ex_arg_code_M->rtwLogInfo, 1);

    /*
     * Set pointers to the data and signal info for each output
     */
    {
      static void * rt_LoggedOutputSignalPtrs[] = {
        &ex_arg_code_Y.Out1,
        &ex_arg_code_Y.Out2
      };

      rtliSetLogYSignalPtrs(ex_arg_code_M->rtwLogInfo, ((LogSignalPtrsType)
        rt_LoggedOutputSignalPtrs));
    }

    {
      static int_T rt_LoggedOutputWidths[] = {
        1,
        1
      };

      static int_T rt_LoggedOutputNumDimensions[] = {
        1,
        1
      };

      static int_T rt_LoggedOutputDimensions[] = {
        1,
        1
      };

      static boolean_T rt_LoggedOutputIsVarDims[] = {
        0,
        0
      };

      static void* rt_LoggedCurrentSignalDimensions[] = {
        (NULL),
        (NULL)
      };

      static int_T rt_LoggedCurrentSignalDimensionsSize[] = {
        4,
        4
      };

      static BuiltInDTypeId rt_LoggedOutputDataTypeIds[] = {
        SS_SINGLE,
        SS_SINGLE
      };

      static int_T rt_LoggedOutputComplexSignals[] = {
        0,
        0
      };

      static RTWPreprocessingFcnPtr rt_LoggingPreprocessingFcnPtrs[] = {
        (NULL),
        (NULL)
      };

      static const char_T *rt_LoggedOutputLabels[] = {
        "",
        "" };

      static const char_T *rt_LoggedOutputBlockNames[] = {
        "ex_arg_code/Out1",
        "ex_arg_code/Out2" };

      static RTWLogDataTypeConvert rt_RTWLogDataTypeConvert[] = {
        { 0, SS_SINGLE, SS_SINGLE, 0, 0, 0, 1.0, 0, 0.0 },

        { 0, SS_SINGLE, SS_SINGLE, 0, 0, 0, 1.0, 0, 0.0 }
      };

      static RTWLogSignalInfo rt_LoggedOutputSignalInfo[] = {
        {
          2,
          rt_LoggedOutputWidths,
          rt_LoggedOutputNumDimensions,
          rt_LoggedOutputDimensions,
          rt_LoggedOutputIsVarDims,
          rt_LoggedCurrentSignalDimensions,
          rt_LoggedCurrentSignalDimensionsSize,
          rt_LoggedOutputDataTypeIds,
          rt_LoggedOutputComplexSignals,
          (NULL),
          rt_LoggingPreprocessingFcnPtrs,

          { rt_LoggedOutputLabels },
          (NULL),
          (NULL),
          (NULL),

          { rt_LoggedOutputBlockNames },

          { (NULL) },
          (NULL),
          rt_RTWLogDataTypeConvert
        }
      };

      rtliSetLogYSignalInfo(ex_arg_code_M->rtwLogInfo, rt_LoggedOutputSignalInfo);

      /* set currSigDims field */
      rt_LoggedCurrentSignalDimensions[0] = &rt_LoggedOutputWidths[0];
      rt_LoggedCurrentSignalDimensions[1] = &rt_LoggedOutputWidths[1];
    }

    rtliSetLogY(ex_arg_code_M->rtwLogInfo, "yout");
  }

  /* states (dwork) */
  (void) memset((void *)&ex_arg_code_DW, 0,
                sizeof(DW_ex_arg_code_T));

  /* external inputs */
  ex_arg_code_U.In1 = 0.0F;

  /* external outputs */
  (void) memset((void *)&ex_arg_code_Y, 0,
                sizeof(ExtY_ex_arg_code_T));

  /* Model Initialize function for ModelReference Block: '<Root>/Model' */
  ex_arg_code_ref_initialize(rtmGetErrorStatusPointer(ex_arg_code_M),
    &(ex_arg_code_DW.Model_InstanceData.rtm),
    &(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* Model Initialize function for ModelReference Block: '<Root>/Model1' */
  ex_arg_code_ref_initialize(rtmGetErrorStatusPointer(ex_arg_code_M),
    &(ex_arg_code_DW.Model1_InstanceData.rtm),
    &(ex_arg_code_DW.Model1_InstanceData.rtdw));

  /* Matfile logging */
  rt_StartDataLoggingWithStartTime(ex_arg_code_M->rtwLogInfo, 0.0, rtmGetTFinal
    (ex_arg_code_M), ex_arg_code_M->Timing.stepSize0, (&rtmGetErrorStatus
    (ex_arg_code_M)));

  /* SystemInitialize for ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref_Init(&(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* SystemInitialize for ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref_Init(&(ex_arg_code_DW.Model1_InstanceData.rtdw));
}

/* Model terminate function */
void ex_arg_code_terminate(void)
{
  /* (no terminate code required) */
}

Формальные параметры используют тип данных real32_T (single) потому что:

  1. Параметры блоков в ex_arg_code_ref определите их типы данных через внутренние правила. Для примера в диалоговое окно блока Gain, на вкладке Параметра Attributes, Параметру тип данных установлен на Inherit: Inherit via internal rule (значение по умолчанию). В этом случае внутреннее правило выбирает тот совпадающий тип данных, что и входные и выходные сигналы, single.

  2. Аргументы модели в рабочем пространстве модели используют контекстно-зависимое типирование данных, потому что значение DataType для свойства задано значение auto (значение по умолчанию). С помощью этой настройки аргументы модели используют совпадающий тип данных, что и параметры блоков, single.

  3. Формальные параметры в сгенерированном коде используют совпадающий тип данных, что и аргументы модели, single.

Сгенерируйте настраиваемые значения аргументов

Можно сконфигурировать значения экземпляров в блоках Model, чтобы они появлялись в сгенерированном коде как настраиваемые глобальные переменные. Этот метод позволяет вам хранить значения параметров для каждого образца в памяти и настраивать значения во время выполнения кода.

В верхней модели ex_arg_code, выберите вкладку «Параметры Model Data Editor».

Используйте Model Data Editor, чтобы задать значения аргументов модели согласно этому рисунку.

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('coeffArg','coeffForInst1','gainArg','gainForInst1'))
set_param('ex_arg_code/Model1','ParameterArgumentValues',...
    struct('coeffArg','coeffForInst2','gainArg','gainForInst2'))

Просмотр содержимого ex_arg_code_ref рабочее пространство модели в Model Explorer.

Копировать gainArg и coeffArg от ex_arg_code_ref моделировать рабочую область в базовое рабочее пространство.

Переименовать gainArg как gainForInst1. Переименовать coeffArg как coeffForInst1.

gainForInst1 = getVariable(modelWorkspace,'gainArg');
gainForInst1 = copy(gainForInst1);
coeffForInst1 = getVariable(modelWorkspace,'coeffArg');
coeffForInst1 = copy(coeffForInst1);

Копировать gainForInst1 и coeffForInst1 как gainForInst2 и coeffForInst2.

gainForInst2 = copy(gainForInst1);
coeffForInst2 = copy(coeffForInst1);

Установите значения параметров конкретного экземпляра при помощи Value свойство объектов параметров в базовом рабочем пространстве.

gainForInst1.Value = 2.98;
coeffForInst1.Value = 0.98;

gainForInst2.Value = 3.34;
coeffForInst2.Value = 1.11;

Для каждого нового объекта параметра на вкладке Генерации кода установите StorageClass на ExportedGlobal. Эта настройка заставляет объекты параметров появляться в сгенерированном коде как настраиваемые глобальные переменные.

gainForInst1.StorageClass = 'ExportedGlobal';
coeffForInst1.StorageClass = 'ExportedGlobal';
gainForInst2.StorageClass = 'ExportedGlobal';
coeffForInst2.StorageClass = 'ExportedGlobal';

Сгенерируйте код из верхней модели.

slbuild('ex_arg_code')
### Starting serial model reference code generation build
### Model reference code generation target for ex_arg_code_ref is up to date.
### Starting build procedure for: ex_arg_code
### Successful completion of build procedure for: ex_arg_code

Build Summary

Top model targets built:

Model        Action                       Rebuild Reason                   
===========================================================================
ex_arg_code  Code generated and compiled  Generated code was out of date.  

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

Файл ex_arg_code.c определяет глобальные переменные, которые соответствуют объектам параметров в базовом рабочем пространстве.

file = fullfile('ex_arg_code_grt_rtw','ex_arg_code.c');
rtwdemodbtype(file,'/* Exported block parameters */',...
    '/* Block states (default storage) */',1,0)
/* Exported block parameters */
real32_T coeffForInst1 = 0.98F;        /* Variable: coeffForInst1
                                        * Referenced by: '<Root>/Model'
                                        */
real32_T coeffForInst2 = 1.11F;        /* Variable: coeffForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */
real32_T gainForInst1 = 2.98F;         /* Variable: gainForInst1
                                        * Referenced by: '<Root>/Model'
                                        */
real32_T gainForInst2 = 3.34F;         /* Variable: gainForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */

При каждом вызове ex_arg_code_refалгоритм верхней модели использует глобальные переменные, чтобы задать значения формальных параметров.

rtwdemodbtype(file,'/* ModelReference: ''<Root>/Model'' incorporates:',...
    'gainForInst2);',1,1)
  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1, coeffForInst1,
                  gainForInst1, &(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2, coeffForInst2,
                  gainForInst2, &(ex_arg_code_DW.Model1_InstanceData.rtdw));

  /* Matfile logging */
  rt_UpdateTXYLogVars(ex_arg_code_M->rtwLogInfo,
                      (&ex_arg_code_M->Timing.taskTime0));

  /* signal main to stop simulation */
  {                                    /* Sample time: [0.2s, 0.0s] */
    if ((rtmGetTFinal(ex_arg_code_M)!=-1) &&
        !((rtmGetTFinal(ex_arg_code_M)-ex_arg_code_M->Timing.taskTime0) >
          ex_arg_code_M->Timing.taskTime0 * (DBL_EPSILON))) {
      rtmSetErrorStatus(ex_arg_code_M, "Simulation finished");
    }
  }

  /* Update absolute time for base rate */
  /* The "clockTick0" counts the number of times the code of this task has
   * been executed. The absolute time is the multiplication of "clockTick0"
   * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
   * overflow during the application lifespan selected.
   * Timer of this task consists of two 32 bit unsigned integers.
   * The two integers represent the low bits Timing.clockTick0 and the high bits
   * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
   */
  if (!(++ex_arg_code_M->Timing.clockTick0)) {
    ++ex_arg_code_M->Timing.clockTickH0;
  }

  ex_arg_code_M->Timing.taskTime0 = ex_arg_code_M->Timing.clockTick0 *
    ex_arg_code_M->Timing.stepSize0 + ex_arg_code_M->Timing.clockTickH0 *
    ex_arg_code_M->Timing.stepSize0 * 4294967296.0;
}

/* Model initialize function */
void ex_arg_code_initialize(void)
{
  /* Registration code */

  /* initialize non-finites */
  rt_InitInfAndNaN(sizeof(real_T));

  /* initialize real-time model */
  (void) memset((void *)ex_arg_code_M, 0,
                sizeof(RT_MODEL_ex_arg_code_T));
  rtmSetTFinal(ex_arg_code_M, 10.0);
  ex_arg_code_M->Timing.stepSize0 = 0.2;

  /* Setup for data logging */
  {
    static RTWLogInfo rt_DataLoggingInfo;
    rt_DataLoggingInfo.loggingInterval = (NULL);
    ex_arg_code_M->rtwLogInfo = &rt_DataLoggingInfo;
  }

  /* Setup for data logging */
  {
    rtliSetLogXSignalInfo(ex_arg_code_M->rtwLogInfo, (NULL));
    rtliSetLogXSignalPtrs(ex_arg_code_M->rtwLogInfo, (NULL));
    rtliSetLogT(ex_arg_code_M->rtwLogInfo, "tout");
    rtliSetLogX(ex_arg_code_M->rtwLogInfo, "");
    rtliSetLogXFinal(ex_arg_code_M->rtwLogInfo, "");
    rtliSetLogVarNameModifier(ex_arg_code_M->rtwLogInfo, "rt_");
    rtliSetLogFormat(ex_arg_code_M->rtwLogInfo, 0);
    rtliSetLogMaxRows(ex_arg_code_M->rtwLogInfo, 0);
    rtliSetLogDecimation(ex_arg_code_M->rtwLogInfo, 1);

    /*
     * Set pointers to the data and signal info for each output
     */
    {
      static void * rt_LoggedOutputSignalPtrs[] = {
        &ex_arg_code_Y.Out1,
        &ex_arg_code_Y.Out2
      };

      rtliSetLogYSignalPtrs(ex_arg_code_M->rtwLogInfo, ((LogSignalPtrsType)
        rt_LoggedOutputSignalPtrs));
    }

    {
      static int_T rt_LoggedOutputWidths[] = {
        1,
        1
      };

      static int_T rt_LoggedOutputNumDimensions[] = {
        1,
        1
      };

      static int_T rt_LoggedOutputDimensions[] = {
        1,
        1
      };

      static boolean_T rt_LoggedOutputIsVarDims[] = {
        0,
        0
      };

      static void* rt_LoggedCurrentSignalDimensions[] = {
        (NULL),
        (NULL)
      };

      static int_T rt_LoggedCurrentSignalDimensionsSize[] = {
        4,
        4
      };

      static BuiltInDTypeId rt_LoggedOutputDataTypeIds[] = {
        SS_SINGLE,
        SS_SINGLE
      };

      static int_T rt_LoggedOutputComplexSignals[] = {
        0,
        0
      };

      static RTWPreprocessingFcnPtr rt_LoggingPreprocessingFcnPtrs[] = {
        (NULL),
        (NULL)
      };

      static const char_T *rt_LoggedOutputLabels[] = {
        "",
        "" };

      static const char_T *rt_LoggedOutputBlockNames[] = {
        "ex_arg_code/Out1",
        "ex_arg_code/Out2" };

      static RTWLogDataTypeConvert rt_RTWLogDataTypeConvert[] = {
        { 0, SS_SINGLE, SS_SINGLE, 0, 0, 0, 1.0, 0, 0.0 },

        { 0, SS_SINGLE, SS_SINGLE, 0, 0, 0, 1.0, 0, 0.0 }
      };

      static RTWLogSignalInfo rt_LoggedOutputSignalInfo[] = {
        {
          2,
          rt_LoggedOutputWidths,
          rt_LoggedOutputNumDimensions,
          rt_LoggedOutputDimensions,
          rt_LoggedOutputIsVarDims,
          rt_LoggedCurrentSignalDimensions,
          rt_LoggedCurrentSignalDimensionsSize,
          rt_LoggedOutputDataTypeIds,
          rt_LoggedOutputComplexSignals,
          (NULL),
          rt_LoggingPreprocessingFcnPtrs,

          { rt_LoggedOutputLabels },
          (NULL),
          (NULL),
          (NULL),

          { rt_LoggedOutputBlockNames },

          { (NULL) },
          (NULL),
          rt_RTWLogDataTypeConvert
        }
      };

      rtliSetLogYSignalInfo(ex_arg_code_M->rtwLogInfo, rt_LoggedOutputSignalInfo);

      /* set currSigDims field */
      rt_LoggedCurrentSignalDimensions[0] = &rt_LoggedOutputWidths[0];
      rt_LoggedCurrentSignalDimensions[1] = &rt_LoggedOutputWidths[1];
    }

    rtliSetLogY(ex_arg_code_M->rtwLogInfo, "yout");
  }

  /* states (dwork) */
  (void) memset((void *)&ex_arg_code_DW, 0,
                sizeof(DW_ex_arg_code_T));

  /* external inputs */
  ex_arg_code_U.In1 = 0.0F;

  /* external outputs */
  (void) memset((void *)&ex_arg_code_Y, 0,
                sizeof(ExtY_ex_arg_code_T));

  /* Model Initialize function for ModelReference Block: '<Root>/Model' */
  ex_arg_code_ref_initialize(rtmGetErrorStatusPointer(ex_arg_code_M),
    &(ex_arg_code_DW.Model_InstanceData.rtm),
    &(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* Model Initialize function for ModelReference Block: '<Root>/Model1' */
  ex_arg_code_ref_initialize(rtmGetErrorStatusPointer(ex_arg_code_M),
    &(ex_arg_code_DW.Model1_InstanceData.rtm),
    &(ex_arg_code_DW.Model1_InstanceData.rtdw));

  /* Matfile logging */
  rt_StartDataLoggingWithStartTime(ex_arg_code_M->rtwLogInfo, 0.0, rtmGetTFinal
    (ex_arg_code_M), ex_arg_code_M->Timing.stepSize0, (&rtmGetErrorStatus
    (ex_arg_code_M)));

  /* SystemInitialize for ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref_Init(&(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* SystemInitialize for ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref_Init(&(ex_arg_code_DW.Model1_InstanceData.rtdw));
}

/* Model terminate function */
void ex_arg_code_terminate(void)
{
  /* (no terminate code required) */
}

Глобальные переменные в сгенерированном коде используют тип данных real32_T (single) потому что:

  1. Объекты параметров в базовом рабочем пространстве используют контекстно-зависимое типирование данных, потому что DataType для свойства задано значение auto (значение по умолчанию). С помощью этой настройки объекты параметров в базовом рабочем пространстве используют тот совпадающий тип данных, что и аргументы модели, single.

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

Группируйте несколько аргументов модели в одну структуру

Используйте браузер Model Explorer, чтобы скопировать gainArg и coeffArg от ex_arg_code_ref моделируйте рабочую область в базовое рабочее пространство.

temp = getVariable(modelWorkspace,'gainArg');
gainArg = copy(temp);
temp = getVariable(modelWorkspace,'coeffArg');
coeffArg = copy(temp);

В командной строке объедините эти два объекта параметра в структуру structArg.

structArg = Simulink.Parameter(struct('gain',gainArg.Value,...
    'coeff',coeffArg.Value));

Используйте браузер Model Explorer, чтобы переместить structArg в рабочее пространство модели.

assignin(modelWorkspace,'structArg',copy(structArg));
clear structArg gainArg coeffArg

На панели «Содержимое» настройте structArg как единственный аргумент модели.

set_param('ex_arg_code_ref','ParameterArgumentNames','structArg')

В ex_arg_code_ref выберите вкладку Параметры Редактора данных модели (Model Data Editor Parameters).

Используйте Model Data Editor, чтобы задать значение параметра Gain равным structArg.gain и значение параметра Numerator, чтобы structArg.coeff. Сохраните модель.

set_param('ex_arg_code_ref/Gain','Gain','structArg.gain')
set_param('ex_arg_code_ref/Discrete Filter',...
    'Numerator','structArg.coeff')
save_system('ex_arg_code_ref')

В командной строке объедините четыре объекта параметров в базовом рабочем пространстве в две структуры. Каждая структура хранит значения параметров для одного образца ex_arg_code_ref.

structForInst1 = Simulink.Parameter(struct('gain',gainForInst1.Value,...
    'coeff',coeffForInst1.Value));

structForInst2 = Simulink.Parameter(struct('gain',gainForInst2.Value,...
    'coeff',coeffForInst2.Value));

В верхней ex_arg_code модели используйте Model Data Editor, чтобы задать значения аргументов согласно этому рисунку.

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('structArg','structForInst1'))
set_param('ex_arg_code/Model1','ParameterArgumentValues',...
    struct('structArg','structForInst2'))

Нажмите кнопку Показать/обновить дополнительные сведения.

Для новых объектов параметров structForInst1 и structForInst2, используйте Model Explorer, чтобы применить класс памяти ExportedGlobal.

structForInst1.StorageClass = 'ExportedGlobal';
structForInst2.StorageClass = 'ExportedGlobal';

В командной строке используйте функцию Simulink.Bus.createObject для создания Simulink.Bus объект. Иерархия элементов объекта соответствует иерархии полей структуры. Имя объекта по умолчанию slBus1.

Simulink.Bus.createObject(structForInst1.Value);

Переименуйте объект шины в myParamStructType путем копирования.

myParamStructType = copy(slBus1);

В Model Data Editor для ex_arg_code, используйте столбец Тип данных, чтобы задать тип данных structForInst1 и structForInst2 на Bus: myParamStructType.

structForInst1.DataType = 'Bus: myParamStructType';
structForInst2.DataType = 'Bus: myParamStructType';

temp = getVariable(modelWorkspace,'structArg');
temp = copy(temp);
temp.DataType = 'Bus: myParamStructType';
assignin(modelWorkspace,'structArg',copy(temp));

Сохраните ex_arg_code_ref модель.

save_system('ex_arg_code_ref')

Когда вы используете структуры для группировки значений параметров, вы не можете использовать преимущества контекстно-зависимого набора данных для управления типами данных полей структур (для примера, полями structForInst1). Однако можно использовать свойства объекта шины для управления типами данных поля.

В команде promt установите тип данных элементов объекта шины на single. Соответствующие поля в структурах (например structForInst1 и structArg) использовать тот совпадающий тип данных.

myParamStructType.Elements(1).DataType = 'single';
myParamStructType.Elements(2).DataType = 'single';

Сгенерируйте код из верхней модели, ex_arg_code.

slbuild('ex_arg_code')
### Starting serial model reference code generation build
### Successfully updated the model reference code generation target for: ex_arg_code_ref
### Starting build procedure for: ex_arg_code
### Successful completion of build procedure for: ex_arg_code

Build Summary

Code generation targets built:

Model            Action                       Rebuild Reason                                 
=============================================================================================
ex_arg_code_ref  Code generated and compiled  Model or library ex_arg_code_ref has changed.  

Top model targets built:

Model        Action                       Rebuild Reason                   
===========================================================================
ex_arg_code  Code generated and compiled  Referenced models were updated.  

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

Файл ex_arg_code_types.h определяет тип структуры myParamStructType, что соответствует Simulink.Bus объект.

file = fullfile('ex_arg_code_grt_rtw','ex_arg_code_types.h');
rtwdemodbtype(file,'typedef struct {','} myParamStructType;',1,1)
typedef struct {
  real32_T gain;
  real32_T coeff;
} myParamStructType;

В файл ex_arg_code_ref.c, функция точки входа модели-ссылки имеет формальный параметр, rtp_structArg, которые соответствуют аргументу модели structArg.

file = fullfile('slprj','grt','ex_arg_code_ref','ex_arg_code_ref.c');
rtwdemodbtype(file,'/* Output and update for referenced model:',...
    '*rtp_structArg)',1,1)
/* Output and update for referenced model: 'ex_arg_code_ref' */
void ex_arg_code_ref(const real32_T *rtu_In1, real32_T *rty_Out1, const
                     myParamStructType *rtp_structArg, DW_ex_arg_code_ref_f_T
                     *localDW)
{
  real32_T rtb_Sum;

  /* Sum: '<Root>/Sum' incorporates:
   *  UnitDelay: '<Root>/Unit Delay'
   */
  rtb_Sum = *rtu_In1 + localDW->UnitDelay_DSTATE;

  /* Gain: '<Root>/Gain' */
  rtb_Sum *= rtp_structArg->gain;

  /* DiscreteFilter: '<Root>/Discrete Filter' */
  localDW->DiscreteFilter_tmp = rtb_Sum - 0.5F * localDW->DiscreteFilter_states;
  *rty_Out1 = rtp_structArg->coeff * localDW->DiscreteFilter_tmp;

  /* Update for UnitDelay: '<Root>/Unit Delay' */
  localDW->UnitDelay_DSTATE = rtb_Sum;

  /* Update for DiscreteFilter: '<Root>/Discrete Filter' */
  localDW->DiscreteFilter_states = localDW->DiscreteFilter_tmp;
}

/* Model initialize function */
void ex_arg_code_ref_initialize(const char_T **rt_errorStatus,
  RT_MODEL_ex_arg_code_ref_T *const ex_arg_code_ref_M, DW_ex_arg_code_ref_f_T
  *localDW)
{
  /* Registration code */

  /* initialize error status */
  rtmSetErrorStatusPointer(ex_arg_code_ref_M, rt_errorStatus);

  /* states (dwork) */
  (void) memset((void *)localDW, 0,
                sizeof(DW_ex_arg_code_ref_f_T));
}

Файл ex_arg_code.c определяет глобальные переменные структуры, которые соответствуют объектам параметров в базовом рабочем пространстве.

file = fullfile('ex_arg_code_grt_rtw','ex_arg_code.c');
rtwdemodbtype(file,'/* Exported block parameters */',...
    '/* Block states (default storage) */',1,0)
/* Exported block parameters */
myParamStructType structForInst1 = {
  2.98F,
  0.98F
} ;                                    /* Variable: structForInst1
                                        * Referenced by: '<Root>/Model'
                                        */

myParamStructType structForInst2 = {
  3.34F,
  1.11F
} ;                                    /* Variable: structForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */

Алгоритм верхней модели в файле ex_arg_code.c передает адреса структурных переменных в ссылочную функцию точки входа модели.

file = fullfile('ex_arg_code_grt_rtw','ex_arg_code.c');
rtwdemodbtype(file,'/* ModelReference: ''<Root>/Model'' incorporates:',...
    '&structForInst2);',1,1)
  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1, &structForInst1,
                  &(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2, &structForInst2,
                  &(ex_arg_code_DW.Model1_InstanceData.rtdw));

  /* Matfile logging */
  rt_UpdateTXYLogVars(ex_arg_code_M->rtwLogInfo,
                      (&ex_arg_code_M->Timing.taskTime0));

  /* signal main to stop simulation */
  {                                    /* Sample time: [0.2s, 0.0s] */
    if ((rtmGetTFinal(ex_arg_code_M)!=-1) &&
        !((rtmGetTFinal(ex_arg_code_M)-ex_arg_code_M->Timing.taskTime0) >
          ex_arg_code_M->Timing.taskTime0 * (DBL_EPSILON))) {
      rtmSetErrorStatus(ex_arg_code_M, "Simulation finished");
    }
  }

  /* Update absolute time for base rate */
  /* The "clockTick0" counts the number of times the code of this task has
   * been executed. The absolute time is the multiplication of "clockTick0"
   * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
   * overflow during the application lifespan selected.
   * Timer of this task consists of two 32 bit unsigned integers.
   * The two integers represent the low bits Timing.clockTick0 and the high bits
   * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
   */
  if (!(++ex_arg_code_M->Timing.clockTick0)) {
    ++ex_arg_code_M->Timing.clockTickH0;
  }

  ex_arg_code_M->Timing.taskTime0 = ex_arg_code_M->Timing.clockTick0 *
    ex_arg_code_M->Timing.stepSize0 + ex_arg_code_M->Timing.clockTickH0 *
    ex_arg_code_M->Timing.stepSize0 * 4294967296.0;
}

/* Model initialize function */
void ex_arg_code_initialize(void)
{
  /* Registration code */

  /* initialize non-finites */
  rt_InitInfAndNaN(sizeof(real_T));

  /* initialize real-time model */
  (void) memset((void *)ex_arg_code_M, 0,
                sizeof(RT_MODEL_ex_arg_code_T));
  rtmSetTFinal(ex_arg_code_M, 10.0);
  ex_arg_code_M->Timing.stepSize0 = 0.2;

  /* Setup for data logging */
  {
    static RTWLogInfo rt_DataLoggingInfo;
    rt_DataLoggingInfo.loggingInterval = (NULL);
    ex_arg_code_M->rtwLogInfo = &rt_DataLoggingInfo;
  }

  /* Setup for data logging */
  {
    rtliSetLogXSignalInfo(ex_arg_code_M->rtwLogInfo, (NULL));
    rtliSetLogXSignalPtrs(ex_arg_code_M->rtwLogInfo, (NULL));
    rtliSetLogT(ex_arg_code_M->rtwLogInfo, "tout");
    rtliSetLogX(ex_arg_code_M->rtwLogInfo, "");
    rtliSetLogXFinal(ex_arg_code_M->rtwLogInfo, "");
    rtliSetLogVarNameModifier(ex_arg_code_M->rtwLogInfo, "rt_");
    rtliSetLogFormat(ex_arg_code_M->rtwLogInfo, 0);
    rtliSetLogMaxRows(ex_arg_code_M->rtwLogInfo, 0);
    rtliSetLogDecimation(ex_arg_code_M->rtwLogInfo, 1);

    /*
     * Set pointers to the data and signal info for each output
     */
    {
      static void * rt_LoggedOutputSignalPtrs[] = {
        &ex_arg_code_Y.Out1,
        &ex_arg_code_Y.Out2
      };

      rtliSetLogYSignalPtrs(ex_arg_code_M->rtwLogInfo, ((LogSignalPtrsType)
        rt_LoggedOutputSignalPtrs));
    }

    {
      static int_T rt_LoggedOutputWidths[] = {
        1,
        1
      };

      static int_T rt_LoggedOutputNumDimensions[] = {
        1,
        1
      };

      static int_T rt_LoggedOutputDimensions[] = {
        1,
        1
      };

      static boolean_T rt_LoggedOutputIsVarDims[] = {
        0,
        0
      };

      static void* rt_LoggedCurrentSignalDimensions[] = {
        (NULL),
        (NULL)
      };

      static int_T rt_LoggedCurrentSignalDimensionsSize[] = {
        4,
        4
      };

      static BuiltInDTypeId rt_LoggedOutputDataTypeIds[] = {
        SS_SINGLE,
        SS_SINGLE
      };

      static int_T rt_LoggedOutputComplexSignals[] = {
        0,
        0
      };

      static RTWPreprocessingFcnPtr rt_LoggingPreprocessingFcnPtrs[] = {
        (NULL),
        (NULL)
      };

      static const char_T *rt_LoggedOutputLabels[] = {
        "",
        "" };

      static const char_T *rt_LoggedOutputBlockNames[] = {
        "ex_arg_code/Out1",
        "ex_arg_code/Out2" };

      static RTWLogDataTypeConvert rt_RTWLogDataTypeConvert[] = {
        { 0, SS_SINGLE, SS_SINGLE, 0, 0, 0, 1.0, 0, 0.0 },

        { 0, SS_SINGLE, SS_SINGLE, 0, 0, 0, 1.0, 0, 0.0 }
      };

      static RTWLogSignalInfo rt_LoggedOutputSignalInfo[] = {
        {
          2,
          rt_LoggedOutputWidths,
          rt_LoggedOutputNumDimensions,
          rt_LoggedOutputDimensions,
          rt_LoggedOutputIsVarDims,
          rt_LoggedCurrentSignalDimensions,
          rt_LoggedCurrentSignalDimensionsSize,
          rt_LoggedOutputDataTypeIds,
          rt_LoggedOutputComplexSignals,
          (NULL),
          rt_LoggingPreprocessingFcnPtrs,

          { rt_LoggedOutputLabels },
          (NULL),
          (NULL),
          (NULL),

          { rt_LoggedOutputBlockNames },

          { (NULL) },
          (NULL),
          rt_RTWLogDataTypeConvert
        }
      };

      rtliSetLogYSignalInfo(ex_arg_code_M->rtwLogInfo, rt_LoggedOutputSignalInfo);

      /* set currSigDims field */
      rt_LoggedCurrentSignalDimensions[0] = &rt_LoggedOutputWidths[0];
      rt_LoggedCurrentSignalDimensions[1] = &rt_LoggedOutputWidths[1];
    }

    rtliSetLogY(ex_arg_code_M->rtwLogInfo, "yout");
  }

  /* states (dwork) */
  (void) memset((void *)&ex_arg_code_DW, 0,
                sizeof(DW_ex_arg_code_T));

  /* external inputs */
  ex_arg_code_U.In1 = 0.0F;

  /* external outputs */
  (void) memset((void *)&ex_arg_code_Y, 0,
                sizeof(ExtY_ex_arg_code_T));

  /* Model Initialize function for ModelReference Block: '<Root>/Model' */
  ex_arg_code_ref_initialize(rtmGetErrorStatusPointer(ex_arg_code_M),
    &(ex_arg_code_DW.Model_InstanceData.rtm),
    &(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* Model Initialize function for ModelReference Block: '<Root>/Model1' */
  ex_arg_code_ref_initialize(rtmGetErrorStatusPointer(ex_arg_code_M),
    &(ex_arg_code_DW.Model1_InstanceData.rtm),
    &(ex_arg_code_DW.Model1_InstanceData.rtdw));

  /* Matfile logging */
  rt_StartDataLoggingWithStartTime(ex_arg_code_M->rtwLogInfo, 0.0, rtmGetTFinal
    (ex_arg_code_M), ex_arg_code_M->Timing.stepSize0, (&rtmGetErrorStatus
    (ex_arg_code_M)));

  /* SystemInitialize for ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref_Init(&(ex_arg_code_DW.Model_InstanceData.rtdw));

  /* SystemInitialize for ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref_Init(&(ex_arg_code_DW.Model1_InstanceData.rtdw));
}

/* Model terminate function */
void ex_arg_code_terminate(void)
{
  /* (no terminate code required) */
}

Управляйте типами данных аргументов модели и значений аргументов

Когда вы используете аргументы модели, можно применить тип данных к:

  • Параметры блоков, которые используют аргументы (для определенных блоков, таких как в дискретной библиотеке).

  • Аргументы в рабочем пространстве модели-ссылки.

  • Значения аргументов, которые вы задаете в Model блоках.

Чтобы сгенерировать эффективный код путем устранения ненужных typecasts и C- сдвигов, рассмотрите использование унаследованного и контекстно-зависимого набора данных, чтобы соответствовать типам данных.

  • В рабочем пространстве модели используйте MATLAB® переменная, тип данных которой double или объект параметра, чей DataType для свойства задано значение auto. В этом случае переменная или объект использует совпадающий тип данных как параметры блоков.

  • Когда вы задаете значения аргументов в блоках Model, используйте преимущества контекстно-зависимого набора данных. Чтобы задать значение аргумента, используйте нетиповое значение.

    • Буквальное число, такое как 15.23. Не используйте типизированное выражение, такое как single(15.23).

    • Переменный MATLAB, тип данных которого double.

    • A Simulink.Parameter объект, чей DataType для свойства задано значение auto.

    В этих случаях число, переменная или объект использует тот совпадающий тип данных, что и аргумент модели в рабочем пространстве модели-ссылки. Если вы также конфигурируете аргумент модели, чтобы использовать контекстно-зависимый набор данных, можно управлять типами данных параметров блоков, аргумента и значения аргумента, задавая тип только для параметров блоков.

Для получения основной информации об управлении типами данных параметров смотрите Типы данных параметров в Сгенерированном коде.

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

Если вы используете аргумент модели, чтобы задать несколько значений параметров блоков, и типы данных параметров блоков различаются, вы не можете использовать контекстно-зависимую типизацию данных (double или auto) для аргумента в рабочем пространстве модели. Необходимо явным образом задать тип данных для аргумента. Для примера, если аргумент в рабочем пространстве модели является объектом параметра (таким как Simulink.Parameter), установите DataType свойство к значению, отличному от auto. Для получения дополнительной информации об этой ситуации см. Раздел «Повторно используйте данные параметра в Различные типы данных контекстах».

В этом случае можно продолжать использовать преимущества контекстно-зависимого набора данных, чтобы управлять типом данных значений аргументов, которые вы задаете в блоках Model. Каждое значение аргумента использует тип данных, который вы задаете для соответствующего аргумента в рабочем пространстве модели.

Похожие темы