Управляющий сигнал и инициализация состояния в сгенерированном коде

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

Для основной информации об определении начальных значений для сигналов и дискретных состояний в модели, смотрите, Инициализируют Сигналы и Дискретные состояния (Simulink).

Инициализация состояния и сигнала в сгенерированном коде

Поведение инициализации для генерации кода совпадает с этим для симуляции модели за следующими исключениями:

  • Исполняемые файлы RSim могут использовать панель Data Import/Export диалогового окна Configuration Parameters, чтобы загрузить входные значения из MAT-файлов. GRT и исполняемые файлы ERT не могут загрузить входные значения из MAT-файлов.

  • Начальное значение для выходного сигнала блока или корневого сигнала ввода или вывода уровня может быть перезаписано внешним (вызов) программа.

  • Устанавливание начального значения для персистентных сигналов релевантно, если значение используется или просматривается внешним приложением.

Когда вы генерируете код, операторы инициализации помещаются в model.c или model.cpp в модели инициализируют код.

Например, рассмотрите модель rtwdemo_sigobj_iv.

Если вы создаете и инициализируете объекты сигнала в базовом рабочем пространстве, коде инициализации мест генератора кода для сигналов в файле rtwdemo_sigobj_iv.c под rtwdemo_sigobj_iv_initialize функция, как показано ниже.

 /* Model initialize function */
    
     void rtwdemo_sigobj_iv_initialize(void)

     {
        .
        .
        .
 /* exported global signals */
 S3 = -3.0;

 S2 = -2.0;
         .
         .
         .
/* exported global states */
X1 = 0.0;
X2 = 0.0;

/* external inputs */
S1 = -4.5;
         .
         .
         .

Следующий код показывает код инициализации для состояния блока Unit Delay активированной подсистемы X1 и выходной сигнал S2.

void MdlStart(void) {
          .
          .
          .
 /* InitializeConditions for UnitDelay: '<S2>/Unit Delay' */
  X1 = aa1;

 /* Start for enable system: '<Root>/Enabled Subsystem (state X1 inside)' */

  /* virtual outports code */

  /* (Virtual) Outport Block: '<S2>/Out1' */

  S2 = aa2;

}

Для активированной подсистемы начальное значение также используется в качестве значения сброса, если параметры блоков Выходного порта подсистемы Output when disabled установлены в reset. Следующий код от rtwdemo_sigobj_iv.c показывает оператор присваивания для S3 когда это появляется в выходной функции модели rtwdemo_sigobj_iv_output.

/* Model output function */

static void rtwdemo_sigobj_iv_output(void)
{
         .
         .
         .
 /* Disable for enable system: '<Root>/Enabled Subsystem (state X1 inside)' */

    /* (Virtual) Outport Block: '<S2>/Out1' */

    S2 = aa2;

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

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

Если вы устанавливаете Параметры конфигурации> Оптимизация> поведение параметра По умолчанию к Tunable, начальные условия появляются как настраиваемые поля глобальной структуры параметров.

Устанавливаете ли вы поведение параметра По умолчанию на Tunable или Inlined, можно использовать настраиваемый параметр, чтобы задать InitialValue свойство объекта сигнала или Начальный параметр условия блока. Для основной информации о настраиваемых параметрах смотрите, Создают Настраиваемый Калибровочный Параметр в Сгенерированном коде (Simulink Coder).

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

Исследуйте модель в качестве примера

Откройте модель rtwdemo_sigobj_iv в качестве примера и сконфигурируйте его, чтобы показать сгенерированные имена блоков. S2 сигнала использует Simulink.Signal объект в базовом рабочем пространстве.

Дважды кликните Simulink.Signal объект S2 просмотреть его свойства. Свойство Начального значения установлено в aa2. Объект использует переменную aa2 задавать начальное условие для S2 сигнала. Свойство Класса памяти установлено в ExportedGlobal. Использовать Simulink.Signal объект инициализировать сигнал, объект сигнала должен использовать класс памяти кроме Auto или, если соответствующая категория данных в Коде, Сопоставляющем Редактор, использует установку класса памяти кроме Default, Model default.

На панели Оптимизации, в диалоговом окне Configuration Parameters, нажимают Configure. Переменная aa2 настраиваемый параметр, который использует класс памяти ExportedGlobal.

В модели откройте Enabled Подсистему. В диалоговом окне блока Выходного порта параметр Вывел, когда отключено установлен в reset. Когда подсистема становится отключенной, выходной сигнал S2 сброс к начальному значению aa2.

Откройте диалоговое окно блока Unit Delay. На вкладке State Attributes поле имени состояния установлено в X1.

Откройте Разрешать диалоговое окно блока. Состояния параметра, когда включение установлено в reset. Когда переходы подсистемы от нерабочего состояния до активированного состояния, это сбрасывает внутренние состояния блока, такие как X1, к их начальным значениям.

В базовом рабочем пространстве дважды кликните Simulink.Signal объект X1 просмотреть его свойства. Свойство Начального значения установлено в aa1.

Дважды кликните Simulink.Parameter объект aa1 просмотреть его свойства. Свойство Класса памяти установлено в ExportedGlobal. Можно сгенерировать настраиваемые начальные условия для состояний блока при помощи настраиваемых параметров, таких как aa1 и Simulink.Signal возражает, такие как X1.

Сгенерируйте и смотрите код

Сгенерируйте код с моделью в качестве примера.

### Starting build procedure for: rtwdemo_sigobj_iv
### Successful completion of build procedure for: rtwdemo_sigobj_iv

В отчете генерации кода просмотрите файл rtwdemo_sigobj_iv.c. Код использует глобальные переменные, чтобы представлять состояние блока X1 и S2 сигнала.

/* Exported block states */
real_T X1;                             /* '<S1>/Unit Delay' */

/* Exported block signals */
real_T S1;                             /* '<Root>/In1' */
real_T S3;                             /* '<Root>/Signal Conversion' */
real_T S2;                             /* '<S1>/Unit Delay' */

Код использует глобальную переменную, чтобы представлять настраиваемый параметр aa1.

/* Exported block parameters */
real_T aa1 = -2.5;                     /* Variable: aa1

Функция инициализации модели использует настраиваемый параметр aa1 инициализировать X1 состояния. Функция также использует настраиваемый параметр aa2 инициализировать S2 сигнала.

  /* SystemInitialize for Enabled SubSystem: '<Root>/Enabled Subsystem (state X1 inside)' */
  /* InitializeConditions for UnitDelay: '<S1>/Unit Delay' */
  X1 = aa1;

  /* SystemInitialize for Outport: '<S1>/Out1' */
  S2 = 0.0;

В ступенчатой функции модели, когда Enabled переходы Подсистемы от нерабочего состояния до активированного состояния, состояние блока Unit Delay X1 сброс к его начальному значению.

  if (rtb_PulseGenerator > 0) {
    if (!rtwdemo_sigobj_iv_DW.EnabledSubsystemstateX1inside_M) {
      /* InitializeConditions for UnitDelay: '<S1>/Unit Delay' */
      X1 = aa1;
      rtwdemo_sigobj_iv_DW.EnabledSubsystemstateX1inside_M = true;
    }

    /* UnitDelay: '<S1>/Unit Delay' */
    S2 = X1;

    /* Update for UnitDelay: '<S1>/Unit Delay' incorporates:
     *  Inport: '<Root>/In1'
     */
    X1 = S1;
  } else {
    if (rtwdemo_sigobj_iv_DW.EnabledSubsystemstateX1inside_M) {
      /* Disable for Outport: '<S1>/Out1' */
      S2 = 0.0;
      rtwdemo_sigobj_iv_DW.EnabledSubsystemstateX1inside_M = false;
    }
  }

  /* End of Outputs for SubSystem: '<Root>/Enabled Subsystem (state X1 inside)' */

  /* DataStoreWrite: '<Root>/Data Store Write' */
  X2 = S2;

  /* SignalConversion: '<Root>/Signal Conversion' incorporates:
   *  DataStoreRead: '<Root>/Data Store Read'
   */
  S3 = X2;
}

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

  /* initialize error status */
  rtmSetErrorStatus(rtwdemo_sigobj_iv_M, (NULL));

  /* block I/O */

  /* exported global signals */
  S3 = -3.0;

  /* states (dwork) */
  (void) memset((void *)&rtwdemo_sigobj_iv_DW, 0,
                sizeof(DW_rtwdemo_sigobj_iv_T));

  /* exported global states */
  X1 = 0.0;
  X2 = 0.0;

  /* external inputs */
  S1 = -4.5;

  /* Start for DiscretePulseGenerator: '<Root>/Pulse Generator' */
  rtwdemo_sigobj_iv_DW.clockTickCounter = -2;

  /* Start for DataStoreMemory: '<Root>/Data Store Memory' */
  X2 = -3.5;

  /* SystemInitialize for Enabled SubSystem: '<Root>/Enabled Subsystem (state X1 inside)' */
  /* InitializeConditions for UnitDelay: '<S1>/Unit Delay' */
  X1 = aa1;

  /* SystemInitialize for Outport: '<S1>/Out1' */
  S2 = 0.0;

  /* End of SystemInitialize for SubSystem: '<Root>/Enabled Subsystem (state X1 inside)' */
}

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

