Хабрахабр

Применение MATLAB/Simulink с аппаратурой производства АО «ИнСис»

Важной практической задачей является использование Matlab/Simulink с реальной аппаратурой которая позволит принять сигнал из реального мира. Это очень полезно для отладки алгоритмов. В данной работе представлена технология подключения к Simulink устройств АЦП производства АО «ИнСис». Для подключения используется DLL, которая видна в Simulink как компонент sm_adc. Для работы с аппаратурой используется отдельная консольная программа. Связь с DLL производится через разделяемую память. По данной технологии могут быть подключены любые АЦП на любых несущих модулях АО «ИнСис». В работе представлена система из генератора A7_DAC и модуля сбора FMC128E/FM412x500M.

Данная работа демонстрировалась на конференции «Технологии разработки и отладки сложных технических систем» 27-28 марта 2018 года.

Постановка задачи

Полученные данные должны быть переданы в Simulink на обработку. Требуется разработка системы из генератора сигналов и АЦП которая будет формировать сигнал с заданными параметрами и производить его оцифровку.

Аппаратура

В качестве АЦП используется субмодуль FM412x500M в котором есть четыре канала АЦП с частотой дискретизации 500 МГЦ. Для работы собран стенд из модуля АЦП и генератора. 0. Субмодуль установлен на несущий модуль FMC128E в котором есть ПЛИС Artix 7 и интерфейс USB 3. Для контроля работоспособности разумеется используется осциллограф. Оба устройства подключены к ноутбуку с запущенным Simulink.

Внешний вид стенда:

Структурная схема стенда:

Сформированный сигнал:

Алгоритм работы стенда:

  1. Simulink подготавливает к запуску АЦП и генератор
  2. Simulink даёт команду генератору на запуск
  3. Генератор формирует строб (жёлтый сигнал) и собственно сигнал (голубой)
  4. АЦП по фронту строба начинает сбор данных
  5. АЦП собирает массив и передаёт его в Simulink
  6. Simulink отображает принятый сигнал от АЦП

Его особенностью является именно однократность. Это классический однократный режим сбора. Фаза сбора данных происходит в режиме «жёсткого реального времени», а вот обработка — как получиться. Аппаратура по фронту сигнала собирает заданный массив данных. Для четырёх каналов АЦП и частоте дискретизации 500 МГц скорость потока данных составляет 4 Гбайт/с. Скорость сбора определяется числом выбранных каналов и частотой дискретизации. То есть может быть сохранена выборка объёмом 4 Гбайт. С этой скоростью данные могут быть записаны в SODIMM модуля FMC128E.

Модуль FMC128E подключается к компьютеру через интерфейс USB 3. Далее данные должны быть переданы в компьютер. Скорость передачи данных составляет 300 Мбайт/c. 0.

Время этой обработки уже определяется сложностью модели. Simulink принимает массив данных и передаёт его на дальнейшую обработку. В данном примере массив просто отображается на панели осциллографа.

Опять по USB передаются команды на подготовку АЦП, на запуск генератора и на сбор данных. В какой-то момент Simulink решает что нужно проводить следующий цикл и всё повторяется.

Можно никуда не торопиться. Такой режим очень удобен для отладки аппаратуры и алгоритмов. На него спокойно посмотреть, записать на диск, выпить кофе. Собрать массив данных. А вот когда всё будет отработано, то тогда уже можно переходить на непрерывный режим сбора.

Подключение DLL

Simulink также имеет возможность подключения внешних DLL, при этом он добавляет некоторые требования. Matlab позволяет подключать функции реализованные во внешних DLL. Внутри Simulink внешняя DLL выглядит как блок S-Function.

Однако способ который предлагает MATLAB не очень удобный. MATLAB предоставляет огромное количество примеров, в том числе и по созданию внешних DLL. В этом проекте разработана библиотека классов для подключения к Simulink. Существует OpenSource проект easyLink.

Для создания компонента требуется создать класс наследник от BaseBlock и объявить порты:

Проблемы подключения DLL

Наиболее существенными лично для меня являются следующие: Внешние DLL позволяют очень многое, но при работе с ними есть ряд проблем.

  1. Затруднена отладка DLL
  2. Неудобно смотреть вывод printf()
  3. Перекомпиляция DLL требует выхода из MATLAB

При отладке программы требуется проводить пошаговую отладку. В случае DLL существует возможность подключиться к уже загруженной в память DLL, назначить там точку останова и провести сеанс отладки. Но это надо отлавливать момент загрузки DLL через Simulink, каким то образом задерживать старт работы. Всё это сделать можно, но неудобно.

