В этом примере показано, как смоделировать коммуникацию через общий канал с несколькими отправителями и приемниками с помощью сообщений Simulink ®, SimEvents ® и Stateflow ®.
Обзор сообщений см. в разделе Обзор сообщений Simulink.
В этой модели существуют два программных компонента, которые отправляют сообщения, и два компонента, которые получают сообщения. Общий канал передает сообщения с дополнительной задержкой. Блоки SimEvents ® используются для создания пользовательского поведения связи путем слияния линий сообщений и копирования и задержки сообщений. Диаграмма Stateflow ® используется в компоненте send для отправки сообщений на основе логики принятия решений.
В модели существуют два программных компонента, которые выводят сообщения: Send и StateflowSend.
В компоненте Send источником сигнала является блок Sine Wave. Блок генерирует сигнал синусоиды с амплитудой 1
. Шаг расчета блока 0.1
. Блок Send преобразует сигнал в сообщение, которое несет значение сигналов как данные. Компонент отправки отправляет сообщения в буфер отправки 1.
В компоненте StateflowSend другой блок Sine Wave генерирует сигнал синусоиды, а блок Noise вводит шум в сигнал. Блок Noise выводит сигнал, значения которого генерируются из Гауссова распределения со средним значением 0
и отклонение 1
. Шаг расчета блока 0.1
.
График Stateflow ® представляет простую логику, которая фильтрует сигнал и решает, отправлять ли сообщения. Если значение сигнала больше 0.5
на время, больше 0.1
, затем график отправляет сообщение, которое несет значение сигналов. Если значение сигналов ниже 0
, затем график переходит к ReceiveSignal
состояние. Компонент StateflowSend отправляет сообщения в буфер отправки 2.
Дополнительные сведения о создании интерфейсов сообщений см. в разделе Установка интерфейсов отправки и получения сообщений между программными компонентами.
В модели есть два программных компонента, которые получают сообщения, Receive и прослушиватель.
В компоненте Receive блок Receive получает сообщения и преобразует данные сообщения в значения сигналов.
В компоненте Listener существует блок Simulink Function. Блок отображает функцию onOneMessage (данные) на грани блока.
Когда сообщение приходит в буфер приема 2, блок Listener уведомляется, и он принимает аргумент data
, которое является значением от данных сообщения в качестве входного сигнала. В блоке, data
значения умножаются на 2
. Блок выводит новое значение данных.
В общем канале пути сообщения, исходящие из двух компонентов отправки сообщения, объединяются, чтобы представлять общий канал связи.
Блок SimEvents ® Entity Input Switch объединяет линии сообщений. В блоке:
Количество портов входа определяет количество линий сообщений, которые будут объединены. Это значение параметров 2
для двух путей сообщения.
Активный выбор порта определяет, как выбрать активный порт для отправки сообщения. Если вы выбираете All
все сообщения, поступающие в блок, могут покинуть блок из порта выхода. Если вы выбираете Switch
можно задать логику, выбирающую активный порт для отправки сообщений. В данном примере параметр устанавливается на All
.
Блок SimEvents ® Entity Server используется для представления задержки передачи сообщений в общем канале. В блоке:
Емкость установлена в 1
, который определяет, сколько сообщений может обрабатываться за раз.
Значение времени обслуживания установлено в 1
, который определяет, сколько времени требуется для обработки сообщения
Блок SimEvents ® Entity Replicator используется для создания идентичных копий сообщений. В блоке:
Replicas depart от определяет, оставляют ли копии блок из отдельных выходных портов или из того же выходного порта, что и исходные сообщения. Параметр установлен в Separate output ports
.
Количество реплик установлено в 1
, которое определяет количество копий, сгенерированных для каждого сообщения.
Удерживайте исходную сущность до тех пор, пока все реплики не будут хранить исходное сообщение в блоке, пока все его копии не покинут блок.
Блок SimEvents ® Entity Terminator используется для моделирования буфера приема 2. В блоке:
На вкладке Действия события, в поле Действие входа, можно задать код MATLAB, который выполняет вычисления или вызовы функции Simulink ®, которые вызываются при входе сообщения в блок. В этом примере onOneMessage(entity)
используется для уведомления блока Simulink Function в компоненте Listener. Чтобы визуализировать вызов функции, на вкладке Debug, выберите Information Overlays, а затем Function Connectors.
Симулируйте модель. Заметьте, что в анимации подсвечиваются сообщения, проходящие через модель. Можно выключить анимацию, щелкнув правой кнопкой мыши по полотну модели и задав для параметра Animation Speed значение None
.
Когда вы останавливаете анимацию, на блоках, которые хранят сообщения, появляется лупа. Если вы указываете на лупу, вы видите количество сообщений, хранящихся в блоке.
Чтобы увидеть, какие сообщения хранятся в блоке, щелкните лупу, чтобы открыть Storage Inspector. Например, рисунок ниже иллюстрирует сообщения, хранящиеся в буфере 1 отправки.
Отключите анимацию и откройте блок Sequence Viewer, чтобы наблюдать вызовы функции Simulink и поток сообщений в модели.
Например, наблюдайте за временем симуляции 0
, во время которого сообщение учитывает значение 0
отправляется из компонента отправки в буфер отправки 1. От времени симуляции 0.1
на 0.5
компонент Send продолжает отправлять сообщения в Send Buffer 1 с различными значениями данных. Во время 0.5
компонент StateflowSend отправляет сообщение в буфер отправки 2. Дополнительные сведения об использовании блока Sequence Viewer см. в разделе Использование Sequence Viewer для визуализации сообщений, событий и сущностей.