文档

使用控制流逻辑

什么是控制流子系统

一个控制流分系统由控制流块启用时,在当前时间步骤执行一次或多次。控制流块实现的控制逻辑类似于编程语言的控制流语句(例如,if - thenwhile-do开关,).

等价的C语言语句

您可以使用框图来建模控制流逻辑,等价于以下C编程语言语句:

  • if - else

  • 开关

条件控制流逻辑

您可以使用以下块来执行条件控制流逻辑。

C声明 等价的块

if - else

如果If动作子系统

开关

开关情况开关案例动作子系统

If-Else控制流

下面的图表示if - else控制流。

构造一个if - else控制流程图如下:

  1. 为If块提供数据输入,用于构造If -else条件。

    在If块参数对话框中,设置If块的输入。在内部,输入被指定为u1, u2,……,联合国和用于构造输出条件。

  2. 在“If块参数”对话框中,设置If块的输出端口If -else条件。

    在“If块参数”对话框中,设置“输出端口”。使用输入值U1, u2……,联合国表示对话框中if、elseif和else条件字段的条件。其中,只有if字段是必需的。可以输入多个elseif条件,选中复选框启用else条件。

  3. 将每个条件输出端口连接到Action子系统。

    如果端口的大小写为真,则将if块上的每个if、elseif和else条件输出端口连接到要执行的子系统。

    创建这些子系统动作子系统中的端口块。这将创建一个带有名为Action的端口的原子动作子系统,然后将其连接到If块上的条件。

    一旦连接上,子系统就具有它所连接的条件的标识,并像已启用的子系统一样运行。

有关更详细的信息,请参见如果而且行动的港口块。

请注意

Action子系统中的所有块都由如果开关情况块必须以与驱动块相同的速率运行。

开关控制流程

下面的图表示开关控制流。

构造一个开关控制流程如下:

  1. 为Switch Case块的参数输入提供一个数据输入。

    Switch Case块的输入是开关控制流程。这个值决定要执行的适当案例。该端口的非整数输入将被截断。

  2. 根据参数输入的数值将案例添加到Switch Case块中。

    使用Switch Case块的参数对话框,将案例添加到Switch Case块。case可以是单值或多值。您还可以添加一个可选的默认大小写,如果没有其他大小写为真,则默认大小写为真。一旦添加,这些案例就会显示为Switch Case块上的输出端口。

  3. 将每个Switch Case块Case输出端口连接到Action子系统。

    Switch case块的每个case输出都连接到一个子系统,如果端口的case为真,则执行该子系统。您可以通过在子系统中放置Action Port块来创建这些子系统。这将创建一个带有名为Action的端口的原子子系统,然后将其连接到Switch Case块上的条件。一旦连接,子系统就具有条件的标识,并像已启用的子系统一样运行。将为该案例执行的所有块编程放在这个子系统中。

有关更详细的信息,请参阅开关情况而且行动的港口块。

请注意

实例的子系统执行后,将执行隐含的中断,该中断将退出开关控制流程报表。万博1manbetx动态仿真模块®开关控制流语句实现没有表现出C语言的“失败”行为开关语句。

While和For循环

使用以下块执行而且循环。

While循环

下面的图表说明了一个循环。

在这个例子中,Simulink在每万博1manbetx个时间步骤中重复执行While子系统的内容,直到满足While迭代器块指定的条件。特别是,对于While迭代器块指定的循环的每次迭代,Simulink调用While子系统中所有块的更新和输出方法,其顺序与在非迭代原子子系统中调用方法的顺序相同。万博1manbetx

请注意

在执行While子系统的迭代过程中,模拟时间不会提前。然而,While子系统中的块将每次迭代视为一个时间步长。因此,在While子系统中,具有状态的块的输出(即其输出依赖于其先前输入的块)反映了其在前一次迭代中的输入值循环。输出是在前面的模拟时间步骤中反映该块的输入。例如,While子系统中的单元延迟块输出其在前一次迭代中的输入值循环,而不是前一个模拟时间步长的值。

