RITM 上的半自然建模(通过 Modbus 控制闸阀)¶
简介¶
本案例研究涉及在 RITM 半自然建模套件(CPM RITM)上对电动管道闸阀进行建模,并通过 Modbus TCP 在操作员和Engee模型之间进行数据传输。
模型描述¶
本示例的模型是test_SUI.engee
。控制对象是一个电动管道闸阀,它被封闭在一个可激活的子系统Valve
中。在闸阀供电电路中有电压(信号VoltageOK
)、供电电压相位正确(信号PhaseOK
)和没有控制信号停止闸阀时,激活信号enable
等于 1。子系统的输入信号是闸阀打开open
和关闭close
的信号。同时提供这些信号会阻止闸阀位置的变化。为了提供打开/关闭信号,控制电路中还必须有电源供应。电源检查信号分别由CO_OK
和CC_OK
模块模拟。
示例模型实现了两种操作模式--在Engee中通过模拟进行闸阀测试,以及在CPM RITM上进行硬实时操作。变量mode
负责模式之间的切换。在mode = 1
的情况下,闸阀的开/关信号来自Test_open
和Test_close
模块,停止信号来自stop
变量,而在mode = 0
的情况下,控制信号来自外围模块 Modbus TCP。stop
变量的默认值为 "0"。模式和停止变量在回调函数PreLoadFunc
中设置。
在闸阀子系统的输出端,通过 Modbus TCP 获取并输出信号:
- 闸阀状态:
opened
(打开)和closed
(关闭)、 - 开启/关闭磁力启动器的激活:
MPO
(MPO 已接通)和МПЗ
(MPZ 已接通)、 - 开启/关闭力矩开关跳闸:
MVO
(MBO 跳闸)和MVZ
(MBZ 跳闸)。
子系统输出端也接收信号Valve_position
(闸阀位置),但不通过 Modbus TCP 输出。
除上述信号外,信号VoltageOK
,PhaseOK
,CO_OK
和CC_OK
也通过 Modbus TCP 输出。
Modbus 外围模块¶
示例中使用了以下外围模块 **Modbus TCP* 通过 **Modbus TCP* 传输数据:
Modbus TCP 设置 - 用于设置与服务器的连接、
Modbus 读线圈状态 - 用于读取标志寄存器、
Modbus Write Coils - 用于写位。
IP 地址和端口号、响应等待时间和重连尝试次数在连接设置块中设置。所有外围设备的参数 "服务器 ID "设置相同,可用于实现与多个 Modbus 服务器的操作。
标志寄存器读取模块设置初始读取寄存器和要读取的寄存器数量。在示例中,这些块将分别写入地址为 863、864 和 862 的寄存器中的闸阀打开/关闭和停止命令传送给模型。
位写入块设置起始地址和要从模型写入的位数。在示例中,模型生成的位将写入地址为 1681 - 1688、1572 - 1573 的寄存器。
控制对象的子系统¶
闸阀Valve
的可激活子系统如下图所示。
闸阀的运行由一个线性惯性元件模拟,其限制条件为valve_state
。因此,当发出闸阀打开/关闭信号时,闸阀会在 1 秒钟内打开/关闭。状态 "0 "对应位置 "打开","1 "对应位置 "关闭"。初始状态为 "关闭"。该子系统还模拟扭矩开关的运行(模块MVO
和MVZ
)。状态 "1 "对应闸阀的正常运行,"0 "对应扭矩过载和故障。此外,子系统还检查闸阀的结束状态。
在 Engee 中建模¶
让我们加载并执行示例模型。
Путь_примера = "$(@__DIR__)";
Имя_модели = "test_SUI";
Путь_модели = joinpath(Путь_примера, Имя_модели*".engee")
if Имя_модели ∉ getfield.(engee.get_all_models(), :name)
engee.load(Путь_модели);
end
модель = engee.run(Имя_модели);
获取要构建模型的变量。
время = модель["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
绘制闸阀开闭图 - 输出开闭测试信号、闸阀位置和结束状态。
using Plots
gr(size=(1000,300), xlims = (0,10))
график_1 = plot(время, [открытие, положение, открыто]; title = "Открытие задвижки")
график_2 = plot(время, [закрытие, положение, закрыто]; title = "Закрытие задвижки")
plot(график_1, график_2; layout = (1,2), label = ["Сигнал" "Положение" "Состояние"])
从图中可以看出,闸阀模型以指定的惯性进行了开启和关闭。
模型在 CPM RITM 上的运行情况¶
所考虑的模型在 RITM CPM 上以实时模式执行了 100 秒。在模型运行过程中,通过 Modbus TCP 与模拟器 ModbusPal 进行数据交换。
闸阀模型在 RITM 上的运行记录见动画ritm_valve_record.gif
。
当标签 863 发出信号时,标签 1683 被设置,表明闸阀开启磁力启动器已接通。这将改变闸阀的位置。1 秒钟后,标签位 1681 被置位,表明闸阀完全打开。当通过标签 864 发出闸阀关闭信号时,首先磁力启动器的标签位 1684 被置位,1 秒钟后关闭限位开关启动,标签位 1682 被置位。当闸阀停止信号(标签 862)发出时,闸阀的运行被阻止,开/关信号不起作用。
输出¶
在本例中,考虑了电动管道闸阀的Engee模型,该模型在CPM RITM上以实时模式执行。通过 Modbus TCP 协议控制闸阀并读取其状态。