管路中的压力控制
该示例演示了Engee管道压力控制模型,然后在Arduino微控制器上执行从模型生成的代码。
导言
此示例是示例开发的下一阶段"Pressure control modeling in трубопроводе"。在前一阶段,对设施的技术部分进行了审查,并调试了调节器以稳定设定的压力。 在当前阶段,控制系统已经扩展到自动调整管道和块中的变化压力。 C Function 于控制算法与单片机外设的交互。
管理系统模型
模型的技术部分与项目前一阶段的模型具有相同的表示。
管道管理系统集成到一个子系统中 Controller 于后续的代码生成。
在该子系统中可以区分以下主要功能部分:
*街区 C Function 与微控制器外设的交互,
*座 Chart 管路中设定压力的形成,
*PI控制器子系统。
外围交互单元具有以下目的:
ADC_A0-从输出读取和缩放模拟信号A0微控制器Arduino,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文件到微控制器。 启动后,在计算机的串行端口中可以观察到以下图形:
这些图表显示了当管道中的当前压力发生变化时PI控制器的控制信号如何变化(第三个图表)(第二个图表,模拟信号)。
结论
在这个演示示例中,我们研究了使用库自动生成预设压力的管道控制模型的开发。 Engee有限自动机具有后续代码生成和测试在目标设备上执行开发的控制模型。