AnyMath 文档
Notebook

[医][医][医][医][医][医][医][医][医]

导言

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

示例模型

示例模型 ritm_dcm_current_control 您可以通过dct(dct)的方式对您的电脑进行控制。 控制对象是dpt电枢电路和晶闸管转换器(TP),它们由连续传递函数-一阶的非周期性链接表示。 在电流反馈中安装电流传感器,该电流传感器由比例链接表示。 控制动作为步进函数。 在初始时刻,形成DPT的起始电流,0.5s的时刻,形成零电枢电流。

流路为换流路,换热器为PPI。 这是一个离散系统组装成一个子系统,用于后续代码生成。

image_2.png

[SI功能]https://engee.com/helpcenter/stable/ru-en/base-lib-user-defined-function/c-function.html )(RITM-PLOT, RITM-PLOT-1)在节奏屏幕上显示模型变量的图形。

整条整条

3.创新创新:创新创新:创新创新。https://engee.com/helpcenter/stable/ru-en/interactive-scripts/base_simulation/demo_callback.html )界面,可以在下载界面的轨迹:

In [ ]:
# 电机电压及控制系统
Udc = 560; Uref = 10;
# 发动机参数
Lя = 0.00757; Rя = 0.203; Iн = 370; Imax = 2*Iн;
# 电动马达电路的传递函数的系数
Kя = 1/0.203; Tя = Lя/Rя;
# 晶闸管变换器传递函数的系数
Kтп = Udc/Uref; Tтп = 0.01;
# 电流反馈系数
Kос = Uref/Imax;
# PI电流调节器的系数
Kp = Tя/(2*Tтп*Kтп*Kос/Rя); Ti = Tя/Kp;
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
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 = ["我*,和" "我,和" "Ep,在"], legend = :topright,
    title = "Dpt电流电路的仿真",
    xlabel = "时间,从", ylabel = "电流,a;电动势,V")
Out[0]:

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

实时节奏测试的自动化

愿铭记整条换热。https://engee.com/helpcenter/stable/ru-en/ritm.html )否定。 在此之前,将控制系统切换到目标设备(控制器)和完全的目标设备(hil)。

工作准备

...... 在[相关实施例]中描述了复制的所有步骤(https://engee.com/community/ru/catalogs/projects/kpm-ritm-bystryi-start )。

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

In [ ]:
# Engee.Package.install("Engee-Device-Manager")
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"])

[医]节律。

我们将把您的设备安装在您的设备上。 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#AnyMathDeviceManager.Targets.RITM_API.isConnected-Tuple{ (%7D)将 true:

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

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

建模管理

)(整条换热法 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/cn/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#AnyMathDeviceManager.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 🔗我可以把它放在里面 EngeeDeviceManager.Targets.RITM_API.getFile 🔗-在AnyMath下载此文件。

让我们阅读它,然后获取文件。 install_manifest.txt 来源:来源:来源:优习网:

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 🔗它能够获得数据存储器的知识的节奏,例如[分析数据](https://engee.com/helpcenter/stable/cn/ritm/ritm-model-settings.html 的整条换热。 将它们保存到文件中:

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]:

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

结论

在这个例子中,我们已经做了预测。 直接在AnyMath脚本中,您可以计算模型参数,在AnyMath和KPM节奏上执行模拟,过程模拟结果和实时机器操作数据。