Simulink - 每 30 秒输出 1,否则输出 0
Simulink - Output 1 every 30 seconds, 0 otherwise
我需要一个需要每隔 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,但它根本不会将值输出到块外),因此想用积木不知道怎么用
非常感谢您的帮助
您可以使用代码或块相对轻松地制作此逻辑。当您请求使用块的解决方案时,就在这里!
- 使用
clock
块来跟踪时间,使用一些 constant
块来确定给出 1 而不是 0 的间隔(以秒为单位)。
- 使用
memory
块将 clock
信号延迟 1 个时间步长,这样我们就可以比较连续步长的值。
- 将时间除以时间间隔,然后向下舍入,得出 多少 个时间间隔过去了。
- 最后,使用
relational operator
比较连续的"number of intervals passed"。如果在上面的线上经过了更多的区间,那么你刚刚跨过了区间阈值。
注意: 这将 return 在您未跨越新间隔的每个时间步长处为 0,在您跨越新间隔的每个单独时间步长处为 1。输出的准确性将取决于模型的步长。
编辑: 在 floor
块之后添加 memory
块可能更清楚/更容易,所以你只做除法 /四舍五入一次。它仍然允许您与之前的时间步长进行比较。看起来像:
最简单的方法是只使用一个 Pulse Generator
块,将 "high" 每 30 秒设置为 1。这显示为下图的一部分。无论在块对话框中指定的周期百分比如何,信号都将处于高电平。
如果出于某种原因您确实需要使用子系统,则使用触发和启用的子系统(参见图像右上角)。将相同的脉冲信号馈入触发器和使能端口,并将子系统内的输出端口设置为 Output when disabled
到 reset
,并设置 Initial Output
为 0
(见图片右下角)。
下面的模型展示了如何做到这一点。在这种情况下,脉冲已设置为具有 30 秒的周期,上升沿每该周期的 1% 发生一次(参见图像的左上角)。
每次输入上升时,输出信号将高一个时间步长(假设触发器设置为上升沿。)
我需要一个需要每隔 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,但它根本不会将值输出到块外),因此想用积木不知道怎么用
非常感谢您的帮助
您可以使用代码或块相对轻松地制作此逻辑。当您请求使用块的解决方案时,就在这里!
- 使用
clock
块来跟踪时间,使用一些constant
块来确定给出 1 而不是 0 的间隔(以秒为单位)。 - 使用
memory
块将clock
信号延迟 1 个时间步长,这样我们就可以比较连续步长的值。 - 将时间除以时间间隔,然后向下舍入,得出 多少 个时间间隔过去了。
- 最后,使用
relational operator
比较连续的"number of intervals passed"。如果在上面的线上经过了更多的区间,那么你刚刚跨过了区间阈值。
注意: 这将 return 在您未跨越新间隔的每个时间步长处为 0,在您跨越新间隔的每个单独时间步长处为 1。输出的准确性将取决于模型的步长。
编辑: 在 floor
块之后添加 memory
块可能更清楚/更容易,所以你只做除法 /四舍五入一次。它仍然允许您与之前的时间步长进行比较。看起来像:
最简单的方法是只使用一个 Pulse Generator
块,将 "high" 每 30 秒设置为 1。这显示为下图的一部分。无论在块对话框中指定的周期百分比如何,信号都将处于高电平。
如果出于某种原因您确实需要使用子系统,则使用触发和启用的子系统(参见图像右上角)。将相同的脉冲信号馈入触发器和使能端口,并将子系统内的输出端口设置为 Output when disabled
到 reset
,并设置 Initial Output
为 0
(见图片右下角)。
下面的模型展示了如何做到这一点。在这种情况下,脉冲已设置为具有 30 秒的周期,上升沿每该周期的 1% 发生一次(参见图像的左上角)。
每次输入上升时,输出信号将高一个时间步长(假设触发器设置为上升沿。)