How to stop timer function at a specified time?
이전 댓글 표시
Hello..
I have used a timer function to capture image files continuously at a fixed rate automatically, at a specified time. I used startat function to do this and it's working, however, my problem is that, I can't stop it at a specified time I want. Instead I use pause. However, once I paused the program, the whole program halts and it never execute the next functions.
Can anyone help me?
Here's some part of my code:
dstart={'07:30' '07:32' '07:34' '12:00' '13:30' '15:00' '18:00' '19:30'};
dfinish={'07:31' '07:33' '07:35' '13:25' '07:31' '16:25' '09:01' '20:55'};
%here i used the captureimage function to capture image using imaq toolbox..
t1=timer('TimerFcn', 'captureimage', 'ExecutionMode', 'FixedRate');
tp1=timer('TimerFcn', 'pause'); %I can't stop the timer fcn that's why i use pause
%the capture starts exactly at 07:30AM continuously with 7second interval
startat(t1, dstart(1,1));
%here, the program pauses when it is exactly 07:31AM
startat(tp1, dfinish(1,1));
How can i stop the timer function without using pause, because instead of pausing the timer function, the whole program pauses.
I will greatly appreciate your help.
Thank you.
채택된 답변
추가 답변 (2개)
Jan
2011년 2월 4일
% Create times as DATENUM vector:
TimerData.start = floor(now) + datenum( ...
{'07:30' '07:32' '07:34' '12:00' '13:30' '15:00' '18:00' '19:30'});
TimerData.finish = floor(now) + datenum( ...
{'07:31' '07:33' '07:35' '13:25' '07:31' '16:25' '09:01' '20:55'});
TimerData.index = 1;
T = timer('TimerFcn', @myTimerFcn, ...
'ExecutionMode', 'FixedRate', 'Period', 7.0, ...
'UserData', TimerData);
startat(T, TimerData.start(1));
% ------ Timer function:
function myTimerFcn(TimerH, EventData)
TimerData = get(TimerH, 'UserData');
% Stop time reached?
if now >= TimerData.finish(TimerData.index)
stop(TimerH);
TimerData.index = TimerData.index + 1;
% Last time reached?
if TimerData.index > length(TimderData.start)
delete(TimerH); % Cleanup
else % Restart the timer at the next start time:
set(TimerH, 'UserData', TimerData); % EDITED2
startat(TimerH, TimerData.start(TimerData.index));
end
return; % EDITED
end
% Perform the action - insert your code here:
capturimage
% ------ End: Timer function
Good luck!
댓글 수: 4
Kent Cabarle
2011년 2월 4일
Kent Cabarle
2011년 2월 4일
Kent Cabarle
2011년 2월 4일
Jan
2011년 2월 4일
@Kent: StartFcn and StopFcn are executed, when the timer is started or stopped, but they do not trigger the starting or stopping.
Yes, you need to start the timer by STARTAT. I insert it in the code.
I've inserted an RETURN in the code to improve it. Please try it again.
Kent Cabarle
2011년 2월 5일
댓글 수: 12
Jan
2011년 2월 5일
I'm confused. If the capturing does not start at 7:30, how do you find out, that it does not stop at 7:31?? If you start the timer by START, it starts immediately, not at 7:30.
I assume using the debugger would help to find out, what happens. Set some break points and go through the program line by line.
Kent Cabarle
2011년 2월 5일
Jan
2011년 2월 5일
What does kaptur1 do? Perhaps you start this function, it runs continuously and you expect it to be stopped from the outside? This will not work and is not connected to the timer at all. Then you have to modify this function, such that it stops the recording.
Kent Cabarle
2011년 2월 6일
Jan
2011년 2월 6일
1. Please cleanup the layout of the code you've posted. It looks, like you redefine the Timer's UserData inside the callback?!
2. What does happen if this line is processed in my suggested solution, after the finish time has been reached: "now >= TimerData.finish(TimerData.index)" ??? You _can_ set a breakpoint in "stop(TimerH)"; Please do not state repeatedly, that the timer does not stop, but post, what happens instead in the "stop(TimerH)" line.
3. I've added the forgotten update of the Timer's UserData in my example code (see EDITED2 tag).
Kent Cabarle
2011년 2월 7일
Walter Roberson
2011년 2월 7일
When unspecified, the year defaults to the current year, month and day default to January 1, hour and minute default to 00:00, and second and millisecond default to 00.000.
Walter Roberson
2011년 2월 7일
Some of what I thought I wrote seems to have disappeared.
Your problem is in the floor(now) + datenum({'07:30'}) . floor(now) is calculating the serial date number of the beginning of today. datenum({'07:30'}) applies the defaults I quoted above, Jan 1 of the current year, so you are getting the serial datenum of Jan 1 2011 07:30 and adding that to the datenum of the start of the day.
The solution is fairly simple:
floor(now) + datenum([0 0 0 7 30 0; 0 0 0 7 34 0; 0 0 0 7 37 0])
and so on.
Jan
2011년 2월 7일
@Walter: You are correct. I tried it under Matlab 6.5: DATENUM('07:31') => 0.3125, Matlab 2009a: DATENUM('07:30') => 7.3341e+5.
Even "floor(now)" will fail, if you run the program ad midnight. The most stable method would be to use a full time specifier as DATENUM('07-Feb-2011 07:31:00').
Kent Cabarle
2011년 2월 7일
Walter Roberson
2011년 2월 7일
If that is the error message you are getting, then you have a typo in your code, 'TimderData' instead of 'TimerData'
Kent Cabarle
2011년 2월 7일
카테고리
도움말 센터 및 File Exchange에서 Time Series Objects에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!