В этом примере показано, как смоделировать беспроводную передачу сообщений с потерей пакетов и отказом канала с помощью сообщений Simulink ®, Stateflow ® и SimEvents ®.
В этой модели существуют два компонента, которые отправляют сообщения, и два компонента, которые получают сообщения. Сообщения передаются с использованием совместно используемого беспроводного канала с задержкой передачи. График Stateflow ® моделирует логику отправки сообщений в беспроводном компоненте, а блоки SimEvents ® моделируют беспроводную передачу сообщений, отказ канала и потерю пакетов.
Обзор сообщений см. в разделе Обзор сообщений Simulink.
В модели существуют два программных компонента, которые выводят сообщения: WirelessSend и WirelessStateflowSend.
В компоненте WirelessSend источником сигнала является блок Sine Wave. Блок Sine Wave генерирует синусоиду с амплитудой 1
. Для блока Шаг расчета задано значение 0.1
. Блок Send преобразует сигнал в сообщение, которое несет данные значения сигналов. Компонент WirelessSendComponent подключен к буферу отправки 1.
В компоненте WirelessStateflowSend другой блок Sine Wave генерирует сигнал синусоиды, и блок Noise используется, чтобы ввести шум в сигнал. Блок Noise выводит сигнал, значения которого генерируются из Гауссова распределения со средним значением 0
и отклонение 1
. График Stateflow ® представляет простую логику, которая фильтрует сигнал и решает, отправлять ли сообщения. Компонент StateflowSend отправляет сообщения в буфер отправки 2.
В модели есть два программных компонента, которые получают сообщения, WirelessReceive и WirelessListener.
В компоненте WirelessReceive блок Receive получает сообщения и преобразует данные сообщения в значения сигналов. Компонент соединяется с буфером приема 1.
В компоненте WirelessListener существует блок Simulink Function, который запускает onOneMessage(data)
функция. Когда сообщение приходит в буфер приема 3, блок Simulink Function принимает аргумент data
, которое является значением от данных сообщения в качестве входного сигнала. В блоке, data
значения умножаются на 2
. Блок выводит новое значение данных.
Дополнительные сведения о создании этих компонентов см. в разделе Создание общего канала связи с несколькими отправителями и приемниках.
Компоненты WirelessSend и WirelessStateflowSend отправляют сообщения в буфер отправки 1 и буфер отправки 2, которые являются блоками SimEvents ® Entity Multicast, которые могут беспроводно передавать сообщения. Блок Transmission Buffer является очередью приема многоадресной рассылки SimEvents ®, которая может получать сообщения, отправленные буфером отправки 1 и буфером отправки 2.
Для достижения этой беспроводной связи между буфером отправки 1, буфером отправки 2 и блоком буфера передачи, который находится внутри блока беспроводного канала:
В блоках Send Buffer 1 и Send Buffer 2 установите параметр Multicast tag на A
.
В блоке Transmission Buffer установите параметр Multicast tag на A
.
Параметр Multicast tag определяет, из каких блоков Entity Multicast получают сообщения.
Блок SimEvents ® Entity Gate используется для моделирования отказа канала. Блок имеет два входных порта. Один входной порт предназначен для входящих сообщений из буфера передачи. Второй входной порт является портом управления, чтобы решить, когда открывать затвор.
Установите параметр рабочего режима блока Gate в Enable gate
. В этом режиме:
Блок открывает ворота и позволяет сообщениям продвигаться вперед, когда он получает сущность, несущее значение, которое больше 0
от его порта управления. Это представляет рабочий канал.
Блок закрывает ворота и блокирует передачу сообщений, если сущность содержит данные, значение которых меньше или равно 0
. Это представляет отказ канала.
Для управления блоком Gate можно использовать блок SimEvents ® Entity Generator, который в этом примере помечен как Control Gate, чтобы сгенерировать сущности, несущие различные значения данных.
В блоке Control Gate, в действиях Event, в поле Generate action, код ниже используется для генерации сущностей, чтобы открыть и закрыть блок Gate. Первоначально данные сущности 1
и затвор открыт, и канал находится в рабочем состоянии. Когда генерируется новая сущность, его значение изменяется на 0
, который закрывает ворота. Каждый сгенерированная сущность изменяет статус ключа с открытого на закрытый или с закрытого на открытый.
В блоке Control Gate, в поле Intergeneration time action, код ниже используется, чтобы представлять рабочее и неудачное состояние канала. Код инициализирует канал как рабочий. dt
является временем межгенерации сущностей и используется для изменения статуса канала, поскольку каждый сгенерированная сущность изменяет статус блока Gate.
В коде время восстановления генерируется из равномерного распределения, которое принимает значения между 0
и 10
. Временной интервал между отказами генерируется из другого равномерного распределения, которое принимает значения между 0
и 50
.
Чтобы смоделировать потерю пакета, используется блок SimEvents ® Entity Output Switch.
Блок имеет два входных порта. Один входной порт принимает сообщения. Другой вход порт принимает сущности, которые определяют выбор выхода порта. Если для сущности задано значение 1
блок выбирает выходной порт 1
для пересылки сообщений в блок «Беспроводное совместное использование сообщений». Если для сущности задано значение 2
блок выбирает выходной порт 2
, который соединяется с блоком Entity Terminator, который представляет потерю пакета.
В блоке Output Switch:
Для параметра «Количество выхода портов» задано значение 2
.
Чтобы определить, какой выход выбран, критерий Switching устанавливается на From control port
и начальный выбор порта установлен на 1
.
Чтобы смоделировать 0.1
вероятность потери пакета, в блоке Probabilistic Packet Loss выберите вкладку Event actions, а в поле Generate action включает этот код:
persistent rngInit; if isempty(rngInit) seed = 12345; rng(seed); rngInit = true; end
% Pattern: Uniform distribution % m: Minimum, M: Maximum m = 0; M = 1; x = m + (M - m) * rand;
% x is generated from uniform distribution and % takes values between |0| and |1|. if x > 0.1 % Entity carries data |1| and this forces Output switch to select % output |1| to forward entities to receive components. entity = 1; else % Entity carries data |2| and this forces Output switch to select % output |2| and this represents a packet loss. entity = 1; end
Это означает, что сущности, входящие в порт управления, имеют 0.9
вероятность установки в 1
, который делает выход сообщений для беспроводного обмена сообщениями.
Симулируйте модель.
Откройте блок Scope, подключенный поверх блока Transmission Buffer. Блок отображает общее количество сообщений, переданных через общий канал.
4255
сообщения передаются по каналу.
На графике также отображаются отказы в работе канала. Например, увеличьте изображение первого 100
секунд. Наблюдатель, что отказ канала происходит между 40
и 49
во время которой блокируется передача сообщений.
Откройте Data Inspector, чтобы визуализировать сущности, которые управляют ключом. Данные сущности изменяются с 1
на 0
для каждого сгенерированной сущности.
Чтобы увидеть количество потерянных сообщений, откройте блок Scope, соединенный с блоком Packet Loss.
409
сообщения теряются во время передачи. Это 9.6
процент сообщений.
Queue | Receive | Send | Sine Wave | Ворота сущности (SimEvents) | передача сущности (SimEvents) | выключатель выхода сущности (SimEvents) | Сущность Терминатор (SimEvents)