首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每当函数调用触发器发生时,我如何在Simulink中产生输出脉冲?

每当函数调用触发器发生时,我如何在Simulink中产生输出脉冲?
EN

Stack Overflow用户
提问于 2022-03-03 05:01:19
回答 2查看 1.7K关注 0票数 0

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

  • 在函数调用触发器中,经过一段固定的时间(例如1ms),我们将输出设置为值1
  • ,输出值设置为0。然后,每当接下来发生函数调用触发器时,这都会重复。我尝试设置一个状态流图,如下所示:

虽然这确实会产生脉冲,但从高到低状态的转换只在E事件发生时发生,而不是在初始E事件发生后1ms发生。也就是说,很明显,图表将在E函数调用事件之间休眠。E事件间隔约200毫秒,“y”的每个脉冲也是相同的宽度--当我希望它在y=1时只有1ms宽的时候。有没有办法改变图表设置,直到从高回到低的过渡发生为止?或者我可以使用函数调用子系统而不是Stateflow图表来实现同样的行为吗?对我来说都没问题。

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

编辑:顶层模型应该是这样的,尽管生成函数调用的块更复杂,而且不只是在一个规则的示例时间间隔内生成函数调用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-04 09:22:12

看起来,您将该事件用作图表的启用触发器,这意味着只有在启用触发器时才会对图表进行评估。这意味着每个触发器只更新一次图表输出,这就给出了问题。

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

下面是一个最小模型

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

“检测增加”块在标准的Simulink库中,并将我们的布尔值(持续事件的频率)转换为上升边缘上的单个样本。您可能不需要这一点,这取决于您的E信号是什么样子,在我的例子中,它是必需的,因为E来自于信号生成器脉冲。

现在图表有一个简单的布尔输入,这对于事件触发器上的一个示例是正确的。我们可以实现一个非常类似于您所拥有的图表:

显然,您可以更改after持续时间以满足您的需要。

票数 1
EN

Stack Overflow用户

发布于 2022-03-04 03:07:35

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

图表:

它存在于以下子系统中:

FunctionCall输入来自产生偶尔函数调用的customer块。1ms函数调用的样本时间为0.001。它们分别以E和M1的形式与图表的输入事件联系起来。

在图表中,函数调用E将从低状态转换为高状态并设置y=1;然后,在M1事件的两个实例之后,我们将转换回Low并设置y=0。

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

通过上面的图表,我可以看到(通过y值的范围),我得到了宽度为1ms的y脉冲,它们与E.

如果有人有更好的解决方案,请随时提交他们!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71332317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档