管道压力调节
该示例演示了管道压力调节的Engee模型,以及随后在Arduino微控制器上执行根据该模型生成的代码。
简介
本示例是"管道压力控制建模"示例开发的下一阶段。在前一阶段,我们考虑了对象的技术部分,并对用于稳定设定压力的调节器进行了调试;在现阶段,控制系统通过自动设定管道中不断变化的压力和控制算法与微控制器外围设备交互的模块C Function
进行了扩展。
控制系统模型
模型的技术部分与前一项目阶段的模型相同。

管道控制系统集成到Controller
子系统中,用于后续代码生成。
该子系统的主要功能部分如下:
- 与微控制器外围进行交互的区块
C Function
、 - 用于在管道中形成设定压力的模块
Chart
、 - PI 调节器子系统。

外设交互块具有以下用途:
*ADC_A0
- 从 Arduino 微控制器的A0
输出端读取和缩放模拟信号、
*PWM
- 缩放控制信号并将其传输到微控制器的 PWM 通道,以调节闸阀位置、
*Serial
- 向串行端口输出一系列数值:设定和测量压力、控制信号。
PI 控制器以离散元件表示,系数如下: 。压力设定点块Chart
表示一个具有一个父态和三个子态的图表,每个子态形成自己的压力设定点值。它们之间的切换由内部计数器Cnt
执行。

压力控制模型
为了模拟控制系统的运行,让我们加载并运行模型arduino_pressure_regulator.engee
:
if "arduino_pressure_regulator" in [m.name for m in engee.get_all_models()]
m = engee.open( "arduino_pressure_regulator" );
else
m = engee.load( "$(@__DIR__)/arduino_pressure_regulator.engee" );
end
data = engee.run(m);
我们将根据获得的建模数据绘制信号图:
*Chart.RefPress
- 管道中的设定压力、
+Датчик давления.1
- 管道中的测量压力。
using Plots
plotlyjs()
plot(data["Chart.RefPress"].time,
data["Chart.RefPress"].value,
label="Заданное давление",
lw=2, size=(900,300), legend=:topright)
plot!(data["Датчик давления.1"].time,
data["Датчик давления.1"].value,
label="Измеренное давление",
lw=2)
从图中可以看出,控制系统会自动生成一个不断变化的压力设定点,并调节管道中的当前压力。
代码生成
让我们从子系统Controller
生成代码,以便进一步将控制算法加载到微控制器中:
engee.generate_code( "$(@__DIR__)/arduino_pressure_regulator.engee",
"$(@__DIR__)/Controller_code";
subsystem_name="Controller" )
我们将进一步使用Controller_code
-arduino_pressure_regulator_Controller.h
和arduino_pressure_regulator_Controller.c
目录中的文件连接到草图pressure_controller.ino
中。让我们继续在微控制器上执行该草图。
在目标设备上执行
为了在调试Engee模型之前测试真实对象的算法,本例中我们将使用Arduino MEGA2560调试板。在 Arduino IDE 环境中,我们将编译草图并将模型生成的 C 文件加载到微控制器中。加载完成后,可以通过 PC 的串行端口观察到以下图形:

图中显示了当管道中的当前压力发生变化时,PI 控制器的控制信号(第三幅图)是如何变化的(第二幅图,模拟信号)。
结论
在本演示中,我们考虑通过使用Engee自动装置**库自动生成给定压力来开发管道控制模型,然后生成代码,并在目标设备上测试所开发控制模型的执行情况。