' ECHIDNA - CONTROLLER 3 ' ' $Revision: 1.11 $ ' $Name: not supported by cvs2svn $ ' $Date: 2008-05-30 00:26:55 $ ' Author: Dan Bartlett ' Limit switch HOME routine added by Ferdi Franceschini ' Last revision by: $Author: ffr $ ' ' A-MONOCHROMATOR FOCUS ' B-SPARE ' C-SPARE ' D-SPARE ' E-SLIT 1 LEFT BLADE (ss1l) ' F-SLIT 1 RIGHT BLADE (ss1r) ' G-SLIT 1 TOP BLADE (ss1u) ' H-SLIT 1 BOTTOM BLADE (ss1d) ' ' '----------------------------------------------------------------------- #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 IA 137,157,201,5;' CONFIGURES IP ADDRESS AC 12500,,,,60000,60000,60000,60000;' SET ACELERATION DC 12500,,,,60000,60000,60000,60000;' SET DECELERATION SP 25000,,,,30000,30000,30000,30000;' SET SPEED HOMERUN=0;' HOMING PROCEDURE HAS NOT BEEN RUN ' 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 #RESLVR 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>25000) SPA=25000 ENDIF IF (_SPB>50000) SPB=50000 ENDIF IF (_SPC>50000) SPC=50000 ENDIF IF (_SPD>50000) SPD=50000 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 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=100000 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 ' ' '----------------------------------------------------------------------- #HOME IF (HOMERUN = 1) JP #ENDHOME ENDIF SH EFGH ST EFGH MC EFGH SP ,,,,30000,30000,30000,30000 ' MOVE SLIT FORWARD 10MM IF IT IS AGAINST THE REVERSE LIMIT SWITCH IF (_LRE = 0) PRE=200000 BGE ENDIF ' MOVE SLIT FORWARD 10MM IF IT IS AGAINST THE REVERSE LIMIT SWITCH IF (_LRF = 0) PRF=200000 BGF ENDIF ' MOVE SLIT FORWARD 10MM IF IT IS AGAINST THE REVERSE LIMIT SWITCH IF (_LRG = 0) PRG=200000 BGG ENDIF ' MOVE SLIT FORWARD 10MM IF IT IS AGAINST THE REVERSE LIMIT SWITCH IF (_LRH = 0) PRH=200000 BGH ENDIF MC EFGH WT 100 ' DRIVE ALL SLITS INTO REVERSE LIMIT SWITCH JG ,,,,-25000,-25000,-25000,-25000 BG EFGH MC EFGH WT 100 ' MOVE AWAY FROM SWITCHES PR ,,,,40000,40000,40000,40000 BG EFGH MC EFGH WT 100 ' DRIVE BACK SLOWLY JG ,,,,-5000,-5000,-5000,-5000 BG EFGH MC EFGH WT 100 ' MOVE FORWARD FROM SWITCH AND SET ZERO PR ,,,,40000,40000,40000,40000 BG EFGH MC EFGH WT 100 ' MO EFGH DP ,,,,0,0,0,0 SP ,,,,30000,30000,30000,30000 HOMERUN=1;'HOMING PROCEDURE HAS BEEN RUN #ENDHOME EN ' ' '----------------------------------------------------------------------- #RESLVR ' PROCEDURE TO UPDATE THE RESOLVER FEEDBACK. ' MUST BE EXCUTED EACH TIME FOR AN UPDATE SB1 CB1;' OUTPUT WITH FALLING EDGE TO TRIGGER EMPIRE RESOLVER BOX AI31;' LOCK DATA IOBYTE1=_TI2;' LOAD FIRST WORD IOBYTE2=_TI3;' LOAD SECOND WORD IOBYTE2=(IOBYTE2&63);' MASK OUT XBUSY BIT IOBYTE2=(IOBYTE2*256);' SHIFT REMAINING BITS 8 POSITIONS TO RIGHT DEA=(IOBYTE1+IOBYTE2);' ADD WORDS TOGETHER, LOAD INTO DEA: USE TPA FOR DATA SB1 EN ' ' '-----------------------------------------------------------------------