Гарантируйте, что Выходной порт является Виртуальным

Simulink® может добавить скрытый буфер сигнала перед блоком Outport в условной подсистеме или перед блоком Outport на корневом уровне модели. Этот буфер гарантирует сопоставимую инициализацию блока-сигнала Выходного порта.

В нескольких случаях, добавляя буфер сигнала с условным выходным сигналом или частичным сигналом записи может вызвать различный результат симуляции. Параметр Ensure outport is virtual является опцией на блоке Outport, чтобы демонтировать буфер. Выберите эту опцию, когда вы будете обеспокоены условными или частичными сигналами записи.

Условный выходной сигнал

Рассмотрите следующую модель.

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

Для случая с большинством моделей очиститесь (сняли флажок) с флажком Ensure outport is virtual на блоке Outport, соединенном с Enabled Subsystem C.

  • Блок выходного порта следует за невиртуальной семантикой. Скрытый буфер вставляется в случае необходимости перед блоком Outport.

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

Время 0: выполнения A, C не запускается, но потому что буфер находится в A, это запускает и копирует начальное значение нуля к блоку Outport. B не запускается. Сигнал слияния является нулем от вывода от A.

Время 0.5: A не запускается. B выполнения и выходные параметры синусоида. Сигнал слияния является синусоидой от B.

Время 1. выполнения A, C не запускается, но буфер снова запускает и копирует по начальному значению нуля к блоку Outport. B не запускается. Сигнал слияния является снова начальным значением A, не последним значением от B.

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

Для случая, где вы обеспокоены условным выражением и частичными записями, выберите (проверяют) флажок Ensure outport is virtual на блок Outport, соединенный с Enabled Подсистемой C.

  • Блок Outport следует за виртуальной семантикой.

  • Скрытый буфер не вставляется перед блоком Outport Подсистемы.

  • Если Simulink решает, что буфер необходим, ошибка отображена.

Время 0: выполнения A, C не запускается. B не запускается. Сигнал слияния является начальным значением сигнала.

Время 0,5 секунды: A не запускается. B выполнения и выходные параметры синусоида. Сигнал слияния является значением синусоиды от B.

Время 1: выполнения A, C не запускается. B не запускается. Сигналом слияния является последний раз вычисленный вывод, который был синусоидой от B.

Частичные сигналы записи с блоком слияния

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

Модель ниже демонстрирует этот шаблон. Initialize_Process_Subsystem называется однажды в начале симуляции, чтобы инициализировать векторный сигнал. Run_Process_Subsystem называется, чтобы частично записать в элементы вектора. Однако для вывода от блока Assignment нужен путь, где скрытые буферы не делают копии вектора. Установка флажка Ensure outport is virtual на блоке Outport демонтирует скрытый буфер. Если Simulink решает, что буфер необходим, ошибка отображена.

Initialize_Process_SubSystem

  • Инициализирует каждый элемент 2 векторов элемента со значением 7.

  • Выводит векторный [7 7].

Run_Process_Subsystem

  • Вводит индексное значение 1, но потому что параметр Index mode для Селекторных блоков устанавливается на Zero-based, они выбирают 2-е элементы из входных векторов.

  • Добавляют выходные скалярные значения от Селекторных блоков для результата 4.

  • Поскольку блоком Assignment, параметр Index mode устанавливается на Zero-based и входной индекс Idx1, является 1, выходной сигнал должен быть вектором с длиной 2. После установки параметра Output size на 2 блок Assignment может записать в 2-й элемент.

  • Выбор флажка Ensure outport is virtual демонтирует скрытый буфер.

Код, сгенерированный из этой модели, включает две функции. Init_Proc и Run_Proc.

	/* Model step function */
	void Init_Proc(void)
	{
	  int32_T s3_iter;
	
	  /* Initialize signal vector elements with 7.0 */
         for (s3_iter = 0; s3_iter < 2; s3_iter++) {
	    PartialWriteSingleMerge_DW.Assignment[s3_iter] = 7.0;
	  }

	  for (s3_iter = 0; s3_iter < 2; s3_iter++) {
	    PartialWriteSingleMerge_Y.Out4[s3_iter] =
	      PartialWriteSingleMerge_DW.Assignment[s3_iter];
	  }
	}
	
	/* Model step function */
	void Run_Proc(void)
	{
        /* Write to element 1 of the output signal vector */
	  PartialWriteSingleMerge_Y.Out4[1] = 4.0;
	}