필터 지우기
필터 지우기

How to stop timer function at a specified time?

조회 수: 7 (최근 30일)
Kent Cabarle
Kent Cabarle 2011년 2월 4일
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.

채택된 답변

Brett Shoelson
Brett Shoelson 2011년 2월 4일
Kent, Why not build into the callback a comparison of the current time (help NOW) with the desired stop time? Then, if current time >= desiredStopTime, then issue a STOP command. Cheers, Brett
  댓글 수: 1
Kent Cabarle
Kent Cabarle 2011년 2월 4일
thanks for the idea..appreciate it.. c:

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Jan
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
Kent Cabarle 2011년 2월 4일
Jan, I've tried it, but still, the capture does not stop at 07:31AM (where the capture starts at 07:30AM)..instead, the program keeps on capturing (from 7:30AM onwards).. What do you think is the problem?
Can StartFcn or StopFcn be useful?
Thanks.
Jan
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
Kent Cabarle 2011년 2월 5일
%Actually, here is my main code..
function kxlsforum
% Assignation
[num dset]=xlsread('class.xls'); % 9x7 skedule
day = datestr(now, 'dddd'); % exact date
t0=timer('TimerFcn', 'kaptur1camtemplate', 'ExecutionMode', 'SingleShot');
dk={'1' '2' '3' '4' '5' '6' '7' '8'};
% Assign and check day and time
for n=2:7 % check Mon - Sat
k=dset(1,n); % disp Mon-Sat etc, compare with actual day
c = strcmp(k,day);
if c == 1
fdate=datestr(now, 'mmddyyyy');
mkdir(fdate);
disp('Today is '); disp(day);
disp('Capturing an image template..');
start(t0); % capture 1 image as template
disp('Image template captured')
for p=1:8
de(1,p)=isempty(dset{p+1,n}); % 0 - occupied
switch de(1,p) % 1 - vacant
case 0
mkdir(fdate, dk{1,p});
end
end
disp(de);
break % break FOR loop
end
end
f=find(~de); % find the 1st class time & last class time capture
mini=min(f);
maxi=max(f);
TimerData.start = floor(now) + datenum({'07:30' '07:34' '07:37' ... '12:00' '13:30' '15:00' '18:00' '19:30'});
TimerData.finish = floor(now) + datenum({'07:31' '07:35' '07:38'... '13:25' '07:31' '16:25' '09:01' '20:55'});
TimerData.index = 1;
T = timer('TimerFcn', @myTimerFcn, 'ExecutionMode','FixedRate',... 'Period', 7.0,'UserData', TimerData);
start(T) % i used this is execute the timer
Here is the timer function (separate file)
% ------ Timer function: function myTimerFcn(TimerH, EventData) TimerData = get(TimerH, 'UserData'); %Stop time reached?
TimerData.start = floor(now) + datenum({'07:30' '07:34' '07:37' '12:00' '13:30' '15:00' '18:00' '19:30'}); TimerData.finish = floor(now) + datenum({'07:31' '07:35' '07:38' '13:25' '07:31' '16:25' '09:01' '20:55'}); TimerData.index = 1;
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:
startat(TimerH, TimerData.start(TimerData.index));
end
return;
end
% Perform the action - insert your code here:
kaptur1
end
% ------ End: Timer function
In the main function, i used the start(T) to execute the timer, instead of startat.. (i used a separate function which is kaptur1camtemplate to capture a single image which will be the basis for image processing..[not included here])
and in the timer function, i just did what you advised me to do..(i used the kaptur1 function for image capturing here..) however, the capturing did not start capturing at 7.30AM, and still not stopping at its specified time, for for this instance 7.31AM..
Can't figure it out.. What do you think?
Thanks for the help..a lot..
  댓글 수: 12
Walter Roberson
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
Kent Cabarle 2011년 2월 7일
@Walt. It worked. It starts capturing at 7.30AM and stops at 7.31AM. Then starts capturing again at 7.32AM, and so on.. Great. Thank you..
@Jan: Thanks also. Thanks for the kindness and wit. Thanks to both of you. Appreciate it. ^^

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Startup and Shutdown에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by