Представляйте различные блоки источника и приемника в сгенерированном коде

Можно использовать Variant Source и блоки Variant Sink, чтобы чувствовать несколько реализаций модели в одной, объединенной блок-схеме. Каждая реализация зависит от условий, которые вы устанавливаете для блоков Variant Sink и Variant Source. Simulink® распространяет эти условия с восходящими и нисходящими блоками включая корневой вход и корневые выходные порты.

Можно сгенерировать:

  • Код из модели Simulink, содержащей Variant Sink и блоки Variant Source.

  • Код, который содержит условные выражения препроцессора, которые управляют активацией каждого варианта.

  • Условные выражения препроцессора, которые не допускают активного варианта.

Представляйте различный источник и различные блоки приемника в Simulink

В этом примере показано, как Различные Исходные блоки делают условное выражение элементов модели.

  1. От Библиотеки блока Simulink добавьте 1 блок Sine Wave Function, два блока Add, три блока Gain, два Outports и два блока Variant Source в новую модель.

  2. Откройте блок Sine Wave Function. Для параметра Sine type выберите Sample based. Для параметра Time (t) выберите Use simulation time. Для параметра Sample time вставьте значение 0.2.

  3. Сделайте четыре копии блока Sine Wave Function.

  4. Соедините и назовите блоки как показано.

  5. Вставьте значения 2, 3, и 4 в Gain2, Gain3, и Gain4 блоки, соответственно.

  6. Дайте модели имя inline_variants_example.

  7. Откройте диалоговое окно Block Parameters для Variant Source.

  8. В столбце Variant control, для Порта 1, Choice_1 замены с V==1. Для Порта 2, замените Choice_2 с V==2.

  9. Откройте диалоговое окно Block Parameters для Variant Source1.

  10. В столбце Variant control замените Choice_1 с W==1. Для Порта 2, замените Choice_2 с W==2.

  11. В командном окне MATLAB используйте эти команды, чтобы задать V и W как Simulink.Parameter объекты.

    V = Simulink.Parameter;
    V.Value = 1;
    V.DataType='int32';
    V.CoderInfo.StorageClass = 'custom';
    V.CoderInfo.CustomStorageClass = 'Define';
    V.CoderInfo.CustomAttributes.HeaderFile='inline_importedmacro.h'
    
    W = Simulink.Parameter;
    W.Value = 2;
    W.DataType='int32';
    W.CoderInfo.StorageClass = 'custom';
    W.CoderInfo.CustomStorageClass = 'Define';
    W.CoderInfo.CustomAttributes.HeaderFile='inline_importedmacro.h'

    В этом примере различными контрольными переменными является Simulink.Parameter объекты. Для генерации кода, если вы используете Simulink.Variant объекты задать различные средства управления, используйте Simulink.Parameter объекты или переменные MATLAB, чтобы задать их условия..

    Различные контрольные переменные, заданные как Simulink.Parameter объекты могут иметь один из этих классов памяти:

    • Define с заданным заголовочным файлом

    • ImportedDefine с заданным заголовочным файлом

    • CompilerFlag

    • SystemConstant (AUTOSAR)

    • Пользовательский пользовательский класс памяти, который задает данные как макрос в заданном заголовочном файле

    Если вы используете скалярные различные контрольные переменные, чтобы симулировать модель, можно преобразовать те переменные в Simulink.Parameter объекты. Смотрите Преобразуют Различные Контрольные переменные в Объекты Simulink.Parameter.

  12. Симулируйте модель.

    Input port 1 является активным выбором для Variant Source потому что значение различной контрольной переменной V 1. Input port 2 является активным выбором для Variant Source1 потому что значение различной контрольной переменной W 2. Неактивный выбор удален из выполнения, и их пути отображаются серым в схеме.

Задайте условия тот выбор варианта управления

Можно сгенерировать код, в который каждый вариант заключен в условных выражениях препроцессора C #if и #endif. Компилятор выбирает активный вариант во время компиляции, и условные выражения препроцессора определяют который разделы кода выполниться.

  1. Во вкладке Modeling панели инструментов Simulink нажмите Model Settings.

  2. На панели Code Generation и наборе System target file к ert.tlc.

  3. На панели Solver, установленной параметр Type на Fixed-step.

  4. В вашей модели откройте диалоговое окно параметров блоков для Variant Source.

  5. Установите параметр Variant activation time на code compile. Во время схемы обновления или симуляции, когда вы устанавливаете это значение параметров, Simulink анализирует все варианты. Этот анализ обеспечивает раннюю валидацию готовности генерации кода вариантов. Во время генерации кода, когда вы устанавливаете это значение параметров, генератор кода генерирует условные выражения препроцессора, которые управляют активацией каждого варианта.

  6. Очистите параметр Allow zero active variant controls.

  7. Откройте диалоговое окно Block Parameters для Variant Source 1. Повторите шаги 5 - 7.

  8. Создайте модель. Когда генерация кода завершена, сгенерированный код отображен в Представлении кода.