В случае с DLL этот поток как то можно перехватить, но мне это не удалось. В процессе работы очень хочется видеть отладочный вывод который формируется как стандартный потоко stdout.

Иначе просто не удаётся записать новый файл. Ну и наконец самое главное неудобство это необходимость выхода из MATLAB при перекомпиляции DLL. А выход и последующий запуск MATLAB занимает много времени.

Это взаимодействие между программами через разделяемую память. Для решения этих проблем существует классический способ построения сложных программных комплексов.

Подключение через разделяемую память

Это позволяет создавать надёжные программы. Современные операционные системы, как Windows так и Linux, позволяют организовывать общие области памяти. При этом зависание программы которая взаимодействует с аппаратурой не приведёт к зависанию программы взаимодействия с оператором. Например одна программа может содержать графический интерфейс и взаимодействовать с оператором, а другая программа может взаимодействовать с аппаратурой. Программа для работы с аппаратурой будет запущена один раз, она подготовит аппаратуру и будет ждать команды через разделяемую память. В случае с Simulink такой подход также даёт некоторые преимущества. Поскольку DLL не работает напрямую с аппаратурой, то это этот запуск будет производиться быстро. DLL будет загружаться каждый раз при запуске Simulink на моделирование.

Для данного стенда разработаны две программы и две DLL:

  1. simulink_a7dac — программа управления генератором
  2. simulink_adc — программа управления АЦП
  3. sm_ctrl — DLL управления генератором
  4. sm_adc — DLL управления АЦП

Структурная схема представлена на рисунке ниже:

Эта программа позволяет работать с любыми АЦП производства АО «ИнСис». Программа simulink_adc построена на основе библиотеки Bardy. Настройка на конкретный АЦП и несущий модуль производится через файлы инициализации.

Вид схемы в Simulink

Ну и наконец как это выглядит внутри Simulink:

Один блок для управления АЦП. Всё выглядит так как и принято в Simulink. Для управления генератором доступен ряд параметров. Второй блок для управления генератором. При необходимости ряд параметров АЦП также можно вывести на уровень блока. Для АЦП — всё через файл инициализации.

Они задают в терминах модельного времени момент старта и момент сбора данных. Обратите внимание на два задающих генератора. Они собственно и задают связь между моделью и реальным миром. Эти моменты очень важны. Через разделяемую память он поступает в программу АЦП. Сигнал старта поступает в блок АЦП, он обрабатывается в DLL. А внутри ПЛИС взводится автомат поиска фронта сигнала старта. Далее он преобразуется в последовательность команд записи в регистры, которые через USB поступают в ПЛИС. Когда подтверждение дойдёт до Simulink на выходе блока sm_adc появиться сигнал start_out который будет передан в блок sm_ctrl. И только после того как автомат будет взведён в обратную сторону по этой же цепочке пойдёт подтверждение. В блоке sm_ctrl по такой же цепочке сигнал будет передан в ПЛИС генератора и она сформирует посылку сигнала. Причём это будет всё тот же самый момент модельного времени. От второго задающего генератора будет сформирован сигнал сбора данных. АЦП захватит этот сигнал в своей памяти. В данный момент возвращается блок размером 16384 отсчёта. По такому же пути данные попадут в Simulink и поступят на выход данных блока sm_adc. Принятый блок отображается в осциллографе.

Результаты

Программа управления АЦП позволяет работать с любыми нашими АЦП. Работа через разделяемую память показала свою эффективность. Программа разработана как консольное приложение, при этом виден весь отладочный вывод. При этом остаётся удобный способ настройки параметров через файл конфигурации. Компонент SM_CTRL позволяет подключать различные внешние приложения для управления аппаратурой. Есть индикация работоспособности. Это обычная программа, в которой можно установить точки останова и проводить отладку. Отладка программы управления АЦП не вызывает никаких трудностей. По этой же технологии могут быть разработаны и другие программы для взаимодействия между Matlab/Simulink и внешним миром.

Работа опубликована на сайте hub.exponenta.ru;

Ссылки:

  1. Проект SIMULINK_SM — исходный код программ: https://github.com/dsmv/simulink_sm
  2. Проект easyLink: https://sourcesup.renater.fr/frs/?group_id=1500
  3. Несущий модуль FMC128E http://insys.ru/fmc/fmc128e
  4. Субмодуль FM412x500M http://insys.ru/mezzanine/fm412x500m
  5. Telegram канал InSys Research
Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»