exponenta event banner

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

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

Основные сведения о задании начальных значений для сигналов и дискретных состояний в модели см. в разделе Инициализация сигналов и дискретных состояний.

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

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

  • Исполняемые файлы 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;

}

Для включенной подсистемы начальное значение также используется в качестве значения сброса, если параметр Outport block подсистемы 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 для просмотра его свойств. Свойство Initial value имеет значение aa2. Объект использует переменную aa2 задание начального условия для сигнала S2. Свойство класса Storage имеет значение ExportedGlobal. Использование Simulink.Signal объект для инициализации сигнала, объект сигнала должен использовать класс хранения, отличный от Auto или, если в соответствующей категории данных в редакторе сопоставления кодов используется параметр класса хранения, отличный от Default, Model default.

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

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

Откройте диалоговое окно Блок задержки установки (Unit Delay block). На вкладке Атрибуты состояния (State Attributes) в поле Наименование состояния (State name) установлено значение X1.

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

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

Дважды щелкните значок Simulink.Parameter объект aa1 для просмотра его свойств. Свойство класса Storage имеет значение 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;

В функции шага модели, когда подсистема Enabled переходит из состояния disabled в состояние 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 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) */
}

Если включенная подсистема отключается во время выполнения кода, алгоритм использует настраиваемое начальное условие 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 ® для определения значений инициализации сигнальных элементов в шине можно создать настраиваемую глобальную структуру в сгенерированном коде.

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

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

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

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

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

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

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

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

Открыть пример модели rtwdemo_tunable_init_struct и настройте его для отображения сгенерированных имен блоков.

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

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

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

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

В редакторе данных модели проверьте вкладку Состояния (States).

Для блока Единичная задержка (Unit Delay) задайте Начальное значение (Initial Value) для структуры, которая задает начальное условие для каждого из трех сигнальных элементов. Чтобы создать эффективный код, сопоставьте типы данных полей структуры с типами данных соответствующих сигнальных элементов. Например, задайте для параметра «Начальное значение» значение выражения 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. 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 Object Data Types.

Открыть пример модели rtwdemo_init_struct_busobj и настройте его для отображения сгенерированных имен блоков.

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

В модели откройте Редактор данных модели (на вкладке Моделирование (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). Редактор данных модели выделяет строку, соответствующую параметру начального условия блока.

В редакторе данных модели задайте значение параметра (столбец «Значение») равным initStruct.

Нажмите кнопку Показать/обновить дополнительную информацию. Объект параметра, 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

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 приводит соответствующее поле структуры к новому типу.

См. также

|

Связанные темы