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

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

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

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

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

  • Исполняемые файлы RSim могут использовать панель Data Import/Export диалогового окна Параметров конфигурации для загрузки значений входа из 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;

}

Для включенной подсистемы начальное значение также используется в качестве значения сброса, если для параметров блоков Outport 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;

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

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

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

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

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

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

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

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

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

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

Откройте диалоговое окно блока Unit Delay. На вкладке «Атрибуты состояния» в поле «имя состояния» задано значение X1.

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

В базовом рабочем пространстве дважды кликните Simulink.Signal X1 объекта для просмотра его свойств. Свойство Initial value установлено в 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

Build Summary

Top model targets built:

Model              Action                       Rebuild Reason                                    
==================================================================================================
rtwdemo_sigobj_iv  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 17.677s

В отчете о генерации кода просмотрите файл 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 UnitDelay: '<S1>/Unit Delay' incorporates:
   *  Outport: '<S1>/Out1'
   */
  S2 = 0.0;

В функции шага модели, когда Включенная Подсистема переходит от отключенного состояния к включенному состоянию, состояние блока 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 UnitDelay: '<S1>/Unit Delay' incorporates:
     *  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 UnitDelay: '<S1>/Unit Delay' incorporates:
   *  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 {

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

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

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

Если для параметра Параметры Конфигурации > Optimization > Default задано значение Tunableначальное условие появляется как настраиваемая подструктура структуры глобальных параметров.

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

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

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

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

Для получения основной информации об использовании структур для инициализации сигналов шины и для принятия решения о том, как управлять типами данных поля, смотрите «Задание начальных условий для элементов шины».

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

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

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

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

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

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

В диалоговом окне Параметры конфигурации откройте панель Оптимизация. Параметру конфигурации Поведение параметра по умолчанию задано значение 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

Build Summary

Top model targets built:

Model                        Action                       Rebuild Reason                                    
============================================================================================================
rtwdemo_tunable_init_struct  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 6.8071s

В отчете о генерации кода просмотрите файл 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. The struct определение типа структуры глобальных параметров содержит подструктуру, UnitDelay_InitialCondition, который представляет параметр Initial condition блока 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 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 объект приводит значения полей структуры к типам данных сигнальных элементов. Основные сведения о создании объектов шины и их использовании в моделях см. в разделе «Задание свойств шины с Simulink типами данных объектов .Bus».

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

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

В модели откройте Редактор данных модели (на вкладке Моделирование, нажмите 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 смотрите вкладку Параметры.

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

В Model Data Editor установите значение параметров (столбец «Значение») равным initStruct.

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

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

initStruct.DataType = 'Bus: ComponentData';

Установите в раскрывающемся списке Change View значение Code.

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

initStruct.StorageClass = 'ExportedGlobal';

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

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

Build Summary

Top model targets built:

Model                       Action                       Rebuild Reason                                    
===========================================================================================================
rtwdemo_init_struct_busobj  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.8746s

В отчете о генерации кода просмотрите файл 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 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 приводит соответствующее поле структуры к новому типу.

См. также

|

Похожие темы