构造一个循环如下:

  1. 在子系统中放置While迭代器块。

    主机子系统标签变为虽然{…},表示它正在建模一个while循环。这些子系统就像被触发的子系统一样。这个子系统是块编程的宿主,您希望用While Iterator块进行迭代。

  2. 为While Iterator块的初始条件数据输入端口提供一个数据输入。

    While迭代器块需要初始条件数据输入(有标记)集成电路)的第一次迭代。这必须起源于While子系统之外。如果这个值非零,则进行第一次迭代。

  3. 为While Iterator块的条件端口提供数据输入。

    其余迭代的条件传递给标记的数据输入端口气孔导度.该端口的输入必须来自While子系统内部。

  4. (可选)设置While Iterator块,通过其属性对话框输出其迭代器值。

    第一次迭代的迭代器值为1,后续迭代的迭代器值加1。

  5. (可选)将While Iterator块的迭代更改为延伸的通过其属性对话框。

    这将主机子系统的标签更改为{…},.与一个延伸的迭代时,While迭代块不再有初始条件(IC)端口,因为子系统中的所有块都在条件端口(标记为气孔导度)被选中。

  6. 在子系统中创建定义子系统输出的框图。

    请注意

    图表不能包含具有连续状态的块(例如,来自continuous块库的块)。所有块的采样时间必须继承(-1)或常数(正)

有关更多信息,请参见而迭代器块。

为循环建模

下图表示a循环:

在这个例子中,Simulink在每万博1manbetx个时间步骤中多次执行For子系统的内容。For Iterator块的输入指定迭代次数。对于每一次迭代在循环中,S万博1manbetximulink调用For子系统中所有块的更新和输出方法的顺序与它调用方法的顺序相同,如果它们在一个非迭代的原子子系统中。

请注意

在For子系统的迭代执行期间,模拟时间不会提前。然而,For子系统中的块将每个迭代视为一个时间步长。因此,在For子系统中,具有状态的块的输出(即,其输出依赖于其先前输入的块)反映了其在前一次迭代中的输入值循环。输出是在前面的模拟时间步骤中反映该块的输入。例如,For子系统中的单元延迟块输出其在上一个迭代中的输入值循环,而不是前一个模拟时间步长的值。

构造一个循环如下:

  1. 将For Iterator子系统块从库浏览器或库窗口拖到您的模型中。

  2. (可选)设置For Iterator块为它执行的迭代次数接受外部或内部输入。

    通过For Iterator块的属性对话框,您可以将其设置为通过标记的端口获取迭代次数的输入N.这个输入必须来自For迭代器子系统之外。

    您还可以在属性对话框中直接设置迭代次数。

  3. (可选)设置For Iterator块以输出其迭代器值,用于For Iterator子系统的块编程。

    第一次迭代的迭代器值为1,后续迭代的迭代器值加1。

  4. 在子系统中创建定义子系统输出的框图。

    请注意

    图表不能包含具有连续状态的块(例如,来自continuous块库的块)。所有块的采样时间必须继承(-1)或常数(正)

For Iterator块与Assignment块一起工作,可以为vector或matrix中的值重新赋值。下面的例子展示了For Iterator块的使用。注意传递的数据中的矩阵维数。

上面的示例使用For子系统输出输入2 × 5矩阵(2行,5列)的sin值赋值块。具体流程如下。

  1. 一个2乘5的矩阵输入到Selector块和Assignment块。

  2. Selector块在For Iterator块的当前迭代值所指示的列值处从输入矩阵中剥离2 × 1矩阵。

  3. 对2 × 1矩阵求sin。

  4. sin值2乘1矩阵被传递给赋值块。

  5. 赋值块将原始的2 × 5矩阵作为其输入之一,在迭代值指示的列位置将2 × 1矩阵赋回原始矩阵。

    在上述示例中的assign块的属性对话框中为重新分配指定的行是[1,2]。因为在原始矩阵中只有两行,您也可以为行指定-1(即所有行)。

    请注意

    三角函数模块已经能够计算矩阵的正弦值。上面的例子只使用三角函数块作为一个例子,在赋值块和For Iterator块的协作下改变矩阵的每个元素。

另请参阅

|||||

这个话题有用吗?