Vous êtes sur la page 1sur 50

$STACK 32766

' History
'
'
'
'

Original
SUPER STEPPER 1.0
10 AUG 1997
Kevin Carroll's Beta Release

'
'
'
'
'
'
'

Super Stepper 1.1


12/20/99
Added white space and comments just
so I could read this thing
Format change spaces to tabs
In editor set tab size to 6 or 8
Minor changes to display positions

' Super Stepper 1.2


' 01/01/00
' Fixes (2) to plane 3 variable names
' Super Stepper 1.3
' 01/05/00
' Overide keys F2 and F3 in manual mode corrected
'
'
'
'
'
'

Current
Super Stepper 1.4
01/10/00
Backlash compensation in G2 and G3 arc operations
fixed by adding "arc" flag and IF THEN ELSE statements
Linear backlash also fixed

'
'
'
'
'
'
'
'
'
'

Known or suspected problems


When in auto mode F6 does not return us to main menu.
Noticed when debuging arc backlash that quadrant test
routines seem to do extra arc moves. Also seems to
show up when cutting perfect cir.
There is a problem with manual mode jog. Until you
do a F7 change jog amount the screen shows 0000 and
it jogs a different amount depending on direction.
Should be an easy fix.
File name handling in auto mode is kinda clunky

' Begin the program


CLS
WIDTH 40
COLOR 15, 0
LOCATE 3, 2: PRINT "
Stepster, Version .979"
LOCATE 5, 2: PRINT "Copyright 1997 by Haberle Machine Co."
LOCATE 7, 2: PRINT "
Written by Kevin Carroll"
' DELAY 2
CLS
LOCATE 3, 2: PRINT "
LOCATE 5, 2: PRINT "

This is a Beta Version"


NOT FOR DISTRIBUTION"

DELAY 3
2

' We set up arrays and set defaults


DIM t(10)
DIM g(30)
DIM misc(5, 2)
hold = 0
CoSys = 1
ariable, G53 to G55
cycle = 0
jds = 1
hold = 0
plane = 1
xy, xz, yz)
firstmove = 0
g90 = 1
g90.1 = 1
pi = 3.141592654#
pt = 127
5

'The coordinate system v

'Hold operation (freeze)


'Which plane is active (

CLS
lines = 0
CLOSE
OVR = 1
WIDTH 40
mX = 10
mY = 10
mZ = 1
KEY 19, CHR$(0) + CHR$(74)
KEY 20, CHR$(0) + CHR$(78)

'+

KEY 21, CHR$(0) + CHR$(20)


KEY 22, CHR$(0) + CHR$(45)

'T - X
KEY 23, CHR$(0) + CHR$(21)
KEY 24, CHR$(0) + CHR$(44)
'Y - Z
ON KEY(21) GOSUB 700
ON KEY(22) GOSUB 710
ON KEY(23) GOSUB 720
'T X Y
ON KEY(24) GOSUB 730
ON KEY(12) GOSUB 740
ON KEY(13) GOSUB 750
'Z L-R
ON KEY(11) GOSUB 760
ON KEY(14) GOSUB 770
ON KEY(19) GOSUB 780
'U-D +
ON KEY(20) GOSUB 790
'' Read our first data file
OPEN "exec.dat" FOR INPUT AS #2
LINE INPUT #2, port$: port = VAL(port$) ' lpt port
LINE INPUT #2, port2off$: port2off = VAL(port2off$) ' offset for input
LINE INPUT #2, mX$: mX1 = VAL(mX$) ' motor step X (axis movement per ste
p)

LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
LINE INPUT
CLOSE #2

#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,
#2,

mY$: mY1 = VAL(mY$) ' motor step Y


mZ$: mZ1 = VAL(mZ$) ' motor step Z
Xb$: Xb = VAL(Xb$) ' X backlash
Yb$: Yb = VAL(Yb$)
' Y backlash
Zb$: Zb = VAL(Zb$) ' Z backlash
panel$: panel = VAL(panel$) ' contol panel present =1
IJ$: IJ = VAL(IJ$) ' I&J incremental = 1
pX$: pX = VAL(pX$) ' pin for X step pulse
nX$: nX = VAL(nX$) ' pin for X direction signal
pY$: pY = VAL(pY$) ' Y step pulse
nY$: nY = VAL(nY$) ' Y direction
pZ$: pZ = VAL(pZ$) ' Z step pulse
nZ$: nZ = VAL(nZ$) ' Z direction
rA$: rA = VAL(rA$) ' pin for relay A
rB$: rB = VAL(rB$) ' relay B
rapid$: rapid = VAL(rapid$) 'IPM G0

' We now know where the lpt1 parallel port is so


' turn off the relays and prep panel on lpt2
OUT port, 255 AND NOT rA + rB ' turn relays off
port1 = port + 1
port2 = port + 2
OUT port1, 255
OUT port2, 4 'prepare panel
port2 = port2 + port2off ' some lpt ports input 1 byte higher
' Read the second data file
OPEN "speed.dat" FOR INPUT AS #2
LINE INPUT #2, compspeed$: compspeed = VAL(compspeed$) '
LINE INPUT #2, accf$: accf = VAL(accf$) 'accel / decel factor
LINE INPUT #2, accd$: accd = VAL(accd$) ' accel / decel distance
LINE INPUT #2, rapid$: rpd = VAL(rapid$) ' limit rapid traverse
LINE INPUT #2, backX$: backX = VAL(backX$) ' back up after homing X
LINE INPUT #2, backY$: backY = VAL(backY$)
LINE INPUT #2, backZ$: backZ = VAL(backZ$)
CLOSE #2
' Set more variables based on data files
FRF = compspeed / 100
rapid = rapid - 2
mX = mX1
mY = mY1
mZ = mZ1
g(16) = 1
g(17) = 1
g(18) = 1
IF IJ = 1 THEN
g90.1 = 0
ELSE
g90.1 = 1
end if
' Read the third data file
OPEN "color.dat" FOR INPUT AS #3
LINE INPUT #3, bground$: bground = VAL(bground$) '
LINE INPUT #3, axis$: axis = VAL(axis$) 'axis display
LINE INPUT #3, action$: action = VAL(action$) ' feed, overide, run, bloc
k

LINE INPUT #3, gee$: gee = VAL(gee$) ' active G codes


LINE INPUT #3, en$: en = VAL(en$) ' current line (N)
LINE INPUT #3, prompt$: prompt = VAL(prompt$) ' screen prompts
CLOSE #3
' Put the background on the screen
CLS
COLOR axis, bground
FOR p = 1 TO 25
PRINT "
NEXT p

"

' Write the foreground (menu) on the screen


LOCATE 2, 14: PRINT "X"
LOCATE 4, 14: PRINT "Y"
LOCATE 6, 14: PRINT "Z"
COLOR action
LOCATE 8, 7: PRINT "F"
LOCATE 8, 9: PRINT "100 "
LOCATE 10, 7: PRINT "%"
LOCATE 10, 9: PRINT "100"
COLOR axis
LOCATE 6, 36: PRINT "T 0 "
COLOR gee
LOCATE 2, 1: PRINT "G"; 50
rot = 0
150

' Entry point for main menu


CLOSE '??? What are we closing ???
can = 0
H2 = 0
homing = 0
HomeX = 0
HomeY = 0
HomeZ = 0
KEY(1) OFF
KEY(2) OFF
COLOR axis, bground
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
LOCATE 6, 36: PRINT "T"; tn
COLOR gee
LOCATE 4, 1: PRINT "G"; CoSys + 52
LOCATE 6, 1: PRINT "G";
LOCATE 6, 2: IF g90 = 1 THEN PRINT 90; " "
LOCATE 6, 2: IF g90.1 = 1 THEN PRINT "90.1"
LOCATE 6, 2: IF g90 = 0 THEN PRINT 90
plane = 1
LOCATE 2, 36: PRINT "G 17"
goX = 0
goY = 0
goZ = 0
X$ = "
FOR R = 8 TO 23
LOCATE R, 1
PRINT space$(40);
NEXT R

"

OUT port, 255 AND NOT rA + rB ' turn off relays


POKE &H417, PEEK(&H417 OR &H40) ' kill caps lock
POKE &H417, PEEK(&H417 OR &H20) ' kill num lock
COLOR prompt
LOCATE 21, 1: PRINT "
F1
F2
F3
LOCATE 22, 1: PRINT "
AUTO
MANUAL
MDI
COLOR action

F9
DOS

' Tell them which version they're running


LOCATE 20, 1: PRINT "
Stepster Version 1.4 1/10/00
260

"
"

"

' Loop here until we get a F1, F2, F3 or F9 keystroke


ON KEY(1) GOSUB 400 'Go do Auto Mode (execute g code from a file)
ON KEY(2) GOSUB 405 'Go do Manual Mode (move and jog from keyboard)
ON KEY(3) GOSUB 410 'Go do MDI Mode (execute g code from keyboard)
ON KEY(9) GOSUB 415 'Exit program and return to DOS
KEY(1) ON
KEY(2) ON
KEY(3) ON
KEY(9) ON
KEY(7) OFF
KEY(8) OFF
KEY(15) OFF
KEY(16) OFF
KEY(17) OFF
KEY(18) OFF
KEY(19) OFF
KEY(20) OFF
KEY(21) OFF
KEY(22) OFF
KEY(23) OFF
KEY(24) OFF

270

IF panel = 0 THEN GOTO 260 'Loop back looking for a keystroke


GOSUB 20000 'read panel
IF rot = 0 THEN GOTO 400
IF rot = 7 THEN GOTO 410
IF rot <> 0 AND rot <> 7 THEN GOTO 500
GOTO 270

400

' Entry for Auto Mode


