Engee 文档
Notebook

以KPM节奏实时测试自动化

导言

这个例子用几种自动化方法来检查实时测试模型的工作流程:模型的软件参数化、Engee中的模拟管理、模拟结果处理、节奏模拟管理和实时测试数据收集。 在这种自动化方法的例子中,更多的关注是通过[与外部设备一起工作]的方法来处理来自Engee的节奏(https://engee.com/helpcenter/stable/ru-en/ritm/working-with-RITM.html )。

示例模型

示例模型 ritm_dcm_current_control 再现独立励磁的直流电机(DCT)的电流控制电路。 控制对象是dpt电枢电路和晶闸管转换器(TP),它们由连续传递函数-一阶的非周期性链接表示。 在电流反馈中安装电流传感器,该电流传感器由比例链接表示。 控制动作为步进函数。 在初始时刻,形成DPT的起始电流,在0.5s的时刻,形成零电枢电流。

流电路设置为模块化电路,稳压器的类型为PI。 这是一个离散的系统组装成一个子系统,用于后续代码生成。

image_2.png

除了自动控制系统块外,该模型还包含以下块:[Си-функции](https://engee.com/helpcenter/stable/ru-en/base-lib-user-defined-function/c-function.html )(RITM-PLOT, RITM-PLOT-1)在节奏屏幕上显示模型变量的图形。

在Engee建模

模型参数在预加载函数[反向вызовов]中定义(https://engee.com/helpcenter/stable/ru-en/interactive-scripts/base_simulation/demo_callback.html )模型,另外它们可以在下面的单元格中定义:

In [ ]:
# Напряжение двигателя и системы управления
Udc = 560; Uref = 10;
# Параметры двигателя
 = 0.00757;  = 0.203;  = 370; Imax = 2*;
# Коэффициенты передаточной функции электрической цепи двигателя
 = 1/0.203;  = /;
# Коэффициенты передаточной функции тиристорного преобразователя
Kтп = Udc/Uref; Tтп = 0.01;
# Коэффициент обратной связи по току
Kос = Uref/Imax;
# Коэффициенты ПИ-регулятора тока
Kp = /(2*Tтп*Kтп*Kос/); Ti = /Kp;

让我们定义使用[软件控制]自动建模的模型名称(https://engee.com/helpcenter/stable/ru-en/modeling/programmatic-modeling.html ):

In [ ]:
name = "ritm_dcm_current_control";

以下自定义函数用于运行模拟。

In [ ]:
"""
Function by @mikhailpetrov
"""
function start_model_engee(name::String)
    try
        engee.close(name, force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load(joinpath(@__DIR__, "$name.engee")) # загрузка модели
        end;

    try
        engee.run(m) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load(joinpath(@__DIR__, "$name.engee")) # загрузка модели
            engee.run(m) # запуск модели
        end
end
Out[0]:
start_model_engee

让我们运行模拟,然后我们将做[软件处理](https://engee.com/helpcenter/stable/ru-en/feature/about-simout.html )模拟结果:

In [ ]:
start_model_engee(name)
data = collect(simout);
t = collect(data[1].time)[:,1];
Iref = collect(data[1].value)[:,1];
Ep = collect(data[2].value)[:,1];
I = collect(data[3].value)[:,1];

我们将在图表上显示接收到的信号:

In [ ]:
gr()
plot(t, [Iref.*(Imax/Uref), I, Ep],
    label = ["I*, А" "I, А" "Ep, В"], legend = :topright,
    title = "Моделирование контура тока ДПТ",
    xlabel = "Время, с", ylabel = "Ток, А; эдс, В")
Out[0]:

这里,I*是设定电枢电流的信号,I是实际电枢电流,Ep是实际电动势TP。 通过电流图的类型,可以直观地假设瞬态过程对应于模块化最优的设置。 需要对超出当前示例的过渡过程进行额外的分析。

节奏的实时测试自动化

让我们继续在[节奏]上执行模型(https://engee.com/helpcenter/stable/ru-en/ritm.html )实时。 在此步骤之前,将控制系统模型转移到目标设备(微控制器)和全面的半自然测试(HIL)。

工作准备

让我们打开KPM节奏并准备使用它。 在[相关实例]中描述了制备的所有必要步骤(https://engee.com/community/ru/catalogs/projects/kpm-ritm-bystryi-start )。

如有必要,我们将安装一个支持包,用于使用外部硬件。 有关将Engee连接到低级接口的详细的分步帮助可从相应примера.

In [ ]:
# Engee.Package.install("Engee-Device-Manager")

连接[软件控制]所需的模块(https://engee.com/helpcenter/stable/ru-en/ritm/ritm-functions.html )KPM节奏:

In [ ]:
using Main.EngeeDeviceManager.Targets
using Main.EngeeDeviceManager.Targets.RITM_API

创建目标平台对象:

In [ ]:
ritm = Targets.RITM.Ritm()
Out[0]:
Main.EngeeDeviceManager.Targets.RITM.Ritm("Ritm", UUID("e206f345-42f3-4902-bb12-a102420135d2"), ["set_url", "get_access_token", "is_connected", "generate_executable_code", "compile_model", "upload_model", "start_model", "start_stream", "stop_model", "get_running_model", "read_file", "get_file", "get_files_list", "model_mem_info", "fetch_log_ritmpipe", "is_running", "get_ritm_screenshot", "get_profiling_data"])

连接到KPM节奏

我们将通过传递命令来设置目标平台的IP地址和端口号 EngeeDeviceManager.Targets.RITM.set_url 🔗创建的对象 ritm.

In [ ]:
Targets.RITM_API.setUrl(ritm, "http://192.168.56.3:8000/")

如果连接到节奏是成功的,命令 EngeeDeviceManager.Targets.RITM_API.isConnected [🔗](https://engee.com/helpcenter/stable/ru-en/ritm/ritm-functions.html#EngeeDeviceManager.Targets.RITM_API.isConnected-Tuple{ (%7D)将返回 true:

In [ ]:
RITM_API.isConnected(ritm)
Out[0]:
true

Engee与KPM RHYTHM的连接已经建立,让我们继续进行实时测试自动化。

建模管理

首先,将模型上传到Engee,然后使用命令上传 EngeeDeviceManager.Targets.RITM.upload_model 🔗对知识的节奏。

In [ ]:
model = engee.load(joinpath(@__DIR__, "$name.engee"))
Targets.upload_model(ritm, model)
Out[0]:
TargetResponse("success", nothing)

下载成功了,让我们继续使用命令从模型生成可执行代码 EngeeDeviceManager.Targets.RITM.generate_executable_code 🔗.

模型将以[独立模式]运行(https://engee.com/helpcenter/stable/ru/ritm/build-modes.html#standalone )(Standalone),因此,命令的第三个属性取值 false.

In [ ]:
Targets.generate_executable_code(ritm, model, false)
Out[0]:
TargetResponse("Code generated successfully", nothing)

代码生成成功了,我们将用命令组装模型以便在节奏上执行 EngeeDeviceManager.Targets.RITM.compile_model 🔗.

In [ ]:
Targets.compile_model(ritm, model)
Out[0]:
TargetResponse("Model compiled successfully", nothing)

根据收到的消息,项目组装成功,我们将继续以独立模式执行模型。 对节奏的模拟的程序开始是由命令进行的 EngeeDeviceManager.Targets.RITM.start_model 🔗.

In [ ]:
Targets.start_model(ritm, model)

如果成功,可以看出,模型没有错误输出。 让我们继续从节奏模型的执行中收集和分析数据。

获得模拟结果

专责小组 EngeeDeviceManager.Targets.RITM_API.getLog 🔗返回指定的日志行数。:

In [ ]:
println(RITM_API.getLog(ritm, 13))
** starting model ritm_dcm_current_control (Standalone)
2025-25-06 09:16:58.605 | Expected non-existent /builds/0/RITM_Team/Julia-RealTime/julia to be your Julia directory.
Certain functionality will be disabled.
To fix this, try deleting Revise's cache files in ~/.julia/compiled/v1.10/Revise, then restart Julia and load Revise.
If this doesn't fix the problem, please report an issue at https://github.com/timholy/Revise.jl/issues.
2025-25-06 09:17:02.399 | Using arrays or dicts to store parameters of different types can hurt performance.
Consider using tuples instead.
; maxlog = 1
2025-25-06 09:17:04.136 | Using arrays or dicts to store parameters of different types can hurt performance.
Consider using tuples instead.
; maxlog = 1
Profiling data stored.
** stopping model ritm_dcm_current_control

在命令的输出中,我们看到伴随模型执行的消息。

在连接到节奏的屏幕上可以观察到相同的日志。 使用命令 EngeeDeviceManager.Targets.RITM_API.getScreenshot [🔗](https://engee.com/helpcenter/stable/ru-en/ritm/ritm-functions.html#EngeeDeviceManager.Targets.RITM_API.getScreenshot-Tuple{Any, String})屏幕截图:

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

具有指定名称的屏幕截图保存在节奏存储器中的临时文件文件夹中。 从节奏的内存下载的截图文件如下所示

model_2.png

使用函数 EngeeDeviceManager.Targets.RITM_API.readFile 🔗您可以输出位于kpm节奏内存中的文件内容,并使用 EngeeDeviceManager.Targets.RITM_API.getFile 🔗-在Engee下载此文件。

让我们阅读它,然后获取文件。 install_manifest.txt 来自kpm节奏的记忆:

In [ ]:
RITM_API.readFile(ritm, "install_manifest.txt"; path = "/home/ritm/build/$name/build/")
Out[0]:
"/home/ritm/run/ritm_dcm_current_control.elf"
In [ ]:
RITM_API.getFile(ritm, "install_manifest.txt"; from = "/home/ritm/build/$name/build/", to = @__DIR__)
/user/start/examples/devices/ritm_dc_motor_current_control/

另外,使用命令 EngeeDeviceManager.Targets.RITM_API.getData 🔗它能够获得数据存储器的知识的节奏,例如分析数据的模型。 将它们保存到文件中:

In [ ]:
RITM_API.getData(ritm, "$name", @__DIR__, true)
[ Info: Данные с профилированием модели были записаны в файл: ritm_dcm_current_control.txt

我们将处理获得的模型分析数据并将其显示在图表上。:

In [ ]:
profiling = parse.(Int64, split(strip(read(joinpath(@__DIR__, "$name.txt"), String)), '\n')).*1e-9;
gr()
plot(profiling;
    title = "Время выполнения шага расчёта", label = :none,
    xlabel = "Шаг моделирования", ylabel = "Время выполнения, с")
Out[0]:

根据获得的数据,我们可以判断执行模型时硬实时模式的维护情况。

结论

在这个例子中,我们已经按顺序回顾了自动测试Engee模型的节奏的步骤。 直接在Engee脚本中,您可以计算模型参数,在Engee和KPM节奏上执行模拟,过程模拟结果和实时机器操作数据。