【问题标题】:Simulink - Output 1 every 30 seconds, 0 otherwiseSimulink - 每 30 秒输出 1,否则为 0
【发布时间】:2017-07-17 09:05:19
【问题描述】:

我需要一个需要每隔 30 秒或略超过 30 秒输出 1 的子系统。

用matlab代码写的应该是这样的

function y = fcn(time,uplinkTimeInterval)

%#codegen

persistent lastTriggerTime

if isempty(lastTriggerTime)

    lastTriggerTime = 0;

end 

if time>=lastTriggerTime || time == 0

    y = 1;

    lastTriggerTime = time + uplinkTimeInterval;
else

    y = 0;

end

end

其中 ulplinkTimeInterval 为 30 秒。当然,我尝试将此代码与 matlab 功能块一起使用,但由于某种原因它不起作用(在调试模式下,我可以看到 y 应取值为 1,但它根本不会将值输出到块之外),因此我想使用积木,但我不知道怎么做。

非常感谢您的帮助

【问题讨论】:

    标签: matlab time simulink intervals


    【解决方案1】:

    您可以使用代码或块相对轻松地创建此逻辑。当您请求使用块的解决方案时,就在这里!

    • 使用clock 块来跟踪时间,并使用一些constant 块来确定给出1 而不是0 的时间间隔(以秒为单位)。
    • 使用memory 块将clock 信号延迟1 个时间步长,以便我们可以比较连续步长的值。
    • 将时间除以间隔,然后向下取整,得到已过去的多少个间隔。
    • 最后,使用relational operator 比较连续的“经过的间隔数”。如果更多区间已超过上限,则您刚刚跨过区间阈值。

    注意:这将为您未跨越新间隔的每个时间步返回一个 0,并在您拥有的每个单独的时间步返回一个 1。输出的准确性取决于模型的步长。


    编辑:floor 块之后添加memory 块可能更清晰/更容易,因此您只需进行一次除法/舍入。它仍然允许您与上一个时间步进行比较。看起来像:

    【讨论】:

      【解决方案2】:

      最简单的方法是使用一个 Pulse Generator 块,设置为每 30 秒具有 1 个“高”。这显示为下图的一部分。无论在块对话框中指定的周期百分比是多少,信号都会很高。

      如果出于某种原因您确实需要使用子系统,请使用触发和启用子系统(参见图片右上角)。将相同的脉冲信号馈入触发端口和启用端口,并将子系统内部的输出端口设置为具有Output when disabledreset,并具有0Initial Output(参见图像的右下角) )。

      下面的模型展示了如何做到这一点。在这种情况下,脉冲被设置为具有 30 秒的周期,上升沿在该周期的每 1% 发生一次(参见图像的左上角)。

      每次输入上升时,输出信号都会保持一个时间步长(假设触发器设置为上升沿。)

      【讨论】:

        猜你喜欢
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 2017-03-31
        相关资源
        最近更新 更多