Этот пример показывает, как использовать передачу сообщений в распределенной системе, где контроллер управляет несколькими входящими сообщениями от различных отправителей итеративным способом и отправляет сообщения для передачи команд различным приемникам. В примере используется модель системы управления, управляющей температурами в двух разных помещениях с отдельными термостатами. Алгоритмическое моделирование компонентов в основном следует примеру Stateflow Model Bang-Bang Temperature Control System (Stateflow), в то время как связь между компонентами моделируется с помощью сообщений Simulink ® и блоков SimEvents ®. Модели Controller и Thermometer, окрашенные в синий цвет, являются компонентами программного обеспечения, которые, как ожидается, сгенерируют автономный код, в то время как другие компоненты моделируют окружение.
Модель содержит N
идентичные помещения с термостатами (моделируются многопозиционными блоками модели), где N
= 2
является параметром Simulink, заданным в файле словаря данных Simulink slddMsg.sldd
, который связан с верхней моделью и ссылочными моделями. Каждая комната может устанавливать уставку температуры отдельно. Термостаты для помещений дистанционно управляются контроллером, используя тот же алгоритм управления для всех термостатов.
Термостаты отправляют сообщения о температуре контроллеру каждый 0.2
секунд, в то время как контроллер отправляет командные сообщения термостатам, чтобы команды нагрева включались или выключались каждый 1
второе. Блок Выход Switch (SimEvents) маршрутизирует сообщения от контроллера к одному из термостатов в соответствии с полем данных шины сообщений deviceID
. (Шина также определяется в словаре данных и совместно используется во всех моделях.) Блок Message Merge маршрутизирует сообщения от различных термостатов к контроллеру.
Первоначально модель конфигурируется с использованием типов шин с плавающей точкой, которые заданы в файле словаря данных slddMsg.sldd
. Чтобы переключиться с плавающей точки на фиксированную, измените словарь данных для модели с slddMsg.sldd
на slddMsgFixpt.sldd
. На вкладке Моделирование перейдите в Настройки модели > Свойства модели > Внешние данные.
Модель легко масштабируется путем изменения значения N
, добавление большего количества образцов блока модели и увеличение количества портов блоков Выход Switch и Message Merge. Каждая модель термометра в модели Room имеет ID
аргумент, который должен быть установлен со значением, соответствующим индексу выходного порта выходного коммутатора сущности.
Блок Queue (FIFO, очередь типов перезаписи) перед моделями контроллеров буферизует сообщение, которое моделирует очередь внутри промежуточного ПО сообщений контроллера. Здесь емкость N
достаточно хорошо, чтобы очередь перезаписала самые старые сообщения новыми таковыми от каждого отправителя, предполагая отсутствие потерь сообщений при транзите. Емкость 5*N
нужен для худшего сценария с потерей сообщений, где 5
- шаг расчета контроллера, разделенное на шаг расчета термостатов. В сложение очередь перед каждым термостатом с емкостью 1 автоматически вставляется и показывает значок значка «1», поскольку очередь емкости-1 автоматически вставляется, если вы не намеренно помещаете блок Queue. См. «Использование блока очереди для управления сообщениями».
Чтобы просмотреть последовательности сообщений и событий, на панели инструментов Simulink, на вкладке Simulation, в разделе Review Results, нажмите Sequence Viewer. См. раздел «Sequence Viewer».
В моделях контроллеров подсистема Update Temperature, соединенная с блоком Inport, сначала получает все сообщения, содержащие информацию о температуре, из комнат. Подсистема хранит эту информацию в двух векторах уставки температуры и текущей температуры. Затем подсистема For Each читает векторы, обрабатывает сигналы и отправляет управляющие сообщения через функцию Simulink sendCtrlMsg
.
Подсистема Update Temperature является подсистемой do-while, порт условия завершения которой питается портом состояния блока Receive, что означает, что он запускается, пока не не может получить больше сообщений из внешней очереди (в верхней модели). Данные сообщения имеют DeviceMsg
тип шины, который определен в файле словаря данных и имеет два поля: temperature
и deviceID
. Таким образом, когда выходной сигнал блока Receive распространяется на активированную подсистему, порт включения которой соединяется с портом состояния блока Receive, блок Bus Selector разлагает сигнал на deviceID
, temperature
, и setpoint
сигналы. The setpoint
и temperature
затем сигналы назначаются соответствующим векторным элементам, сопоставленным со deviceID
. Наконец, векторы, поддерживаемые блоками Unit Delay, выводятся как сигналы активированной подсистемы и подсистемы Update Temperature в подсистему For Each.
Подсистема For Each, настройки блоков которой показаны выше, установлена в N
итерации и оба их входных порта разделены. Диаграмма Stateflow моделирует Контроллер, который напоминает тот, который объясняется в Model Bang-Bang Temperature Control System (Stateflow). Его выходной порт выводит логический сигнал, указывающий, включать или нет обогрев. Этот сигнал упаковывается в невиртуальный сигнал в блоке Bus Creator с идентификатором устройства (на основе одного) от числа итерации (на основе нуля). Сигнал передается в блок Function Caller, который вызывает функцию Simulink SendCtrlMsg
(помещен вне Подсистемы For Each), чтобы отправить сообщение из модели.
В модели Room подсистема Thermostat взаимодействует со окружением. Thermostat имеет два входа, управляющее сообщение и сигнал заданной температуры, и два выхода, скорость нагрева и сообщение температуры к контроллеру. Блоки Gain и Integrator моделируют физику нагрева или охлаждения помещения относительно скорости нагрева и размера помещения.
Подсистема Thermostat состоит из Подсистемы Датчика Термометра, блока модели Программного Обеспечения Термометра и Подсистемы Привода Температуры. Блок модели программного обеспечения термометра периодически получает управляющее сообщение от контроллера и распаковывает его в логическую команду (вкл ./выкл.) в подсистему привода температуры, которая определяет скорость нагрева. Программное обеспечение термометра также вводит сигнал температуры от подсистемы датчика термометра, который обнаруживает аналоговую температуру, преобразует ее в цифровой сигнал и отправляет сообщение обратно контроллеру.
В модели Thermometer блок Receive соединяется с блоком Inport, чтобы получить управляющее сообщение от внешней очереди на каждом временном шаге. Данные сообщения разлагаются на сигнал команды, который является выходом, и сигнал deviceID, который должен совпадать с аргументом ID модели. Аргумент ID должен быть установлен в блоке модели в верхней модели. Начальное значение блока Receive устанавливается на структуру MATLAB ® с deviceID
поле, равное аргументу модели ID
и command
поле принимает значение false
. Между тем, сигналы цифровой температуры, уставки и deviceID упаковываются в невиртуальный сигнал шины и передаются как сообщение в блок Outport.
Для генерации и развертывания кода модели Контроллера и Thermometer (цветной синий) могут генерировать автономные целевые процессоры Кода С++ и могут развертываться отдельно на встраиваемых устройствах с промежуточным программным обеспечением сообщений. Для получения дополнительной информации смотрите Сгенерировать сообщения C++ для связи между Simulink и операционной системой или промежуточным программным обеспечением (Embedded Coder); см. также Использование рукописного кода для интеграции сообщений C++ с POSIX (Embedded Coder).
Message root-level Inport/Outport не поддерживает генерацию кода C и индивидуальную настройку кода. Если вам нужно сгенерировать код С и вызвать промежуточный API сообщения для отправки сообщений, рассмотрите перемещение функции Simulink sendCtrlMsg
к верхней модели и настройка имени правильно так, чтобы ссылочная модель генерировала настраиваемый сайт вызова внешней функции. Точно так же для приемной стороны рассмотрите использование функции Simulink, содержащей блок Receive в верхней модели, и использование блока Function Caller в ссылочной модели, чтобы заменить блок Receive.
For Each Subsystem | Function Caller | Выгода | Интегратор | Receive | Simulink Function