KEY(9) OFF
MDI = 0
goX = 0
goY = 0
goZ = 0
hey = hey + 1 '??? code fragment, seems not used ???
GOTO 2000 'Auto Mode code section

405

' Entry for Manual Mode


KEY(9) OFF
MDI = 0
GOTO 500 'Manual Mode code section

410

' Entry for MDI Mode


KEY(9) OFF
MDI = 1
block = 0

GOTO 1000 'MDI Mode code


415

' Entry for quiting the program


CLS 'clear the screen
' Print some statistics
PRINT FRE(""); FRE(-1); FRE(-2)
SYSTEM 'Exit back to DOS

500

' Enter here for Manual Mode


g90 = 1 'Set absolute positioning
g(2) = 1 'Set G01 linear feed
g(9) = 100 'Set default feedrate to 100
COLOR action
LOCATE 8, 28: PRINT "JOG"
COLOR prompt
LOCATE 14, 1: PRINT " Press 'X' 'Y' 'Z' to zero"
LOCATE 15, 1: PRINT "
"
LOCATE 17, 2: PRINT CHR$(27); " "; CHR$(26); " "; CHR$(24); " ";
PRINT CHR$(25); " - +
T
F7
F8"
LOCATE 18, 1: PRINT " X
Y
Z
TOOL# JOG# MENU"
LOCATE 21, 1: PRINT " F1 F2
F3
F4
F5
F6 "
LOCATE 22, 1: PRINT "HOLD -OVERIDE+ GOTO XY0 GOTO T0 STOP"
ON KEY(2) GOSUB
ON KEY(3) GOSUB
KEY(2) ON
KEY(3) ON
KEY(4) OFF
ON KEY(4) GOSUB
KEY(5) OFF
ON KEY(5) GOSUB

580

7984 'Decrease feedrate


7982 'Increase feedrate

810 'Move both x an y to zero


820 'Change tool to tool zero, zero z axis

' Stop everything, keep values but go back to main menu


ON KEY(6) GOSUB 7900
ON KEY(7) GOSUB 800 'Go change the jog amount
ON KEY(8) GOSUB 850 'Go back to main menu

585

KEY(7) ON
KEY(8) ON
KEY(11) ON
KEY(12) ON
KEY(13) ON
KEY(14) ON
KEY(19) ON
KEY(20) ON
KEY(21) ON
KEY(22) ON
KEY(23) ON
KEY(24) ON
KEY(4) ON
KEY(5) ON
KEY(6) ON
IF panel = 0 THEN GOTO 600
GOSUB 20000 'read panel
IF rot = 0 THEN GOTO 400
IF rot = 7 THEN GOTO 410
IF rot <> 0 AND rot <> 7 THEN GOTO 500

600

KEY(2) STOP
KEY(3) STOP
KEY(4) STOP
KEY(5) STOP
KEY(6) STOP
COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) /
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) /
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) /
LOCATE 6, 36: PRINT "T"; tn
COLOR action
LOCATE 8, 7: PRINT "F RAPID"
LOCATE 10, 7: PRINT "% "; : PRINT USING "###"; OVR
LOCATE 10, 28: PRINT USING "#.####"; jd / 10000; :
KEY(2) ON
KEY(3) ON
KEY(4) ON
KEY(5) ON
KEY(8) ON
IF panel = 1 THEN GOSUB 900
IF gojog = 0 THEN GOTO 585
KEY(7) OFF
KEY(8) OFF
KEY(11) OFF
KEY(12) OFF
KEY(13) OFF
KEY(14) OFF
KEY(19) OFF
KEY(20) OFF
KEY(21) OFF
KEY(22) OFF
KEY(23) OFF

10000
10000
10000

* 100
PRINT "

cycle = 1
hold = 0
mode = 1
GOSUB 6700 'backlash setup then move loop
goX = 0
goY = 0
goZ = 0
gojog = 0
cycle = 0
GOTO 585 'Go back to Manual Mode menu and wait for keystroke
700

tn = tn + 1
IF tn > 10 THEN tn = 0 'cycle Tool

705

IF CoSys = 1 THEN bZ = cZ - t(tn)


IF CoSys = 2 THEN bZ = cZ + Z54off - t(tn)
IF CoSys = 3 THEN bZ = cZ + Z55off - t(tn)
RETURN

710

IF CoSys = 1 THEN cX = 0
bX = 0
RETURN 'zero X

720

IF CoSys = 1 THEN cX = 0
bY = 0
RETURN 'zero Y

"

730

IF tn = 0 THEN
cZ = 0
else
t(tn) = cZ
end if
GOTO 705 'zero tool

740

IF mX >= jd THEN
jd = mX
ELSE
jd = jds
end if
goX = jd * -1
gojog = 1
RETURN 'X-

750

IF mX >= jd THEN
jd = mX
ELSE
jd = jds
end if
goX = jd
gojog = 1
RETURN 'X+

760

IF mY >= jd THEN
jd = mY
ELSE
jd = jds
end if
goY = jd
gojog = 1
RETURN 'Y+

770

IF mY >= jd THEN
jd = mY
ELSE
jd = jds
end if
goY = jd * -1
gojog = 1
RETURN 'Y-

780

IF mZ >= jd THEN
jd = mZ
ELSE
jd = jds
end if
goZ = jd * -1
gojog = 1
RETURN 'Z+

790

IF mZ >= jd THEN
jd = mZ
ELSE
jd = jds
end if
goZ = jd
gojog = 1
RETURN 'Z-

800

' Enter here on a F8 jog, change amount


jds = jds / 10 'divide current value by 10
IF jds < 1 THEN
jds = 10000
end if
jd = jds
RETURN

810

' Move both x and y to zero


KEY(4) OFF
goX = bX * -1
goY = bY * -1
gojog = 1
'goto XY zero
KEY(4) OFF
RETURN

820

' Change tool to tool zero, set z to zero


tn = 0
goZ = cZ * -1
gojog = 1 ' call T0, goto Z zero
KEY(5) OFF
RETURN

850

GOTO 150 'go to menu


GOTO 580

900

' manual panel "gosub 20000" reads switches at LPT port


GOSUB 20000
IF rot = 6 THEN
IF button = butpress THEN
FOR slow = 1 TO 10000
NEXT slow
end if
IF button = 1 THEN GOSUB 7982
IF button = 2 THEN GOSUB 7984
butpress = button
END IF
IF rot = 5 THEN
IF butpress = button THEN 915
IF button = 1 THEN
tn = tn - 1
IF tn < 0 THEN
tn = 0
end if
end if
IF button = 2 THEN
tn = tn + 1
IF tn > 10 THEN
tn = 10
end if
end if
bZ = cZ - t(tn)
IF button = 3 THEN
t(tn) = cZ
bZ = cZ - t(tn)
end if
butpress = button

END IF
915

IF rot = 1 THEN 'Jog amount


IF butpress = button THEN 920
IF button = 1 THEN
jd = jd / 10
IF jd < 1 THEN
jd = 1
end if
end if
IF button = 2 THEN
jd = jd * 10
IF jd > 10000 THEN
jd = 10000
end if
end if
butpress = button
END IF

920

IF rot = 2 THEN 'Jog x


IF button = 1 THEN
goX = mX * jd * -1
gojog = 1
end if
IF button = 2 THEN
goX = mX * jd
gojog = 1
end if
IF button = 3 THEN bX = 0
END IF
IF rot = 3 THEN 'Jog y
IF button = 1 THEN
goY = mY * jd * -1
gojog = 1
end if
IF button = 2 THEN
goY = mY * jd
gojog = 1
end if
IF button = 3 THEN bY = 0
END IF
IF rot = 4 THEN 'Jog z
IF button = 1 THEN
goZ = mZ * jd * -1
gojog = 1
end if
IF button = 2 THEN
goZ = mZ * jd
gojog = 1
end if
IF button = 3 THEN
t(tn) = cZ
bZ = cZ - t(tn)
end if
END IF
IF rot = 7 OR rot = 0 THEN
goto 150 'Go to main menu

end if
RETURN
1000

' Enter here for MDI Mode


KEY(2) STOP
KEY(3) STOP
KEY(4) STOP
g90 = 1
ON KEY(2) GOSUB 7984
ON KEY(3) GOSUB 7982
KEY(2) ON
KEY(3) ON
COLOR axis
LOCATE 2, 16: PRINT USING "######.####";
LOCATE 4, 16: PRINT USING "######.####";
LOCATE 6, 16: PRINT USING "######.####";
LOCATE 6, 38: PRINT tn
LOCATE 10, 28
LOCATE 2, 14: PRINT "X"
LOCATE 4, 14: PRINT "Y"
LOCATE 6, 14: PRINT "Z"
COLOR action
LOCATE 8, 7: PRINT "F"
LOCATE 10, 7: PRINT "%"; : PRINT "
COLOR prompt
LOCATE 21, 1: PRINT " F1
F2
F3
LOCATE 22, 1: PRINT "HOLD
-OVERIDE+

INT(bX) / 10000
INT(bY) / 10000
INT(bZ) / 10000

"

1500

LOCATE 16, 1: PRINT "


COLOR en
' Get the line of g code
LOCATE 16, 1: INPUT l$
goX = 0
goY = 0
goZ = 0
' If they don't type in anything
' go back to main menu
IF l$ = "" THEN
MDI = 0
GOTO 150
end if
COLOR action
IF block = 1 THEN
COLOR action
LOCATE 10, 28: PRINT "BLOCK MODE"
GOTO 1900
end if
COLOR action
LOCATE 10, 28: PRINT "NORMAL MODE"

1900

cycle = 1
' Go parse the line
GOSUB 3000
' Get the next line
GOTO 1500
STOP

F4
BLOCK

F5
START

F6 "
STOP"
"

