Matlab Timer函数启动另一个函数

时间:2015-02-18 23:50:28

标签: matlab timer callback handle

我想在定时器开始计数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'时出错。输入参数太多了。'有什么可能导致问题的原因吗?有没有更简单/更有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

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函数中(如果你知道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

答案 1 :(得分:1)

有几件事情在我身上跳了出来。如果您希望每60秒执行一次,则应设置Period。

如果您的计时器正在执行许多其他操作,并且您确实只想在第60个任务执行后调用PowerOnFunc(而不是在第120个任务),则可以通过不在您的{中丢弃它来访问TasksExecuted属性{1}}功能。

ftimer

但是,如果您正在寻找的只是拨打function ftimer(th,~) if th.TasksExecuted == 60 PowerOnFunc(); end end ,那么我建议将PowerOnFunc设置为60,将StartDelay设置为1.然后您可以使用TasksToExecute作为您的回调,或者仍然将其包装在PowerOnFunc中,但您不需要if语句。这具有停止计时器的额外好处。

此外,请确保在某些时候删除计时器 - 清除变量不适合您。