Если Enabled Подсистема становится отключенной во время выполнения кода, алгоритм использует настраиваемое начальное условие aa2 устанавливать значение S2 сигнала.

  } else {

    if (rtwdemo_sigobj_iv_DW.EnabledSubsystemstateX1inside_M) {
      /* Disable for Outport: '<S1>/Out1' */
      S2 = 0.0;
      rtwdemo_sigobj_iv_DW.EnabledSubsystemstateX1inside_M = false;
    }
  }

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

Когда вы используете структуру MATLAB®, чтобы задать значения инициализации для элементов сигнала в шине, можно создать настраиваемую глобальную структуру в сгенерированном коде.

Если вы устанавливаете Параметры конфигурации> Оптимизация> поведение параметра По умолчанию к Tunable, начальное условие появляется как настраиваемая подструктура глобальной структуры параметров.

Устанавливаете ли вы поведение параметра По умолчанию на Tunable или Inlined, можно задать начальное условие при помощи настраиваемого Simulink.Parameter возразите, чье значение является структурой. Если вы применяете класс памяти кроме Auto к объекту параметра структура является настраиваемой в сгенерированном коде.

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

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

  • Simulink.Bus возразите, чтобы управлять типами данных полей структуры и элементов сигнала.

Для основной информации об использовании структур, чтобы инициализировать сигналы шины и решить, как к типам данных поля элемента управления, видят, Задают Начальные условия для Сигналов Шины (Simulink).

