Engee 文档
Notebook

并行状态控制逻辑仿真

要实现并行操作模式,请在有限自动机的库中使用并行状态。 例如,作为复杂系统设计的一部分,您可以使用并行状态对同时处于活动状态的独立组件或子系统进行建模。

状态的分解

关系图或状态的分解类型确定该关系图或状态是包含排他状态还是并行状态。:
*排除状态代表相互排斥的操作模式。 同一层次结构级别上的两个异常状态不能同时处于活动状态或执行状态。 在过渡图中,每个异常状态由一个实心矩形表示。
*并行状态表示独立的操作模式。 两个或多个并行状态可以同时被激活,尽管它们是顺序执行的。 在状态图中,每个并行状态由一个带数字表示执行顺序的虚线矩形表示。

您可以通过在状态层次结构的不同级别上定义状态的分解来组合独占状态和并行状态。 默认状态分解类型是Exclusive(OR)。 要将分解类型更改为Parallel(AND),请右键单击父状态并选择Decomposition>Parallel(AND)。 要将分解类型更改回独占(OR),请右键单击父状态,然后选择分解>独占(OR)。

空气温度控制器

此示例使用并行分解建模来模拟将真实物体上的空气温度保持在120度的调节器。

FAN--1747037996176.png

在顶层,空气控制器电路具有两个相互排斥的状态,PowerOff和PowerOn。 该方案使用互斥激活(OR)策略,因为控制器不能在同一时间打开和关闭。

控制器控制两个风扇。 当空气温度上升到120度以上时,第一个风扇打开。 当空气温度上升到150度以上时,第二个风扇提供额外的冷却。 在图中,这些风扇被表示为上电状态的并联变电站FAN1和FAN2。 因为风扇作为独立的组件工作,根据所需的冷却水平打开或关闭。 PowerOn使用并联激活电路,以便在控制器打开时两个变电站都处于活动状态。

除阈值外,风扇由具有相同配置的变电站和转换的状态建模,这些状态反映了两种风扇工作模式:开和关。 由于没有一个风扇可以在同一时间打开和关闭,FAN1和FAN2具有相互排斥的电路(OR)。

在PowerOn中,称为SpeedValue的第三个并行状态是一个独立的子系统,它计算每个时间步长打开的风扇数量。 (FAN1中的布尔表达式。On)具有值1当On是FAN1的活动状态。 否则,在(FAN1.On)为0。 同样,在(FAN2中的值。On)表示FAN2是on还是off。 这些表达式的总和表示在每个时间步长打开的风扇数量。

并行状态的执行顺序

虽然FAN1、FAN2和SpeedValue同时处于活动状态,但这些状态在仿真过程中是按顺序执行的。 状态右上角的数字决定了执行的顺序。 此执行程序的理由如下:

*FAN1首先运行,因为它在比FAN2更低的温度下打开。 无论FAN2是打开还是关闭,它都可以打开。
*FAN2运行第二,因为它在比FAN1更高的温度下打开。 只有当FAN1已经打开时,它才能打开。
*SpeedValue最后执行,以便可以监视FAN1和FAN2的最新状态。

默认情况下,并行状态的执行顺序是根据将它们添加到关系图中的顺序确定的。 要更改并行状态的执行顺序,请右键单击它并从下拉列表中选择一个值。 执行顺序

研究模型

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

FAN--1747037852784.png

根据物理安装上的空气温度,该图打开风扇并将工作气流风扇的数量输出到子系统。 该值确定冷却效率系数。 根据这些规则:

*气流=0-风扇不工作。 空气温度不会下降,因为 .

*气流=1-一个风扇正在运行。 空气温度按照冷却效率系数降低 .

*气流=2-两个风扇正在运行。 空气温度按照冷却效率系数降低 .

子系统"物理对象"更新空气温度 基于方程的对象内部

哪里:

  • 为初始温度。 默认值为70°。

  • 为环境温度。 默认值为160°。

  • -安装的传热系数。 默认值为0.01。

  • -与气流相对应的冷却活动系数。

新的温度决定了仿真的下一个时间步骤中的冷却程度。

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

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

结论

我们考虑了使用有限自动机的并行状态对控制逻辑进行建模。 此工具允许您实现模型的变体,其中系统的几个独立状态需要工作。