我需要一个需要以间隔或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,但它根本不输出块外的值),因此我想使用块,但我不知道该怎么做。
非常感谢你的帮助
答案 0 :(得分:3)
您可以使用代码或块相对轻松地创建此逻辑。正如您要求使用块的解决方案,这里是!
clock
块来跟踪时间,并使用一些constant
阻止来确定给出1而不是0的间隔(以秒为单位)。memory
块将clock
信号延迟1个步,因此我们可以比较连续的步骤'值。relational operator
。如果在上面一行传递了更多的间隔,那么你刚刚跨过间隔阈值。注意:这将为您没有越过新间隔的每个时间步长返回0,并且在每个时间步长为1时返回1。输出的准确性取决于模型的步长。
修改:在memory
块之后添加floor
块可能更清晰/更容易,因此您只进行一次分割/舍入。它仍然允许您与前一个时间步骤进行比较。那看起来像是:
答案 1 :(得分:0)
最简单的方法是使用一个Pulse Generator
块,设置为"高"每30秒1。这显示为下图的一部分。无论块对话框中指定的周期百分比如何,信号都将为高电平。
如果由于某种原因您确实需要使用子系统,则使用触发和启用子系统(请参见图像的右上角)。将相同的脉冲信号馈入触发器和启用端口,并将子系统内的输出设置为Output when disabled
到reset
,并Initial Output
为0
(见图像的右下角)。
下面的模型显示了如何执行此操作。在这种情况下,脉冲的周期设置为30s,上升沿每1%发生一次(参见图像的左上角)。
每次输入上升时输出信号将为高电平一段时间(假设触发设置为上升沿。)