2000

' AUTO Mode (Read and run a g code file)


ON ERROR GOTO 2020
' Find out which file we last ran on auto mode
OPEN "last.dat" FOR INPUT AS #4
LINE INPUT #4, oldfile$
CLOSE #4
GOTO 2021

2020
2021

RESUME 2021
'

2070

CLOSE
ON ERROR GOTO 2070 'Trap file name errors
GOTO 2100
PRINT
PRINT " FILE NOT FOUND"
PRINT
GOTO 5

2100

2150

'
LOCATE 21, 1: PRINT "
LOCATE 22, 1: PRINT "
file$ = ""
COLOR prompt
LOCATE 22, 1: PRINT "

"
"
File to run? "; oldfile$

' Give them a chance type a new file name


f$ = INKEY$
IF f$ = "" THEN 2150
IF (f$) <> CHR$(13) THEN
file$ = file$ + f$
LOCATE 21, 18: PRINT "
LOCATE 21, 18: PRINT file$
GOTO 2150
end if
' If they want to stick with the old file
IF file$ = "" THEN file$ = oldfile$
ON ERROR GOTO 2210
CLOSE
OPEN file$ FOR INPUT AS #1
lines = 0
ON ERROR GOTO 2200
OPEN "last.dat" FOR OUTPUT AS #4
PRINT #4, file$
CLOSE #4

2180

INPUT #1, lines$


lines = lines + 1
LOCATE 19, 12: PRINT lines
GOTO 2180

2200

CLOSE #1
RESUME 2220

2210

CLOSE #1
RESUME 2100

2220

ON ERROR GOTO 150

"

2310

CLOSE #1
ON KEY(2) GOSUB 7984
ON KEY(3) GOSUB 7982
KEY(2) ON
KEY(3) ON
OPEN file$ FOR INPUT AS #1
' CLS : WIDTH 40
COLOR axis
LOCATE 2, 14: PRINT "X"
LOCATE 4, 14: PRINT "Y"
LOCATE 6, 14: PRINT "Z"
COLOR action
LOCATE 8, 7: PRINT "F"
LOCATE 10, 7: PRINT "%": '
COLOR prompt
LOCATE 21, 1: PRINT " F1
LOCATE 22, 1: PRINT "HOLD

"
F2
F3
-OVERIDE+

F4
BLOCK

F5
START

ON KEY(4) GOSUB 2505 'Go toggle block mode


KEY(4) ON
GOTO 2520
2505

' Set or clear block mode here


IF block = 0 THEN
block = 1
ELSE
block = 0
end if
' Update block section of screen to show normal mode
COLOR action
IF block = 1 THEN
COLOR action
LOCATE 10, 28: PRINT "BLOCK MODE "
RETURN
end if
COLOR action
LOCATE 10, 28: PRINT "NORMAL MODE"
RETURN

2520

' Update block section to screen to show block mode


IF block = 1 THEN
COLOR action
LOCATE 10, 28: PRINT "BLOCK MODE"
GOTO 2530
end if
COLOR action
LOCATE 10, 28: PRINT "NORMAL MODE"

2530

' Begin executing the g code file


ON KEY(5) GOSUB 2545
GOTO 2550

2545

cycle = 1
RETURN

2550

' Stop execution and go to main menu


ON KEY(6) GOSUB 2555
GOTO 2560

F6 "
STOP"

2555

cycle = 0
RETURN

2560

'
'
FOR
goX
goY
goZ
goI
goJ
goK

linecount = 1 TO lines
= 0
= 0
= 0
= 0
= 0
= 0

LINE INPUT #1, l$


COLOR prompt
LOCATE 19, 2: PRINT "Block
"
LOCATE 19, 7: PRINT USING "######"; linecount
LOCATE 19, 14: PRINT "OF
"
LOCATE 19, 16: PRINT USING "######"; lines
3000

' Enter here to parse a line of g code


' (from either Auto or Manual Modes)
FOR letter = 1 TO LEN(l$)
Q$ = MID$(l$, letter, 1)
IF Q$ = "(" THEN
COLOR en
LOCATE 17, 1: PRINT "
"
LOCATE 18, 1: PRINT "
"
LOCATE 17, 1: PRINT "("; RIGHT$(l$, LEN(l$) - letter)
GOTO 3500
END IF
' Read the first letter and then
' decide what to do
IF Q$ <> " " THEN
IF Q$ = "N" THEN place =
IF Q$ = "G" THEN place =
IF Q$ = "X" THEN place =
IF Q$ = "Y" THEN place =
IF Q$ = "Z" THEN place =
IF Q$ = "I" THEN place =
IF Q$ = "J" THEN place =
IF Q$ = "K" THEN place =
IF Q$ = "F" THEN place =
IF Q$ = "M" THEN place =
IF Q$ = "S" THEN place =
IF Q$ = "T" THEN place =
IF Q$ = "L" THEN place =
IF Q$ = "P" THEN place =
IF Q$ = "U" THEN place =
IF Q$ = "V" THEN place =
IF Q$ = "W" THEN place =
IF Q$ = "R" THEN place =
IF Q$ = "n" THEN place =
IF Q$ = "g" THEN place =

1: GOTO 5000
2: GOTO 5000
3: GOTO 5000
4: GOTO 5000
5: GOTO 5000
6: GOTO 5000
7: GOTO 5000
8: GOTO 5000
9: GOTO 5000
10: GOTO 5000
11: GOTO 5000
12: GOTO 5000
14: GOTO 5000
15: GOTO 5000
16: GOTO 5000
17: GOTO 5000
18: GOTO 5000
19: GOTO 5000
1: GOTO 5000
2: GOTO 5000

IF
IF
IF
IF
IF
IF
IF
IF
IF
IF
IF
IF
IF
IF
IF
IF
IF

Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$
Q$

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

"x"
"y"
"z"
"i"
"j"
"k"
"f"
"m"
"s"
"t"
"\"
"l"
"p"
"u"
"v"
"w"
"r"

THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN
THEN

place
place
place
place
place
place
place
place
place
place
place
place
place
place
place
place
place

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

3: GOTO 5000
4: GOTO 5000
5: GOTO 5000
6: GOTO 5000
7: GOTO 5000
8: GOTO 5000
9: GOTO 5000
10: GOTO 5000
11: GOTO 5000
12: GOTO 5000
13: GOTO 5030
14: GOTO 5000
15: GOTO 5000
16: GOTO 5000
17: GOTO 5000
18: GOTO 5000
19: GOTO 5000

end if
3400
NEXT letter
3500

' POST PARSER GUIDE


' epa = end point angle, cpa = center point angle
IF rot = 1 AND mode < 5 THEN
'rotation G53
'convert to polar coords, add angle, convert back
X = g(3)
Y = g(4)
I = g(6)
J = g(7)
U = g(16)
V = g(17)
R = g(19)
IF g90 = 0 THEN
X = bX + g(3)
Y = bY + g(4)
end if
IF g90.1 = 0 THEN
I = oldX + g(6)
J = oldY + g(7)
end if
exx = ABS(X - U)
wye = ABS(Y - V)
eye = ABS(I - U)
jay = ABS(J - V)
IF exx = 0 THEN epa = pi / 2
IF wye = 0 THEN epa = 0
IF exx <> 0 AND wye <> 0 THEN epa = ATN(wye / exx)
IF eye = 0 THEN cpa = pi / 2
IF jay = 0 THEN cpa = 0
IF eye <> 0 AND jay <> 0 THEN cpa = ATN(jay / eye)
'should the following sections be" pi /2 + epa", etc.? NO, WORKS

OK

IF X < U AND Y > V THEN epa = pi - epa


IF X <= U AND Y <= V THEN epa = pi + epa
IF X > U AND Y <= V THEN epa = 2 * pi - epa
IF I <= U AND J > V THEN cpa = pi - cpa
IF I <= U AND J <= V THEN cpa = pi + cpa
IF I > U AND J <= V THEN cpa = 2 * pi - cpa
epr = SQR(exx * exx + wye * wye) 'end point radius
cpr = SQR(eye * eye + jay * jay) ' center point radius
epa = epa + (R * pi / 180)' radians/degrees
cpa = cpa + (R * pi / 180)
Xa
Ya
Ia
Ja
goX
goY
goI
goJ

=
=
=
=

epr
epr
cpr
cpr
=
=
=
=

Xa
Ya
Ia
Ja

*
*
*
*

COS(epa)
SIN(epa)
COS(cpa)
SIN(cpa)

*
*
*
*

10000
10000
10000
10000

bX
bY
bX
bY

' I & J need to be based off of old X and Y


oldX = X
oldY = Y
END IF
KEY(6) STOP
ON KEY(6) GOSUB 7900
COLOR action

'POST PARSER

IF hold = 0 AND cycle = 1 THEN


LOCATE 8, 28: PRINT "RUN
end if

"

IF cycle = 0 THEN
LOCATE 8, 28: PRINT "STOP
end if

"

IF block <> 0 THEN


cycle = 0
end if
3505
LOCATE 14, 1:
LOCATE 15, 1:
COLOR axis
LOCATE 2, 16:
LOCATE 4, 16:
LOCATE 6, 16:
LOCATE 6, 38:
COLOR en
LOCATE 14, 1:
COLOR action
LOCATE 10, 9:
KEY(5) ON
KEY(6) ON

PRINT "
PRINT "
PRINT
PRINT
PRINT
PRINT

"
"

USING "######.####"; INT(bX) / 10000


USING "######.####"; INT(bY) / 10000
USING "######.####"; INT(bZ) / 10000
tn

PRINT l$
PRINT USING "###"; OVR * 100; : PRINT "

"

IF hold = 0 AND cycle = 1 THEN


LOCATE 8, 28: PRINT "RUN
end if

