Engee 文档
Notebook

RITM 上的半自然建模(通过 Modbus 控制闸阀)

简介

本案例研究涉及在 RITM 半自然建模套件(CPM RITM)上对电动管道闸阀进行建模,并通过 Modbus TCP 在操作员和Engee模型之间进行数据传输。

模型描述

本示例的模型是test_SUI.engee 。控制对象是一个电动管道闸阀,它被封闭在一个可激活的子系统Valve 中。在闸阀供电电路中有电压(信号VoltageOK )、供电电压相位正确(信号PhaseOK )和没有控制信号停止闸阀时,激活信号enable 等于 1。子系统的输入信号是闸阀打开open 和关闭close 的信号。同时提供这些信号会阻止闸阀位置的变化。为了提供打开/关闭信号,控制电路中还必须有电源供应。电源检查信号分别由CO_OKCC_OK 模块模拟。
示例模型实现了两种操作模式--在Engee中通过模拟进行闸阀测试,以及在CPM RITM上进行硬实时操作。变量mode 负责模式之间的切换。在mode = 1 的情况下,闸阀的开/关信号来自Test_openTest_close 模块,停止信号来自stop 变量,而在mode = 0 的情况下,控制信号来自外围模块 Modbus TCPstop 变量的默认值为 "0"。模式和停止变量在回调函数PreLoadFunc 中设置。

test_sui_1735291378616_2.png

在闸阀子系统的输出端,通过 Modbus TCP 获取并输出信号:

  • 闸阀状态:opened (打开)和closed (关闭)、
  • 开启/关闭磁力启动器的激活:MPO (MPO 已接通)和МПЗ (MPZ 已接通)、
  • 开启/关闭力矩开关跳闸:MVO (MBO 跳闸)和MVZ (MBZ 跳闸)。

子系统输出端也接收信号Valve_position (闸阀位置),但不通过 Modbus TCP 输出。

除上述信号外,信号VoltageOK,PhaseOK,CO_OKCC_OK 也通过 Modbus TCP 输出。

Modbus 外围模块

示例中使用了以下外围模块 **Modbus TCP* 通过 **Modbus TCP* 传输数据:
Modbus TCP 设置 - 用于设置与服务器的连接、 Modbus 读线圈状态 - 用于读取标志寄存器、 Modbus Write Coils - 用于写位。

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

从图中可以看出,闸阀模型以指定的惯性进行了开启和关闭。

模型在 CPM RITM 上的运行情况

RITM RITM上开始运行模型之前,我们需要确保连接正确,然后切换到模型的交互执行模式。

所考虑的模型在 RITM CPM 上以实时模式执行了 100 秒。在模型运行过程中,通过 Modbus TCP 与模拟器 ModbusPal 进行数据交换。

闸阀模型在 RITM 上的运行记录见动画ritm_valve_record.gif

image.png

当标签 863 发出信号时,标签 1683 被设置,表明闸阀开启磁力启动器已接通。这将改变闸阀的位置。1 秒钟后,标签位 1681 被置位,表明闸阀完全打开。当通过标签 864 发出闸阀关闭信号时,首先磁力启动器的标签位 1684 被置位,1 秒钟后关闭限位开关启动,标签位 1682 被置位。当闸阀停止信号(标签 862)发出时,闸阀的运行被阻止,开/关信号不起作用。

输出

在本例中,考虑了电动管道闸阀的Engee模型,该模型在CPM RITM上以实时模式执行。通过 Modbus TCP 协议控制闸阀并读取其状态。