Сгенерируйте код, который реагирует на инициализацию, сброс и прекращение событий

Чтобы сгенерировать код из компонента моделирования, который реагирует на инициализацию, сброс и завершение событий во время выполнения, используйте блоки Initialize Function и Terminate Function. Для получения информации о том, как использовать эти блоки, смотрите Использование функций Initialize, Reset и Terminate. Можно использовать блоки в любом месте иерархии модели.

Примеры того, когда сгенерировать код, который реагирует на события инициализации, сброса или завершения, включают:

  • Запуск и остановка компонента.

  • Вычисление начальных условий.

  • Сохранение и восстановление состояния из энергонезависимой памяти.

  • Генерация функций точки входа сброса, которые реагируют на внешние события.

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

Генератор кода производит код инициализации и окончания по-другому, чем код сброса. Для кода инициализации и завершения генератор кода включает ваш код инициализации и завершения компонента в функции точки входа по умолчанию, model_initialize и model_terminate. Генератор кода производит код сброса только, если вы моделируете поведение сброса.

Сгенерируйте код для инициализации и завершения событий

Когда вы генерируете код для компонента, который включает Initialize Function и Terminate Function блоки, генератор кода:

  • Включает инициализацию кода события с кодом инициализации по умолчанию в функции точки входа model_initialize.

  • Включает код события завершения с кодом завершения по умолчанию в функции точки входа model_terminate.

Рассмотрим rtwdemo_irt_base модели.

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

void rtwdemo_irt_base_initialize(void)
void rtwdemo_irt_base_terminate(void)

Этот код появляется в сгенерированном файле rtwdemo_irt_base.c. Функция инициализации, rtwdemo_irt_base_initialize:

  • Инициализирует состояние ошибки.

  • Выделяет память для блочных параметров ввода-вывода и состояния.

  • Устанавливает выход значение

  • Устанавливает начальное условие для дискретного интегратора.

Функция завершения,,rtwdemo_irt_base_terminate, не требует кода.

Этот код принимает, что поддержка нефинитных чисел и логгирования MAT-файлов отключена.

void rtwdemo_irt_base_initialize(void)
{
  rtmSetErrorStatus(rtwdemo_irt_base_M, (NULL));

  (void) memset((void *)&rtwdemo_irt_base_DW, 0,
                 sizeof(DW_rtwdemo_irt_base_T));   
      
  rtwdemo_irt_base_Y.Out1 = 0.0;

  rtwdemo_irt_base_DW.DiscreteIntegrator_DSTATE = 0.0;
}
	
void rtwdemo_irt_base_terminate(void)
{
  /* (no terminate code required) */
}

Добавьте Initialize Function и Terminate Function блоки к модели (см rtwdemo_irt_initterm). Блок Initialize Function использует блок State Writer, чтобы задать начальное условие блока Дискретного Интегратора. Блок Terminate Function включает в себя State Reader блок, который читает состояние блока Discrete Integrator.

Значение Event type параметра для блока Event Listener для функций initialize и terminate устанавливается равным Initialize и Terminate, соответственно. Функция инициализации использует блок Средство Записи, чтобы инициализировать входное значение для блока Дискретного Интегратора равное 10. Функция terminate использует блок State Reader, чтобы считать состояние блока Discrete Integrator.

Генератор кода включает код события, который он генерирует для блоков Initialize Function и Terminate Function со стандартной инициализацией и завершением кода в функциях точки входа rtwdemo_irt_initterm_initialize и rtwdemo_irt_initterm_terminate. Этот код принимает, что поддержка нефинитных чисел и логгирования MAT-файлов отключена.

void rtwdemo_irt_initterm_initialize(void)
{
  rtmSetErrorStatus(rtwdemo_irt_initterm_M, (NULL));
		
  (void) memset((void *)&rtwdemo_irt__initterm_DW, 0,
	          sizeof(DW_rtwdemo_irt__initterm_T));
	
  rtwdemo_irt_initterm_Y.Out1 = 0.0;

  rtwdemo_irt_initterm_DW.DiscreteIntegrator_DSTATE = 10.0;
}

