启动另一个函数的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 语句。这具有停止计时器的额外好处。

此外,请确保您在某个时候删除了计时器 - 清除变量不会为您做这件事。