什么是Bind 操作?
你Bind 状态中的操作将指定的数据和事件绑定到该状态。绑定到一个状态的事件只能通过该状态或其子状态的行为进行广播。你还可以将函数调用事件绑定到状态,以启用或禁用事件触发的函数调用子系统。函数调用子系统在进入具有绑定事件的状态时启用,在退出该状态时禁用。函数调用子系统的执行完全绑定到调用它的状态的活动。
将函数调用子系统绑定到状态
默认情况下,函数调用子系统由定义相关函数调用输出事件的图表控制。这种关联意味着函数调用子系统在图表唤醒时启用,并保持活动状态,直到图表进入睡眠状态。为了实现更精细的控制,可以使用绑定操作将函数调用子系统绑定到图表层次结构中的状态。
绑定操作可以将函数调用输出事件绑定到状态。当创建这种类型的绑定时,事件调用的函数调用子系统也绑定到状态。在这种情况下,函数调用子系统在进入状态时启用,在退出状态时禁用。
当你将函数调用子系统绑定到状态时,可以在启用和禁用子系统时微调子系统的行为,如以下部分所述:
子系统禁用时处理输出
子系统启用时的状态控制行为
子系统禁用时处理输出
虽然函数调用子系统在禁用时不会执行,但它们的输出信号可用于模型中的其他块。如果函数调用子系统绑定到某个状态,则可以将其输出保持在上一时间步的值,或者在子系统禁用时将输出重置为初始值。请按照以下步骤操作:
1 双击子系统的输出块以打开“Block Parameters
2 选择一个 Output when disabled选项:
选择 | |
---|---|
held | 保持最新的输出值 |
reset | 输出它的初始值 |
3 点击ok保存设置
只有当函数调用子系统绑定到某个状态时, 设置Output when disabled 才有意义。
子系统启用时的状态控制行为
如果函数调用子系统绑定到状态,则可以将子系统状态变量保持在上一时间步的值,或者在子系统执行时将状态变量重置为初始状态。通过这种方式,绑定状态可以完全控制函数调用子系统的状态变量。请按照以下步骤操作:
1 双击子系统的触发端口,打开“ Block Parameters ”对话框。
2 为States when enabling选择一个选项:
选择 | |
---|---|
held | 保持包含触发端口的子系统状态的最新值 |
reset | 恢复到包含此触发端口的子系统状态的初始状态 |
inherit | 从函数调用发起者的父子系统继承此设置。如果启动器的父级是模型根,则保留继承的设置。如果触发器有多个启动器,则所有启动器的父级必须具有相同的设置:全部保持或全部重置。 |
3 点击ok保存设置
只有当函数调用子系统绑定到某个状态时,启用时设置状态才有意义。
Bind一个 Function-Call 子系统到状态
此模型通过绑定到图表状态的触发事件E触发函数调用子系统。在“Model Configuration Parameters”对话框的“Solver ”窗格中,模型指定了一个固定步长为1的固定步长解算器。
该图表包含两个状态。事件E通过动作绑定到状态A
bind:E
事件E是为图表定义的,其范围为输出到Simulink,触发类型为function-call。
函数调用子系统包含一个触发端口块、一个输入端口、一个输出端口和一个简单的框图。该框图使用单位延迟块,在每个时间步长将计数器递增1。
触发器端口的“ Block Parameters”对话框包含以下设置:
触发器类型: function-call.
States when enabling: reset. 此设置在启用时将函数调用子系统的状态值重置为零。
采样类型: triggered. 此设置将函数调用子系统设置为仅在启用时由调用事件触发时执行。
将采样时间类型设置为周期性将启用其下方的采样时间字段,默认值为1。这些设置强制函数调用子系统在启用时对采样时间字段中指定的每个时间步执行。为了实现这一点,绑定函数调用子系统的调用事件的状态必须发送与采样时间字段中指定的采样率一致的时间步长的事件。状态可以以模拟采样率在entry或during 期间发送事件。
对于固定步长采样,采样时间值必须是固定步长的整数倍。
对于可变步长采样,采样时间值没有限制。
为了了解状态如何控制绑定函数调用子系统,开始模拟模型。
在时间t=0时,发生向状态A的默认转换。状态A执行其绑定和输入操作。绑定操作将事件E绑定到状态A,启用函数调用子系统并将其状态变量重置为0。入口操作触发函数调用子系统并执行其框图。该框图使用单位延迟块将计数器递增1。单元延迟块输出值0,并保持新值1,直到下一次调用子系统。
在时间t=1时,模型的下一个更新事件将测试状态A的传出转换。向状态B的转换不会发生,因为(10,勾选)后的时间运算符只允许在收到十个更新事件后进行转换。状态A保持活动状态,其在操作过程中触发函数调用子系统。单位延迟块输出其保持的值1。子系统还会递增其计数器以产生值2,单位延迟块将保持该值,直到下一次触发执行。
接下来的八个更新事件在每个时间步将子系统输出增加一个。
在时间t=10时,发生从状态A到状态B的转变。由于与状态A的绑定不再处于活动状态,函数调用子系统被禁用,其输出降至0。
在时间t=11时,发生从状态B到状态A的转变。同样,绑定操作启用了函数调用子系统。后续的更新事件在每个时间步将子系统输出递增1,直到下一次转换到状态B发生在时间t=21。
你绑定事件将函数调用子系统的控制权赋予图表中的单个状态。当n允许其他事件通过多路复用器触发函数调用子系统时,此控件不起作用。例如,该模型定义了两个函数调用事件,以使用Mux块触发函数调用子系统。
在图表中,E1绑定到状态A,但E2没有。状态B在其进入动作中发送触发事件E2。
模拟此模型时,当从状态A转换到状态B时,输出不会重置。
当你通过mux向函数调用子系统提供多个触发事件时,不建议进行绑定。多重触发事件会干扰事件绑定并导致未定义的行为。