每次发生函数调用触发时,如何在 Simulink 中生成输出脉冲?

How can I generate an output pulse in Simulink every time a function-call trigger occurs?

我有一个来自客户的现有 Simulink 模型,该模型使用函数调用语义作为 Stateflow 图表上的事件触发器,等等。 对于我们目前的目的,我需要能够在函数调用触发器发生时生成一个简单的输出脉冲,这样:

虽然这确实会产生一个脉冲,但从高状态到低状态的转变只发生在 E 事件发生时,而不是在初始 E 事件发生后 1 毫秒。也就是说,很明显该图将在 E 函数调用事件之间休眠。 E 事件相隔大约 200 毫秒,'y' 的每个脉冲也具有相同的宽度——当我希望它在 y=1 时只有 1 毫秒宽。 有没有办法更改图表设置,使其保持清醒状态,直到发生从高位回到低位的转变? 或者我可以使用函数调用子系统而不是 Stateflow 图来实现相同的行为吗?哪个都适合我。

(整个模型使用变量求解器,因为生成函数调用脉冲的模块需要它。)

编辑:顶层模型应该是这样的,尽管生成函数调用的块更复杂并且不只是以规则的采样时间间隔生成函数调用。

经过一些实验,这里有一个似乎对我有用的解决方案。

图表:

它存在于以下子系统中:

FunctionCall 输入来自偶尔生成函数调用的客户块。 1ms 函数调用的采样时间为 0.001。这些分别作为 E 和 M1 与图表的输入事件混合。

在图表中,函数调用E将从Low状态转换到High状态并设置y=1;然后,在 M1 事件的 2 个实例之后,我们转换回低电平并设置 y=0.

我需要等待 M1 的 2 个实例,而不是仅仅将转换作为 M1,这看起来确实很奇怪 - 但考虑到 E 和 M1 将同时发生(通常,E 为微秒边界),没有 after(2, M1) 转换,我可以通过使用调试断点和步进看到状态转换发生,但它们都在同一时间步发生,因此脉冲宽度为 0 倍。

通过上面的图表,我可以看到(通过 y 值的范围)我得到了宽度为 1ms 的 y 个脉冲,并且它们与 E 同时开始。

如果大家有更好的解决方案,也欢迎提出来!

您似乎将该事件用作图表的已启用触发器,这意味着仅在启用触发器时才对图表进行评估。这意味着图表输出每个触发器只更新一次,给你的问题。

相反,一种方法是将事件源转换为布尔信号,该信号是模型的全速率,即 kHz 以捕获 1ms 样本,然后使用检测到的该信号的增加作为“正常” (不是启用的触发器)状态流变量。

这是一个最小模型

在这种情况下,我故意从事件中驱动启用的子系统,如下所示,它创建了布尔信号。请注意,您需要将输出端口的“禁用时输出”属性 设置为“重置”,以便它在事件触发之间翻转回 0。否则你有同样的问题。

“检测增加”块位于标准 Simulink 库中,并将我们的布尔值(持续事件的频率)转换为上升沿的单个样本。根据您的 E 信号的样子,您可能不需要它,在我的情况下,它是必需的,因为 E 来自 signal-builder 脉冲。

现在图表有一个简单的布尔输入,事件触发器上的一个样本为真。我们可以实现一个与您的图表非常相似的图表:

显然,您可以根据需要更改 after 持续时间。