Engee 模型架构的实际工作
页面进行中。 |
恩吉的示范建筑 一文中介绍了*Engee*中构建模型架构的理论。建议在开始学习本文之前先阅读这篇文章。 |
子系统和子模型用于对模块进行分组。子系统可视为一个函数,子模型可视为一个插件文件。在*Engee*中,它们的实现方式如下:
子系统类型.h | 子模型.h | 实现子系统行为的其他模块 | |
---|---|---|---|
经典 |
程序块Subsystem |
块Model (子模型) |
|
有条件触发 |
启用子系统(启用子系统) 触发(触发子系统) 触发并启用子系统(触发并启用子系统) 可复位子系统(可复位子系统) 功能调用(功能调用) |
||
控制逻辑 |
操作 |
||
多次执行(计算周期) |
对于每个 迭代器 |
有关各种子系统的实现示例,请访问链接。 |
任何 Engee 子系统都可以用掩码定制(见恩吉的面具 )。 |
经典子系统
经典子系统* 是一个块Subsystem ,用于将模型划分为模块,无需附加条件或控制外部信号。
何时使用经典子系统:
-
将大型模型分割成较小的模块,以简化模型;
-
改善模型的结构和可读性;
-
在模型之间转移现成模块(复制子系统)。
有关经典子系统的更多信息_.
模块 Subsystem 包含模型或系统中的模块子集,可以是非虚拟子系统,也可以是虚拟子系统:
-
非虚拟子系统作为一个单元执行,可配置为仅在某些事件发生时执行。
-
虚拟子系统不作为一个单元执行,独立于事件。该子系统有助于使模型更易于理解,但不会影响其运行。
要将虚拟子系统切换为非虚拟子系统,请将 Treat as atomic unit 参数设置为 "true"。
*经典子系统具有以下功能:
-
不是托管子系统;
-
允许一个子系统包含另一个子系统的分层模型结构;
-
不能作为单独文件或子系统保存。要将子系统保存为单独的模型,需要使用块Model (子模型);
-
不影响模型的功能和逻辑。
如何使用经典子系统:
-
在画布上添加 Subsystem 块,并在子系统中添加所需的块;
或
-
使用组合键Shift+ЛКМ 将图块组合到子系统中,然后选择 子系统 :
有条件触发
启用子系统(启用子系统)
可激活子系统 - 是一个块类型 Subsystem,其执行受外部信号控制。只要控制信号为正,启用子系统就会在每个主时间步执行一次。
何时使用可激活子系统:
-
执行取决于外部条件或信号的操作。
-
实现复杂的控制逻辑,只有在满足特定条件时才需要执行模型。
有关可激活子系统的更多信息_.
可激活子系统具有以下功能:
-
是一个受控子系统;
-
Enable 块添加了一个外部信号,用于控制子系统的执行;
-
控制信号可以是标量或矢量:
-
如果标量值大于零,则执行子系统;
-
如果至少一个矢量值大于零,则执行子系统;
-
-
如果控制信号在一个较小的时间步长内过零,则在下一个主要时间步长之前不会开启或关闭子系统。
如何使用可激活子系统:
触发子系统(触发子系统)
触发子系统 - 是一种由外部触发信号启动执行的块 Subsystem。当控制信号的值以指定方式发生变化时,触发子系统每步将执行一次。
有关触发子系统的更多信息
触发子系统具有以下功能:
-
是一个受控子系统;
-
Trigger 块添加了一个外部信号来控制子系统的执行;
-
触发式子系统与激活式子系统不同,激活式子系统在控制信号为正时执行,而触发式子系统则在两次触发之间将其输出参数保持在最后一个值;
-
子系统内离散块的状态在两次触发之间保持不变。
*何时使用触发式子系统?
-
执行必须由特定事件触发的操作;
-
执行必须响应中断或其他异步事件才能执行某些操作的系统;
-
执行必须以外部触发信号确定的指定频率执行的任务。
*如何使用触发子系统:
触发和启用子系统(触发和启用子系统)
触发和激活子系统 - 是将两个子系统(触发和启用)的功能合并为一个子系统。只有当激活控制信号为正值且触发事件发生时,才会执行该子系统。
何时使用触发和激活子系统:
有关触发和激活子系统的更多信息
可触发和可激活*子系统具有以下功能*:
-
是一个受控子系统;
-
子系统的执行同时受两个外部信号控制:触发信号和激活信号;
-
子系统必须由标量或矢量信号的正值激活。如果标量值大于零或任何一个矢量值大于零,子系统即被激活。
-
当控制信号的值以指定方式变化时,子系统在每一步中执行一次。Trigger* 块控制子系统的执行。
-
子系统在两次触发之间将其输出参数保持在上次的值。
-
子系统内离散块的状态在两次触发之间保持不变。
如何使用触发和激活子系统:
可复位子系统(可复位子系统)
*何时使用可重置子系统:
-
执行需要在特定条件下重置子系统内所有区块状态的操作;
-
针对外部事件(如系统重启或出错)将子系统重置为初始状态;
-
通过确保在特定时间点重置子系统来管理系统状态。
有关要重置的子系统的更多信息_。
*可重置子系统具有以下功能:
-
是一个受控子系统;
-
复位块增加了一个外部信号,用于控制子系统的执行;
-
当*复位*端口触发时,子系统内所有模块的状态都会复位到初始状态;
-
子系统在每个时间步执行,但只有当*复位*端口上的触发器被触发时,才会重置模块状态;
-
与使用 Reset 端口重置程序块的行为类似,只是被重置的子系统会重置其内部所有程序块的状态。
如何使用可重置子系统:
-
在画布上添加一个 Subsystem 块,并在子系统中添加一个 * 复位 * 块;
或
-
使用组合键Shift+ЛКМ 将所需的图块组合到一个子系统中,然后选择 可复位子系统 :
如果使用组合键合并到可复位子系统中,将自动添加 Reset 块。
功能调用(功能调用子系统)
Function-Call (功能调用子系统) 是一个块类型 Subsystem。每当控制端口收到函数调用事件时,子系统就会启动。这些事件可能来自Chart 块、功能调用生成器块或Engee Function 块。
*何时使用功能调用子系统:
-
创建类似于编程语言中程序的功能,只有在函数调用发生时才需要执行。
-
实现复杂的控制逻辑,必须根据要求执行某些操作。
有关函数调用子系统的更多信息_.
*功能调用子系统具有以下功能:
-
是一个受管理的子系统;
-
触发类型*参数为 "功能调用 "的 Trigger 块变为*功能*块,并添加外部信号以控制子系统的执行;
-
只有当控制端口收到函数调用事件时,子系统才会被执行;
-
对子系统的调用会按给定顺序启动子系统中所有区块的执行,类似于程序编程语言中的函数。
如何使用函数调用子系统:
控制逻辑
操作
动作子系统*是一个子系统,其执行受块Action Port 的动作信号控制。该子系统用于包含区块If 和Switch Case 的模型。
何时使用动作子系统:
-
实现具有 If 和 Switch-Case 逻辑的模型;
-
根据动作信号(来自*动作端口*块)实现模型部分的条件执行;
-
创建复杂的分支逻辑,其中模块的执行取决于外部信号决定的条件。
有关 "动作 "子系统的更多信息
*动作子系统具有以下功能:
-
是一个受管理的子系统;
-
程序块 If 实现 If-Else 逻辑,以控制 *Action 子系统*的执行;
-
块 Switch Case 实现切换逻辑,以控制*动作子系统*的执行;
-
动作信号控制子系统内各块的执行,类似于编程语言中的 If 和 Switch-Case 结构。
如何使用动作子系统:
-
在画布中添加 Subsystem 块,并在子系统中添加 * 动作端口* 块。该块为子系统添加了一个外部 Action 输入端口。
多重执行
For Each(针对每个项目)
*For Each 子系统*是一个可以处理输入信号中每个元素的子系统。这种子系统的控制块是For Each 。
何时使用 For Each 子系统:
-
处理每个元素的输入信号,例如在过滤或数据转换任务中;
-
对输入信号的元素或子数组执行并行计算;
-
执行复杂的处理逻辑,需要对每个数据元素进行单独的状态核算。
关于每个子系统的更多信息
对于迭代器(迭代子系统)
For Iterator 子系统*是一个具有可编程 For 逻辑的迭代子系统。它代表一个子系统,在当前时间步长内重复执行,直到迭代变量超过给定的迭代限制。这样,您就可以使用程序块For Iterator 在 Engee 中实现与 For 循环相同的逻辑。
何时使用迭代子系统:
-
在需要累积或总结单一时间步长数据的模型中;
-
执行需要多次执行相同操作的复杂数据处理算法;
-
需要对数据数组中的元素进行多次计算的任务。
有关迭代器子系统的更多信息
迭代器子系统具有以下功能*:
-
是一个受控子系统;
-
子系统在当前时间步长内根据迭代变量重复执行;
-
For Iterator* 块控制迭代次数(*迭代限制*参数),类似于 For 循环;
-
For Iterator* 块的输出不能是函数调用信号,如果违反这一条件,Engee 将在更新模型时产生错误。
如何使用迭代子系统:
-
将 Subsystem 块添加到画布,并将 For Iterator 块添加到子系统。
-
启用*显示迭代变量*参数,以显示输出端口。启用*设置下一个 i(外部迭代变量)参数,以显示输入端口。在*迭代限制*参数中定义子系统的迭代次数。使用 *Index mode 参数指定初始迭代次数。
模型(子模型)
何时使用子模型:* *
-
创建系统模型层次结构;
-
在项目之间重复使用和分配模块
-
开发具有许多相互关联组件的复杂系统;
-
将项目划分为可单独开发和测试的独立部分。