启用和触发子系统的事件计数
在本模型中,我们演示了程序块enabled
和程序块triggered
在操作上的差异,这两个程序块决定了触发子系统的条件。演示以事件计数为例。
模型描述
该模型包含一个脉冲发生器Pulse Generator
,在Sample based
模式下,它根据开关之间必须经过的指定离散仿真步数来控制信号参数。

接下来,信号会进入两个计数器:
- 一个是作为子系统实现的,其端口为
EnablePort
(输入端出现正信号时触发、 - 另一个是作为子系统
TriggerPort
实现的,当信号出现上升沿时触发。

两个计数器被触发后,输出信号都加一。但是,从颜色上我们可以看出,第二个计数器的触发时间 (Sample Time
) 是由TriggerPort
块的操作决定的,因此计数器块的颜色与系统中其他块(采样时间设为 0.01)的颜色不同。
模型操作
通过该模型,我们可以研究不同子系统的执行控制块是如何工作的。让我们运行模型并分析结果。
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 )
第一个信号演示了离散控制信号源的运行。
plot( data["Сигнал управления"].time, data["Сигнал управления"].value )
在第二幅图中,我们可以看到enabled
子系统的运行情况,其触发逻辑由EnablePort
定义。当子系统在控制端口上接收到正信号时,计数器在每个仿真周期内都会增加。当子系统被禁用时,它会返回信号的最后累积值。当恢复正控制信号时,输出将被重置--该行为由块配置集EnablePort
设置。
plot( data["Счетчик Enabled"].time, data["Счетчик Enabled"].value )
在第三幅图中,我们可以看到triggered
子系统的运行情况,其触发逻辑通过TriggerPort
设置。控制信号每上升一个边沿,计数器就递增 1。
plot( data["Счетчик Triggered"].time, data["Счетчик Triggered"].value )
为什么计数器会 "错过 "前两个上升沿?其电路中有一个块Unit Delay
,在第一次触发时返回 0。而该程序块的第一次触发并不是在t=0
,而是在登记第一个上升沿的时刻:
- 当模型启动时,控制信号最初位于
1
,没有上升脉冲、 - 当第一个边沿出现时,计数器第一次被触发并返回
0
、 - 当记录第二个边沿时(第三个脉冲),计数器将返回
1
。
结论
在Engee中使用不同的子系统触发模式,可以组织离散或连续过程模拟的复杂混合场景。我们已经通过两个子系统执行修改器--EnablePort
和TriggerPort
看到了这一点,但Engee还有更多此类修改器,允许您设置更复杂的子系统条件,这些修改器可在基本程序块库的子系统面板中找到。