Сгенерируйте настраиваемую начальную структуру условия

В этом примере показано, как использовать настраиваемый параметр структуры, чтобы инициализировать сигнал виртуальной шины.

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

На вкладке Modeling нажмите Model Data Editor.

На вкладке Inports/Outports столбец Типов данных показывает, что каждый блок Inport в модели использует различный тип выходных данных.

Откройте диалоговое окно блока Создателя Шины. Блок выход является виртуальной шиной.

В диалоговом окне Configuration Parameters откройте панель Оптимизации. Поведение параметра Значения по умолчанию параметра конфигурации установлено в Tunable. По умолчанию параметры блоков, включая начальные условия, появляются в сгенерированном коде как настраиваемые поля глобальной структуры параметров.

В Model Data Editor смотрите вкладку Штатов.

Для блока Unit Delay, установленного Начального значения к структуре, которая задает начальное условие для каждого из трех элементов сигнала. Чтобы сгенерировать эффективный код, совпадайте с типами данных полей структуры с типами данных соответствующих элементов сигнала. Например, установите Начальное значение к выражению struct('thermocpl',15.23,'magFlow',uint32(79),'posSwitch',false).

set_param('rtwdemo_tunable_init_struct/Unit Delay','InitialCondition',...
'struct(''thermocpl'',15.23,''magFlow'',uint32(79),''posSwitch'',false)')

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

### Starting build procedure for: rtwdemo_tunable_init_struct
### Successful completion of build procedure for: rtwdemo_tunable_init_struct

В отчете генерации кода просмотрите файл rtwdemo_tunable_init_struct_types.h. Код задает тип структуры, поля которого используют типы данных, которые вы задали в struct выражение.

#ifndef DEFINED_TYPEDEF_FOR_struct_mqGi1jsItE0G7cf1bNqMu_
#define DEFINED_TYPEDEF_FOR_struct_mqGi1jsItE0G7cf1bNqMu_

typedef struct {
  real_T thermocpl;
  uint32_T magFlow;
  boolean_T posSwitch;
} struct_mqGi1jsItE0G7cf1bNqMu;

Просмотрите файл rtwdemo_tunable_init_struct.h. struct определение типа глобальной структуры параметров содержит подструктуру, UnitDelay_InitialCondition, который представляет Начальный параметр условия блока Unit Delay.

