以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。 这是一个离散的系统组装成一个子系统,用于后续代码生成。
除了自动控制系统块外,该模型还包含以下块:[Си-функции](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 )模型,另外它们可以在下面的单元格中定义:
# Напряжение двигателя и системы управления
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;
# Коэффициенты ПИ-регулятора тока
Kp = Tя/(2*Tтп*Kтп*Kос/Rя); Ti = Tя/Kp;
让我们定义使用[软件控制]自动建模的模型名称(https://engee.com/helpcenter/stable/ru-en/modeling/programmatic-modeling.html ):
name = "ritm_dcm_current_control";
以下自定义函数用于运行模拟。
"""
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
让我们运行模拟,然后我们将做[软件处理](https://engee.com/helpcenter/stable/ru-en/feature/about-simout.html )模拟结果:
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];
我们将在图表上显示接收到的信号:
gr()
plot(t, [Iref.*(Imax/Uref), I, Ep],
label = ["I*, А" "I, А" "Ep, В"], legend = :topright,
title = "Моделирование контура тока ДПТ",
xlabel = "Время, с", ylabel = "Ток, А; эдс, В")
这里,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连接到低级接口的详细的分步帮助可从相应примера.
# Engee.Package.install("Engee-Device-Manager")
连接[软件控制]所需的模块(https://engee.com/helpcenter/stable/ru-en/ritm/ritm-functions.html )KPM节奏:
using Main.EngeeDeviceManager.Targets
using Main.EngeeDeviceManager.Targets.RITM_API
创建目标平台对象:
ritm = Targets.RITM.Ritm()
连接到KPM节奏
我们将通过传递命令来设置目标平台的IP地址和端口号 EngeeDeviceManager.Targets.RITM.set_url 🔗创建的对象 ritm.
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:
RITM_API.isConnected(ritm)
Engee与KPM RHYTHM的连接已经建立,让我们继续进行实时测试自动化。
建模管理
首先,将模型上传到Engee,然后使用命令上传 EngeeDeviceManager.Targets.RITM.upload_model 🔗对知识的节奏。
model = engee.load(joinpath(@__DIR__, "$name.engee"))
Targets.upload_model(ritm, model)
下载成功了,让我们继续使用命令从模型生成可执行代码 EngeeDeviceManager.Targets.RITM.generate_executable_code 🔗.
模型将以[独立模式]运行(https://engee.com/helpcenter/stable/ru/ritm/build-modes.html#standalone )(Standalone),因此,命令的第三个属性取值 false.
Targets.generate_executable_code(ritm, model, false)
代码生成成功了,我们将用命令组装模型以便在节奏上执行 EngeeDeviceManager.Targets.RITM.compile_model 🔗.
Targets.compile_model(ritm, model)
根据收到的消息,项目组装成功,我们将继续以独立模式执行模型。 对节奏的模拟的程序开始是由命令进行的 EngeeDeviceManager.Targets.RITM.start_model 🔗.
Targets.start_model(ritm, model)
如果成功,可以看出,模型没有错误输出。 让我们继续从节奏模型的执行中收集和分析数据。
获得模拟结果
专责小组 EngeeDeviceManager.Targets.RITM_API.getLog 🔗返回指定的日志行数。:
println(RITM_API.getLog(ritm, 13))
在命令的输出中,我们看到伴随模型执行的消息。
在连接到节奏的屏幕上可以观察到相同的日志。 使用命令 EngeeDeviceManager.Targets.RITM_API.getScreenshot [🔗](https://engee.com/helpcenter/stable/ru-en/ritm/ritm-functions.html#EngeeDeviceManager.Targets.RITM_API.getScreenshot-Tuple{Any, String})屏幕截图:
RITM_API.getScreenshot(ritm, "model.png")
具有指定名称的屏幕截图保存在节奏存储器中的临时文件文件夹中。 从节奏的内存下载的截图文件如下所示
在 RITM.Monitor 此时将显示[RTOS]的当前版本。真实的东西время](https://engee.com/helpcenter/stable/ru/ritm/intro.html#осрв-ритм-реальное-время),KPMG的IP地址,模型的名称和状态,以及计算步骤和计算步骤的时间,当前和最终模拟时间。 这些图形对应于在Engee中建模时获得的图形。
RITM_API.readFile(ritm, "install_manifest.txt"; path = "/home/ritm/build/$name/build/")
RITM_API.getFile(ritm, "install_manifest.txt"; from = "/home/ritm/build/$name/build/", to = @__DIR__)
RITM_API.getData(ritm, "$name", @__DIR__, true)
我们将处理获得的模型分析数据并将其显示在图表上。:
profiling = parse.(Int64, split(strip(read(joinpath(@__DIR__, "$name.txt"), String)), '\n')).*1e-9;
gr()
plot(profiling;
title = "Время выполнения шага расчёта", label = :none,
xlabel = "Шаг моделирования", ylabel = "Время выполнения, с")
根据获得的数据,我们可以判断执行模型时硬实时模式的维护情况。
结论
在这个例子中,我们已经按顺序回顾了自动测试Engee模型的节奏的步骤。 直接在Engee脚本中,您可以计算模型参数,在Engee和KPM节奏上执行模拟,过程模拟结果和实时机器操作数据。

