; Standalone Example Program 10 – Multi-thread with subroutine
; Program 1 will home axis X and Y, then will continuously 
; move the X and Y-axis and control a laser pointer to draw 
; circle, line, then an Arc.  
; Simultaneously, program 3 will control the status of 
; general-purpose digital outputs to control LED’s.  
; Subroutine 1 turns off a laser pointer, 
; Subroutine 2 turns on the laser pointer, 
; Subroutine 7 enables and homes the X and Y-axis, 
; Subroutine 31 handles errors. 

PRG 1 						;Start program 1
	GOSUB 1					;Go to subroutine 1, Turn off laser pointer
	GOSUB 7 				;Go to subroutine 7,  Enable and Home X/Y
	WHILE 1=1				;Forever loop
; Draw Circle
		X85610Y562530			;Move to start point for Circle
		WAITX				;Wait for X-axis move to complete
		GOSUB 2				;Go to subroutine 2, Turn on laser pointer
		CIRXYP487659:562431		;Moves XY in a CW circle around points X487659 Y562431
		WAITX				;Wait for X-axis move to complete
		GOSUB 1				;Go to subroutine 1, Turn off laser pointer
; Draw Line
		X100000Y100000			;Move to start point of Line
		WAITX				;Wait for X-axis move to complete
		GOSUB 2				;Go to subroutine 2, Turn on laser pointer
		X909000Y642390			;Linear XY move from X100000 Y100000 to X909000 Y642390
		WAITX				;Wait for X-axis move to complete
		GOSUB 1				;Go to subroutine 1, Turn off laser pointer
; Draw Arc
		X430589Y20623			;Move to start point for Arc
		WAITX				;Wait for X-axis move to complete
		GOSUB 2				;Go to subroutine 2, Turn on laser pointer
		ARCXYN288899:267403:95000	;270dig arc of XY CCW around points X288899 Y267403
		WAITY				;Wait for Y-axis move to complete
		GOSUB 1				;Go to subroutine 1, Turn off laser pointer
	ENDWHILE				;Go back to WHILE statement
END						;End program 1
PRG 3						;Start program 3
	WHILE 1 = 1				;Forever loop
		IO=64				;General-purpose output 7 on.
		DELAY=700			;Delay 0.7 seconds
		IO=80				;General-purpose output 5 and 7 on.
 		DELAY=700			;Delay 0.7 seconds
 		IO=84				;General-purpose output 3, 5, and 7 on.
 		DELAY=700			;Delay 0.7 seconds
 		IO=85				;General-purpose output 1, 3, 5, and 7 on.
 		DELAY=700			;Delay 0.7 seconds
 		V30=0				; Set variable 30 to 0.
		WHILE V30 < 10			;Loop while variable 30 is less than 10
			IO = 85			;General-purpose output 1, 3, 5, and 7 on.
			DELAY=50		;Delay 0.05 seconds
			IO = 0			;All general-purpose outputs off.
			DELAY=50		;Delay 0.05 seconds
			V30=V30+1		;Increment variable 30 by 1
		ENDWHILE			;Go back to WHILE statement
	ENDWHILE				;Go back to WHILE statement
END						;End Program 3
SUB 1						;Subroutine start line, subroutine 1
	DO2=0					;DO 2 off to turn off Laser pointer
	DELAY=10				;Delay 0.01 seconds to stabilize laser
ENDSUB						;End of subroutine 1
SUB 2						;Subroutine start line, subroutine 2
	DO2=1					;DO 2 on to turn on Laser pointer
	DELAY=10				;Delay 0.01 seconds to stabilize laser
ENDSUB						;End of subroutine 2
SUB 7 						;Subroutine start line, subroutine 7
; Enable motors
	HSPD=15000				;Set high speed to 15,000 pulses/sec
	LSPD=500				;Set low speed to 500 pulses/sec
	ACC=100					;Set acceleration to 100 msec
	EO=3					;Enable X and Y-axis
; Home axis
	HOMEX-6				;Home X-axis with mode 6 in the negative direction
	WAITX					;Wait for X-axis move to complete
	HOMEY-6				;Home Y-axis with mode 6 in the negative direction
	WAITY					;Wait for Y-axis move to complete
; Move X/Y to Start Position
	HSPD=35000				;Set high speed to 35,000 pulses/sec
	X500000Y500000				;Move X and Y-axis to X500,000 Y500,000
	WAITX					;Wait for X-axis move to complete
ENDSUB						;End of subroutine 7
SUB 31						;Subroutine start line, subroutine 31 (error handling)
	SR1=0					;Stop program 1
	SR3=0					;Stop program 3
	ABORT					;Abort all-axis motion
	ECLEARX				;Clear the current error in X-axis
	ECLEARY				;Clear the current error in Y-axis
	IO=0					;All general-purpose outputs off.
	DO2=0					;DO 2 off to turn off Laser pointer
ENDSUB						;End of subroutine 31

