Документация Engee
Notebook

Полунатурное моделирование на КПМ РИТМ (Регулятор тока ДПТ на STM32)

Один из сценариев тестирования в реальном времени, реализуемый на КПМ РИТМ в Engee, это полунатурное моделирование. С его помощью мы можем, например, моделировать реальный физический объект, обмениваясь сигналами с системой его управления, работающей на микроконтроллере. Этот пример показывает, как перенести регулятор на контроллер и провести полноценное полунатурное моделирование. Объектом управления здесь является контур тока двигателя постоянного тока на КПМ РИТМ, а системой управления - ПИ-регулятор тока на микроконтроллере STM32F446RE.

Введение

Полный справочный список инструментария и подходов, используемых в этом примере:

Hardware-In-the-Loop (HIL)

Технология полунатурного моделирования, или Hardware-In-the-Loop (HIL), основана на замене отдельных подсистем на их модели, работающие в реальном времени. Эти модели обмениваются данными с другими подсистемами по тем же интерфейсам, по которым общаются реальные подсистемы. Контроллеры или агрегаты работают в том же режиме, что и обычно, а перед инженером открываются широкие возможности для разработки и испытаний [1].

В этом примере мы рассмотрим полунатурное моделирование системы автоматического регулирования тока (контур тока) двигателя постоянного тока независимого возбуждения. Модель физического объекта будет моделироваться на КПМ РИТМ в реальном времени. Регулятор тока из модели сгенерируем в код и загрузим на микроконтроллер STM32F446RE. Соединив аналоговые входы и выходы микроконтроллера и комплекса полунатурного моделирования проведём полунатурное моделирование в реальном времени.

Конечная задача такого сценария - перенести часть модели (регулятор) на реальный физический объект (микроконтроллер), и с применением HIL добиться идентичности результатов при имитационном и полунатурном моделированиях.

Модель примера

Модель текущего примера является функциональным продолжением модели, рассмотренной в примере автоматизации тестирования в реальном времени. Отличия от исходной модели следующие:

  1. В обратных вызовах опорное напряжение системы управления принимает значение $U_{ref} = 1\ В$ (вместо $10\ В$)
  2. Источник сигналов заданного тока - блок генератора прямоугольных импульсов (вместо блока ступенчатой функции) с периодом $2\ с$, процентом заполнения $D = 50\%$ и амплитудой $0,5\ В$,
  3. Параллельно регулятору тока добавлена цепочка с интерфейсными блоками GP-LC-4x DAC и ADC для приёма-передачи данных по аналоговым входам и выходам с микроконтроллером.
  4. Добавлены блоки для смещения, ограничения и извлечения сигнала при работе с интерфейсными блоками.
  5. Перед моделированием источник сигнала регулирования для модели объекта управления может быть переключен при помощи блока ручного переключателя.

image.png

Модуль GP-LC-4x сконфигурирован следующим образом:

  • DAC: модуль: $1$, каналов: $2$, шаг расчёта: $-1$;

  • ADC: модуль: $1$, каналов: $1$, уровень напряжения: $\pm\ 5 В$, режим: с общей землёй, шаг расчёта: $0,001\ с$.

Уровни смещения следует откалибровать до начала полунатурных испытаний. Уровни насыщения на входе блока ЦАП устанавливаются по максимальным уровням входного напряжения АЦП микроконтроллера: $0 \div 3,3\ В$.

Подключение к КПМ РИТМ

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

Установим этот пакет.

In [ ]:
engee.package.install("Engee-Device-Manager");
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
Пакет поддержки 'Engee-Device-Manager' версии 'v0.60' успешно установлен.

С настройкой подключения в клиентской программе и работой с методами пакета поддержки можно ознакомиться в примере автоматизации тестирования в реальном времени.

На этом этапе также необходимо подключить РИТМ, установить соединение с ним из Engee, и при необходимости обновить его операционную систему и пакет поддержки. Как это сделать, подробно и пошагово представлено в примере быстрого старта с КПМ РИТМ.

После подготовки установим соединение с КПМ РИТМ:

In [ ]:
# @markdown ## Подключение КПМ РИТМ

IP = "192.168.56.3" # @param {type:"string",placeholder:"192.168.56.3"}
порт = "8000" # @param {type:"string",placeholder:"8000"}

using Main.EngeeDeviceManager.Targets
using Main.EngeeDeviceManager.Targets.RITM_API

ritm = Targets.RITM.Ritm()
Targets.RITM_API.setUrl(ritm, "http://$IP:$порт/")

println("КПМ РИТМ подключен: ", RITM_API.isConnected(ritm))
КПМ РИТМ подключен: true

Теперь перейдём непосредственно к моделированию. Для начала повторим опыт имитационного моделирования в реальном времени из исходного примера.

Моделирование в реальном времени на КПМ РИТМ

Запустим модель примера на КПМ РИТМ:

In [ ]:
# @markdown ## Запуск модели в режиме Standalone
имя_модели = "hil_dcm" # @param {type:"string",placeholder:"hil_dcm"}
path = joinpath(@__DIR__, "$имя_модели.engee")
model = engee.load(path)
resp = Targets.upload_model(ritm, model)
println("\n", "Загрузка модели: ", resp)
resp = Targets.generate_executable_code(ritm, model, false)
println("\n", "Генерация кода: ", resp)
resp = Targets.compile_model(ritm, model)
println("\n", "Компиляция: ", resp)
Targets.start_model(ritm, model)
engee.close(model; force=true)
Загрузка модели: TargetResponse("success", nothing)

Генерация кода: TargetResponse("Code generated successfully", nothing)

Компиляция: TargetResponse("Model compiled successfully", nothing)

