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

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

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

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

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

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

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

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

Генератор кода производит код инициализации и завершения по-другому, чем код сброса. Для кода инициализации и завершения генератор кода включает ваш код инициализации и завершения компонента в функции точки входа по умолчанию, 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:

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

  • Выделяет память для блока I/O и параметров состояния.

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

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

Оконечная функция, 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). Инициализировать Функциональный блок использует блок State Writer, чтобы установить начальное условие блока Discrete Integrator. Оконечный Функциональный блок включает блок State Reader, который читает состояние блока Discrete Integrator.

Параметр Event type для блока Event Listener для инициализирования и оконечных функций устанавливается на Initialize и Terminate, соответственно. Инициализировать функция использует блок State Writer, чтобы инициализировать входное значение для блока Discrete Integrator к 10. Оконечная функция использует блок State Reader, чтобы считать состояние блока Discrete Integrator.

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

Рассмотрите модель rtwdemo_irt_reset, который включает Функциональный блок Сброса, выведенный из Инициализировать Функционального блока.

Event type и параметры Event name блока Event Listener установлены в Reset и reset, соответственно. Функция использует блок State Writer, чтобы сбросить входное значение для блока Discrete Integrator к 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.blockic ), генератор кода заказывает код для компонентов, начиная с самого низкого уровня иерархии и заканчивающийся корнем.

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

Похожие темы