void rtwdemo_irt__initterm_terminate(void)
{
  /* (no terminate code required) */
} 

Сгенерируйте код для событий сброса

Сгенерируйте код, который реагирует на событие сброса, включив Initialize Function или Terminate Function блок в компонент моделирования. Сконфигурируйте блок для сброса путем установки параметра Event type его Event Listener блока равным Reset. Также установите параметр Event name. Имя по умолчанию reset.

Генератор кода производит функцию сброса точки входа, только если вы моделируете поведение сброса. Если компонент содержит несколько спецификаций сброса, код, который генерирует генератор кода, зависит от того, имеют ли функции сброса общее имя события. Для заданной иерархии компонентов:

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

  • Для функций сброса, которые имеют общее имя события, генератор кода агрегирует код сброса в одну функцию точки входа. Код для функций сброса появляется в порядке, начиная с самого низкого уровня (самого внутреннего) иерархии компонентов и заканчивая корнем (самым внешним). Имя функции: model_reset. Для получения дополнительной информации смотрите Имена событий и Агрегация кода.

Рассмотрим модель rtwdemo_irt_reset, который включает блок Reset Function, выведенный из блока Initialize Function.

Параметры Event type и Event name блока Event Listener установлены в Reset и reset, соответственно. Функция использует блок Средство Записи, чтобы сбросить входное значение для блока Дискретного Интегратора к 5.

Генератор кода производит функцию сброса rtwdemo_irt_reset_reset.

void rtwdemo_irt_reset_reset(void)

{
  rtwdemo_irt_reset_DW.DiscreteIntegrator_DSTATE = 5.0;
}

Имена событий и агрегация кода

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

При создании кода генератор кода агрегирует код для функций, которые имеют заданное имя события по всей иерархии компонентов, в одну функцию точки входа. Код для функций сброса появляется в порядке, начиная с самого низкого уровня (самого внутреннего) иерархии компонентов и заканчивая корнем (самым внешним). Генератор кода использует имя события, чтобы назвать функцию.

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

Несмотря на то, что модель включает несколько копий функций инициализации, сброса и завершения, генератор кода производит одну функцию точки входа для сброса (rtwdemo_irt_shared_reset), один для инициализации (rtwdemo_irt_shared_initialize), и один для завершения (rtwdemo_irt_shared_terminate). В рамках каждой функции точки входа, после перечисления кода для блоков, сконфигурированных с начальным условием (model_P. block_IC), генератор кода заказывает код для компонентов, начиная с самого низкого уровня иерархии и заканчивая корнем.

.
.
.
void rtwdemo_irt_shared_reset(void)
{
  rtwdemo_irt_shared_DW.SubIntegrator2_DSTATE = 5.0;

  rtwdemo_irt_shared_DW.Integrator2_DSTATE = 5.0;
} 
.
.
.
void rtwdemo_irt_shared_initialize(void)
{
  rtmSetErrorStatus(rtwdemo_irt_shared_M, (NULL));

  (void) memset(((void *)&rtwdemo_irt_shared_DW), 0,
                sizeof(DW_rtwdemo_irt_shared_T));

  rtwdemo_irt_shared_Y.Out1 = 0.0;

  rtwdemo_irt_shared_DW.Integrator1_DSTATE = 0.0;

  rtwdemo_irt_shared_DW.SubIntegrator2_DSTATE = 2.0;

  rtwdemo_irt_shared_DW.Integrator2_DSTATE = 10.0;
.
.
.
void rtwdemo_irt_shared_terminate(void)
{
   /* (no terminate code required) */
   }

Если вы переименовали событие, сконфигурированное для функции сброса подсистемы, в reset_02генератор кода производит две функции сброса точки входа, rtwdemo_irt_shared_reset и rtwdemo_irt_shared_reset_02.

void rtwdemo_irt_shared_reset(void)
{
	  rtwdemo_irt_shared_DW.SubIntegrator2_DSTATE = 5.0;
}
 
void rtwdemo_irt_shared_reset_02(void)
{
   rtwdemo_irt_shared_DW.Integrator2_DSTATE = 5.0;
}

Ограничение

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

Похожие темы