"

IF cycle = 0 THEN
LOCATE 8, 28: PRINT "STOP
end if

"

do
'Just keep going around!
loop while cycle = 0
' Go do the operation specified by mode
ON mode GOSUB 6700, 6700, 8000, 8000, 3625, 3650, 3600, 3700, 3550, 3750
'
rapid line G2
G3 dwell g92 readT loadT null,scal
ing
'

' Return here after doing the operaton


IF HomeX = 1 THEN
HomeX = 0
H2 = 1 '2nd Homing Move.
mode = 1
goX = backX
GOSUB 6700
H2 = 0
cX = 0
bX = 0
mode = 9
GOTO 3505
END IF
IF HomeY = 1 THEN
HomeY = 0
H2 = 1 'Home Y
mode = 1
goY = backY
GOSUB 6700
H2 = 0
cY = 0
bY = 0
mode = 9
GOTO 3505
END IF
IF HomeZ = 1 THEN
HomeZ = 0
H2 = 1 'Home Z
mode = 1
goZ = backZ
GOSUB 6700
H2 = 0
cZ = 0
bZ = 0
mode = 9
GOTO 3505
END IF
' G81 drill cycle

10

IF can = 1 THEN
IF g90 = 1
IF g90 = 0
mode = 2
goX = 0
goY = 0
GOSUB 6700
IF g90 = 1
IF g90 = 0
mode = 1
goX = 0
goY = 0
GOSUB 6700
END IF

THEN goZ = g(5) * 10000 - bZ


THEN goZ = g(5) * 10000

THEN goZ = g(19) * 10000 - bZ


THEN goZ = g(19) * 10000

tread = 0
3550
IF MDI = 1 THEN
cycle = 0
GOTO 1500
end if
NEXT linecount
LOCATE 14, 1: PRINT "
"
cycle = 0
GOTO 150 ' 2310: '150 'end post parser
3600

' Tool Data Read MODE 7


tn = g(12)
t(tn) = g(14) * 10000
mode = 9
RETURN

3625

' Dwell MODE 4


do
'just idle here
loop while cycle = 0
DELAY g(15)
RETURN

3650

' G92 G53 MODE 6


IF CoSys = 2 THEN
' G92 G54
bX = g(3) * 10000
bY = g(4) * 10000
bZ = g(5) * 10000
X54off = cX - bX
Y54off = cY - bY
Z54off = cZ - bZ
COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
LOCATE 6, 36: PRINT "T"; tn
COLOR gee
LOCATE 4, 1: PRINT "G"; CoSys + 52
mode = 9
RETURN
end if

IF CoSys = 3 THEN
' G92 G55
bX = g(3) * 10000
bY = g(4) * 10000
bZ = g(5) * 10000
X55off = cX - bX
Y55off = cY - bY
Z55off = cZ - bZ
COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
LOCATE 6, 36: PRINT "T"; tn
COLOR gee
LOCATE 4, 1: PRINT "G"; CoSys + 52
mode = 9
RETURN
end if
CoSys = 1
cX = g(3) * 10000
cY = g(4) * 10000
cZ = g(5) * 10000
t(0) = cZ
bX = cX
bY = cY
bZ = cZ
COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
LOCATE 6, 36: PRINT "T"; tn
mode = 8
COLOR gee
LOCATE 4, 1: PRINT "G"; CoSys + 52
RETURN
STOP

3700

3750

' Tool Data Load


MODE
IF CoSys = 1 THEN bZ = cZ
IF CoSys = 2 THEN bZ = cZ
IF CoSys = 3 THEN bZ = cZ
COLOR axis
LOCATE 6, 16: PRINT USING
mode = 9
RETURN

8
- t(tn1)
+ Z54off - t(tn1)
+ Z55off - t(tn1)
"######.####"; INT(bZ) / 10000

' Scaling
MODE 10
COLOR gee
LOCATE 2, 1: PRINT "G"; g(2)
IF g(2) = 51 THEN
IF g(16) = 0 THEN g(16) = 1 'U
IF g(17) = 0 THEN g(17) = 1 'V
IF g(18) = 0 THEN g(18) = 1 'W
g(16) = ABS(g(16))
g(17) = ABS(g(17))

g(18) = ABS(g(18))
mX = mX1 / g(16)
mY = mY1 / g(17)
mZ = mZ1 / g(18)
COLOR gee
LOCATE 2, 7: PRINT
LOCATE 2, 7: PRINT
LOCATE 4, 7: PRINT
LOCATE 4, 7: PRINT
LOCATE 6, 7: PRINT
LOCATE 6, 7: PRINT
RETURN

"
USING
"
USING
"
USING

"
"###"; g(16) * 100; : PRINT "%"
"
"###"; g(17) * 100; : PRINT "%"
"
"###"; g(18) * 100; : PRINT "%"

END IF
' Unscaling
IF g(2) = 50 THEN
rot = 0
mX = mX1
mY = mY1
mZ = mZ1
g(16) = 1
g(17) = 1
g(18) = 1
LOCATE 2,
LOCATE 4,
LOCATE 6,
LOCATE 4,
RETURN
END IF

7: PRINT "
7: PRINT "
7: PRINT "
35: PRINT "

"
"
"
"

IF g(2) = 52 THEN
rot = 1
COLOR gee
LOCATE 4, 35: PRINT "R "; : PRINT USING "###"; g(19)
RETURN
END IF
5000

' PARSER
IF MID$(l$, letter + 1, 2) = "- " THEN
MID$(l$, letter + 1, 2) = " -"
end if
g(place) = VAL(MID$(l$, letter + 1, 10))
letter = letter + 1

