Files
sics/site_ansto/instrument/tas/DMC2280/controller6.txt
Douglas Clowes 57e675756a Fix coding error and increase deceleration on hitting a limit switch
r3312 | dcl | 2011-12-02 17:20:53 +1100 (Fri, 02 Dec 2011) | 1 line
2012-11-15 17:20:41 +11:00

444 lines
8.6 KiB
Plaintext
Executable File

'TAIPAN - CONTROLLER 6
'
'AUTHOR - DANIEL BARTLETT
'DATE - 23.02.2011
'
'A-SLIT S1 LEFT BLADE
'B-SLIT S1 RIGHT BLADE
'C-SLIT S1 TOP BLADE
'D-SLIT S1 BOTTOM BLADE
'E-SLIT S2 LEFT BLADE
'F-SLIT S2 RIGHT BLADE
'G-SLIT S2 TOP BLADE
'H-SLIT S2 BOTTOM BLADE
'
'
'-----------------------------------------------------------------------------
#AUTO
'THIS IS THE PROGRAM THAT RUNS AUTOMATICALLY ON CONTROLLER STARTUP
'
MT-2,-2,-2,-2,-2,-2,-2,-2;'CONFIGURES ALL AXES AS STEPPER
MO;'ALL MOTORS OFF
CN1;'CONFIGURES LIMIT SWITCHES. NC CONTACTS USE CN1. NO CONTACT USE CN-1
II 8,,,0;'CONFIGURES THE 8TH INPUT TO ACTIVATE THE #ININT ROUTINE
OP 65281;'SETS OUTPUTS 9-16 ON = RELAYS OFF
IA 137,157,203,136;'CONFIGURES IP ADDRESS
AC 60416,60416,60416,60416,60416,60416,60416,60416;' SET ACELERATION
DC 60416,60416,60416,60416,60416,60416,60416,60416;' SET DECELERATION
SP 30000,30000,30000,30000,30000,30000,30000,30000;' SET SPEED
SIA=0;'TURN OFF CLOCK PULSES TO ALLOW ENCODER TO INITIALISE
SIB=0
SIC=0
SID=0
SIE=0
SIF=0
SIG=0
SIH=0
WT1000;'WAIT FOR ENCODER TO INITIALISE
'SIA=1,25,13,0<-26>2;'HEIDENHAIN ROQ425
'SIA=1,25,25,0<-26>2;'HEIDENHAIN RCN226
'SIA=1,25,12,-1<-26>1;'VEGA RESOLVER TO SSI CONVERTER
'SIA=1,25,13,0<-26>1;'IVO GXM2H
'SIA=1,25,13,0<-26>2;'KUEBLER 5863
'SIA=1,31,13,0<26>2;'IVO STRING PULL, 31 BIT CONTROLLER REQUIRED
'SIA=1,24,18,6<-26>2;'IVO PLATYPUS COLLIMATION TILT
'SIA=1,15,15,0<-26>2;'GURLEY 15BIT
LSAHIT=0;'INITIALISE THE BIT SET AFTER A LIMIT IS HIT
LSBHIT=0
LSCHIT=0
LSDHIT=0
LSEHIT=0
LSFHIT=0
LSGHIT=0
LSHHIT=0
S1HOMED=0;'SLIT S1 NOT HOMED
S2HOMED=0;'SLIT S2 NOT HOMED
HOMERUN=0;'HOME ROUTINES NOT RUN
JS #THREAD0
EN
'
'
'-----------------------------------------------------------------------------
#THREAD0
'THERE MUST BE A THREAD RUNNING FOR #LIMSWI, #TCPERR AND #ININT TO WORK
'
JS #CHKDCEL
JS #CHKSPD
JP #THREAD0
EN
'
'
'-----------------------------------------------------------------------------
#CHKDCEL
'ROUTINE TO RESET DECELERATIONS AFTER A LIMIT HIT
'
IF (LSAHIT=1)&(_BGA=0);'WHEN MOTION STOPS AFTER A LIMIT HIT
DCA=OLDDCA;'RESET DECEL TO OLD VALUE
LSAHIT=0
ENDIF
'
IF (LSBHIT=1)&(_BGB=0)
DCB=OLDDCB
LSBHIT=0
ENDIF
'
IF (LSCHIT=1)&(_BGC=0)
DCC=OLDDCC
LSCHIT=0
ENDIF
'
IF (LSDHIT=1)&(_BGD=0)
DCD=OLDDCD
LSDHIT=0
ENDIF
'
IF (LSEHIT=1)&(_BGE=0)
DCE=OLDDCE
LSEHIT=0
ENDIF
'
IF (LSFHIT=1)&(_BGF=0)
DCF=OLDDCF
LSFHIT=0
ENDIF
'
IF (LSGHIT=1)&(_BGG=0)
DCG=OLDDCG
LSGHIT=0
ENDIF
'
IF (LSHHIT=1)&(_BGH=0)
DCH=OLDDCH
LSHHIT=0
ENDIF
EN
'
'
'-----------------------------------------------------------------------------
#CHKSPD
'ROUTINE TO CHECK THE SPEED OF THE AXES IS NOT GREATER THAN MAX ALLOWED
'
IF (_SPA>30000)
SPA=30000
ENDIF
'
IF (_SPB>30000)
SPB=30000
ENDIF
'
IF (_SPC>30000)
SPC=30000
ENDIF
'
IF (_SPD>30000)
SPD=30000
ENDIF
'
IF (_SPE>30000)
SPE=30000
ENDIF
'
IF (_SPF>30000)
SPF=30000
ENDIF
'
IF (_SPG>30000)
SPG=30000
ENDIF
'
IF (_SPH>30000)
SPH=30000
ENDIF
EN
'
'
'-----------------------------------------------------------------------------
#TCPERR
'EMPTY TCP ERROR ROUTINE
'
RE
'
'
'-----------------------------------------------------------------------------
#ININT
'INTERUPT ROUTINE TO STOP ALL AXES
'WHEN SAFETY & INTERLOCK SYSTEM REQUESTS IT
CN-1;'RECONFIGURES LIMITS. RESULT:ALL LIMITS SEEN AS HIT. WILL RUN #LIMSWI
WT250
CN1;'SETS LIMITS BACK TO NORMAL
RI
'
'
'-----------------------------------------------------------------------------
#CMDERR
'ROUTINE TO HANDLE COMMAND ERRORS
'
ZS0
EN1
'
'
'-----------------------------------------------------------------------------
#LIMSWI
'ROUTINE TO HASTEN THE DECELERATION OF AN AXIS WHEN A LIMIT SWITCH IS HIT
'
IF (_LFA=0)|(_LRA=0);'LIMIT HIT
IF (LSAHIT=0)&(_BGA=1);'STILL MOVING, FIRST TIME
OLDDCA=_DCA;'REMEMBER OLD DECEL VALUE
DCA=100000;'INCREASE DECEL VALUE FOR RAPID STOP
LSAHIT=1
ENDIF
ENDIF
'
IF (_LFB=0)|(_LRB=0)
IF (LSBHIT=0)&(_BGB=1)
OLDDCB=_DCB
DCB=100000
LSBHIT=1
ENDIF
ENDIF
'
IF (_LFC=0)|(_LRC=0)
IF (LSCHIT=0)&(_BGC=1)
OLDDCC=_DCC
DCC=100000
LSCHIT=1
ENDIF
ENDIF
'
IF (_LFD=0)|(_LRD=0)
IF (LSDHIT=0)&(_BGD=1)
OLDDCD=_DCD
DCD=100000
LSDHIT=1
ENDIF
ENDIF
'
IF (_LFE=0)|(_LRE=0)
IF (LSEHIT=0)&(_BGE=1)
OLDDCE=_DCE
DCE=100000
LSEHIT=1
ENDIF
ENDIF
'
IF (_LFF=0)|(_LRF=0)
IF (LSFHIT=0)&(_BGF=1)
OLDDCF=_DCF
DCF=100000
LSFHIT=1
ENDIF
ENDIF
'
IF (_LFG=0)|(_LRG=0)
IF (LSGHIT=0)&(_BGG=1)
OLDDCG=_DCG
DCG=100000
LSGHIT=1
ENDIF
ENDIF
'
IF (_LFH=0)|(_LRH=0)
IF (LSHHIT=0)&(_BGH=1)
OLDDCH=_DCH
DCH=100000
LSHHIT=1
ENDIF
ENDIF
RE
'
'
'-----------------------------------------------------------------------------
#MOVE
'THIS ROUTINE IS USED TO MOVE AN AXIS WITH A SSI ENCODER
'USING A MOVE-CHECK-CORRECT METHOD
'THE FOLLOWING VARIABLES MUST BE INITIALISED FIRST
'~a=0 TO 7 SETS THE MOTOR, 0=A AXIS 1=B AXIS ETC
'~b=0 TO 7 SETS THE ENCODER, 0=1ST SSI CHANNEL 1=2ND CHANNEL ETC
'TRIES= MAXIMUM NUMBER OF TRIES
'POS=DESIRED ENCODER POSITION
'
'~a=0:~b=0:TRIES=5:POS=12345678:XQ #MOVE,1
'
DBAND=3
SH~a
WT500;'WAIT TO STABILISE
IF (_BG~a=1);'MOVING, FORCE STOP. PRA WHEN MOVING CAUSES THREAD CRASH
ST~a
MC~a
ENDIF
TEMP=_TP~b;'SET TEMPORARY VARIABLE
PR~a=2500
IF (_LF~a=0);'ALREADY ON LIMIT
MG "Forward limit actuated" {EA}
MG "Ratio not calculated" {EA}
JP #MOVEEND
ENDIF
BG~a;'PERFORM A SMALL MOVE TO DETERMIN MOTOR:ENCODER RATIO
MC~a
WT500;'WAIT TO STABILISE
IF (TEMP=_TP~b);'FAILED TO MOVE
MG "No movement detected" {EA}
MG "Ratio not calculated" {EA}
JP #MOVEEND
ENDIF
RATIO=(TEMP-_TP~b)*10;'SETS ENCODER/MOTOR RATIO
'
#LOOP
IF (_BG~a=1);'MOVING, FORCE STOP. PRA WHEN MOVING CAUSES THREAD CRASH
ST~a
MC~a
ENDIF
PR~a=25000*((_TP~b-POS)/RATIO);'CALC STEPS TO DESTINATION
IF ((_PR~a>0)&(_LF~a=0));'IF POSITIVE MOVE AND ALREADY ON LIMIT
MG "Forward limit actuated" {EA}
MG "Positive move aborted" {EA}
JP #MOVEEND
ENDIF
IF ((_PR~a<0)&(_LR~a=0));'IF NEGATIVE MOVE AND ALREADY ON LIMIT
MG "Reverse limit actuated" {EA}
MG "Negative move aborted" {EA}
JP #MOVEEND
ENDIF
IF (_BG~a=1);'ALREADY MOVING
ST~a
MC~a
ENDIF
SH~a
BG~a
MC~a;'WAIT FOR MOTION TO COMPLETE
TRIES=TRIES-1;'INCREMENT ATTEMPT COUNTER
MG "Attempts to go: " {N} {EA}
MG TRIES {F1.0} {EA}
JP #LOOP, ((@ABS[_TP~b-POS]>DBAND)&(TRIES>0))
'HAVE ANOTHER GO IF OUTSIDE DEAD BAND AND NOT TOO MANY ATTEMPTS
#MOVEEND
MG "TARGET :" {N} {EA}
MG POS {F8.0} {EA}
MG "POSITION :" {N} {EA}
MG _TP~b {F8.0} {EA}
MG "Program ends" {EA}
EN
'
'
'-----------------------------------------------------------------------------
#HOME
'THIS ROUTINE CALLS THE HOME ROUTINES FOR EACH SLIT PACKAGE IN TURN
'IT IS INVOKED BY SICS AS: XQ #HOME,7
IF (HOMERUN=1)
JP #ENDHOME
ENDIF
JS #HOMES1
JS #HOMES2
IF (S1HOMED=1)&(S2HOMED=1)
HOMERUN=1
ENDIF
#ENDHOME
EN
'-----------------------------------------------------------------------------
#HOMES1
'THIS ROUTINE HOMES THE S1 SLIT PACKAGE
'
IF (S1HOMED=1);'ALREADY HOMED
JP #ENDS1
ENDIF
'
IF (_LFA=0)&(_LRA=0)
'BOTH LIMITS ACTUATED. SLIT PACKAGE PROBABLY NOT PLUGGED IN.
JP #ENDS1
ENDIF
'
SHABCD;'TURN ON THE MOTORS
SP 30000,30000,30000,30000,,,,;'SET SPEED
IF (_LRA=0);'ON THE REVERSE LIMIT SWITCH
PRA=250*161/2*10;'MOVE AWAY 10mm
BGA
ENDIF
'
IF (_LRB=0);'ON THE REVERSE LIMIT SWITCH
PRB=250*161/2*10;'MOVE AWAY 10mm
BGB
ENDIF
'
IF (_LRC=0);'ON THE REVERSE LIMIT SWITCH
PRC=250*161/2*10;'MOVE AWAY 10mm
BGC
ENDIF
'
IF (_LRD=0);'ON THE REVERSE LIMIT SWITCH
PRD=250*161/2*10;'MOVE AWAY 10mm
BGD
ENDIF
'
MCABCD;'WAIT FOR MOTION TO BE COMPLETE
JG -30000,-30000,-30000,-30000,,,,;'JOG INTO REVERSE LIMIT
BGABCD
MCABCD
PR 80500,80500,80500,80500,,,,;'MOVE AWAY 4MM
BGABCD
MCABCD
JG -5000,-5000,-5000,-5000,,,,;'JOG SLOWLY INTO LIMITS
BGABCD
MCABCD
DP 0,0,0,0,,,,;'DEFINE HOME POSITION
SP 30000,30000,30000,30000,,,,;'SET SPEED BACK TO NORMAL
S1HOMED=1;'HOMING OF SLIT S1 COMPLETE
#ENDS1
EN
'
'
'-----------------------------------------------------------------------------
#HOMES2
'THIS ROUTINE HOMES THE S2 SLIT PACKAGE
'
IF (S2HOMED=1);'ALREADY HOMED
JP #ENDS2
ENDIF
'
IF (_LFE=0)&(_LRE=0)
'BOTH LIMITS ACTUATED. SLIT PACKAGE PROBABLY NOT PLUGGED IN.
JP #ENDS2
ENDIF
'
SHEFGH;'TURN ON THE MOTORS
SP ,,,,30000,30000,30000,30000;'SET SPEED
IF (_LRE=0);'ON THE REVERSE LIMIT SWITCH
PRE=250*161/2*10;'MOVE AWAY 10mm
BGE
ENDIF
'
IF (_LRF=0);'ON THE REVERSE LIMIT SWITCH
PRF=250*161/2*10;'MOVE AWAY 10mm
BGF
ENDIF
'
IF (_LRG=0);'ON THE REVERSE LIMIT SWITCH
PRG=250*161/2*10;'MOVE AWAY 10mm
BGG
ENDIF
'
IF (_LRH=0);'ON THE REVERSE LIMIT SWITCH
PRH=250*161/2*10;'MOVE AWAY 10mm
BGH
ENDIF
'
MCEFGH;'WAIT FOR MOTION TO BE COMPLETE
JG ,,,,-30000,-30000,-30000,-30000;'JOG INTO REVERSE LIMIT
BGEFGH
MCEFGH
PR ,,,,80500,80500,80500,80500;'MOVE AWAY 4MM
BGEFGH
MCEFGH
JG ,,,,-5000,-5000,-5000,-5000;'JOG SLOWLY INTO LIMITS
BGEFGH
MCEFGH
DP ,,,,0,0,0,0;'DEFINE HOME POSITION
SP ,,,,30000,30000,30000,30000;'SET SPEED BACK TO NORMAL
S2HOMED=1;'HOMING OF SLIT S1 COMPLETE
#ENDS2
EN
'
'
'-----------------------------------------------------------------------------