Matlab Simulink-每30秒输出1,否则为0

Matlab Simulink-每30秒输出1,否则为0,matlab,time,simulink,intervals,Matlab,Time,Simulink,Intervals,我需要一个子系统,需要输出1的间隔或30秒或略超过30秒 用matlab代码编写,应该是这样的 function y = fcn(time,uplinkTimeInterval) %#codegen persistent lastTriggerTime if isempty(lastTriggerTime) lastTriggerTime = 0; end if time>=lastTriggerTime || time == 0 y = 1; l

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

用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,但它只是不输出块外的值),因此我想使用块,但我不知道如何做


非常感谢您的帮助

您可以使用代码或块相对轻松地创建此逻辑。正如您所要求的使用块的解决方案,在这里

  • 使用
    时钟
    块跟踪时间,使用一些
    常量
    块确定给出1而不是0的间隔(以秒为单位)
  • 使用
    内存
    块将
    时钟
    信号延迟1次,以便我们可以比较连续步骤的值
  • 将时间除以间隔,然后四舍五入,以给出经过的间隔数
  • 最后,使用
    关系运算符
    比较连续的“传递的间隔数”。如果在上一行通过了更多的间隔,则您刚刚跨过了间隔阈值

注意:对于未跨越新时间间隔的每个时间步,将返回0;对于跨越新时间间隔的每个时间步,将返回1。输出的准确性将取决于模型的步长


编辑:只需在
地板
块之后添加
内存
块可能更清晰/更容易,因此您只需进行一次除法/取整。它仍然允许您与上一个时间步骤进行比较。这看起来像:


最简单的方法是只使用一个
脉冲发生器
块,设置为每30秒“高”1。如下图所示。无论在块对话框中指定的周期百分比是多少,信号都将是高的

如果出于某种原因,您确实需要使用子系统,那么请使用触发并启用的子系统(请参见图右上角)。将相同的脉冲信号输入触发器和启用端口,并将子系统内的输出端口设置为禁用时有
输出
重置
,并有
初始输出
0
(见图像右下角)

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

每次输入上升时,输出信号将高达一个时间步长(假设触发器设置为上升沿)