Engee 文档
Notebook

启用和触发子系统的事件计数

在本模型中,我们演示了程序块enabled 和程序块triggered 在操作上的差异,这两个程序块决定了触发子系统的条件。演示以事件计数为例。

模型描述

该模型包含一个脉冲发生器Pulse Generator ,在Sample based 模式下,它根据开关之间必须经过的指定离散仿真步数来控制信号参数。

image.png

接下来,信号会进入两个计数器:

  • 一个是作为子系统实现的,其端口为EnablePort (输入端出现正信号时触发、
  • 另一个是作为子系统TriggerPort 实现的,当信号出现上升沿时触发。

image.png

两个计数器被触发后,输出信号都加一。但是,从颜色上我们可以看出,第二个计数器的触发时间 (Sample Time) 是由TriggerPort 块的操作决定的,因此计数器块的颜色与系统中其他块(采样时间设为 0.01)的颜色不同。

模型操作

通过该模型,我们可以研究不同子系统的执行控制块是如何工作的。让我们运行模型并分析结果。

In [ ]:
modelName = "counters_demo";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");

# Запустим модель
data = engee.run( modelName, verbose=false )
Out[0]:
Dict{String, DataFrames.DataFrame} with 3 entries:
  "Счетчик Enabled"   => 226×2 DataFrame…
  "Счетчик Triggered" => 226×2 DataFrame…
  "Сигнал управления" => 226×2 DataFrame

第一个信号演示了离散控制信号源的运行。

In [ ]:
plot( data["Сигнал управления"].time, data["Сигнал управления"].value )
Out[0]:

在第二幅图中,我们可以看到enabled 子系统的运行情况,其触发逻辑由EnablePort 定义。当子系统在控制端口上接收到正信号时,计数器在每个仿真周期内都会增加。当子系统被禁用时,它会返回信号的最后累积值。当恢复正控制信号时,输出将被重置--该行为由块配置集EnablePort 设置。

In [ ]:
plot( data["Счетчик Enabled"].time, data["Счетчик Enabled"].value )
Out[0]:

在第三幅图中,我们可以看到triggered 子系统的运行情况,其触发逻辑通过TriggerPort 设置。控制信号每上升一个边沿,计数器就递增 1。

In [ ]:
plot( data["Счетчик Triggered"].time, data["Счетчик Triggered"].value )
Out[0]:

为什么计数器会 "错过 "前两个上升沿?其电路中有一个块Unit Delay ,在第一次触发时返回 0。而该程序块的第一次触发并不是在t=0 ,而是在登记第一个上升沿的时刻:

  • 当模型启动时,控制信号最初位于1 ,没有上升脉冲、
  • 当第一个边沿出现时,计数器第一次被触发并返回0
  • 当记录第二个边沿时(第三个脉冲),计数器将返回1

结论

Engee中使用不同的子系统触发模式,可以组织离散或连续过程模拟的复杂混合场景。我们已经通过两个子系统执行修改器--EnablePortTriggerPort 看到了这一点,但Engee还有更多此类修改器,允许您设置更复杂的子系统条件,这些修改器可在基本程序块库的子系统面板中找到。