# 7. 条件子系统


# 模块采样时间

前面已经了解了具有连续或离散采样时间的模块。这些模块要么在每个时间步执行,要么以周期性的方式执行。然而,有时会需要一个模块在非周期性的时间间隔执行。 本文将创建条件执行子系统,即根据条件信号输入执行的子系统。这些模块可以具有新的采样时间类型——触发式。

  • 连续——模块在求解器所采取的每个时间步执行。
  • 离散——模块基于模块采样时间以周期性间隔执行。
  • 触发式——模块根据条件信号输入执行。

# 子系统类型

存在两种类型的子系统:

  • 虚拟型——子系统仅添加视觉层次结构。在模拟过程中,子系统模块被视为模型中该子系统上级部分的一部分。这是创建子系统的默认设置。
  • 原子型——子系统被视为一个非虚拟单元。在给定时间步长开始执行原子子系统时,该子系统内的每个模块都会先执行,然后模拟执行才会继续执行子系统外部的其他模块。

条件执行子系统是原子子系统的子集。它们必须是原子型,因为其执行取决于控制信号。控制信号决定了子系统内的所有模块是否必须执行。因此,原子子系统的非虚拟层次结构和边界对于强制执行这一点是必要的。

有两种主要类型的条件执行子系统:

  • 使能型(enable)
  • 触发型(trigger)

# 条件执行子系统

要创建条件执行子系统,在已有的子系统中添加一个 EnableTrigger 模块(位于子系统模型库中)。 任何使能或触发子系统都会在子系统顶部新增一个输入端口。此输入端口用于控制信号。详细内容可查看条件执行子系统概述

提示

不能在一个子系统中放置多个 Enable 模块或多个 Trigger 模块。一个子系统最多可以同时包含一个 Enable 模块和一个 Trigger 模块。要对多个条件或事件进行建模,需要在外部处理控制信号逻辑。

# 使能子系统

根据控制信号的不同,使能子系统既可以被启用也可以被禁用。只要控制信号输入大于 0,启用的子系统就会被使能。

当一个启用的子系统处于活动状态时,其行为与其他原子子系统相同。 要正确使用启用的子系统,需要启用时子系统内部状态的行为。

状态行为:

  • 保持(held)——输出或状态的值保持在子系统变为禁用之前所具有的最后值。
  • 重置(reset)——输出或状态的值重置为模拟开始时的初始值。

状态行为 要设置状态值是保持还是重置,请使用 Enable 模块中的使能时的状态选项。

提示

对于子系统中的每个输出,可以使用 outport 块的参数对话框来设置输出行为。初始输出选项控制初始输出值。禁用时的输出选项确定输出是保持还是重置。

示例模型

中展示了 Sysblock 启用一个使能子系统时的状态。

# 触发子系统

触发子系统在触发事件发生时仅执行一次。触发事件是在控制信号以某种方式越过零点时发生的。 触发子系统的输出和状态在触发事件之间始终保持其先前的值。 触发子系统只能包含离散模块,并且其采样时间必须设置为继承模式。

触发子系统可以监听三种类型的触发设置。

① 上升沿(rising)——当信号上升时发生:

  • 从负值变为正值
  • 从零变为正值
  • —从负值变为零

② 下降沿(falling)——当信号下降时发生:

  • 从正值变为负值
  • 从正值变为零
  • 从零变为负值

③ 任一沿(either)——当出现上升沿或下降沿时发生。

通过触发模块的触发类型选项可以设置触发子系统所监听的触发事件。 在离散模型中的触发子系统只会被连续的触发事件触发一次(从 -1 到 0,然后在下一个时间步变为 1)。控制信号必须保持在 0 状态一个时间步,触发器才能再次记录事件。

示例

中展示了一个包含触发子系统的模型。

# 使能与触发子系统

如果需要根据某个条件来验证事件驱动系统的执行情况。为此,可以使用使能和触发子系统。 使能和触发子系统使用两个独立的信号源作为其执行控制信号。当触发事件发生时,只有当使能信号为正时,该子系统才会执行一次。

可参考示例

# 处理无效输入

作为条件执行子系统的一个应用,用户可以在电子节气门控制模型中根据无效输入数据来禁用 PI 控制器。

  1. 通过添加一个 Enable 模块,将 PI 控制器设置为启用状态的子系统。
  2. 判断输入到区间测试块中的信号是否在有效输入范围内。
  3. 根据输入信号来启用或禁用 PI 控制器子系统。

添加逻辑以在踏板输入无效时禁用 PI 控制器。

参考示例

带有误差信号和自定义启用信号的 PI 控制器模型,可用于测试。

参考示例

这里的示例需要从 Syslab 工作区读取变量数据,所以要从 Syslab 中打开 Sysplorer 运行模型。所需数据文件:etc_data.jl

提示

在 Sysblock 中用 SignalBuilder 模块实现 Simulink 中 Signal Editor 模块功能。 如果模型中出现 SignalBuilder 模块,需要自行设置信号或在运行前将信号文件提前导入。文中所需的文件可自行下载enabledController.SignalBuilder.sbdetc_PI_enabled.SignalBuilder.sbd