Simulink® может добавить скрытый буфер сигнала перед блоком Outport в условной подсистеме или перед блоком Outport на верхнем уровне модели. Этот буфер обеспечивает последовательную инициализацию сигнала Outport блока.
В нескольких случаях добавление буфера сигнала с условным выходным сигналом или частичным сигналом записи может вызвать другой результат симуляции. Параметр Ensure outport is virtual является опцией для блока Outport, чтобы удалить буфер. Выберите эту опцию, когда вы имеете отношение к условным или частичным сигналам записи.
Рассмотрим следующую модель. Чтобы открыть модель, смотрите ex_conditional_write
.
Блок Merge объединяет свои входы в один сигнал, значение которого в любой момент равняется последнему вычисленному выходу его ведущих блоков.
Для случая с большинством моделей снимите флажок Ensure outport is virtual на блоке Outport, соединенном с Enabled Subsystem C
.
Блок Outport следует невиртуальной семантике. Скрытый буфер вставляется, если необходимо, перед блоком Outport.
Буфер обеспечивает последовательную инициализацию сигнала 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 Subsystem C.
Блок Outport следует виртуальной семантике.
Скрытый буфер не вставляется перед Outport блоком Подсистемы.
Если Simulink определяет, что буфер нужен, отображается ошибка.
Время 0: A
запускается, C не запускается. B не запускается. Сигнал слияния является начальным значением сигнала.
Время 0.5 сек: A не запускается. B запусков и выходов синусоиды. Сигнал слияния является значением синусоиды от B.
Время 1: A
запускается, C не запускается. B не запускается. Сигнал слияния является последним вычисленным выходом, который был синусоидой от B.
Типичный шаблон моделирования - это место, где вы хотите инициализировать векторный сигнал, а затем периодически обновлять частичные элементы сигнала на основе определенных обстоятельств или входов. Одним из способов моделирования этого шаблона является использование блока Merge, входы которого получены из двух блоков Function-Call Subsystem. Одна подсистема является задачей инициализации, а другая - задачей периодической записи.
Модель ниже демонстрирует этот шаблон. Этот Initialize_Process_Subsystem вызывается один раз в начале симуляции, чтобы инициализировать сигнал вектора. Вызывается Run_Process_Subsystem, чтобы частично записать в элементы вектора. Однако для выхода из блока Assignment нужен путь, где скрытые буферы не делают копии вектора. Установка флажка Ensure outport is virtual на блоке Outport удаляет скрытый буфер. Если Simulink определяет, что буфер нужен, отображается ошибка. Чтобы открыть модель, смотрите ex_partial_write_single_merge
.
The Initialize_Process_SubSystem
Инициализирует каждый элемент массива вектора 2 элемента со значением 7
.
Выводит вектор [7 7]
.
The Run_Process_Subsystem
Вводит значение индекса 1, но потому что параметр Index mode для блоков Selector установлен на Zero-based
, они выбирают 2-ые элементы из векторов входа.
Добавляет выходные скалярные значения из блоков Selector для результата 4
.
Потому что параметр Assignment Index mode блока установлен в Zero-based
и входной индекс Idx1 1
, выход сигнал должен быть вектором с длиной 2. После установки параметра Output size равным 2
, блок Assignment способен записывать во второй элемент.
Установка флажка 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; }