Award
Congratulations Rich, for answering the question and has received an EZ-Credit award! Share what you have learned and create a tutorial to help others by clicking here.

How To Run A Script At Set Intervals?

Assistance Requested

Help Dave Schulpius with their question and receive $10 of EZ-Credit to get more robots and parts from our store. The following information was provided about their previous efforts searching tutorials for a resolution.

Dave Schulpius claims to have checked these sources:
 
#1

It seems like an easy thing to do but I cant quite seem to figure how to trigger a script at set intervals. For example if I want to run a re-calibration script every 30 minutes to home an encoder. I did this and put it in the personality generator but sometimes it will run the homing script a lot more then necessary.

Any advice is welcomed.

I have found a few conversations, tutorials and activities that may help with your question. Take a look at these links. I've sorted them by what I believe to be most relevant but that is not always the case as I'm still learning.


Also, consider reviewing the Learn section for informative lessons and activities. Check it out!


#2

@Dave You can create a timer script to run in the background....

Code:


:top
ControlCommand("Open", ScriptStart) #Run a script called "open" every 30 mins
sleep(1800000) #sleep for 30 minutes
goto (top)

#3

Thanks Richard but last time I tried to make a script sleep for a long time I couldn't get it to Sleep more then a minute or two. Cant remember how long it was but it wasn't very long. Maybe they changed that.

#4

In a rush, I'll add more later if needed but look at the $hour and $minute variables and the WaitUntil() commands if you want to "sleep" for a long period Smile

#5

Damn, hit close before I hit post. Had just written a quick and nasty script for this.

Try again Smile

Code:


:loop
$waithour = $hour
$waitminute = $minute

IF($waitminute > 29)
$waitminute = $waitminute - 30
$waithour++
IF($waithour = 24)
$waithour = 0
EndIf
Else
$waitminute = $waitminute + 30
EndIf

WaitUntilTime($waithour, $waitminute)

# Your commands here

Goto(loop)



That should grab the current time, add on 30 minutes (or add on an hour then subtract 30 minutes if the minutes are above 30), if the hour equals 24 it resets to 0 (no need for anything greater since it will never get that far without resetting to 0) wait until the calculated time, execute your commands then loop back to the start.

It's crude and could be written better but I'm rushing Smile

#6

I haven't tested long sleep intervals so you could very well be right, Dave... Maybe you could string a bunch of sleep commands of shorter intervals in a row to make up the 30 minutes? Not sure that will work either so maybe Rich has a better option for you....

#7

Another alternative for long sleeps (if a long sleep command wont work) is a loop...

Code:


$SleepTimeInMinutes = 30
$Counter = 0
RepeatUntil($Counter = $SleepTimeInMinutes)
Sleep(60000)
$Counter++
EndRepeatUntil



Or if 60000 is still too long a sleep

Code:


$SleepTimeInMinutes = 30
$Counter = 0

# Maths stuff...
$SleepTimeInSeconds = $SleepTimeInMinutes * 60

RepeatUntil($Counter = $SleepTimeInSeconds)
Sleep(1000)
$Counter++
EndRepeatUntil



Both of those will use more processing than the WaitUntilTime() version but would allow the inclusion of a countdown timer until next execution or whatever.

#8

@Rich... Actually, that's a really good option (a counter)... Smile

#9

To go one further, and to make it more complicated than it needs to be Grin

Code:


:begin
$SleepTimeInMinutes = 30
$Counter = 0

# Maths stuff...
$SleepTimeInSeconds = $SleepTimeInMinutes * 60

RepeatUntil($Counter = $SleepTimeInSeconds)

# More maths stuff...
$CountdownSeconds = $SleepTimeInSeconds - $Counter
$CountdownMinutes = Floor($CountdownSeconds/60)
$CountdownSeconds = $CountdownSeconds - ($CountdownMinutes * 60)

# Add a leading 0 to seconds (because I'm picky!)
IF($CountdownSeconds < 10)
$LeadingZero = ":0"
Else
$LeadingZero = ":"
EndIf

Print(" ")
Print(" " + $CountdownMinutes + $LeadingZero + $CountdownSeconds )
Print(" Until Next Execution ")
Print(" ")

Sleep(1000)
$Counter++
EndRepeatUntil

Print(" ")
Print(" TASK ")
Print(" EXECUTING! ")
Print(" ")

# Your commands here For Example
# ControlCommand("Calibrate", ScriptStartWait)

Goto(begin)



Complete with countdown timer (and a good example of the use of the Floor() math function that's under used) and emulated display within the script window (if it is a stand alone script not in Script Manager, and the control not resized).

Change $SleepTimeInMinutes as required (Default is 30 minutes)
Add your code where indicated (Use ScriptStartWait to pause the countdown until after the commands have been run)
The rest is automatic.

#10

You guys are great! I need to stiffen up my script writing skills. I've been spending all my "robot" time working on getting the B9 arms to a working prototype stage (just dropped the working prototype off at the machinist this morning to reproduce it. More to follow in a few weeks) . Thank goodness for people like you that are willing to give a guy a hand. I thought there was an elegant way to do this and you found several. Smile

Thanks again! Grin