启动另一个函数的Matlab定时器函数
Matlab Timer function to start another function
我想使用定时器函数在定时器开始计时 60 秒后执行另一个函数 PowerOnFunc。
%Timer Callback function
function [] = ftimer(~,~)
while TimerHandle.TasksExecuted == 60
PowerOnFunc();
break;
end
end
%Handle and execution
TimerHandle = timer('ExecutionMode','fixedrate','period',...
1,'tag','clockTimer','timerfcn',@ftimer);
start(TimerHandle);
但是,这会产生一个错误:“为计时器计算 TimerFcn 时出错 'timer-31'。输入参数太多。知道可能导致问题的原因是什么吗?有没有 simpler/more 有效的方法来做到这一点?
matlab中的回调函数自动获取两个参数source,event你需要你的回调函数支持这个
function [] = ftimer(src,evnt)
或者更现实一点,因为你不使用它们就这样做
function [] = ftimer(~,~)
作为旁注,您可以在一行中初始化计时器
TimerHandle = timer('ExecutionMode','fixedrate','period', ...
1,'tag','clockTimer','timerfcn',@ftimer)
和另一个注释
TimerHandle == 60
不起作用,因为该函数不知道 TimerHandle 是什么。你想用这行代码做什么?
编辑
TimerHandle == 60 应该等待 1 秒计时器的 60 次超时。将周期设置为 60 秒更有效(并且可能更准确)
%notice I change the time period v here
TimerHandle = timer('ExecutionMode','fixedrate','period',60,...
'tag','clockTimer','timerfcn',@ftimer);
现在 ftimer 函数只会每 60 秒调用一次。如果您想从回调函数内部查看计时器的 属性,您必须使用我们之前讨论过的源和事件
function []=ftimer(src,evnt)
if src.TasksExecuted == 5
edit2:上面代码中的拼写错误,现已修复
嗯,效果很好。仅供您自己了解,以下是 src 的一些字段:
Timer Object: timer-3
Timer Settings
ExecutionMode: fixedRate
Period: 1
BusyMode: drop
Running: on
Callbacks
TimerFcn: @ftimer
ErrorFcn: ''
StartFcn: ''
StopFcn: ''
有关更多信息,evnt 包含:
K>> evnt
evnt =
Type: 'TimerFcn'
Data: [1x1 struct]
K>> evnt.Data
ans =
time: [2015 2 19 16 37 19.3750] %this is the time the event triggered
这是计算代码执行次数的另一种方法,甚至可以在多次调用中将数据保存在回调函数中。 Matlab 有一个叫做 persistent variables 的东西。这就像在 C 函数中使用单词 'static'(如果您了解 C)。否则它只是意味着即使在函数结束后变量仍然存在。如果你真的想知道它执行了多少次,你的代码可能看起来像这样
%Timer Callback function
function [] = ftimer(src,evnt)
%this will be saved everytime the function is called, unlike normal
%varaibles who only 'live' as long as the function is running
persistent times_executed;
%initialies persisten variable
if (isempty(times_executed))
times_executed = 0;
end
fprintf('executed: %d times\n',times_executed);
%increments
times_executed = times_executed +1;
end
我突然想到了几件事。如果你想让它每 60 秒执行一次,你应该设置 Period。
如果您的计时器正在做很多其他事情,而您确实只想在第 60 次任务执行后调用 PowerOnFunc(而不是第 120 次),您可以通过 not 访问 TasksExecuted 属性在你的 ftimer
函数中抛出它。
function ftimer(th,~)
if th.TasksExecuted == 60
PowerOnFunc();
end
end
但是,如果您要查找的只是对 PowerOnFunc
的一次调用,那么我建议将 StartDelay
设置为 60,将 TasksToExecute
设置为 1。然后您可以只需使用 PowerOnFunc
作为您的回调,或者仍然将其包装在 ftimer
中,但您不需要 if 语句。这具有停止计时器的额外好处。
此外,请确保您在某个时候删除了计时器 - 清除变量不会为您做这件事。
我想使用定时器函数在定时器开始计时 60 秒后执行另一个函数 PowerOnFunc。
%Timer Callback function
function [] = ftimer(~,~)
while TimerHandle.TasksExecuted == 60
PowerOnFunc();
break;
end
end
%Handle and execution
TimerHandle = timer('ExecutionMode','fixedrate','period',...
1,'tag','clockTimer','timerfcn',@ftimer);
start(TimerHandle);
但是,这会产生一个错误:“为计时器计算 TimerFcn 时出错 'timer-31'。输入参数太多。知道可能导致问题的原因是什么吗?有没有 simpler/more 有效的方法来做到这一点?
matlab中的回调函数自动获取两个参数source,event你需要你的回调函数支持这个
function [] = ftimer(src,evnt)
或者更现实一点,因为你不使用它们就这样做
function [] = ftimer(~,~)
作为旁注,您可以在一行中初始化计时器
TimerHandle = timer('ExecutionMode','fixedrate','period', ...
1,'tag','clockTimer','timerfcn',@ftimer)
和另一个注释
TimerHandle == 60
不起作用,因为该函数不知道 TimerHandle 是什么。你想用这行代码做什么?
编辑
TimerHandle == 60 应该等待 1 秒计时器的 60 次超时。将周期设置为 60 秒更有效(并且可能更准确)
%notice I change the time period v here
TimerHandle = timer('ExecutionMode','fixedrate','period',60,...
'tag','clockTimer','timerfcn',@ftimer);
现在 ftimer 函数只会每 60 秒调用一次。如果您想从回调函数内部查看计时器的 属性,您必须使用我们之前讨论过的源和事件
function []=ftimer(src,evnt)
if src.TasksExecuted == 5
edit2:上面代码中的拼写错误,现已修复
嗯,效果很好。仅供您自己了解,以下是 src 的一些字段:
Timer Object: timer-3
Timer Settings
ExecutionMode: fixedRate
Period: 1
BusyMode: drop
Running: on
Callbacks
TimerFcn: @ftimer
ErrorFcn: ''
StartFcn: ''
StopFcn: ''
有关更多信息,evnt 包含:
K>> evnt
evnt =
Type: 'TimerFcn'
Data: [1x1 struct]
K>> evnt.Data
ans =
time: [2015 2 19 16 37 19.3750] %this is the time the event triggered
这是计算代码执行次数的另一种方法,甚至可以在多次调用中将数据保存在回调函数中。 Matlab 有一个叫做 persistent variables 的东西。这就像在 C 函数中使用单词 'static'(如果您了解 C)。否则它只是意味着即使在函数结束后变量仍然存在。如果你真的想知道它执行了多少次,你的代码可能看起来像这样
%Timer Callback function
function [] = ftimer(src,evnt)
%this will be saved everytime the function is called, unlike normal
%varaibles who only 'live' as long as the function is running
persistent times_executed;
%initialies persisten variable
if (isempty(times_executed))
times_executed = 0;
end
fprintf('executed: %d times\n',times_executed);
%increments
times_executed = times_executed +1;
end
我突然想到了几件事。如果你想让它每 60 秒执行一次,你应该设置 Period。
如果您的计时器正在做很多其他事情,而您确实只想在第 60 次任务执行后调用 PowerOnFunc(而不是第 120 次),您可以通过 not 访问 TasksExecuted 属性在你的 ftimer
函数中抛出它。
function ftimer(th,~)
if th.TasksExecuted == 60
PowerOnFunc();
end
end
但是,如果您要查找的只是对 PowerOnFunc
的一次调用,那么我建议将 StartDelay
设置为 60,将 TasksToExecute
设置为 1。然后您可以只需使用 PowerOnFunc
作为您的回调,或者仍然将其包装在 ftimer
中,但您不需要 if 语句。这具有停止计时器的额外好处。
此外,请确保您在某个时候删除了计时器 - 清除变量不会为您做这件事。