Engee 文档

Engee 模型架构的实际工作

页面进行中。

恩吉的示范建筑 一文中介绍了*Engee*中构建模型架构的理论。建议在开始学习本文之前先阅读这篇文章。

子系统和子模型用于对模块进行分组。子系统可视为一个函数,子模型可视为一个插件文件。在*Engee*中,它们的实现方式如下:

子系统类型.h 子模型.h 实现子系统行为的其他模块

经典

程序块Subsystem classic subsystem

Model (子模型)

Chart

有条件触发

启用子系统(启用子系统)enabled subsystem

触发(触发子系统)triggered subsystem

触发并启用子系统(触发并启用子系统)triggered enabled subsystem

可复位子系统(可复位子系统)resettable subsystem

功能调用(功能调用)function call subsystem

控制逻辑

操作

多次执行(计算周期)

对于每个

迭代器

有关各种子系统的实现示例,请访问链接
任何 Engee 子系统都可以用掩码定制(见恩吉的面具 )。

经典子系统

经典子系统*classic subsystem 是一个块Subsystem ,用于将模型划分为模块,无需附加条件或控制外部信号。

何时使用经典子系统

  • 将大型模型分割成较小的模块,以简化模型;

  • 改善模型的结构和可读性;

  • 在模型之间转移现成模块(复制子系统)。

有关经典子系统的更多信息_.

模块 Subsystem 包含模型或系统中的模块子集,可以是非虚拟子系统,也可以是虚拟子系统:

  • 非虚拟子系统作为一个单元执行,可配置为仅在某些事件发生时执行。

  • 虚拟子系统不作为一个单元执行,独立于事件。该子系统有助于使模型更易于理解,但不会影响其运行。

要将虚拟子系统切换为非虚拟子系统,请将 Treat as atomic unit 参数设置为 "true"。

*经典子系统具有以下功能:

  • 不是托管子系统;

  • 允许一个子系统包含另一个子系统的分层模型结构;

  • 不能作为单独文件或子系统保存。要将子系统保存为单独的模型,需要使用块Model (子模型);

  • 不影响模型的功能和逻辑。

如何使用经典子系统

  • 在画布上添加 Subsystem 块,并在子系统中添加所需的块;

  • 使用组合键Shift+ЛКМ 将图块组合到子系统中,然后选择 子系统 :

classic subsystem

有条件触发

启用子系统(启用子系统)

可激活子系统 enabled subsystem - 是一个块类型 Subsystem,其执行受外部信号控制。只要控制信号为正,启用子系统就会在每个主时间步执行一次。

何时使用可激活子系统

  • 执行取决于外部条件或信号的操作。

  • 实现复杂的控制逻辑,只有在满足特定条件时才需要执行模型。

有关可激活子系统的更多信息_.

可激活子系统具有以下功能

  • 是一个受控子系统;

  • Enable 块添加了一个外部信号,用于控制子系统的执行;

  • 控制信号可以是标量或矢量:

    • 如果标量值大于零,则执行子系统;

    • 如果至少一个矢量值大于零,则执行子系统;

  • 如果控制信号在一个较小的时间步长内过零,则在下一个主要时间步长之前不会开启或关闭子系统。

如何使用可激活子系统

  • 在画布上添加一个 Subsystem 块,并在子系统上添加一个 Enable 块。如果 Enable 被用于 Model 块引用的模型的根级别,则需要执行以下操作:

    • 对于多通道模型,将求解器设置为单任务模式。

    • 对于固定步长模型,模型中至少有一个程序块必须以指定的固定步长速度运行

  • 使用组合键Shift+ЛКМ 将所需区块合并为一个子系统,然后选择 可激活子系统 :

    enabled subsystem 1

    如果使用组合键并入可激活子系统,将自动添加块 Enable

触发子系统(触发子系统)

触发子系统 triggered subsystem - 是一种由外部触发信号启动执行的块 Subsystem。当控制信号的值以指定方式发生变化时,触发子系统每步将执行一次。

有关触发子系统的更多信息

触发子系统具有以下功能

  • 是一个受控子系统;

  • Trigger 块添加了一个外部信号来控制子系统的执行;

  • 触发式子系统与激活式子系统不同,激活式子系统在控制信号为正时执行,而触发式子系统则在两次触发之间将其输出参数保持在最后一个值;

  • 子系统内离散块的状态在两次触发之间保持不变。

*何时使用触发式子系统?

  • 执行必须由特定事件触发的操作;

  • 执行必须响应中断或其他异步事件才能执行某些操作的系统;

  • 执行必须以外部触发信号确定的指定频率执行的任务。

*如何使用触发子系统:

  • 在画布上添加 Subsystem 块,并在子系统中添加 Trigger 块;

  • 使用组合键Shift+ЛКМ 将所需的图块组合到一个子系统中,然后选择 触发子系统 :

    triggered subsystem 1

    如果使用组合键并入触发子系统,将自动添加块 Trigger

