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

时间:2017-07-17 09:05:20

标签: matlab time simulink intervals

我需要一个需要以间隔或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,但它根本不输出块外的值),因此我想使用块,但我不知道该怎么做。

非常感谢你的帮助

2 个答案:

答案 0 :(得分:3)

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

block diagram

  • 使用clock块来跟踪时间,并使用一些constant阻止来确定给出1而不是0的间隔(以秒为单位)。
  • 使用memory块将clock信号延迟1个步,因此我们可以比较连续的步骤'值。
  • 按时间间隔划分时间,然后向下舍入,以了解多个间隔的传递方式。
  • 最后,比较连续的"通过的间隔数"使用relational operator。如果在上面一行传递了更多的间隔,那么你刚刚跨过间隔阈值。

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

修改:在memory块之后添加floor块可能更清晰/更容易,因此您只进行一次分割/舍入。它仍然允许您与前一个时间步骤进行比较。那看起来像是:

2nd option

答案 1 :(得分:0)

最简单的方法是使用一个Pulse Generator块,设置为"高"每30秒1。这显示为下图的一部分。无论块对话框中指定的周期百分比如何,信号都将为高电平。

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

下面的模型显示了如何执行此操作。在这种情况下,脉冲的周期设置为30s,上升沿每1%发生一次(参见图像的左上角)。

每次输入上升时输出信号将为高电平一段时间(假设触发设置为上升沿。)

Simulink Model