Matlab Simulink-每30秒输出1,否则为0
我需要一个子系统,需要输出1的间隔或30秒或略超过30秒 用matlab代码编写,应该是这样的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
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%出现一次(见图像左上角)
每次输入上升时,输出信号将高达一个时间步长(假设触发器设置为上升沿)