触发和启用子系统(触发和启用子系统)

触发和激活子系统 triggered enabled subsystem - 是将两个子系统(触发和启用)的功能合并为一个子系统。只有当激活控制信号为正值且触发事件发生时,才会执行该子系统。

何时使用触发和激活子系统

  • 执行取决于激活和触发事件的操作;

  • 在系统中,只有当两个条件都为真时,子系统才会被执行(来自 TriggerEnable 块的信号)。

  • 实现复杂的控制逻辑,需要在特定条件下激活,并在触发事件时执行。

有关触发和激活子系统的更多信息
可将 Trigger 模块添加到 Enable 模块中,以获得 * 可触发和可激活 * 子系统。

可触发和可激活*子系统具有以下功能*:

  • 是一个受控子系统;

  • 子系统的执行同时受两个外部信号控制:触发信号和激活信号;

  • 子系统必须由标量或矢量信号的正值激活。如果标量值大于零或任何一个矢量值大于零,子系统即被激活。

  • 当控制信号的值以指定方式变化时,子系统在每一步中执行一次。Trigger* 块控制子系统的执行。

  • 子系统在两次触发之间将其输出参数保持在上次的值。

  • 子系统内离散块的状态在两次触发之间保持不变。

如何使用触发和激活子系统

  • 在画布上添加程序块 Subsystem,并在子系统中添加程序块 TriggerEnable

  • 使用组合键Shift+ЛКМ 将所需图块组合到一个子系统中,然后选择 触发和激活子系统 :

    triggered enabled subsystem 1

    如果使用组合键组合成已触发和已激活的子系统,将自动添加块 TriggerEnable

可复位子系统(可复位子系统)

可复位子系统 resettable subsystem - 是一种块类型 Subsystem,其块状态可由外部触发器重置。该子系统在每个时间步执行,但当 Reset 端口发生触发事件时,子系统中所有块的状态都会重置为初始状态。

*何时使用可重置子系统:

  • 执行需要在特定条件下重置子系统内所有区块状态的操作;

  • 针对外部事件(如系统重启或出错)将子系统重置为初始状态;

  • 通过确保在特定时间点重置子系统来管理系统状态。

有关要重置的子系统的更多信息_。

*可重置子系统具有以下功能:

  • 是一个受控子系统;

  • 复位块增加了一个外部信号,用于控制子系统的执行;

  • 当*复位*端口触发时,子系统内所有模块的状态都会复位到初始状态;

  • 子系统在每个时间步执行,但只有当*复位*端口上的触发器被触发时,才会重置模块状态;

  • 与使用 Reset 端口重置程序块的行为类似,只是被重置的子系统会重置其内部所有程序块的状态。

如何使用可重置子系统

  • 在画布上添加一个 Subsystem 块,并在子系统中添加一个 * 复位 * 块;

  • 使用组合键Shift+ЛКМ 将所需的图块组合到一个子系统中,然后选择 可复位子系统 :

    resettable subsystem 1

    如果使用组合键合并到可复位子系统中,将自动添加 Reset 块。

功能调用(功能调用子系统)

Function-Call (功能调用子系统)function call subsystem 是一个块类型 Subsystem。每当控制端口收到函数调用事件时,子系统就会启动。这些事件可能来自Chart 块、功能调用生成器块或Engee Function 块。

*何时使用功能调用子系统:

  • 创建类似于编程语言中程序的功能,只有在函数调用发生时才需要执行。

  • 实现复杂的控制逻辑,必须根据要求执行某些操作。

有关函数调用子系统的更多信息_.

*功能调用子系统具有以下功能:

  • 是一个受管理的子系统;

  • 触发类型*参数为 "功能调用 "的 Trigger 块变为*功能*块,并添加外部信号以控制子系统的执行;

  • 只有当控制端口收到函数调用事件时,子系统才会被执行;

  • 对子系统的调用会按给定顺序启动子系统中所有区块的执行,类似于程序编程语言中的函数。

如何使用函数调用子系统

  • 在画布中添加 Subsystem 块,并在子系统中添加 Trigger 块。将*触发器类型*参数值设为 "函数调用"。Trigger* 块将把视图更改为 Function

  • 使用组合键Shift+ЛКМ 并选择 功能调用子系统 :

    function call subsystem 1

    如果使用组合键并入功能调用子系统,Function 块将自动添加。

控制逻辑

操作

动作子系统*是一个子系统,其执行受块Action Port 的动作信号控制。该子系统用于包含区块IfSwitch Case 的模型。

何时使用动作子系统

  • 实现具有 If 和 Switch-Case 逻辑的模型;

  • 根据动作信号(来自*动作端口*块)实现模型部分的条件执行;

  • 创建复杂的分支逻辑,其中模块的执行取决于外部信号决定的条件。

有关 "动作 "子系统的更多信息

