Engee 文档
Notebook

Kpm节奏的半自然模拟(STM32上的DPT电流调节器)

在Engee中以KPM节奏实现的实时测试场景之一是半自然模拟。 在它的帮助下,我们可以通过与运行在微控制器上的控制系统交换信号来模拟真实的物理对象。 此示例演示如何将控制器传输到控制器并执行完整的半自然仿真。 这里的控制对象是KPM节律上的直流电机电流电路,控制系统是STM32F446RE单片机上的PI电流调节器。

导言

本示例中使用的工具和方法的完整参考列表:

*面向模型的设计环境[Engee](https://engee.com/helpcenter/stable/ru-en/about-engee.html

*应用程序[节奏。机管理](https://engee.com/helpcenter/stable/ru-en/ritm/ritm-manager.html

*整合[外部оборудования](https://engee.com/helpcenter/stable/ru-en/engee-hardware/integration-with-hardware.html )在Engee

*[节奏软件控制](https://engee.com/helpcenter/stable/ru-en/ritm/ritm-functions.html

*[软件模型管理](https://engee.com/helpcenter/stable/ru-en/modeling/programmatic-modeling.html

*[模型回调](https://engee.com/helpcenter/stable/ru-en/modeling/callbacks-engee.html

*Code masks ячеек脚本

*半自然节奏建模的复杂([KPM节奏](https://kpm-ritm.ru/hil ?ysclid=md4g7frg1g193206631))

*实时测试场景-半自然模拟(*****)

*通用模块RITMeX GP-LC-45:2通道[DAC](https://engee.com/helpcenter/stable/ru-en/ritmex-gp-lc-45/gp-lc-4x-dac.html ),1通道[ADC](https://engee.com/helpcenter/stable/ru-en/ritmex-gp-lc-45/gp-lc-4x-dac.html )与终端GP-LC-45-终端v1.0

*自动[c代码生成](https://engee.com/helpcenter/stable/ru-en/codegen/code-generation-overview.html )来自Engee模型

*软件生成管理кода

*带STM32F446RE微控制器的Nucleo调试板

*2个ADC通道,1个PWM通道

*IDE VS代码

*PlatformIO

*STM32F4支持包

*框架[stm32duino](https://engee.com/helpcenter/stable/ru/interactive-scripts/codegen/joystick_description.html)

硬件在环(HIL)

半自然仿真技术或硬件在环(Hil)是基于用实时模型替换单个子系统。 这些模型通过真实子系统使用的相同接口与其他子系统交换数据。 控制器或单元以与往常相同的模式运行,工程师有充足的开发和测试机会[[1]](https://habr.com/ru/companies/etmc_exponenta/articles/848778 /)。

在本例中,我们将考虑具有独立励磁的直流电机的自动电流控制系统(电流环)的半自然仿真。 物理对象的模型将以KPM节奏实时建模。 我们将从模型中生成电流调节器并将其加载到STM32F446RE微控制器上。 通过连接微控制器和半自然仿真复合体的模拟输入和输出,我们将实时进行半自然仿真。

这种场景的最终目标是将部分模型(控制器)转移到真实的物理对象(微控制器),并使用HIL在仿真和半自然仿真中实现相同的结果。

示例模型

当前示例的模型是实时测试自动化的示例中讨论的模型的功能延续времени。与原始模型的差异如下:

  1. 在回调中,控制系统的参考电压取值 (而不是
  2. 给定电流的信号源是矩形脉冲发生器的块(而不是阶跃函数的块),具有周期 ,填充的百分比 和振幅
  3. 与接口块[GP-LC-4X]的电路已被并行添加到电流调节器(https://engee.com/helpcenter/stable/ru-en/ritmex-gp-lc-45/blocks.html )[DAC](https://engee.com/helpcenter/stable/ru-en/ritmex-gp-lc-45/gp-lc-4x-dac.html )和[ADC](https://engee.com/helpcenter/stable/ru-en/ritmex-gp-lc-45/gp-lc-4x-adc.html )用于通过模拟输入和输出与微控制器接收和传输数据。
  4. 在使用接口块时,添加了块来偏移、限制和提取信号。
  5. 在建模之前,用于控制对象模型的控制信号源可以使用手动开关单元进行切换。
image.png

GP-LC-4X模块配置如下:

*DAC:模块: 、渠道: ,计算步骤: ;

*ADC:模块: 、渠道: ,电压等级: ,模式:带共同点,计算步骤: .

在半正常测试开始之前,应校准位移水平。 DAC单元输入端的饱和电平根据微控制器ADC的最大输入电压电平设置: .

连接到KPM节奏

为了尽量减少半自然建模过程中的手动操作,我们将使用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与其建立连接,并在必要时更新其操作系统和支持包。 如何做到这一点在示例[快速启动与KPM节奏]中详细和一步一步地呈现(https://engee.com/helpcenter/stable/ru-en/interactive-scripts/realtime/ritm_quick_start.html )。

准备完成后,我们将与KPM节奏建立联系:

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

现在让我们直接进入建模。 首先,让我们重复原始示例中的实时仿真体验。

KPM节奏的实时模拟

让我们在KPM节奏上运行示例模型:

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)

实时仿真成功,KPM节奏监视器显示了转换器电枢电流和电动势的预设信号和图形。 我们会得到显示器的屏幕截图:

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

调节器设置为模块化最优,并在电流图上观察到瞬态过程的相应过冲和延迟。 现在让我们继续进行半自然建模。

为HIL做准备

首先,我们将部分电流调节器模型转移到物理:我们将从PI控制器子系统生成代码并将其上传到微控制器。

代码生成

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

将生成的代码上传到微控制器后,我们将连接KPM RHYTHM和NUCLEO-F446RE的模拟输入/输出。

连接到MCU

在连接之前,必须去除器件的电压,此外,还应避免静电对芯片的影响。 如图所示安装连接。

RITM_HIL_bb.png

我们将连接终端的模拟输出和模拟输入的公共触点,面包板和微控制器的公共触点。

模拟端子输入 DAC1, DAC2 连接到微控制器的模拟输入 A0, A1 相应地。

微控制器的模拟输出 D9 连接到模拟端子输入 X01 过级联的RC低通滤波器。 截止频率 ,链参数: , .

模拟系统的一部分已经转移到STM微控制器,在所有的电源连接到电路后,您可以切换到半自然建模。

Dpt电流电路的半自然仿真

首先,我们将编辑我们的模型:我们将切换手动开关,这样模型中的控制对象将接收来自微控制器的控制信号:

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)

半自然模拟成功,KPM节奏监视器还显示了转换器电枢电流和电动势的预设信号和图形。 我们会得到显示器的屏幕截图:

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

从电流曲线图可以看出,这种仿真模式下超调较多,建立值较低。 ATS的动态和静态误差表明调节器的低效调整,这是模型缺乏考虑用于在MCU和节奏之间传输模拟信号的电子电路引入的延迟和失真的结果。 为了项目的进一步发展,有必要在Engee模型中考虑这些元素。

结论

在这个例子中,我们研究了通过从Engee模型生成代码将自动控制系统的部分控制器模型转移到数字微控制器的过程,逐步分解了准备和进行半自然建模实验的过程,并利用与外部设备的工作自动化在ENGEE中对节奏进行有效建模。

其他来源

  1. [如何建立一个半自然的立场与KPM节奏](https://habr.com/ru/companies/etmc_exponenta/articles/848778 /)