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