' WOMBAT - CONTROLLER 2 ' ' $Revision: 1.7 $ ' $Name: not supported by cvs2svn $ ' $Date: 2008-05-30 00:26:55 $ ' Author: Dan Bartlett ' Airpad control added by Doug Clowes ' Last revision by: $Author: ffr $ ' ' A-SAMPLE UPPER TILT ' B-SAMPLE LOWER TILT ' C-SAMPLE UPPER LINEAR ' D-SAMPLE LOWER LINEAR ' E-SAMPLE ROTATE ' F-DETECTOR ROTATE ' G-OSCILLATING COLLIMATOR ' H-SPARE ' ' '----------------------------------------------------------------------- #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;' FIRST TIME MOTOR OFF CN 1;' CONFIGURES LIMIT SWITCHES TO ACCEPT NC CONTACTS II 8,,,0;' CONFIGURES THE 8TH INPUT TO ACTIVATE THE #ININT ROUTINE OP 65280;' SETS OUTPUTS 9-16 ON = RELAYS OFF IA 137,157,201,68;' CONFIGURES IP ADDRESS AC 25000,25000,25000,25000,50000,10000,25000,;' SET ACELERATION DC 25000,25000,25000,25000,50000,10000,25000,;' SET DECELERATION SP 25000,25000,25000,25000,25000,100000,25000,;' SET SPEED SIA=1,25,13,0<-2>2;'HEIDENHAIN ROQ425 SIB=1,25,13,0<-2>2;'HEIDENHAIN ROQ425 SIC=1,25,13,0<-2>2;'HEIDENHAIN ROQ425 SID=1,25,13,0<-2>2;'HEIDENHAIN ROQ425 SIE=1,25,13,0<-2>2;'HEIDENHAIN ROQ425 SIF=1,25,25,0<-2>2;'HEIDENHAIN RCN226 SIG=1,25,13,0<-2>2;'HEIDENHAIN ROQ425 SIH=0,25,13,0<-2>2;'NOT USED ' FIRST TIME THROUGH RESET AIRPAD CONTROL REQF=0 RSPF=0 ' FIRST TIME THROUGH RESET HALT CONTROL HLTA=0 HLTB=0 HLTC=0 HLTD=0 HLTE=0 HLTF=0 HLTG=0 HLTH=0 ' FIRST TIME THROUGH RESET LIMIT CONTROL LSAHIT=0 LSBHIT=0 LSCHIT=0 LSDHIT=0 LSEHIT=0 LSFHIT=0 LSGHIT=0 LSHHIT=0 JS #THREAD0 EN ' ' '----------------------------------------------------------------------- #THREAD0 ' MAIN THREAD ' THERE MUST BE A THREAD RUNNING FOR #LIMSWI, #TCPERR AND #ININT TO WORK ' JS #CHKSPD JS #CHKDCEL JS #AIRPAD JP #THREAD0 EN ' ' '----------------------------------------------------------------------- #CHKDCEL 'ROUTINE TO RESET DECELERATION AFTER AN EMERGENCY STOP ' IF (_BGA=0);'WHEN MOTION STOPS AFTER A LIMIT HIT IF (LSAHIT=1);'WHEN MOTION STOPS AFTER A LIMIT HIT DCA=OLDDCA;' RESET DECEL TO OLD VALUE LSAHIT=0 ENDIF IF (HLTA=1) HLTA=0 ENDIF ENDIF ' IF (_BGB=0) IF (LSBHIT=1) DCB=OLDDCB LSBHIT=0 ENDIF IF (HLTB=1) HLTB=0 ENDIF ENDIF ' IF (_BGC=0) IF (LSCHIT=1) DCC=OLDDCC LSCHIT=0 ENDIF IF (HLTC=1) HLTC=0 ENDIF ENDIF ' IF (_BGD=0) IF (LSDHIT=1) DCD=OLDDCD LSDHIT=0 ENDIF IF (HLTD=1) HLTD=0 ENDIF ENDIF ' IF (_BGE=0) IF (LSEHIT=1) DCE=OLDDCE LSEHIT=0 ENDIF IF (HLTE=1) HLTE=0 ENDIF ENDIF ' IF (_BGF=0) IF (LSFHIT=1) DCF=OLDDCF LSFHIT=0 ENDIF IF (HLTF=1) HLTF=0 ENDIF ENDIF ' IF (_BGG=0) IF (LSGHIT=1) DCG=OLDDCG LSGHIT=0 ENDIF IF (HLTG=1) HLTG=0 ENDIF ENDIF ' IF (_BGH=0) IF (LSHHIT=1) DCH=OLDDCH LSHHIT=0 ENDIF IF (HLTH=1) HLTH=0 ENDIF ENDIF ' JS #SETDCEL,((HLTA=1)&(LSAHIT=0)) JS #SETDCEL,((HLTB=1)&(LSBHIT=0)) JS #SETDCEL,((HLTC=1)&(LSCHIT=0)) JS #SETDCEL,((HLTD=1)&(LSDHIT=0)) JS #SETDCEL,((HLTE=1)&(LSEHIT=0)) JS #SETDCEL,((HLTF=1)&(LSFHIT=0)) JS #SETDCEL,((HLTG=1)&(LSGHIT=0)) JS #SETDCEL,((HLTH=1)&(LSHHIT=0)) EN ' ' '----------------------------------------------------------------------- #CHKSPD ' ROUTINE TO CHECK IF SPEEDS ARE ABOVE MAXIMUM ALLOWED ' IF (_SPA>50000) SPA=50000 ENDIF IF (_SPB>50000) SPB=50000 ENDIF IF (_SPC>50000) SPC=50000 ENDIF IF (_SPD>50000) SPD=50000 ENDIF IF (_SPE>50000) SPE=50000 ENDIF IF (_SPF>150000) SPF=150000 ENDIF IF (_SPG>500000) SPG=500000 ENDIF IF (_SPH>50000) SPH=50000 ENDIF EN ' ' '----------------------------------------------------------------------- #TCPERR ' EMPTY ROUTINE FOR A TCP ERROR ' RE ' ' '----------------------------------------------------------------------- #CMDERR 'ROUTINE TO HANDLE COMMAND ERRORS ' ZS0 EN1 ' ' '----------------------------------------------------------------------- #ININT ' INTERUPT ROUTINE TO STOP ALL AXES ' WHEN SAFETY & INTERLOCK SYSTEM REQUESTS IT ' STA,B,C,D,E,F,G,H HLTA=1 HLTB=1 HLTC=1 HLTD=1 HLTE=1 HLTF=1 HLTG=1 HLTH=1 JS #SETDCEL RI ' ' '----------------------------------------------------------------------- #LIMSWI 'ROUTINE TO HASTEN THE DECELERATION OF AN AXIS WHEN A LIMIT SWITCH IS HIT ' JS #SETDCEL RE ' '----------------------------------------------------------------------- #SETDCEL 'ROUTINE TO HASTEN THE DECELERATION OF AN AXIS ' IF (_BGA=1) IF (((_SCA=2)&(_LFA=0))|((_SCA=3)&(_LRA=0))|(HLTA=1)) STA IF (LSAHIT=0) OLDDCA=_DCA DCA=100000 LSAHIT=1 ENDIF ENDIF ENDIF ' IF (_BGB=1) IF (((_SCB=2)&(_LFB=0))|((_SCB=3)&(_LRB=0))|(HLTB=1)) STB IF (LSBHIT=0) OLDDCB=_DCB DCB=100000 LSBHIT=1 ENDIF ENDIF ENDIF ' IF (_BGC=1) IF (((_SCC=2)&(_LFC=0))|((_SCC=3)&(_LRC=0))|(HLTC=1)) STC IF (LSCHIT=0) OLDDCC=_DCC DCC=100000 LSCHIT=1 ENDIF ENDIF ENDIF ' IF (_BGD=1) IF (((_SCD=2)&(_LFD=0))|((_SCD=3)&(_LRD=0))|(HLTD=1)) STD IF (LSDHIT=0) OLDDCD=_DCD DCD=100000 LSDHIT=1 ENDIF ENDIF ENDIF ' IF (_BGE=1) IF (((_SCE=2)&(_LFE=0))|((_SCE=3)&(_LRE=0))|(HLTE=1)) STE IF (LSEHIT=0) OLDDCE=_DCE DCE=100000 LSEHIT=1 ENDIF ENDIF ENDIF ' IF (_BGF=1) IF (((_SCF=2)&(_LFF=0))|((_SCF=3)&(_LRF=0))|(HLTF=1)) STF IF (LSFHIT=0) OLDDCF=_DCF DCF=50000 LSFHIT=1 ENDIF ENDIF ENDIF ' IF (_BGG=1) IF (((_SCG=2)&(_LFG=0))|((_SCG=3)&(_LRG=0))|(HLTG=1)) STG IF (LSGHIT=0) OLDDCG=_DCG DCG=100000 LSGHIT=1 ENDIF ENDIF ENDIF ' IF (_BGH=1) IF (((_SCH=2)&(_LFH=0))|((_SCH=3)&(_LRH=0))|(HLTH=1)) STH IF (LSHHIT=0) OLDDCH=_DCH DCH=100000 LSHHIT=1 ENDIF ENDIF ENDIF ' EN ' ' '----------------------------------------------------------------------- #AIRPAD ' ROUTINE TO CONTROL THE AIRPADS ' SET REQF=1 TO MAKE FLIGHT TUBE AVAILABLE FOR MOVE ' THE RSPF BIT IS USED SO THAT THE CODE ONLY RUNS WHEN THE ' STATE OF FTUBE CHANGES - THE DELAYS ARENT RUNNING EVERY CYCLE ' IN THE 2ND IF, THE OFF-SOLENOIDS ARENT HELD ENERGISED IN CASE THE ' VALVE MANUAL OVER RIDE IS NEEDED. ' ' FOLLOW SHF/MOF COMMANDS ENTERED MANUALLY IF (_MOF=0)&(RSPF=0);'FLIGHT TUBE MOTOR IS ON BUT AIR IS OFF REQF=1 ENDIF IF (_MOF=1)&(RSPF=1);'FLIGHT TUBE MOTOR IS OFF BUT AIR IS ON SHF;' FOLLOWING STEPS MUST BE RUN BEFORE MOTOR CAN BE TURNED OFF REQF=0 ENDIF ' IF (REQF=1)&(RSPF=0);'REQUESTING FLIGHT TUBE BE MOVABLE SHF;' TURN MOTOR ON WT500;' WAIT FOR MOTOR TO STABILISE SB 10;' AIR PAD OFF-SOLENOID OFF CB 9;' AIR PAD ON-SOLENOID ON WT1000; RSPF=1 ENDIF IF (REQF=0)&(RSPF=1)&(_BGF=0);'FLIGHT TUBE MOTION FINISHED WT1000;' WAIT FOR FLIGHT TUBE TO SETTLE SB 9;' AIR PAD ON-SOLENOID OFF CB 10;' AIR PAD OFF-SOLENOID ON WT500; SB 10;' AIR PAD OFF-SOLENOID OFF MOF;' TURN MOTOR OFF RSPF=0 ENDIF EN ' ' '----------------------------------------------------------------------- #OSC ' THIS PROGRAM OSCILATES THE COLLIMATOR ' IT MUST BE RUN IN THREAD 1 XQ #ACCVETO,2 ' STARTS THE VETO PROGRAM IN THREAD 2 #STRT STRTPOS=7744139;' STARTING ENCODER POSITION SHG SPG=75000 ACG=50000 DCG=50000 PRG=(_TPG - STRTPOS)/204.8*25000 BGG AMG JP #STRT,(_TPG<>STRTPOS) ' JUMP TO #STRT UNTIL TABLE IS IN POSITION SPG=500000 ACG=750000 DCG=750000 #LOOP PRG=225000;' MOVE FORWARD DISTANCE AS PER ANGLE VALUE BGG AMG PRG=-225000;' MOVE BACK DISTANCE AS PER ANGLE VALUE BGG AMG JP #LOOP EN ' ---------------------------------------- #ACCVETO ' THIS PROGRAM MONITORS THE VELOCITY OF THE OSCILATING COLLIMATOR ' AND SENDS A VETO SIGNAL TO THE DAE WHEN VELOCITY IS CONSTANT ' IT IS CALLED BY #OSC AND IS RUN IN THREAD 2 IF (_TVG=_SPG) SB1 ELSE CB1 ENDIF JP #ACCVETO,(_XQ1<>-1) ' JUMP BACK TO START UNLESS #OSC IS NOT RUNNING EN ' ' '-----------------------------------------------------------------------