Привет, хабр! Уже более 5 лет занимаюсь разработкой и моделированием радиолокационных систем, в частности «больших» локаторов дециметровой длины. В своей практике сталкивался с тем, что при разработке такой сложной системы, как локационная, в основном делают упор на моделировании функциональной части, например, блоков фильтрации, типа зондирующего сигнала, алгоритмов компенсации задержек, а иногда и учет нелинейных эффектов, в частности в аналоговом усилительном тракте.  Как‑то раз, разрабатывая модель функциональных блоков и ячеек локатора в матлабе и симулинке (для моих нужд и целей этого аппарата хватало вполне), задумался о том, что живой локатор так не работает, он состоит из множества дополнительных систем, которые в совокупности и формируют его истинный облик. Проведя небольшие исследования, а также на личном опыте столкнулся с тем, что мало кто из разрабов моделит САУ, а уж совместно с функциональной частью и подавно. Еще меньше моделят учет и потери пакетов при сетевом трафике, а это частая проблема у «больших» локаторов со множеством приемо‑передающих ячеек и блоков.  В связи с этим появилась идея поделиться с читателями Хабра простыми (хелповыми), но полезными моделями, которые подтолкнут или способствуют к решению этих проблем. Также хочу поделиться небольшим опытом в моделировании аналоговой части, так как ее в реале еще никто не отменял.  Итак, поехали..  САУ довольно сложная и трудоемкая задача, в том числе и для моделирования. В первом приближении ее можно решить с помощью теории конечных автоматов. Конечные автоматы хорошо реализуются с помощью утилиты Stateflow, которая позволяет осуществить  симуляцию комбинаторной и последовательной логики принятия решений, основанных на машинах состояниях и блок‑схемах. Среда Stateflow работает совместно с утилитой Simulink и поддерживает языки программирования MATLAB и C. Stateflow имеет следующие возможности по моделированию: логика диспетчерского управления; система планирования и реагирования на разнообразные ошибки; различные алгоритмы обработки сигнала; конечные автоматы Мили и Мура и многое другое. В Stateflow предусмотрены таблицы истинности, позволяющие моделировать логику, которая не требует поддержания состояния при последовательных запусках. Таким образом, создавая таблицу истинности, где вводятся условия для проверки, запускаются статические диагностические проверки для идентификации переопределенных или недоопределенных условий. В итоге на базе таких таблиц автоматически строится графическое представление — диаграмма Stateflow.  Стоит отметить, что Stateflow имеет собственный внутренний верификатор, что еще раз подчеркивает его самодостаточность. Одним из распространенных способов моделирования логики управления устройства является использование темпоральных операторов (before — до, after — после, at — в момент и every — каждый). Это позволяет задать логику переходов между состояниями по числу событий или прошедшему времени без использования таймеров и счетчиков. Пример использования темпоральных операторов представлен на выдуманной модели на рисунке 1. В модели в качестве синхроимпульсов используется Pulse Generator, определенный в стандартной библиотеке Simulink. В зависимости от количества пришедших импульсов каждый блок устанавливает свое состояние, тем самым появляется возможно осуществить имитацию управления различными блоками в модели. В каждом из четырех Chart реализован свой темпоральный оператор. С помощью таких операторов можно реализовать САУ практически любой сложности. Результаты работы такой модели представлены на рисунке 2.    Давайте для ясности рассмотрим каждый из блоков отдельно. В первом блоке (рисунок 3) реализован оператор after. Диаграмма состояний представлена слева на рисунке 3. В соответствии с ней после 10 синхроимпульсов выход pulse устанавливается в значение 1, по истечении одного периода или одного синхроимпульса значение pulse снова переключается в 0. Далее значение выхода round_count увеличивается на 1 (при инициализации round_count = 0). Последовательность действий повторяется вновь. Выходные диаграммы представлены на рисунках 2 и 3. Давайте для ясности рассмотрим каждый из блоков отдельно. В первом блоке (рисунок 3) реализован оператор after. Диаграмма состояний представлена слева на рисунке 3. В соответствии с ней после 10 синхроимпульсов выход pulse устанавливается в значение 1, по истечении одного периода или одного синхроимпульса значение pulse снова переключается в 0. Далее значение выхода round_count увеличивается на 1 (при инициализации round_count = 0). Последовательность действий повторяется вновь. Выходные диаграммы представлены на рисунках 2 и 3. Во втором блоке представлен оператор at. В соответствии с оператором at переключение выхода (output) в состояние 1 осуществляется в момент, когда количество синхроимпульсов совпадает со значением переменной a=5. Далее выход меняет свое состояние на 0, только когда количество синхроимпульсов совпадает со значением переменной a=10. Впоследствии выход меняет свое состояние только при a=30 на -1. По истечении еще пяти периодов следования синхроимпульсов выход блока снова устанавливается в 1. Далее процесс формирования временной диаграммы повторяется. Результаты работы второго блока представлены на рисунках 2 и 4.  Далее рассмотрим работу третьего блока. Он реализует оператор before. Особенность этого блока заключается в том, что в нем реализованы три состояния, причем они работают параллельно, что показано штрих‑пунктирной линией в левой части рисунка 5. Выход первого состояния переключается в 1 до того, как придут 10 синхроимпульсов по условию signal_one<5. Переключение в 1 происходит не сразу из‑за того, что на первых двух тактах осуществляется вход в первое состояние. Похожим способом осуществляются переключения второго и третьего состояния. Результаты работы модели представлены на рисунках 2 и 5.  Заключительный блок реализует работу оператора every. В соответствии с ним на каждые 5 синхроимпульсов осуществляется инкрементация внутренней переменной count (левая часть рисунка 6). На каждые 10 синхроимпульсов вызывается функция double_counter, которая увеличивает значение переменной count вдвое. Выход функции double_counter является выходом блока состояния. Результаты моделирования представлены на рисунках 2 и 6.   Заключение. Stateflow является мощным средством моделирования логики автоматической системы управления и обработчика ошибок и прерываний. Моделирование логики может осуществляться по условиям и по времени, при этом есть возможность вызова функций Simulink и MATLAB. События, основанные на логике, смоделированной в Stateflow, могут быть переданы в Simulink для активации подсистем, которые реагируют на вызов функции или на изменение в управляющем сигнале. Таким образом, применение концепций состояний Stateflow позволяет улучшить качество моделирования разрабатываемого модуля или устройства.  Немаловажный фактор моделирования — это учет пакетного трафика между различными функциональными ячейками и ячейками управления, например, через протокол Ethernet. Для моделирования сетевого трафика можно воспользоваться теорией очередей.  Различные состояния очереди будем моделить в SimEvents. SimEvents позволяет анализировать и оптимизировать: сквозные задержки; пропускную способность; потерю пакетов и другие характеристики производительности.  Кроме того, SimEvents позволяет моделировать различные очереди, сервисы и переключатели, осуществить настройку маршрутизации, задержку обработки, назначение приоритетов.  Ключевым объектом исследования в SimEvents является сущность (Entity). В качестве примера сущности можно рассмотреть пакет в сетевом трафике. В свою очередь, обработка сущностей в системе моделирования вызывает события, которые изменяют состояния в системе и влияют на поведение системы. Для общего понимания, как работает SimEvents, рассмотрим пример, представленный на рисунке 7. Модель, представленную на рисунке 7, можно интерпретировать как простую модель, имитирующую транспорт пакетов в сети. Генератор пакетов каждую секунду выдает по одному пакету. Далее пакеты выстраиваются в очередь, где каждый из них обслуживается на сервере строго в течение 3 секунд. В результате на выходе каждые 3 секунды мы имеем сетевой пакет. Время моделирования составляло 20 секунд, т. е. было послано 20 пакетов, и на выходе было получено 6 пакетов. Результаты модели представлены на рисунке 8. Добавим в модель рисунка 7 элемент случайности. Пусть время обслуживания на сервере имеет случайное значение, заданное с помощью Random Number, определенным в стандартной библиотеке Simulink. Такая модель представлена на рисунке 9.    В результате ожидание на сервере уже не 3 секунды, а некое случайное число со средним равным 2 секунды и дисперсией — 1 секунда. Как и ожидалось, время обработки одного пакета неодинаковое, о чем свидетельствует полученные временные диаграммы (рисунок 10). На выходе мы имеем 7 пакетов при том же времени моделирования. В заключение рассмотрим более сложный пример моделирования (рисунок 11). Представлена сеть, где есть два генератора, причем пакеты отправляются не равномерно, а по экспоненциальному распределению. Для каждого генератора предусмотрен свой весовой коэффициент.  Такую модель называют моделью Джексона, для более понятной интерпретации рассмотрим рисунок 12, где представлен граф модели.    Среднее время ожидания каждого пакета можно рассчитать по следующей формуле:   где a - средняя скорость прибытия для определенного узла, i - номер узла, P - среднее время ожидания пакета.  Средняя скорость прибытия рассчитывается по следующему соотношению: где R - вектор прибывших пакетов на каждый узел,  I - единичная матрица, D - матрица маршрута.    Из рисунка 11  R = (0.5  0  0  0.15), для определения D более удобно смотреть рисунок 12: В результате расчетное среднее время составляет  P = (1  0.11  0.88  0.58). На рисунке 13 представлены графики среднего времени ожидания пакетов, как можно увидеть, оно в целом совпадает с расчетным временем.  Заключение. SimEvents позволяет создавать, обрабатывать, сохранять и перемещать сущности в системе с целью моделирования как простых, так и сложных сетевых очередей и серверов. Подключая шлюзы и блоки для переключения, можно устанавливать пути, по которым сущности перемещаются в ответ на события. Эти пути могут включать задержки и выборочные критерии переключения. Многие параметры в SimEvents могут быть статистически определены для моделирования вероятностных вариаций в системе. Кроме того, при помощи SimEvents можно разрабатывать распределенные системы управления, аппаратные архитектуры, а также системы датчиков и коммуникационные сети. Также можно симулировать событийные процессы, такие как выполнение плана производства для стадий производственного процесса, определение требований к ресурсам и идентификация «бутылочных горлышек» или самого узкого места в системе. Для моделирования аналоговой части будем использовать инструмент RF Blockset. В свой состав RF Blockset включает такие компоненты, как усилители, смесители, различные фильтры, а также базовые пассивные элементы, на которых можно смоделировать высокочастотный тракт — резистор, конденсатор и индуктивность. Ключевое достоинство библиотеки RF Blockset состоит в том, что компоненты заданы с помощью s‑параметров, что позволяет смоделировать особенности любых устройств СВЧ, так как измерение параметров сводится к измерению падающей и отраженной волны на входах компонента. Другая особенность библиотеки RF Blockset состоит в том, что для интеграции ее компонентов в общую модель необходим входной порт, также для вывода данных, которые прошли через тракт RF Blockset, нужен выходной порт. Для общего понимания рассмотрим модель, представленную на рисунке 14. Она позволяет оценить частотные характеристики фильтра, в данном примере это фильтр Чебышева 3 порядка, с целью последующей интеграции его в СВЧ‑тракт модели. В качестве входного воздействия выступает случайный процесс. Далее он поступает на входной порт (SL to RF), как было сказано, он необходим для преобразования сигнала в СВЧ‑тракт библиотеки RF Blockset. Конфигурацию тракта задает блок RF. Далее сигнал поступает на фильтр Чебышева. На рисунке 15 представлена АЧХ фильтра. В блоке Discrete Transfer Function Estimator реализован буфер накопления, а также задается размер БПФ.  Библиотека RF Blockset позволяет следующее: оценить усиление, шум, составляющие интермодуляционных искажений четных и нечетных порядков; смоделировать работу смесителей: избирательность по зеркальному каналу, преобразование шумов, фазовые сдвиги гетеродина; сформировать модель с множеством несущих. Отличительной особенностью библиотеки RF Blockset является то, что можно смоделировать следующие радиочастотные искажения: шум; паразитные сигналы; зеркальные эффекты; фазовые смещения; несоответствия между синфазной и квадратурной составляющими; сдвиг постоянной составляющей; фазовый шум локального генератора и многое другое. В заключение рассмотрим более сложный пример (рисунок 16), который реализует полноценную модель радиолокационной системы.  Ключевая особенность модели рисунка 16 состоит в том, что передатчик и приемник выполнены средством RF Blockset. Итак, остановимся более подробно на каждом элементе. Radar Pulse Generator — источник зондирующего сигнала, представляющий собой ЛЧМ сигнал мощностью 1мВт, длительностью 2мс и периодом 100мс. Состав блока и внешний вид зондирующего сигнала представлен на рисунке 17. Следующий блок — передатчик сигнала (RF Transmitter), выполненный на библиотеке RF Blockset (Рисунок 18). Блок включает в себя как линейную часть, так и нелинейную. Линейная часть представляет собой полосовой фильтр, выполненный на пассивных элементах. В блоке LC Bandpass Pi вносятся номиналы элементов, формирующих АЧХ фильтра. Нелинейная часть — это усилитель с коэффициентом усиления 40 дБ. Идеальная антенна (Ideal Antenna) — это блок с коэффициентом усиления 40 дБ.  Блок цель (Target) — имеет довольно сложную структуру, где учитываются задержки сигнала, сдвиг Доплера, отражение от цели и многое другое. Состав блока представлен на рисунке 19. Следующим блоком является блок приемник сигнала (RF Receiver Front End). Он, как и блок передатчика, выполнен на основе библиотеки RF Blockset. Также блок учитывает линейную часть и нелинейную. В дополнении производится моделирование фазового шума.  Линейная часть приемника имеет более сложную структуру по сравнению с линейной частью передатчика. Она представлена на рисунке 21.  Как можно увидеть на рисунке 21, линейная часть приемника базируется на пассивных элементах. Также реализован малошумящий усилитель (LNA) в виде скрипт файла на языке MATLAB. Нелинейная часть представлена на рисунке 22. В ней реализован смеситель сигнала, фазовый сдвиг для формирования синфазного и квадратурного канала, а также усиление сигнала. Заключительный блок — Rx module, где осуществляется окончательная обработка сигнала. Состав модуля представлен на рисунке 23.  Результат работы модели представлен на рисунке 24, где пики соответствуют детектированию цели из шумового сигнала.  Заключение. Библиотека RF Blockset позволяет моделировать как отдельные части приемо‑передающего тракта, так и передатчик и приемник в целом. За счет отличительных свойств RF Blockset можно учитывать различные шумовые составляющие, нелинейные эффекты, фазовые искажения, зеркальные эффекты. Это существенно повышает гибкость и достоверность разрабатываемой модели. Библиотека RF Blockset будет полезным дополнением для реализации сложных радиолокационных моделей.   Выводы для каждого из рассмотренных пакетов писал по ходу статьи. Поэтому особо много не буду на этом останавливаться. Только хочу подчеркнуть, что САУ, сетевой трафик и аналоговая часть моделируются в единой среде, что существенно повышает адекватность обобщенной модели и приближает нас к живому локатору. Также были рассмотрены довольно типовые примеры, которые носят более общий характер, но на базе них можно проектировать боевые системы. Если рассмотренный материал зайдет читателям, то про каждый из этих пакетов есть смысл написать отдельную статью, где уже будут рассмотрены детали моделирования реальных узлов локатора. Всем спасибо, что прочитали. Пока!