exponenta event banner

Использовать блок очереди для управления сообщениями

В этом примере показано, как использовать блок Queue для хранения и постановки в очередь сообщений. Блок «Очередь» позволяет указать емкость хранилища сообщений, политику перезаписи и политику сортировки при переходе сообщений.

Управление переходами сообщений с помощью политик сортировки очереди

Блок Queue поддерживает три политики сортировки сообщений:

  • Last-in-first-out (FIFO) - новое сообщение в хранилище отправляется первым.

  • FIFO (First-in-first-out) - самое старое сообщение в хранилище отправляется первым.

  • Приоритет - сообщения сортируются на основе их приоритета. Очередь приоритетов может использоваться только в том случае, если снят флажок Перезаписать самый старый элемент, если очередь заполнена.

В этом примере используется простая модель связи на основе сообщений, представленная в разделе Анимация и понимание отправки и получения сообщений. Модель включает в себя поток сообщений 1 и поток сообщений 2, в которых сообщения передаются от синуса Wave1 к синусу Scope1 и синус Wave2 к синусу Scope2.

Описание модели

В потоке сообщений 1 и потоке сообщений 2:

  • Параметр Sample time для параметров Sine Wave1 и Sine Wave2 имеет значение 0.1. Они являются идентичными источниками синусоидальных волн.

  • Параметр Sample time Receive1 и Receive2 имеют значение 0.5. Они идентичны блокам приема.

  • Вместимость Queue1 и Queue2: 100. Обе очереди имеют одинаковую емкость.

  • Политика сортировки Queue1: LIFO и Queue2 является FIFO, которая отображается под метками блоков. Единственное различие между двумя сценариями потока сообщений заключается в политике сортировки очереди.

  • Сигналы между Sine Wave1, Receive1 и Receive2 регистрируются.

Моделирование модели и просмотр результатов

Смоделировать модель и наблюдать за результатами в инспекторе данных моделирования.

Просмотрите выходные данные Sine Wave1. Выходные данные SineWave2 не отображаются, так как они идентичны SineWave1. Также следует отметить, что сигнал от Receive1 является представлением синусоидальной волны, но с более длинными интервалами между выборками. Однако сигнал от Receive2 является первой частью синусоидальной волны, достигающей положительного пика, поскольку политика сортировки блока Queue установлена на FIFO и его емкость достаточно велика для хранения сообщений.

Политики перезаписи сообщений блокировки очереди

Можно также указать политику перезаписи сообщений блокировки очереди, когда очередь заполнена:

  • По умолчанию установлен флажок Перезаписать самый старый элемент, если очередь заполнена. Блок настроен так, чтобы всегда принимать входящее сообщение, перезаписывая самое старое сообщение в хранилище. В этом случае блок перезаписывает самое старое сообщение, но сообщение, покидающее блок, определяется политикой сортировки очереди.

В этом примере поведения очереди сообщения перечисляются на основе времени их поступления в очереди FIFO и LIFO с пропускной способностью. 8. Новое сообщение с номером 9 прибывает. В случаях FIFO и LIFO сообщение 9 заменяет сообщение 1, поскольку оно является самым старым элементом в очереди. Тем не менее, наблюдайте за сменой головки и хвостовой части очереди во время этого процесса. В очереди FIFO сообщение 2 отходит первым, потому что это самое старое сообщение после сообщения 1 заменяется. В очереди LIFO сообщение 9 отходит первым, поскольку это последнее сообщение, поступившее в хранилище. После отправления сообщения новое сообщение 10 прибывает. Очередь принимает новые сообщения в свою пустую ячейку склада.

  • Если флажок Перезаписать самый старый элемент, если очередь заполнена, то значок блока Очередь изменяется, и блок не принимает новые сообщения, когда очередь заполнена. Это поведение блокирующей очереди.

Блокировка очереди с включенной политикой перезаписи

В модели QueureSortingPolicyModelSequureViewer емкости блоков Queue в потоке сообщений 1 и потоке сообщений 2 изменяются на 15. При уменьшении емкости входящие сообщения перезаписываются существующими в хранилище.

Смоделировать модель и открыть блок «Просмотр последовательностей». В блоке «Просмотр последовательности» прокрутите вверх или щелкните слева значок Перейти к первому событию. Наблюдайте за сообщениями, выходящими из блока на основе политик FIFO и LIFO.

Оба блока очереди имеют ограниченную емкость. Когда их емкость заполнена, новое входящее сообщение перезаписывает самое старое сообщение в очереди. Прокрутите вниз и убедитесь, что в блоке «Просмотр последовательности» отображаются сообщения, перезаписывающие существующие.

Пример поведения блокирующей очереди

Чтобы проверить поведение очереди блокировок, откройте модель QueureOverAlignedPolicyModel.

В блоке Receive установите для параметра Sample time значение 0.5.

Обратите внимание, что в блоке Queue:

  • Флажок Перезаписать самый старый элемент, если очередь заполнена, снят. Наблюдайте за изменением значка блока.

  • Параметр Capacity имеет значение 16.

  • На вкладке Статистика (Statistics) установлены флажки Количество удаляемых объектов (Number of entities departed), d и Количество объектов в блоке (Number of entities in block), n.

Моделирование модели и анализ результатов

Моделирование модели. Обратите внимание на предупреждение, отображаемое в программе Diagnostic Viewer. Сообщения, отправленные блоком отправки, были удалены во время моделирования.

Блок «Очередь» блокирует сообщения при снятии флажка «Перезаписать самый старый элемент, если очередь заполнена». Для предотвращения отбрасывания сообщений можно увеличить емкость блока очереди.

Использование статистики для анализа поведения очереди

Если флажок Перезаписать самый старый элемент, если очередь заполнена, снят, вкладка Статистика включена. Вкладка «Статистика» используется для включения выходных портов и просмотра статистики блоков очереди. Статистика не поддерживается для создания кода.

Просмотрите сигналы, помеченные как Количество сообщений в блоке и Количество отправленных сообщений. До времени моделирования 2, есть 16 сообщения в хранилище, т.е. емкость очереди. После этого количество сообщений в блоке принимает значения 15 и 16 потому что сообщения отправляются каждые 0.5 время моделирования и приходит новое сообщение.

Во время моделирования 10, всего 21 сообщения покидают блок.

Использовать действия с событиями

Можно также использовать действия Событие, если снят флажок Перезаписать самый старый элемент, если очередь заполнена. Действия с событиями не поддерживаются для создания кода. Дополнительные сведения см. в разделе События и действия с событиями (SimEvents).

Используйте действия События, чтобы указать поведение сообщения в определенных событиях. Например, действия Ввод и Выход вызываются непосредственно после ввода сообщения и непосредственно перед выходом сообщения. Действие Блокировано вызывается после блокировки сообщения.

Дополнительные сведения см. в разделе Моделирование интерфейса получения сообщений, работающего при доступности сообщений.

Можно также моделировать более сложные политики связи с помощью блоков из библиотеки SimEvents ®, для которых требуется лицензия SimEvents ®.

См. также

| | | | |

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