Имитационное моделирование в реальном времени прошло успешно, на мониторе КПМ РИТМ наблюдаются заданный сигнал и графики тока якоря и эдс преобразователя. Получим скриншот монитора:

In [ ]:
RITM_API.getScreenshot(ritm, "model.png")
Out[0]:
"/tmp/model.png"

ritm_interactive.png

Регулятор настроен на модульный оптимум, на графике тока наблюдаются соответствующие перерегулирование и запаздывание переходного процесса. Теперь перейдём к полунатурному моделированию.

Подготовка к HIL

В первую очередь, перенесём часть модели - регулятор тока в физику: сгенерируем код из подсистемы ПИ-регулятора и загрузим его на микроконтроллер.

Генерация кода

In [ ]:
# Генерируем код из подсистемы:
engee.generate_code(joinpath(@__DIR__, "$имя_модели.engee"), joinpath(@__DIR__, "cg_res"); subsystem_name="PI_reg")

# Перенесём сгенерированные файлы в папки проекта PlatformIO
for file in readdir("cg_res")
    if file == "main.c" # шаблонный main.c не переносим, так как уже есть готовый main.cpp
        nothing
    elseif last(file)=='h'
        mv(joinpath(@__DIR__, "cg_res", file), joinpath(@__DIR__, "PlatformIO_proj/include", file); force=true)
    else
        mv(joinpath(@__DIR__, "cg_res", file), joinpath(@__DIR__, "PlatformIO_proj/src", file); force=true)
    end
end

# Удалим лишнее
rm(joinpath(@__DIR__, "cg_res"); recursive=true)

Полученные в папке PlatformIO_proj файлы необходимы для сборки проекта в VS Code PlatformIO. Скачаем их и добавим в проект во внешней IDE.

Проект примера в VS Code PlatformIO

Добавленные файлы в проекте PlatformIO выглядят следующим образом:

image.png

Перед сборкой проекта нужно убедиться, что необходимые для PlatformIO пакеты поддержки установлены, после чего можно переходить к сборке проекта:

Перенос кода на MCU

Запустим сборку проекта:

image.png

Сборка проекта успешна, можно переходить к загрузке кода на микроконтроллер. Подключим контроллер и загрузим в него скомпилированный код:

image.png

После загрузки сгенерированного кода на микроконтроллер установим подключение аналоговых входов/выходов КПМ РИТМ и NUCLEO-F446RE.

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

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

RITM_HIL_bb.png

Соединим общие контакты аналоговых выходов и аналоговых входов терминала, общие контакты макетной платы и микроконтроллера.

Аналоговые входы терминала DAC1, DAC2 соединены с аналоговыми входами микроконтроллера A0, A1 соответственно.

Аналоговый выход микроконтроллера D9 соединён с аналоговым входом терминала X01 через каскадный RC-фильтр нижних частот. Частота среза $f_с = 7\ кГц$, параметры цепи: $R_ф = 330\ Ом$, $С_ф = 68\ нФ$.

Часть моделируемой системы перенесена на микроконтроллер STM, после всех подключений подачи питания на схему можно перейти к полунатурному моделированию.

Полунатурное моделирование контура тока ДПТ

Прежде всего, отредактируем нашу модель: переключим ручной переключатель, так объект управления в модели будет получать сигналы регулирования от микроконтроллера:

In [ ]:
# Загрузка модели
имя_модели = "hil_dcm"
path = joinpath(@__DIR__, "$имя_модели.engee")
model = engee.load(path)
# Изменение положения переключателя
engee.set_param!("$имя_модели/Ручной переключатель", "PortValue" => true)
# Сохранение изменений
engee.save(model, path; force = true)
# Закрытие модели
engee.close(model)

Теперь загрузим изменённую модель на РИТМ и выполним её:

In [ ]:
# @markdown ## Запуск модели в режиме Standalone
имя_модели = "hil_dcm" # @param {type:"string",placeholder:"hil_dcm"}
model = engee.load(joinpath(@__DIR__, "$имя_модели.engee"))
resp = Targets.upload_model(ritm, model)
println("\n", "Загрузка модели: ", resp)
resp = Targets.generate_executable_code(ritm, model, false)
println("\n", "Генерация кода: ", resp)
resp = Targets.compile_model(ritm, model)
println("\n", "Компиляция: ", resp)
Targets.start_model(ritm, model)
engee.close(model; force=true)
Загрузка модели: TargetResponse("success", nothing)

Генерация кода: TargetResponse("Code generated successfully", nothing)

Компиляция: TargetResponse("Model compiled successfully", nothing)

Полунатурное моделирование прошло успешно, на мониторе КПМ РИТМ также наблюдаются заданный сигнал и графики тока якоря и эдс преобразователя. Получим скриншот монитора:

In [ ]:
RITM_API.getScreenshot(ritm, "model.png")
Out[0]:
"/tmp/model.png"

ritm_hil.png

Как видно по графику тока, перерегулирования в этом режиме моделирования больше, устоявшееся значение меньше. Динамические и статические ошибки САР говорят о неэффективной настройке регулятора, что является результатом отсутствия учёта в модели задержек и искажений, вносимых электронной схемой передачи аналоговых сигналов между MCU и РИТМом. Для дальнейшего развития проекта необходимо учесть эти элементы в модели Engee.

Заключение

В этом примере мы рассмотрели процесс переноса части модели - регулятора системы автоматического регулирования на цифровой микроконтроллер с помощью генерации кода из модели Engee, пошагово разобрали процесс подготовки и проведения эксперимента полунатурного моделирования, а также использовали автоматизацию работы с внешним оборудованием для эффективного моделирования в Engee на РИТМ.

Дополнительные источники