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

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

Для основной информации об определении начальных значений для сигналов и дискретных состояний в модели, смотрите, Инициализируют Сигналы и Дискретные состояния (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;
         .
         .
         .

Следующий код показывает код инициализации для состояния блока Единичной задержки активированной подсистемы 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 объекта сигнала или Начальный параметр условия блока. Для основной информации о настраиваемых параметрах смотрите, Создают Настраиваемый Калибровочный Параметр в Сгенерированном коде.

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

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

Откройте модель 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 Подсистему. В диалоговом окне блока Outport параметр Вывел, когда отключено установлен в reset. Когда подсистема становится отключенной, выходной сигнал сброс S2 к начальному значению aa2.

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

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

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

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

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

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

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

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

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

/* Exported block signals */
real_T S1;                             /* '<Root>/In1' */
real_T S3;                             /* '<Root>/Signal Conversion' */
real_T S2;                             /* '<S2>/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: '<S2>/Unit Delay' */
  X1 = aa1;

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

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

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

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

  } else {

    if (rtwdemo_sigobj_iv_DW.EnabledSubsystemstateX1inside_M) {
      /* Disable for Outport: '<S2>/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 в качестве примера и сконфигурируйте ее, чтобы показать сгенерированные имена блоков.

В модели выберите View> Model Data Editor.

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

Откройте диалоговое окно блока Bus Creator. Блок вывод является виртуальной шиной.

В диалоговом окне 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 model: rtwdemo_tunable_init_struct
### Successful completion of build procedure for model: 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,
    0
  },

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

  /* InitializeConditions for UnitDelay: '<Root>/Unit Delay' */
  rtwdemo_tunable_init_struct_DW.UnitDelay_1_DSTATE =
    rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.thermocpl;
  rtwdemo_tunable_init_struct_DW.UnitDelay_2_DSTATE =
    rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.magFlow;
  rtwdemo_tunable_init_struct_DW.UnitDelay_3_DSTATE =
    rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.posSwitch;

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

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

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

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

В модели откройте Model Data Editor (Представление> 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 model: rtwdemo_init_struct_busobj
### Successful completion of build procedure for model: 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,
  0
} ;                                    /* Variable: initStruct

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

  /* InitializeConditions for UnitDelay: '<Root>/Unit Delay' */
  rtwdemo_init_struct_busobj_DW.UnitDelay_1_DSTATE = initStruct.thermocpl;
  rtwdemo_init_struct_busobj_DW.UnitDelay_2_DSTATE = initStruct.magFlow;
  rtwdemo_init_struct_busobj_DW.UnitDelay_3_DSTATE = initStruct.posSwitch;

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

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

|

Похожие темы