struct P_rtwdemo_tunable_init_struct_T_ {
  struct_mqGi1jsItE0G7cf1bNqMu UnitDelay_InitialCondition;

Просмотрите файл rtwdemo_tunable_init_struct_data.c. Этот исходный файл выделяет память для глобальной структуры параметров. Подструктура UnitDelay_InitialCondition появляется.

/* Block parameters (default storage) */
P_rtwdemo_tunable_init_struct_T rtwdemo_tunable_init_struct_P = {
  /* Mask Parameter: UnitDelay_InitialCondition
   * Referenced by:
   *   '<Root>/Unit Delay'
   *   '<Root>/Unit Delay'
   *   '<Root>/Unit Delay'
   */
  {
    15.23,
    79U,
    false
  },

Просмотрите файл rtwdemo_tunable_init_struct.c. Функция инициализации модели использует поля подструктуры, чтобы инициализировать состояния блока.

  /* InitializeConditions for UnitDelay generated from: '<Root>/Unit Delay' */
  rtwdemo_tunable_init_struct_DW.UnitDelay_1_DSTATE =
    rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.thermocpl;

  /* InitializeConditions for UnitDelay generated from: '<Root>/Unit Delay' */
  rtwdemo_tunable_init_struct_DW.UnitDelay_2_DSTATE =
    rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.magFlow;

  /* InitializeConditions for UnitDelay generated from: '<Root>/Unit Delay' */
  rtwdemo_tunable_init_struct_DW.UnitDelay_3_DSTATE =
    rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.posSwitch;

Используйте объект шины задать типы данных

Если вы создаете объект шины, можно использовать его, чтобы задать тип данных сигнала шины и настраиваемой начальной структуры условия. Перед генерацией кода, Simulink.Parameter возразите бросает значения полей структуры к типам данных элементов сигнала. Для основной информации о создании объектов шины и использовании их в моделях, смотрите Specify Bus Properties с Simulink. Соедините шиной Объекты (Simulink).

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

В базовом рабочем пространстве дважды кликните Simulink.Bus объект ComponentData. Объект задает три элемента сигнала: thermocpl, magFlow, и posSwitch. Элементы каждое использование другой тип данных.

В модели откройте Model Data Editor (на вкладке Modeling, нажмите Model Data Editor). Вкладка Inports/Outports показывает это для блока Inport DataIn, тип выходных данных (Столбец типа данных) установлен в Bus: ComponentData.

В командной строке создайте параметр структуры initStruct. Можно задать значения полей при помощи нетипизированных выражений. Чтобы улучшить удобочитаемость, задайте поле posSwitch с булевым значением.

initStruct = struct(...
    'thermocpl',15.23,...
    'magFlow',79,...
    'posSwitch',false ...
    );
initStruct = Simulink.Parameter(initStruct);

В Model Data Editor смотрите вкладку Parameters.

В модели кликните по блоку Unit Delay. Model Data Editor подсвечивает строку, которая соответствует Начальному параметру условия блока.

В Model Data Editor, набор значение параметров (Столбец значений) к initStruct.

Нажмите кнопку дополнительной информации Show/refresh. Объект параметра, initStruct, появляется в таблице данных как строка.

Используйте столбец Типа данных, чтобы установить тип данных initStruct к Bus: ComponentData.

initStruct.DataType = 'Bus: ComponentData';

Установите Представление Изменения выпадающий список на Code.

Используйте столбец Класса памяти, чтобы применить класс памяти ExportedGlobal к initStruct.

initStruct.StorageClass = 'ExportedGlobal';

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

### Starting build procedure for: rtwdemo_init_struct_busobj
### Successful completion of build procedure for: rtwdemo_init_struct_busobj

В отчете генерации кода просмотрите файл rtwdemo_init_struct_busobj_types.h. Код создает тип структуры ComponentData чьи поля используют типы данных в объекте шины.

#ifndef DEFINED_TYPEDEF_FOR_ComponentData_
#define DEFINED_TYPEDEF_FOR_ComponentData_

typedef struct {
  real_T thermocpl;
  uint32_T magFlow;
  boolean_T posSwitch;
} ComponentData;

Просмотрите файл rtwdemo_init_struct_busobj.c. Код создает глобальную переменную, чтобы представлять объект initStruct настраиваемого параметра.

/* Exported block parameters */
ComponentData initStruct = {
  15.23,
  79U,
  false
} ;                                    /* Variable: initStruct

Функция инициализации модели использует поля структуры, чтобы инициализировать состояния блока.

  /* InitializeConditions for UnitDelay generated from: '<Root>/Unit Delay' */
  rtwdemo_init_struct_busobj_DW.UnitDelay_1_DSTATE = initStruct.thermocpl;

  /* InitializeConditions for UnitDelay generated from: '<Root>/Unit Delay' */
  rtwdemo_init_struct_busobj_DW.UnitDelay_2_DSTATE = initStruct.magFlow;

  /* InitializeConditions for UnitDelay generated from: '<Root>/Unit Delay' */
  rtwdemo_init_struct_busobj_DW.UnitDelay_3_DSTATE = initStruct.posSwitch;

Чтобы изменить тип данных элемента сигнала, задайте новый тип в объекте шины. Элемент сигнала в модели использует новый тип. Перед симуляцией и генерацией кода, объект параметра initStruct бросает соответствующее поле структуры к новому типу.

Смотрите также

|

Похожие темы