Рассмотрите сгенерированный код

  1. В Представлении кода выберите inline_variants_example.c файл.

  2. В inline_variants_example.c файл, вызов inline_variants_example_step функция условно скомпилирована как показано:

    /* Model step function */
    void inline_variants_example_step(void)
    {
      real_T rtb_VariantMerge_For_Variant_So;
      real_T rtb_VariantMerge_For_Variant__e;
    
      /* Sin: '<Root>/Sine2' incorporates:
       *  Sin: '<Root>/Sine3'
       *  Sum: '<Root>/Add'
       */
    #if V == 2
    
      rtb_VariantMerge_For_Variant_So = sin((real_T)
        inline_variants_example_DW.counter * 2.0 * 3.1415926535897931 / 10.0) + sin
        ((real_T)inline_variants_example_DW.counter_g * 2.0 * 3.1415926535897931 /
         10.0);
    
    #endif
    
      /* End of Sin: '<Root>/Sine2' */
    
      /* Sin: '<Root>/Sine4' incorporates:
       *  Sin: '<Root>/Sine5'
       *  Sum: '<Root>/Add1'
       */
    #if W == 2
    
      rtb_VariantMerge_For_Variant__e = sin((real_T)
        inline_variants_example_DW.counter_c * 2.0 * 3.1415926535897931 / 10.0) +
        sin((real_T)inline_variants_example_DW.counter_i * 2.0 * 3.1415926535897931 /
            10.0);
    
    #endif
    
      /* End of Sin: '<Root>/Sine4' */
    
      /* Sin: '<Root>/Sine1' */
    #if V == 1
    
      rtb_VariantMerge_For_Variant_So = sin((real_T)
        inline_variants_example_DW.counter_m * 2.0 * 3.1415926535897931 / 10.0);
    
    #endif
    
      /* End of Sin: '<Root>/Sine1' */
    
      /* Outport: '<Root>/Outport' incorporates:
       *  Gain: '<Root>/Gain1'
       */
      inline_variants_example_Y.Outport = 3.0 * rtb_VariantMerge_For_Variant_So;
    
      /* Gain: '<Root>/Gain' */
    #if W == 1
    
      rtb_VariantMerge_For_Variant__e = 2.0 * rtb_VariantMerge_For_Variant_So;
    
    #endif
    
      /* End of Gain: '<Root>/Gain' */
    
      /* Outport: '<Root>/Outport1' incorporates:
       *  Gain: '<Root>/Gain2'
       */
      inline_variants_example_Y.Outport1 = 4.0 * rtb_VariantMerge_For_Variant__e;
    
      /* Update for Sin: '<Root>/Sine2' incorporates:
       *  Sin: '<Root>/Sine3'
       */
    #if V == 2
    
      inline_variants_example_DW.counter++;
      if (inline_variants_example_DW.counter == 10) {
        inline_variants_example_DW.counter = 0;
      }
    
      inline_variants_example_DW.counter_g++;
      if (inline_variants_example_DW.counter_g == 10) {
        inline_variants_example_DW.counter_g = 0;
      }
    
    #endif
    
      /* End of Update for Sin: '<Root>/Sine2' */
    
      /* Update for Sin: '<Root>/Sine4' incorporates:
       *  Sin: '<Root>/Sine5'
       */
    #if W == 2
    
      inline_variants_example_DW.counter_c++;
      if (inline_variants_example_DW.counter_c == 10) {
        inline_variants_example_DW.counter_c = 0;
      }
    
      inline_variants_example_DW.counter_i++;
      if (inline_variants_example_DW.counter_i == 10) {
        inline_variants_example_DW.counter_i = 0;
      }
    
    #endif
    
      /* End of Update for Sin: '<Root>/Sine4' */
    
      /* Update for Sin: '<Root>/Sine1' */
    #if V == 1
    
      inline_variants_example_DW.counter_m++;
      if (inline_variants_example_DW.counter_m == 10) {
        inline_variants_example_DW.counter_m = 0;
      }
    
    #endif
    
      /* End of Update for Sin: '<Root>/Sine1' */
    }

Переменные rtb_VariantMerge_For_Variant_So и rtb_VariantMerge_For_Variant_e содержите входные значения с блоками Variant Source. Заметьте, что код для этих переменных является условным выражением. Переменные inline_variants_example_Y.Outport и inline_variants_example_Y.Outport1 содержите выходные значения блоков Variant Source. Заметьте, что код для этих переменных не является условным выражением.

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

Можно сгенерировать код, в котором блоки, соединенные с входом и выходом Различного Исходного блока, являются условным выражением.

  1. Для Variant Source, откройте диалоговое окно Block Parameters. Выберите параметр Allow zero active variant controls.

  2. Для Variant Source 1, откройте диалоговое окно Block Parameters. Выберите параметр Allow zero active variant controls.

Когда вы выбираете параметр Allow zero active variant controls, можно сгенерировать код для модели, содержащей Variant Source и блоки Variant Sink, даже когда вы задаете значение для различной контрольной переменной, которая не допускает активный вариант. Выбор значения для различной контрольной переменной, которая не допускает активный вариант и не выбор параметра Allow zero active variant controls, производит ошибку.

Сгенерируйте код для inline_variants_example. Заметьте в inline_variants_example.c файл, что код для переменных inline_variants_example_Y.Outport1 и inline_variants_example_Y.Outport2 условное выражение.

/* Model step function */
void inline_variants_example_step(void)
{
 ...
#if V == 1 || V == 2

  inline_variants_example_Y.Outport = 3.0 * rtb_VariantMerge_For_Variant_So;

#endif


 ...
#if (V == 1 && W == 1) || (V == 2 && W == 1) || W == 2

  inline_variants_example_Y.Outport1 = 4.0 * rtb_VariantMerge_For_Variant__e;

#endif
 
 ...

Похожие темы