Engee 文档
Notebook

Kpm节奏的半自然模拟(通过Modbus控制阀门)

导言

在这个例子中,使用节奏半自然建模复合体([KPM节奏](https://kpm-ritm.ru/hil ?ysclid=m56mwxw7q2227541664)),而运营商与Engee模型之间的数据接收和传输则采用Modbus TCP协议进行。

模型描述

这个例子的模型 - test_SUI.engee. 控制对象是一个电动操作的管道闸阀,它被封闭在一个激活的子系统中。 Valve. 激活信号 enable 如果闸阀供应电路中有电压(信号),则等于一 VoltageOK),电源电压的正确定相(信号 PhaseOK)和没有控制信号来停止阀。 子系统的输入信号-打开信号 open 和关闭 close 闩锁。 这些信号的同时供应阻止了阀门位置的变化。 控制电路中的电源也需要提供打开/关闭信号。 功率检查信号由单元模拟 CO_OKCC_OK 相应地。
示例模型实现了两种操作模式-在Engee中通过模拟进行阀门测试,在硬实时模式下在KPM RHYTHM上操作。 变量负责模式之间的切换 mode. 的情况下 mode = 1 用于打开/关闭闸阀的信号来自块 Test_openTest_close,停止信号是从一个变量 stop,以及何时 mode = 0 控制信号来自外围设备Modbus TCP。 变量 stop 默认值为"0"。 模式和停止变量在回调中设置,函数 PreLoadFunc.

test_SUI--1735291378616_2.png

在子系统的输出端,闸阀被移除并通过Modbus TCP信号输出:
*阀门状态: opened (开放)及 closed (已关闭),
*打开磁性开启/关闭触发器: MPO (MPO已启用)和 МПЗ (MPZ已启用),
*打开/关闭扭矩开关的驱动: MVO (MVO工作)和 MVZ (MVZ工作)。

信号 Valve_position (闸阀位置)也在子系统输出处捕获,但不是通过Modbus TCP输出。

除上述信号外,Modbus TCP还输出以下信号 VoltageOK, PhaseOK, CO_OKCC_OK.

Modbus外围设备

对于通过Modbus TCP进行数据传输,示例中使用了以下外围单元KPM。:
*Modbus TCP Setup-配置与服务器的连接,
*Modbus读取线圈状态-用于读取标志寄存器,
*Modbus写入线圈-用于写入位。

连接设置块包含IP地址和端口号、响应的等待时间以及重新连接尝试次数。 "服务器ID"参数设置为所有外围设备相同,可用于与多个Modbus服务器一起工作。

image_2.png

在标志寄存器读取块中设置初始读取寄存器和要读取的寄存器数量。 在示例中,这些块向模型传送用于打开/关闭和停止阀门的命令,分别记录在地址863、864和862处的寄存器中。

image_3.png

在位记录块中设置从模型写入的起始地址和位数。 在示例中,模型生成用于写入地址1681-1688、1572-1573的寄存器的位。

image.png

理对象的子系统

激活的阀门子系统 Valve 如下图所示。

test_SUI--1735291413098.png

闸阀的操作由具有限制的线性惯性元件模拟 valve_state. 因此,当给出打开/关闭阀门的信号时,它会在1秒内打开/关闭。 状态"0"对应于位置"打开",并且"1"-"关闭"。 初始状态为"关闭"。 该子系统还模拟扭矩开关(块)的操作 MVOMVZ). 条件"1"对应于闸阀的正常操作,"0"对应于扭矩过载和故障。 此外,在子系统中检查阀门的最终状态。

在Engee建模

让我们下载并执行示例模型。

In [ ]:
Путь_примера = "$(@__DIR__)";
Имя_модели = "test_SUI";
Путь_модели = joinpath(Путь_примера, Имя_модели*".engee")

if Имя_модели  getfield.(engee.get_all_models(), :name)
    engee.load(Путь_модели);
end

модель = engee.run(Имя_модели);

我们得到模型变量来构建。

In [ ]:
время = модель["valve_position"].time;
открытие = модель["test_open"].value;
закрытие = модель["test_close"].value;
положение_0 = модель["valve_position"].value;
открыто_0 = модель["opened"].value;
закрыто_0 = модель["closed"].value;

длина = length(положение_0)
положение = Vector{Float64}(undef, длина)
открыто = Vector{Float64}(undef, длина)
закрыто = Vector{Float64}(undef, длина)

for i in 1:длина
    положение[i] = положение_0[i][1]
    открыто[i] = открыто_0[i][1]
    закрыто[i] = закрыто_0[i][1]
end

我们将绘制阀门的打开和关闭时间表-我们将输出打开和关闭的测试信号,阀门的位置和最终状态。

In [ ]:
using Plots
gr(size=(1000,300), xlims = (0,10))

график_1 = plot(время, [открытие, положение, открыто]; title = "Открытие задвижки")
график_2 = plot(время, [закрытие, положение, закрыто]; title = "Закрытие задвижки")
plot(график_1, график_2; layout = (1,2), label = ["Сигнал" "Положение" "Состояние"])
Out[0]:

从图表中可以看出,阀门模型在给定惯性下执行打开和关闭。

KPM节奏模型的工作

KPM节奏上开始执行模型之前,您需要确保[连接正确](https://engee.com/helpcenter/stable/ru/ritm/ritm-manager.html ),之后我们将切换到[交互执行]模式(https://engee.com/helpcenter/stable/ru/ritm/build-modes.html )模型。

所考虑的模型在KPM节奏上实时执行100秒。 在模型运行期间,数据通过Modbus TCPModbusPal模拟器交换。

动画中显示了阀门模型在节奏上的操作记录 ritm_valve_record.gif.

image.png

当施加用于标签863的打开信号时,用于标签1683的位被置位,其指示磁性阀打开起动器被接通。 在这种情况下,阀的位置改变。 在1秒之后,用于标记1681的位被置位,其指示阀完全打开。 当通过标签864给出关闭阀门的信号时,首先设置磁性起动器的逐位标签1684,并且在1秒之后触发关闭限位开关,设置逐位标签1682。 当施加阀停止信号(标签862)时,阀的操作被阻止,并且打开/关闭信号不会导致任何影响。

结论

在示例中,考虑了电驱动管道闸阀的Engee模型,在KPM节奏上实时执行。 闸阀进行控制,并使用Modbus TCP协议读取其状态。