Engee 文档
Notebook

并行状态控制逻辑建模

要实现并行操作,可使用有限自动机库中的并行状态。例如,作为复杂系统设计的一部分,您可以使用并行状态来模拟同时工作的独立组件或子系统。

状态分解

图表或状态的分解类型决定了图表或状态是否包含排他状态或并行状态:

  • 例外状态代表相互排斥的运行模式。同一层次中没有两个例外状态可以同时激活或执行。在过渡图中,每个例外状态都用实心矩形表示。
  • 并行状态代表独立的运行模式。两个或多个并行状态可同时处于活动状态,尽管它们是按顺序执行的。在状态图中,每个并行状态用虚线矩形表示,数字表示执行顺序。

通过在状态层次结构的不同层级指定状态分解,可以将排除状态和并发状态结合起来。默认状态分解类型为排除(OR)。要将分解类型更改为并行 (AND),请右键单击父状态并选择分解 > 并行 (AND)。要将分解类型改回排除 (OR),请右键单击父状态并选择分解 > 排除 (OR)。

空气温度控制器

本例使用并行分解建模来模拟一个调节器,该调节器可将实际设施中的空气温度保持在 120 度。

fan_1747037996176.png

在顶层,空气控制器电路有两个互斥状态,即 PowerOff 和 PowerOn。电路采用互斥激活 (OR) 策略,因为控制器不能同时开启和关闭。

控制器控制两个风扇。当空气温度升至 120 摄氏度以上时,第一个风扇开启。第二个风扇在空气温度升至 150 摄氏度以上时提供额外冷却。在原理图中,这些风扇被表示为 PowerOn 顶层状态的并行子状态 FAN1 和 FAN2。由于风扇作为独立组件运行,其开启或关闭取决于所需的冷却水平。PowerOn 采用并联激活 (AND) 电路,因此当控制器开启时,两个子状态都处于激活状态。

除阈值外,风扇由状态建模,其子状态和转换的配置完全相同,反映了风扇的两种运行模式:开和关。由于风扇不能同时开启和关闭,因此 FAN1 和 FAN2 是互斥的(OR)。

在 PowerOn 中,名为 SpeedValue 的第三个并行状态是一个独立的子系统,用于计算每个时间步长内开启的风扇数量。当 FAN1 处于开启状态时,布尔表达式 in(FAN1.On) 的值为 1。同样,in(FAN2.On) 的值表示风扇 2 是开启还是关闭。这些表达式的总和表示每个时间步长内开启的风扇数量。

并行状态的执行顺序

虽然 FAN1、FAN2 和 SpeedValue 同时处于激活状态,但这些状态在模拟过程中是按顺序执行的。状态右上角的数字定义了执行顺序。执行顺序的原理如下:

  • 首先执行 FAN1,因为它的开启温度比 FAN2 低。无论 FAN2 是否开启,它都可以开启。
  • FAN2 运行在后,因为它的开启温度高于 FAN1。只有当 FAN1 已经开启时,它才能开启。
  • SpeedValue 最后执行,以便观察 FAN1 和 FAN2 的最新状态。

默认情况下,并联状态的执行顺序根据您将其添加到图表中的顺序确定。要更改并行状态的执行顺序,请右键单击该状态,然后从 ** 执行顺序** 下拉列表中选择一个值。

检查模型

该模型包含一个状态图空气温度控制器和一个名为物理对象的子系统。 和一个名为物理对象的子系统。

fan_1747037852784.png

根据物理厂房的空气温度,图表会打开风扇并输出子系统中运行的气流风扇数量。根据这些规则,该值可确定冷却效率系数$k_{cool}$ :

  • 气流 = 0 - 无风扇运行。空气温度不会降低,因为$k_{Cool} = 0$ 。

  • 气流 = 1 - 一个风扇运转。空气温度根据冷却效率系数降低$k_{Cool} = 0.05$ 。

  • 气流 = 2 - 两个风扇运转。空气温度根据冷却效率系数降低$k_{Cool} = 0.1$.

物理对象 "子系统根据以下公式更新对象内部的空气温度$temp$

$$temp(0) = T_{initial}$$

$$temp'(t) = (T_{Ambient}-temp(t)) \cdot (k_{Heat}-k_{Cool}).$$

其中 *$T_{initial}$ 是初始温度。默认值为 70°。

*$T_{Ambient}$ 是环境温度。默认值为 160°。

*$k_{Heat}$ 是安装的传热系数。默认值为 0.01。

*$k_{Cool}$ - 与气流相对应的冷却活性系数。

新温度决定了下一模拟时间步骤的冷却程度。

让我们来看看气温控制器是如何工作的。使用指令控制运行模型。

In [ ]:
modelName = "parallel_st_fan";
PID_model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
In [ ]:
results = engee.run( modelName )
Out[0]:
SimulationResult(
    "Switch" => WorkspaceArray{Float64}("parallel_st_fan/Switch")
,
    "Tout" => WorkspaceArray{Float64}("parallel_st_fan/Tout")

)
In [ ]:
plot(
    plot(results["Tout"].time, results["Tout"].value, lab = "Tout"),
    plot(results["Switch"].time, results["Switch"].value, lab = "Switch", c="red"),
    layout = (2,1)
)
Out[0]:

结论

我们已经考虑使用有限自动机的并行状态来建立控制逻辑模型。通过这一工具,我们可以实现需要对系统的多个独立状态进行操作的各种模型。

示例中使用的块