Académique Documents
Professionnel Documents
Culture Documents
' History
'
'
'
'
Original
SUPER STEPPER 1.0
10 AUG 1997
Kevin Carroll's Beta Release
'
'
'
'
'
'
'
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
'
'
'
'
'
'
'
'
'
'
DELAY 3
2
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)
'+
'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,
"
"
F9
DOS
"
"
"
270
400
405
410
500
580
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
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
810
820
850
900
END IF
915
920
end if
RETURN
1000
INT(bX) / 10000
INT(bY) / 10000
INT(bZ) / 10000
"
1500
1900
cycle = 1
' Go parse the line
GOSUB 3000
' Get the next line
GOTO 1500
STOP
F4
BLOCK
F5
START
F6 "
STOP"
"
2000
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$
2180
2200
CLOSE #1
RESUME 2220
2210
CLOSE #1
RESUME 2100
2220
"
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
2520
2530
2545
cycle = 1
RETURN
2550
F6 "
STOP"
2555
cycle = 0
RETURN
2560
'
'
FOR
goX
goY
goZ
goI
goJ
goK
linecount = 1 TO lines
= 0
= 0
= 0
= 0
= 0
= 0
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
OK
=
=
=
=
epr
epr
cpr
cpr
=
=
=
=
Xa
Ya
Ia
Ja
*
*
*
*
COS(epa)
SIN(epa)
COS(cpa)
SIN(cpa)
*
*
*
*
10000
10000
10000
10000
bX
bY
bX
bY
'POST PARSER
"
IF cycle = 0 THEN
LOCATE 8, 28: PRINT "STOP
end if
"
PRINT "
PRINT "
PRINT
PRINT
PRINT
PRINT
"
"
PRINT l$
PRINT USING "###"; OVR * 100; : PRINT "
"
"
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
'
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
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
3625
3650
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
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
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
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
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
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
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)
to be taken
= goX / mX
= goY / mY
= goZ / mZ
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
"
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
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
'
'
'
'
'
'
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
nce
' accf = accel / decel factor, from setspeed
NEXT c
7625
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
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
"
"
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
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
";
'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
'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
'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
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
'*******************************************************************************
*****
8905
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
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
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
'
'
'
'
'
"
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
"
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
20100
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