5030
ON place GOTO 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000
, 6100, 6200, 6300, 6400, 6425, 6450, 6475, 6500, 6550
'
N
G
X
Y
Z
I
J
K
F
M
S
T
\
L
P
U
V
W
R
'
g(
1
2
3
4
5
6
7
8
9
10
11
12
13
14 15
16
17
18
19
stop
5100

' PARSE N
GOTO 3400 'next letter

5200

' PARSE G
'trap g92, g90, g91 ,g04
' G00 Rapid traverse
IF g(2) = 0 THEN

mode = 1
can = 0
GOTO 3400 'Get next letter
end if
' G01 Linear feed move
IF g(2) = 1 THEN
mode = 2
can = 0
GOTO 3400
end if
' G02 Clockwise arc
IF g(2) = 2 THEN
mode = 3
can = 0
GOTO 3400
end if
' G03 Counter clockwise arc
IF g(2) = 3 THEN
mode = 4
can = 0
GOTO 3400
end if
' G04 Dwell (in seconds)
IF g(2) = 4 THEN
mode = 5
GOTO 3400
end if
' G17 Arcs are in the xy plane
IF g(2) = 17 THEN
COLOR gee
plane = 1
LOCATE 2, 36: PRINT "G 17"
GOTO 3400
END IF
' G18 Arcs are in the xz plane
IF g(2) = 18 THEN
COLOR gee
plane = 2
LOCATE 2, 36: PRINT "G 18"
GOTO 3400
END IF
' G19 Arcs are in the yz plane
IF g(2) = 19 THEN
COLOR gee
plane = 3
LOCATE 2, 36: PRINT "G 19"
GOTO 3400
END IF
' G50 Cancel
IF g(2) = 50
mode
GOTO

scaling
THEN
= 10
3400

end if
' G51 Use scaling
IF g(2) = 51 THEN
mode = 10
GOTO 3400
end if
' G52 Rotate
IF g(2) = 52
mode
GOTO
end if

xy about z
THEN
= 10
3400

' G53 Machine coordinate system


IF g(2) <> 53 THEN
goto 5250
end if
CoSys = 1
bX = cX
bY = cY
bZ = cZ - t(tn)
COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
LOCATE 6, 36: PRINT "T"; tn
COLOR gee
LOCATE 4, 1: PRINT "G"; CoSys + 52
mode = 9 ' null mode
GOTO 3400
5250
' G54 Work coordiante system #1
IF g(2) <> 54 THEN
goto 5260
end if
CoSys = 2
bX = cX - X54off
bY = cY - Y54off
bZ = cZ - Z54off - t(tn)
COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
LOCATE 6, 36: PRINT "T"; tn
mode = 9
COLOR gee
LOCATE 4, 1: PRINT "G"; CoSys + 52
GOTO 3400
5260

' G55 Work coordinate system #2


IF g(2) <> 55 THEN
goto 5270
end if
CoSys = 3
bX = cX - X55off
bY = cY - Y55off
bZ = cZ - Z55off - t(tn)

COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
LOCATE 6, 36: PRINT "T"; tn
mode = 9
COLOR gee
LOCATE 4, 1: PRINT "G"; CoSys + 52
GOTO 3400
5270

' G81 Canned drill cycle


IF g(2) = 81 THEN
can = 1
mode = 1
GOTO 3400
end if
' G90 Absolute positioning
IF g(2) = 90 THEN
g90 = 1
g90.1 = 0
mode = 9
COLOR gee
LOCATE 6, 1: PRINT "G 90 "
GOTO 3400
END IF
' G91 Incremental positioning
IF g(2) = 91 THEN
' xxxxxx bug?
g90 = 0
g90.1 = 0
mode = 9
COLOR gee
LOCATE 6, 1: PRINT "G 91 "
GOTO 3400
END IF
' G90.1 Absolute positioning
IF g(2) = 90.1 THEN
' xxxx bug? should g90 be set to 0?
g90.1 = 1
g90 = 1
mode = 9
COLOR gee
LOCATE 6, 1: PRINT "G90.1"
GOTO 3400
END IF
' G92 Relocate origin, absolute zero
IF g(2) = 92 THEN mode = 6
' \ = tlength = mode 7
' T= mode 8= load tool offset
' mode 9 = null
GOTO 3400 'next letter

5300

' PARSE X
IF g90 = 1 THEN
goX = g(3) * 10000 - bX
GOTO 3400

end if
IF g90 = 0 THEN
goX = g(3) * 10000
GOTO 3400
end if
5400

' PARSE Y
IF g90 = 1 THEN
goY = g(4) * 10000 - bY
GOTO 3400
end if
IF g90 = 0 THEN
goY = g(4) * 10000
GOTO 3400
end if

5500

' PARSE Z
IF can = 1 THEN
goZ = 0
GOTO 3400
end if
IF g90 = 1 THEN
goZ = g(5) * 10000 - bZ
GOTO 3400
end if
IF g90 = 0 THEN
goZ = g(5) * 10000
GOTO 3400
end if

5600

' PARSE I
IF g90.1 = 0 THEN
goI = g(6) * 10000
GOTO 3400
end if
IF g90.1 = 1 THEN
goI = g(6) * 10000 - bX
GOTO 3400
end if
goI = ABS(goI)

5700

' PARSE J
IF g90.1 = 0 THEN
goJ = g(7) * 10000
GOTO 3400
end if
IF g90.1 = 1 THEN
goJ = g(7) * 10000 - bY
GOTO 3400
end if
goJ = ABS(goJ)

5800

' PARSE K
IF g90.1 = 0 THEN
goK = g(8) * 10000
GOTO 3400
end if
IF g90.1 = 1 THEN
goK = g(8) * 10000 - bZ
GOTO 3400

end if
goK = ABS(goK)
5900

' PARSE F
GOTO 3400

6000

' PARSE M
IF g(10) = 101 THEN
HomeX = 1
homing = 1
GOTO 3400
end if
IF g(10) = 102 THEN
HomeY = 1
homing = 1
GOTO 3400
end if
IF g(10) = 103 THEN
HomeZ = 1
homing = 1
GOTO 3400
end if
IF g(10) = 0 THEN
cycle = 0
p7 = rA
p8 = rB
end if
IF g(10) = 2 THEN
cycle = 0
p7 = rA
p8 = rB
GOTO 150
end if
IF g(10) = 3 THEN
p7 = 0 ' 0 for on, r? for off
end if
IF g(10) = 5 THEN
p7 = rA
end if
IF g(10) = 6 THEN
p7 = rA
p8 = rB
cycle = 0
end if
IF g(10) = 8 THEN
p8 = 0
end if
IF g(10) = 9 THEN
p8 = rB
end if
IF g(10) = 30 THEN
p7 = rA
p8 = rB
cycle = 0
linecount = 1
GOTO 2310
end if
OUT port, 255 AND NOT p7 + p8
GOTO 3400

6100

' PARSE S
GOTO 3400

6200

' PARSE T
tn1 = g(12)
IF mode <> 7 THEN
mode = 8
tn = g(12)
end if
GOTO 3400

6300

' PARSE \ -set tool length


mode = 7
GOTO 3400

6400

' PARSE L
g(14) = ABS(g(14))
GOTO 3400

6425

' Parse P
g(15) = ABS(g(15))
GOTO 3400

6450

' parse U
GOTO 3400

6475

' Parse V
GOTO 3400

6500

' Parse W
GOTO 3400

6550

' Parse R
GOTO 3400

6700

' Linear move


' Enter here from parser or Manual Mode menu
' to do a linear move
arc = 0 'Clear flag to indicate this is a linear move
' First do backlash setup & execution
' Figure out which direction - or + we
' need to move each axis
IF goX < 0 THEN Xdir = -1 ELSE Xdir = 1
IF goY < 0 THEN Ydir = -1 ELSE Ydir = 1
IF goZ < 0 THEN Zdir = -1 ELSE Zdir = 1
' Don't do any backlash if this is our first
' move during this session
IF firstmove = 0 THEN
firstmove = 1
GOTO 6790
end if
' Otherwise, see if we should do backlash comp
Xtemp = goX
Ytemp = goY
Ztemp = goZ
goX = 0

goY = 0
goZ = 0
' Check to see if there's been a change in direction
IF Xdir <> oldXdir THEN
goX = Xb * Xdir
bkl = 1
end if
IF Ydir <> oldYdir THEN
goY = Yb * Ydir
bkl = 1
end if
IF Zdir <> oldZdir THEN
goZ = Zb * Zdir
bkl = 1
end if
IF bkl = 1 THEN
GOSUB 7000 'If change then do backlash
end if
' Restore variables
bkl = 0
goX = Xtemp
goY = Ytemp
goZ = Ztemp
6790

GOSUB 7000
RETURN 'to parser or manual

7000

' Straight linear move


' ON ERROR GOTO 150 'main menu
KEY(1) OFF
ON KEY(1) GOSUB 7901 'hold
ON KEY(2) GOSUB 7984 'feed ON KEY(3) GOSUB 7982 'feed +
KEY(1) ON
KEY(2) ON
KEY(3) ON

7100
' Enter here from arc backlash routines
' Arc backlash is just a linear move
' Figure out acceleration and deceleration
' distances, adjusted for any scaling that
' might be in effect
Ad = INT(g(9)) * accd 'Feedrate times distance
Dd = INT(g(9)) * accd
IF g(9) = 0 THEN
g(9) = .1
Frn = ABS(g(9))
Fdr = Frn
IF Fdr = 0 THEN
Fdr = 1
end if
END IF
go = 0
IF bkl = 1 THEN
Fdr = 100

ELSE
Fdr = ABS(g(9))
end if
IF mode = 1 THEN
Fdr = 100
end if
IF bkl = 1 OR mode = 1 THEN
Ad = 100 * accd
Dd = 100 * accd
end if
Finv = Fdr * .01
' *
goX
goY
goZ

OVR
= ABS(goX)
= ABS(goY)
= ABS(goZ)

' Figure out how many steps need


' to get where we want to go
IF goX = 0 THEN stX = 0 ELSE stX
IF goY = 0 THEN stY = 0 ELSE stY
IF goZ = 0 THEN stZ = 0 ELSE stZ
stX = ABS(stX)
stY = ABS(stY)
stZ = ABS(stZ)
'
'
'
'

to be taken
= goX / mX
= goY / mY
= goZ / mZ

Arc routines call the linear move routine to do


backlash comp. We need to make sure we're using
the right variable to set the direction pin so
we don't get the wrong directions

pt = 255 AND NOT p7 + p8 'preset direction pins


IF arc = 0 THEN
'We have come from a linear move
IF Xdir = -1 THEN pt = pt AND NOT nX
IF Ydir = -1 THEN pt = pt AND NOT nY
IF Zdir = -1 THEN pt = pt AND NOT nZ
ELSE
'We're doing backlash from G2 or G3
IF CosDir = -1 THEN pt = pt AND NOT CosDirPin ' leave direction
pins on
IF SinDir = -1 THEN pt = pt AND NOT SinDirPin
IF LinDir = -1 THEN pt = pt AND NOT LinDirPin
END IF
OUT port, pt
' Figure out which axis has the longer to move
' then set our loop counter to it, cycles to step
IF stX >= stY AND stX >= stZ THEN
cts = stX
GOTO 7230
end if
IF stY >= stZ AND stY >= stX THEN
cts = stY

GOTO 7230
end if
IF stZ >= stY AND stZ >= stY THEN
cts = stZ
GOTO 7230
end if
7230
' Figure the percentage (per)
' we have to move
IF goX = 0 THEN perX = 0 ELSE
IF goY = 0 THEN perY = 0 ELSE
IF goZ = 0 THEN perZ = 0 ELSE

of each axis
perX = goX / cts
perY = goY / cts
perZ = goZ / cts

' The t (travel) variable tracks how far each


' axis is moved while in move loop
tX = 0
tY = 0
tZ = 0
start = 1
cnt = 0
'Counts actual number of passes through move loop
half = cts / 2
ct = 0
IF hold = 1 THEN
COLOR action
LOCATE 8, 28: PRINT "HOLD"
end if
COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
COLOR action
LOCATE 8, 9: PRINT USING "###"; Fdr; : PRINT "
"
IF Fdr = 100 AND bkl = 0 THEN
LOCATE 8, 9: PRINT "RAPID "
END IF
IF bkl = 1 THEN
LOCATE 8, 9: PRINT "SLACK"
end if
ON KEY(6) GOSUB 150
KEY(6) ON
7260
IF panel <> 0 THEN
GOSUB 20000 'Panel
IF button = 4 THEN
hold = 1
GOSUB 7915 ' hold
end if
IF button = 1 THEN
GOSUB 7984 ' ovr end if
IF button = 2 THEN
GOSUB 7982 ' ovr +
end if
end if

' KEY(5) OFF


KEY(6) OFF
ON KEY(6) GOSUB 7900
KEY(6) ON 'hold & stop
IF hold = 0 AND cycle = 1 THEN
COLOR action
LOCATE 8, 28: PRINT "RUN
end if
IF hold = 1 THEN 7260
' IF cycle = 0 THEN GOTO 7260
IF goX < mX THEN goX = 0
IF goY < mY THEN goY = 0
IF goZ < mZ THEN goZ = 0
OUT port2, 4
hold = 0

"

' Main Move Loop


' DO WHILE goX > tX OR goY > tY OR goZ > tZ 'BEGIN MOVE LOOP
FOR L1 = 0 TO cts 'cycles to step
' Check to see if we should move this axis
' Move if distance we want to go is greater
' than distance already traveled
IF tX >= goX THEN GOTO 7345 'X Axis
' Check to see if we can fit the distance
' left to go in a step length
Xe = cnt * perX - tX
IF Xe < mX THEN GOTO 7345
'X= actual X, cX = machine X, bX = absolute X
tX = tX + mX
pt = pt AND NOT pX
IF bkl = 0 THEN
IF Xdir = -1 THEN
bX = bX - mX
cX = cX - mX1
ELSE
bX = bX + mX
cX = cX + mX1
end if
END IF
7345

COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000
IF tY >= goY THEN GOTO 7400 'Y Axis
Ye = cnt * perY - tY
IF Ye < mY THEN GOTO 7400
tY = tY + mY
pt = pt AND NOT pY
IF bkl = 0 THEN
IF Ydir = -1 THEN
bY = bY - mY
cY = cY - mY1
ELSE
bY = bY + mY
cY = cY + mY1
end if
END IF

7400

COLOR axis

LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000


IF tZ >= goZ THEN GOTO 7485 'Z Axis
Ze = cnt * perZ - tZ
IF Ze < mZ THEN GOTO 7485
tZ = tZ + mZ
pt = pt AND NOT pZ
IF bkl = 0 THEN
IF Zdir = -1 THEN
bZ = bZ - mZ
cZ = cZ - mZ1
ELSE
bZ = bZ + mZ
cZ = cZ + mZ1
end if
END IF
7485

COLOR axis
LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000
'Limit Switches
IF INP(port2) = 236 THEN
hold = 1
GOSUB 7915
end if
' Finally, output the step pulse
OUT port, pt
'
'
'
'
'
'

LOCATE 8, 9: PRINT "


"
LOCATE 8, 9
IF mode = 2 THEN
COLOR action: PRINT USING "###"; g(9)
ELSE : COLOR action: PRINT "RAPID"
END IF

KEY(1) ON
KEY(2) ON
KEY(3) ON
' acceleration loop
IF (go > Ad OR go > half) or hold = 1 THEN
goto 7600
end if
FOR c = Ad - ct TO 1 STEP accf * -1
NEXT c
ct = ct + 1
7600

' deceleration loop


IF (cnt < cts - Dd OR cnt < half) or hold = 1 THEN
goto 7625
end if
FOR c = cnt - (cts - Dd) TO 1 STEP accf * -1
' cnt = current count; cts= total counts; Dd=decel dista

nce
' accf = accel / decel factor, from setspeed
NEXT c
7625

' SLOW TO HOLD


IF hold = 0 THEN
goto 7670
end if

FOR h = htg TO hl STEP accf


NEXT h
htg = htg - 1
7645
IF panel <> 0 THEN
GOSUB 20000
IF button = 3 THEN
hold = 0
end if
IF button = 1 THEN
GOSUB 7984
end if
IF button = 2 THEN
GOSUB 7982
end if
IF rot > 1 AND rot < 6 AND htg < 0 THEN
goto 150
end if
end if
KEY(1)
KEY(2)
KEY(3)
IF htg

ON
ON
ON
< 0 AND hold = 1 THEN
IF homing = 1 THEN
homing = 0
hold = 0
GOTO 7827
end if
GOTO 7645

END IF
7670

' FEED
FOR SLO = Fdr * FRF TO (compspeed / OVR + rpd) / Finv
NEXT SLO
'
KEY(1) STOP
KEY(2) STOP
KEY(3) STOP
' Reset port, bring the step signals back inactive
pt = 255 AND NOT p7 + p8 ' leave relays on
IF arc = 0 THEN 'We have come from a linear move
IF Xdir = -1 THEN pt = pt AND NOT nX
IF Ydir = -1 THEN pt = pt AND NOT nY
IF Zdir = -1 THEN pt = pt AND NOT nZ
ELSE 'We're doing backlash from G2 or G3
IF CosDir = -1 THEN pt = pt AND NOT CosDirPin ' leave di

rection pins on
IF SinDir = -1 THEN pt = pt AND NOT SinDirPin
IF LinDir = -1 THEN pt = pt AND NOT LinDirPin
END IF
OUT port, pt
IF panel <> 0 THEN
GOSUB 20000 'button
IF button = 4 THEN

hold = 1
GOSUB 7915 '

hold
end if
IF button = 1 THEN GOSUB 7984 ' ovr IF button = 2 THEN GOSUB 7982 ' ovr +
end if
cnt = cnt + 1
go = go + 1
' Loop
NEXT L1
7827
' Clean up and Get Out
'
Changes here to fix
'
linear backlash
'
IF bkl = 0 THEN
IF Xdir < 0
IF Ydir < 0
IF Zdir < 0
'
END IF
RETURN 'to backlash section

broken
THEN oldXdir = -1 ELSE oldXdir = 1
THEN oldYdir = -1 ELSE oldYdir = 1
THEN oldZdir = -1 ELSE oldZdir = 1
or arc quadrant direction selection section

7900
' Enter here to stop, keep xyz and tool values
' but return to main menu
cycle = 0
GOTO 150 'stop is immediate and non recoverable
7901

' Toggle the hold flag


IF hold = 1 THEN
hold = 0
ELSE
hold = 1
end if
IF hold = 0 THEN
goto 7950 'Unhold if on hold
end if

7915
IF H2 = 1 THEN
hold = 0
RETURN
end if
IF cnt < cts - Dd THEN
hl = Dd / 2
GOTO 7925
end if
hl = cts - cnt
7925
htg = hl
COLOR action
LOCATE 8, 28: PRINT "HOLD
IF cycle = 1 THEN
RETURN
end if

"

RETURN
7950
' unhold
IF cnt < cts - (Ad + Dd) THEN
reaccel = Ad
GOTO 7970
end if
reaccel = (cts - cnt) / 2
half = cts + reaccel
go = 0
ct = 1
7970
COLOR action
LOCATE 8, 28: PRINT "RUN
RETURN

"

' Feedrate overide


7982
' Increase the feedrate
OVR = OVR + .01
GOTO 7985
7984
' Decrease the feedrate
OVR = OVR - .01
IF OVR < .01 THEN
OVR = .01
end if
7985
IF OVR > 1 THEN OVR = 1
COLOR action
' Write the new feedrate to screen
LOCATE 10, 9: PRINT USING "###"; OVR * 100; : PRINT "
RETURN
8000

"

' Enter here to perform G02 or G03 arc operations


arc = 1 'Let anyone who cares know we're doing arc operations
Ad = INT(g(9)) * accd
Dd = (g(9)) * accd 'ARC SETUP
Frn = ABS(g(9))
Fdr = Frn
FinvArc = ABS(g(9)) * .01
IF Fdr = 0 THEN Fdr = 1
IF plane = 1 THEN
goCos = goX
goSin = goY
goLin = goZ
CosOff = goI
SinOff = goJ

CosM = mX
SinM = mY
LinM = mZ
CosM1 = mX1
SinM1 = mY1
LinM1 = mZ1
CosDirPin = nX
SinDirPin = nY
LinDirPin = nZ
CosStepPin = pX
SinStepPin = pY
LinStepPin = pZ
CosLoc = 2
SinLoc = 4
LinLoc = 6
oldCosDir = oldXdir
oldSinDir = oldYdir
oldLinDir = oldZdir
END IF
IF plane = 2 THEN
goCos = goX
goSin = goZ
goLin = goY
CosOff = goI
SinOff = goK
CosM = mX
SinM = mZ
LinM = mY
CosM1 = mX1
SinM1 = mZ1
LinM1 = mY1
CosDirPin = nX
SinDirPin = nZ
LinDirPin = nY
CosStepPin = pX
SinStepPin = pZ
LinStepPin = pY
CosLoc = 2
SinLoc = 6
LinLoc = 4
oldCosDir = oldXdir
oldSinDir = oldZdir
oldLinDir = oldYdir
END IF
IF plane = 3 THEN
goCos = goY
goSin = goZ
goLin = goX
CosOff = goJ
SinOff = goK
CosM = mY
SinM = mZ
LinM = mX
CosM1 = mY1
SinM1 = mZ1
LinM1 = mX1
CosDirPin = nY
SinDirPin = nZ

LinDirPin = nX
CosStepPin = pY
SinStepPin = pZ
LinStepPin = pX
CosLoc = 4
SinLoc = 6
LinLoc = 2
oldCosDir = oldYdir
oldSinDir = oldZdir
oldLinDir = oldXdir
END IF
' Calculate arc angles
accel = 100
togo = 101
decel = 100
ct = 0
tohold = -1
R1 = SQR(CosOff * CosOff + SinOff * SinOff)
IF g90.1 = 1 THEN
I1 = CosOff - goCos
J1 = SinOff - goSin
else
' new I & J routine uses SIGNED I and J
I1 = goCos + CosOff * -1
J1 = goSin + SinOff * -1
I1 = I1 * -1
J1 = J1 * -1
end if
IF CosOff = 0 THEN
CosOff = .00001
end if
IF I1 = 0 THEN
I1 = .00001
end if
stangle = ATN(SinOff / CosOff)
endangle = ATN(J1 / I1)
IF g(2) = 3 THEN 'Conter clockwise arc
IF CosOff >= 0 AND SinOff >= 0 THEN stangle = pi + stangle 'OK 2
47,202
IF CosOff >= 0 AND SinOff < 0 THEN stangle = pi + stangle '158,1
12
IF CosOff < 0 AND SinOff < 0 THEN stangle = stangle + 0 'OK 68,
IF CosOff < 0 AND SinOff >= 0 THEN stangle = stangle + pi * 2 'O
K 338
IF I1 < 0 AND J1 >= 0 THEN endangle = endangle + pi * 2 'OK 338,
292
IF I1 < 0 AND J1 < 0 THEN endangle = endangle + 0 'OK 68,
IF I1 >= 0 AND J1 < 0 THEN endangle = endangle + pi 'OK 158,112
IF I1 >= 0 AND J1 >= 0 THEN endangle = pi + endangle 'OK 202 deg
IF endangle <= stangle THEN endangle = endangle + pi * 2
sweep = endangle - stangle
END IF
IF g(2) = 2 THEN 'Clockwise arc

' >= needs checked


IF CosOff >= 0 AND SinOff >= 0 THEN stangle = pi + stangle 'OK 2
47,202
IF CosOff >= 0 AND SinOff < 0 THEN stangle = pi + stangle '158,1
12
IF CosOff < 0 AND SinOff < 0 THEN stangle = stangle + 0 'OK 68,
IF CosOff < 0 AND SinOff >= 0 THEN stangle = stangle + pi * 2 'O
K 338
IF I1 < 0 AND J1 >= 0 THEN endangle = endangle + pi * 2 'OK 338,
292
IF I1 < 0 AND J1 < 0 THEN endangle = endangle + 0 'OK 68,
IF I1 >= 0 AND J1 < 0 THEN endangle = endangle + pi 'OK 158,112
IF I1 >= 0 AND J1 >= 0 THEN endangle = pi + endangle 'OK 202 deg
IF endangle >= stangle THEN stangle = stangle + pi * 2
sweep = stangle - endangle
END IF
CosAct = COS(stangle) * R1
SinAct = SIN(stangle) * R1
IF ABS(CosAct) < .00001 THEN CosAct = 0
IF ABS(SinAct) < .00001 THEN SinAct = 0
Ang = stangle
CosDelta = ATN(CosM / R1)
SinDelta = ATN(SinM / R1)
IF CosDelta >= SinDelta THEN
Delta = SinDelta
ELSE
Delta = CosDelta
end if
8345
cts = INT(sweep / Delta)
togo = cts
LinReps = cts
half = cts / 2
count = 0
go = 0
IF goLin = 0 THEN
LinSteps = 0
ELSE
LinSteps = goLin / LinM ' steps for Z axis move
end if
IF LinSteps > cts THEN
Delta = Delta / 2
GOTO 8345
end if
' make sure Z move can finish
LinPer = ABS(goLin / LinReps) ' amount z axis must move per iteration
LinAct = 0 ' actual pos (incremental) set to zero
IF goLin < 0 THEN
LinDir = -1
ELSE
LinDir = 1
end if
goLin = ABS(goLin)

KEY(1) OFF
KEY(2) OFF
KEY(3) OFF
ON KEY(1) GOSUB 9905
ON KEY(2) GOSUB 9984
ON KEY(3) GOSUB 9982
ON KEY(6) GOSUB 9900
KEY(1) ON
KEY(2) ON
KEY(3) ON
KEY(6) ON
COLOR action
LOCATE 8, 9: PRINT USING "###"; g(9)
LOCATE 10, 9: PRINT USING "###"; OVR * 100; : PRINT "
ON KEY(6) GOSUB 150
KEY(6) ON

";

IF panel <> 0 THEN


do
GOSUB 20000
IF button = 4 THEN
hold = 1
GOSUB 9915 'hold panel
end if
IF button = 1 THEN GOSUB 9984 ' ovr IF button = 2 THEN GOSUB 9982 ' ovr +
IF panel AND button = 3 THEN
cycle = 1
end if
loop while cycle = 0
end if
IF g(2) <> 3 THEN
'***************************************************************
*********
'check the G02 (clockwise) Quadrants
CosIs = 1
CosDir = -1
SinIs = -1
SinDir = -1
'4 ok
GOSUB 8905 'Preset the direction pins for any moves in this quad
' Check to see if we're on a quadrant boundary and if we are go
' do backlash compensation
IF Ang > pi * 3.5 AND Ang <= pi * 4 THEN
bkl = 1
GOSUB 10000
end if
do while Ang => pi * 3.5
'If angle is in this quad
GOSUB 9000 'Go do an arc move
'Repeat until through the quadrant
loop

'quad 3
CosIs = -1
CosDir = -1
SinIs = -1
SinDir = 1 '3
GOSUB 8905
IF Ang > pi *
bkl =
GOSUB
end if

ok
3 AND Ang <= pi * 3.5 THEN
1
10000

do while Ang => pi * 3


GOSUB 9000
loop

'8555

Quad 2
CosIs = -1
CosDir = 1
SinIs = 1
SinDir = 1 '2
GOSUB 8905
IF Ang > pi *
bkl =
GOSUB
end if

ok
2.5 AND Ang <= pi * 3 THEN
1
10000

do while Ang => pi * 2.5


gosub 9000
loop

'8580

Quad 1
CosIs = 1
CosDir = 1
SinIs = 1
SinDir = -1 '1 ok
GOSUB 8905
IF Ang > pi * 2 AND Ang <= pi * 2.5 THEN
bkl = 1
GOSUB 10000
end if
do while Ang => pi * 2
GOSUB 9000
loop

'8605

Quad 4
CosIs = 1
CosDir = -1
SinIs = -1
SinDir = -1 '4
GOSUB 8905
IF Ang > pi * 1.5 AND Ang <= pi * 2 THEN

bkl = 1
GOSUB 10000
end if
do while Ang => pi * 1.5
GOSUB 9000
loop
'8630
CosIs = -1
CosDir = -1
SinIs = -1
SinDir = 1
GOSUB 8905
IF Ang > pi * 1 AND Ang <= pi * 1.5 THEN
bkl = 1
GOSUB 10000
end if
do while Ang => pi * 1
GOSUB 9000
loop
'8655
CosIs = -1
CosDir = 1
SinIs = 1
SinDir = 1
GOSUB 8905
IF Ang > pi * .5 AND Ang <= pi * 1 THEN
bkl = 1
GOSUB 10000
end if
do while Ang => pi * .5
GOSUB 9000
loop
'8680
CosIs = 1
CosDir = 1
SinIs = 1
SinDir = -1
GOSUB 8905
IF Ang > 0 AND Ang <= pi * .5 THEN
bkl = 1
GOSUB 10000
end if
do while Ang > 0
gosub 9000
loop
else
' Check G03 (counter clockwise) quadrants
CosIs = 1
CosDir = -1

SinIs = 1
SinDir = 1 '1 OK
GOSUB 8905
IF Ang >= 0 AND Ang <= pi * .5 THEN
bkl = 1
GOSUB 10000
end if
do until Ang > pi * .5
gosub 9000
loop
CosIs = -1
CosDir = -1
SinIs = 1
SinDir = -1 '
GOSUB 8905
IF Ang > pi *
bkl =
GOSUB
end if

2 OK
.5 AND Ang <= pi * 1 THEN
1
10000

do until Ang > pi * 1


gosub 9000
loop

CosIs = -1
CosDir = 1
SinIs = -1
SinDir = -1 ' 3 OK
GOSUB 8905
IF Ang > pi * 1 AND Ang <= pi * 1.5 THEN
bkl = 1
GOSUB 10000
end if
do until Ang > pi * 1.5
gosub 9000
loop
CosIs = 1
CosDir = 1
SinIs = -1
SinDir = 1 '4 OK
GOSUB 8905
IF Ang > pi * 1.5 AND Ang <= pi * 2 THEN
bkl = 1
GOSUB 10000
end if
do until Ang > pi * 2
gosub 9000
loop
CosIs = 1
CosDir = -1
SinIs = 1
SinDir = 1
GOSUB 8905

IF Ang > pi * 2 AND Ang <= pi * 2.5 THEN


bkl = 1
GOSUB 10000
end if
do until Ang > pi * 2.5
gosub 9000
loop
CosIs = -1
CosDir = -1
SinIs = 1
SinDir = -1
GOSUB 8905
IF Ang > pi * 2.5 AND Ang <= pi * 3 THEN
bkl = 1
GOSUB 10000
end if
do until Ang > pi * 3
gosub 9000
loop
CosIs = -1
CosDir = 1
SinIs = -1
SinDir = -1
GOSUB 8905
IF Ang > pi * 3 AND Ang <= pi * 3.5 THEN
bkl = 1
GOSUB 10000
end if
do until Ang > pi * 3.5
gosub 9000
loop
CosIs = 1
CosDir = 1
SinIs = -1
SinDir = 1
GOSUB 8905
IF Ang > pi * 3.5 AND Ang <= pi * 4 THEN
bkl = 1
GOSUB 10000
end if
do until Ang > pi * 4
gosub 9000
loop
end if
return

'to the parser

'*******************************************************************************
*****
8905

' preset direction pins

pt = 255 OR p7
IF CosDir = -1
IF SinDir = -1
IF LinDir = -1
OUT port, pt
RETURN

+ p8
THEN pt = pt AND NOT CosPinDir
THEN pt = pt AND NOT SinPinDir
THEN pt = pt AND NOT LinPinDir

9000
IF panel <> 0 THEN
GOSUB 20000
IF button = 4 THEN
hold = 1
GOSUB 9915 'hold panel
end if
IF button = 1 THEN GOSUB 9984 ' ovr IF button = 2 THEN GOSUB 9982 ' ovr +
end if
KEY(1) STOP
KEY(2) STOP
KEY(3) STOP
xCos = ABS(COS(Ang)) * R1 * CosIs 'COSINE AXIS (x)
CosErr = ABS(xCos - CosAct) + .45 * CosM
IF CosErr < CosM THEN
CosDsp = 0
else
CosAct = CosAct + (CosM * CosDir)
pt = pt AND NOT CosStepPin
IF CosDir = -1 THEN
CosDsp = -1
ELSE
CosDsp = 1
end if
end if
xSin = ABS(SIN(Ang)) * R1 * SinIs 'Sine Axis (y)
'
SINE AXIS
SinErr = ABS(xSin - SinAct) + .45 * SinM
IF SinErr < SinM THEN
SinDsp = 0
else
SinAct = SinAct + (SinM * SinDir)
pt = pt AND NOT SinStepPin
IF SinDir = -1 THEN
SinDsp = -1
ELSE
SinDsp = 1
end if
end if
'LINEAR AXIS
IF LinAct <= goLin THEN
LinErr = count * LinPer - LinAct

IF LinErr + .45 => LinM THEN


LinAct = LinAct + LinM
pt = pt AND NOT LinStepPin
IF LinDir = -1 THEN
LinDsp = -1
ELSE
LinDsp = 1
end if
end if
end if
' Finally output the step pulse
OUT port, pt
GOSUB 10500 'display and position registers
count = count + 1
CosDsp = 0
SinDsp = 0
LinDsp = 0
togo = togo - 1
KEY(1) ON
KEY(2) ON
KEY(3) ON
'ACCEL
IF (go <= Ad) and (go <= half) THEN
IF hold = 1 THEN
goto 9400
end if
FOR c = Ad - ct TO 1 STEP accf * -1
NEXT c
end if
IF (togo <= Dd) and (togo <= half) AND (hold <> 1 ) THEN
FOR c = 0 TO Dd - togo STEP accf
NEXT c
end if
9400
IF hold <> 0 THEN 'SLOW TO HOLD
FOR h = htg TO hl STEP 1
NEXT h
htg = htg - 1
IF panel <> 0 THEN
GOSUB 20000
IF button = 3 THEN
hold = 0
end if
IF button = 1 THEN
GOSUB 7984
end if
IF button = 2 THEN
GOSUB 7982
end if
IF rot > 1 AND rot < 6 AND htg < 0 THEN
goto 150

end if
end if
do
KEY(1)
KEY(2)
KEY(3)
loop while htg

ON
ON
ON
< 0 AND hold = 1

end if
IF INP(port2) = 236 THEN
hold = 1
GOSUB 9915
end if
do
IF panel <> 0 THEN
GOSUB 20000
IF button = 3 THEN
hold = 0
GOSUB 9950 ' unhold panel
end if
IF button = 1 THEN
GOSUB 9984 ' ovr end if
IF button = 2 THEN
GOSUB 9982 ' ovr +
end if
end if
loop while htg < 0 AND hold = 1
' FEED
FOR SLO = Fdr * FRF TO (compspeed / OVR + rpd) / FinvArc
NEXT SLO
' Reset the port, bring the
pt = 255 AND NOT p7 + p8
IF CosDir = -1 THEN pt = pt
IF SinDir = -1 THEN pt = pt
IF LinDir = -1 THEN pt = pt
OUT port, pt

step signal inactive


AND NOT CosDirPin ' leave direction pins on
AND NOT SinDirPin
AND NOT LinDirPin

go = go + 1
LinReps = LinReps + .5
IF g(2) = 3 THEN
Ang = Ang + Delta 'increment Angle & check for end
IF Ang > endangle THEN
Ang = pi * 6
oldSinDir = SinDir
oldCosDir = CosDir
oldLinDir = LinDir
' Set up the direction bits in case next operation is li
near move
IF plane = 1 THEN
oldXdir = CosDir
oldYdir = SinDir
oldZdir = LinDir

end if
IF plane = 2 THEN
oldXdir =
oldYdir =
oldZdir =
end if
IF plane = 3 THEN
oldXdir =
oldYdir =
oldZdir =
end if
RETURN

CosDir
LinDir
SinDir
LinDir
CosDir
SinDir

END IF
END IF
IF g(2) = 2 THEN
Ang = Ang - Delta
IF Ang < endangle THEN
Ang = pi * -1
oldSinDir = SinDir
oldCosDir = CosDir
oldLinDir = LinDir
' Set up the direction bits in case next operation is li
near move
IF plane = 1 THEN
oldXdir = CosDir
oldYdir = SinDir
oldZdir = LinDir
end if
IF plane = 2 THEN
oldXdir = CosDir
oldYdir = LinDir
oldZdir = SinDir
end if
IF plane = 3 THEN
oldXdir = LinDir
oldYdir = CosDir
oldZdir = SinDir
end if
RETURN
END IF
END IF
RETURN 'From arc move
9880
STOP
KEY(1)
KEY(2)
KEY(3)
KEY(6)

OFF
OFF
OFF
OFF

CosAbs = INT(CosAbs)
SinAbs = INT(SinAbs)
RETURN
9900

cycle = 0
GOTO 150 'HOLD
9905
IF hold = 1 THEN
hold = 0
ELSE
hold = 1
END IF
IF hold <> 0 THEN
9915
IF ct < cts - Dd THEN
hl = Dd / 2
ELSE
hl = cts - cnt
END IF
htg = hl
COLOR action
LOCATE 8, 28: PRINT "HOLD"
IF cycle = 1 THEN
RETURN
END IF
RETURN
END IF
9950
' UNHOLD
IF togo < cts - (Ad + Dd) THEN
reaccel = Ad
ELSE
reaccel = (cts - togo) / 2
end if
half = cts + reaccel
go = 0
ct = 1
COLOR action
LOCATE 8, 28: PRINT "RUN
RETURN
' Feedrate overide
9982
OVR = OVR + .01
GOTO 9985
9984
OVR = OVR - .01
IF OVR < 0 THEN
OVR = 0
end if
9985
IF OVR > 1 THEN
OVR = 1

"

end if
Fdr = Frn * OVR
COLOR action
LOCATE 10, 9: PRINT USING "###"; OVR * 100; : PRINT "
RETURN
10000
' Backlash for Arc
goX = 0
goY = 0
goZ = 0
bkl = 0
ON plane GOTO 10100, 10200, 10300
10100

'
'
'
'
'

we should only perform backlash on an axis if there's


a change in direction of that axis.
Check to see if any axis is changing direction
If there is, set the distance to travel = backlash
amount from setup file and set a flag.

IF CosDir <> oldCosDir THEN


goX = Xb * CosDir
bkl = 1 'G17 backlash
end if
IF SinDir <> oldSinDir THEN
goY = Yb * SinDir
bkl = 1
end if
IF LinDir <> oldLinDir THEN
goZ = Zb * LinDir
bkl = 1
end if
IF bkl = 1 THEN
GOSUB 7100 'Go perform backlash compensation
end if
Frn = ABS(g(9))
Fdr = Frn * OVR
go = 0
COLOR action
LOCATE 8, 9: PRINT USING "###"; g(9); : PRINT "
"
bkl = 0
RETURN ' to quadrant direction selection section
10200
IF CosDir <> oldCosDir THEN
goX = Xb * CosDir
bkl = 1 'G18 backlash
end if
IF SinDir <> oldSinDir THEN
goZ = Zb * SinDir
bkl = 1
end if
IF LinDir <> oldLinDir THEN
goY = Yb * LinDir
bkl = 1
end if
IF bkl = 1 THEN GOSUB 7100
Frn = ABS(g(9))
Fdr = Fdn * OVR
go = 0

"

COLOR action
LOCATE 8, 9: PRINT USING "###"; g(9); : PRINT " "
bkl = 0
RETURN ' to quadrant direction selection section
10300
IF CosDir <> oldCosDir THEN
goY = Yb * CosDir
bkl = 1 'G19 backlash
end if
IF SinDir <> oldSinDir THEN
goZ = Zb * SinDir
bkl = 1
end if
IF LinDir <> oldLinDir THEN
goX = Xb * LinDir
bkl = 1
end if
IF bkl = 1 THEN GOSUB 7100
Frn = ABS(g(9))
Fdr = Fdn * OVR
go = 0
COLOR action
LOCATE 8, 9: PRINT USING "###"; g(9); : PRINT "
bkl = 0
RETURN ' to quadrant direction selection section
10500

"

' Display & position


ON plane GOTO 10600, 10700, 10800

10600
bX =
bY =
bZ =
cX =
cY =
cZ =
GOTO

bX + CosDsp
bY + SinDsp
bZ + LinDsp
cX + CosDsp
cY + SinDsp
cZ + LinDsp
10900

*
*
*
*
*
*

mX
mY
mZ
mX1
mY1
mZ1

bX =
bZ =
bY =
cX =
cZ =
cY =
GOTO

bX + CosDsp
bZ + SinDsp
bY + LinDsp
cX + CosDsp
cZ + SinDsp
cY + LinDsp
10900

*
*
*
*
*
*

mX
mZ
mY
mX1
mZ1
mY1

bY =
bZ =
bX =
cY =
cZ =
cX =
GOTO

bY + CosDsp
bZ + SinDsp
bX + LinDsp
cY + CosDsp
cZ + SinDsp
cX + LinDsp
10900

*
*
*
*
*
*

mY
mZ
mX
mY1
mZ1
mX1

10700

10800

10900

' display
COLOR axis
LOCATE 2, 16: PRINT USING "######.####"; (INT(bX)) / 10000

LOCATE 4, 16: PRINT USING "######.####"; (INT(bY)) / 10000


LOCATE 6, 16: PRINT USING "######.####"; (INT(bZ)) / 10000
RETURN
20000

' Read Panel


' read rotary
rot = 0
IF NOT INP(port1) AND 64 THEN rot = 1 ' pin 10
IF INP(port1) AND 128 THEN rot = rot + 2 ' pin 11
IF NOT INP(port1) AND 32 THEN rot = rot + 4 ' pin 12

20100

' read buttons


button = 0
IF INP(port2) AND
IF INP(port2) AND
IF NOT INP(port2)
IF INP(port2) AND
RETURN

1 THEN button = 1
2 THEN button = 2
AND 4 THEN button
8 THEN button = 4

'ovr -, pin 1
'ovr +, pin 14
= 3 'start, pin 16
'Hold, pin 17

Vous aimerez peut-être aussi