*动作子系统具有以下功能:

  • 是一个受管理的子系统;

  • 程序块 If 实现 If-Else 逻辑,以控制 *Action 子系统*的执行;

  • Switch Case 实现切换逻辑,以控制*动作子系统*的执行;

  • 动作信号控制子系统内各块的执行,类似于编程语言中的 If 和 Switch-Case 结构。

如何使用动作子系统

  • 在画布中添加 Subsystem 块,并在子系统中添加 * 动作端口* 块。该块为子系统添加了一个外部 Action 输入端口。

多重执行

For Each(针对每个项目)

*For Each 子系统*是一个可以处理输入信号中每个元素的子系统。这种子系统的控制块是For Each

何时使用 For Each 子系统

  • 处理每个元素的输入信号,例如在过滤或数据转换任务中;

  • 对输入信号的元素或子数组执行并行计算;

  • 执行复杂的处理逻辑,需要对每个数据元素进行单独的状态核算。

关于每个子系统的更多信息

每个子系统具有以下功能

  • 是一个受控子系统;

  • 子系统处理输入信号的每个元素;

  • 子系统中的每个区块为其处理的每个元素或子阵列保持一组单独的状态;

  • 在处理元素或子数组时,子系统会将结果合并形成输出信号;

  • 程序块允许为输入数据建立索引,并作为端口输出。

*如何使用 For Each 子系统:


对于迭代器(迭代子系统)

For Iterator 子系统*是一个具有可编程 For 逻辑的迭代子系统。它代表一个子系统,在当前时间步长内重复执行,直到迭代变量超过给定的迭代限制。这样,您就可以使用程序块For IteratorEngee 中实现与 For 循环相同的逻辑。

何时使用迭代子系统

  • 在需要累积或总结单一时间步长数据的模型中;

  • 执行需要多次执行相同操作的复杂数据处理算法;

  • 需要对数据数组中的元素进行多次计算的任务。

有关迭代器子系统的更多信息

迭代器子系统具有以下功能*:

  • 是一个受控子系统;

  • 子系统在当前时间步长内根据迭代变量重复执行;

  • For Iterator* 块控制迭代次数(*迭代限制*参数),类似于 For 循环;

  • For Iterator* 块的输出不能是函数调用信号,如果违反这一条件,Engee 将在更新模型时产生错误。

如何使用迭代子系统

  • Subsystem 块添加到画布,并将 For Iterator 块添加到子系统。

  • 启用*显示迭代变量*参数,以显示输出端口。启用*设置下一个 i(外部迭代变量)参数,以显示输入端口。在*迭代限制*参数中定义子系统的迭代次数。使用 *Index mode 参数指定初始迭代次数。

模型(子模型)

Model 是一个指向单独模型文件的块。它可以使用块Model 嵌入到其他模型中。

何时使用子模型:* *

  • 创建系统模型层次结构;

  • 在项目之间重复使用和分配模块

  • 开发具有许多相互关联组件的复杂系统;

  • 将项目划分为可单独开发和测试的独立部分。

有关子模式的更多信息_.

*子模型具有以下功能:

  • 与经典子系统不同,子模型必须已存在于搜索路径上的文件系统中,才能在其他模型中使用;

  • 显示与子模型顶层输入和输出端口相对应的输入和输出端口。这些端口允许子模型连接到父模型中的其他块;

  • 子模型可引用另一个子模型,并支持任何子系统和其他子模型的多级嵌套;

  • 所有子模型的求解器步长必须与父模型的求解器步长一致(块 Model)。否则会出现求解器错误;

  • 只要步长相同,您可以选择不同的求解器。选择离散或连续求解器。同时使用两种求解器将导致求解器错误;

  • 子模型不支持物理建模 库块和多变量信号。

*如何使用子模型:

  • 在画布上添加 Model 块。

  • 在图块设置中,按下 选择型号 .

  • 要使输入/输出端口显示在模型块上,请在引用的模型上添加输入和输出块,并选择选项 更新连接器 :

    model 1

要查看子模型的实施示例,请访问 链接

图表

Chart有限自动机 的图形表示。Chart* 块用于模拟有限自动机的控制逻辑,有限自动机是一种设备的数学模型,用于描述具有有限状态数的系统。

*何时使用图表

  • 实现有限自动机逻辑

  • 实现状态 和流程图。

  • 用于为具有明确控制逻辑和事件的系统建模。

  • 用于直观表示系统中的状态和转换。

  • 实现复杂的控制算法。

  • 使用代码生成 实现 Julia 语言结构。

有关 Chart_ 的更多信息

*图表具有以下功能:

  • 该库由独特的组件组成:

    stateflow library

  • 您只能使用在信号添加菜单(在 Chart 块)中声明的内部变量。

    stateflow settings 3

  • 要显示输入/输出端口,必须设置相应的局部变量。

如何使用图表

  • 在画布上添加一个块 Chart

  • 设置局部变量(输入/输出),添加 Chart 块的输入/输出端口。

阅读更多有关 Engee 中有限自动机的信息,请访问状态机