REM ************************************************************************* REM * Copyright Sutter Instrument Company (C) 1998 REM * REM * Version 2.1 N.B.: This is written in Power BASIC REM * REM * 1) Velocity now contains the step resolution in the high-order bit REM * Set = 50 usteps/step; Clear = 10 usteps/step REM * N.B. Max. value is 32767 and RSPEED contains the resolution bit REM * REM * 2) Nine new commands have been added REM * C Absolute movement mode for program vectors (output "a") REM * L Relative .... (output "b") REM * D Download program TO controller in VECTORS (output "d") REM * U Upload ... FROM ... (output "u") REM * H Separate help screen REM * R Reset controller (output "r") REM * E Interrupt PAUSE in robotics (output "e") REM * X Toggle; No position query & slow download REM * J A built-in centering routine REM * REM * 3) Lame timeout incorporated (ON TIMER) REM * REM * Version 1.2/1.3 Modifications REM * REM * 1) Parity can now be accomodated if desired. Use: REM * OPEN "COM1:9600,E,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 REM * REM * 2) The parameter RSPEED now comes in on the 32 byte stats string REM * Now, all 32 bytes are read; See SHOWSTATS REM * REM * 3) The display has been revised REM * REM * 4) The input and display for the MOVE command has been revised such REM * that the step and æm displays are valid for 50 and 10 æsteps/step. REM * REM * 5) Three new commands have been added. REM * N "reNew" causes a complete rewrite of the VFD display REM * D toggles the position display and input from steps to æm REM * Z sends an invalid command ("z") to test SIO error 4 REM * REM * Notes: N, Z do not behave properly unless vectors are displayed on VFD REM * Parity must be implemented by modifying the OPEN instructions REM * REM ************************************************************************* $EVENT ON ON TIMER (2) GOSUB TIMEOUT UNION fourbytes longfield AS LONG fourstring AS STRING*4 END UNION UNION twobytes wordfield AS WORD numbfield AS INTEGER twostring AS STRING*2 END UNION UNION onebyte bytefield AS BYTE onestring AS STRING*1 END UNION DIM XVAL AS fourbytes DIM YVAL AS fourbytes DIM ZVAL AS fourbytes DIM FLAGS AS onebyte DIM UDIRX AS onebyte DIM UDIRY AS onebyte DIM UDIRZ AS onebyte DIM DEAD AS twobytes DIM UOFFSET AS twobytes DIM URANGE AS twobytes DIM PULSE AS twobytes DIM USPEED AS twobytes DIM POWER AS onebyte DIM ECHOSTAT AS onebyte DIM SAFELO AS twobytes DIM SAFEHI AS twobytes DIM BAUDHI AS onebyte DIM BAUDLO AS onebyte DIM STEPDIV AS twobytes DIM STEPMUL AS twobytes DIM RSPEED AS twobytes DIM XPARAM AS twobytes DIM VELOCITY AS twobytes DIM PROGRAMNUMBER AS twobytes DIM NUMBERofVECTORS AS twobytes DIM UPLOADCOUNT AS twobytes DIM USTEPS AS WORD ROBOFILE$ = "TEST.DAT" SAVEFILE$ = "MP185.DAT" DOWNLOAD$ = "DOWNLOAD.DAT" UPLOAD$ = "UPLOAD.DAT" OPEN SAVEFILE$ FOR OUTPUT AS #2 DISPLAYTYPE%=1 PULSESTR$="PULSE speed (æs/æstep):" BAUDRATE=9600 PORTVAL=1 RSPEED.wordfield=6550 QUERYFLAG = 1 GOSUB MP185INIT MAIN: LOCATE 1,1,0 PRINT " Press H for help " SLEEP 2 LOCATE 1,1,0 PRINT " " WHILE(1) REM OPEN "COM1:19200,E,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 GOSUB OPENCOM WHILE NOT INSTAT IF QUERYFLAG THEN IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) GOSUB GETLOCATION GOSUB SHOWLOCATION END IF DELAY 0.1 WEND MYKEY$ = INKEY$ IF MYKEY$ = " " THEN GOSUB QUIETCOMMAND ELSEIF MYKEY$ = "A" OR MYKEY$ = "a" THEN GOSUB GETSTATSCOMMAND ELSEIF MYKEY$ = "B" OR MYKEY$ = "b" THEN GOSUB GETSPEEDCOMMAND ELSEIF MYKEY$ = "C" OR MYKEY$ = "c" THEN GOSUB SETABSOLUTEMODE ELSEIF MYKEY$ = "D" OR MYKEY$ = "d" THEN GOSUB DOWNLOADPROGRAM ELSEIF MYKEY$ = "E" OR MYKEY$ = "e" THEN GOSUB ENDPAUSECOMMAND ELSEIF MYKEY$ = "F" OR MYKEY$ = "f" THEN GOSUB INFILECOMMAND ELSEIF MYKEY$ = "G" OR MYKEY$ = "g" THEN GOSUB GETLOCUSCOMMAND ELSEIF MYKEY$ = "H" OR MYKEY$ = "h" THEN GOSUB HELPCOMMAND ELSEIF MYKEY$ = "I" OR MYKEY$ = "i" THEN GOSUB INTERRUPTMOVE ELSEIF MYKEY$ = "J" OR MYKEY$ = "j" THEN GOSUB FINDCENTER ELSEIF MYKEY$ = "L" OR MYKEY$ = "l" THEN GOSUB SETRELATIVEMODE ELSEIF MYKEY$ = "M" OR MYKEY$ = "m" THEN GOSUB MOVECOMMAND ELSEIF MYKEY$ = "N" OR MYKEY$ = "n" THEN GOSUB VFDRENEWCOMMAND ELSEIF MYKEY$ = "O" OR MYKEY$ = "o" THEN GOSUB ORIGINCOMMAND ELSEIF MYKEY$ = "P" OR MYKEY$ = "p" THEN GOSUB PLAYCOMMAND ELSEIF MYKEY$ = "Q" OR MYKEY$ = "q" THEN GOTO MP185END ELSEIF MYKEY$ = "R" OR MYKEY$ = "r" THEN GOSUB RESETCOMMAND ELSEIF MYKEY$ = "S" OR MYKEY$ = "s" THEN GOSUB SHOWSTATSCOMMAND ELSEIF MYKEY$ = "T" OR MYKEY$ = "t" THEN GOSUB TESTER ELSEIF MYKEY$ = "U" OR MYKEY$ = "u" THEN GOSUB UPLOADPROGRAM ELSEIF MYKEY$ = "V" OR MYKEY$ = "v" THEN GOSUB VELOCITYCOMMAND ELSEIF MYKEY$ = "W" OR MYKEY$ = "w" THEN GOSUB OUTFILECOMMAND ELSEIF MYKEY$ = "X" OR MYKEY$ = "x" THEN GOSUB QUERYTOGGLECOMMAND ELSEIF MYKEY$ = "Y" OR MYKEY$ = "y" THEN GOSUB SHOWPARAMS ELSEIF MYKEY$ = "Z" OR MYKEY$ = "z" THEN GOSUB BOGUSCOMMAND ELSEIF LEN(MYKEY$) = 2 THEN PRINT VAL(MID$(MYKEY$,2,1)) SECONDVAL = VAL (MID$ (MYKEY$,2,1)) IF SECONDVAL = 1 THEN GOSUB HELPCOMMAND ELSE OTHERCHAR = VAL(MID$(MYKEY$,1,1)) IF OTHERCHAR=3 OR OTHERCHAR=27 THEN IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, CHR$(03); PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) ELSE LOCATE 1,1,0 PRINT ">" SLEEP 0.1 LOCATE 1,1,0 PRINT " " END IF END IF IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) CLOSE #1 WEND REM ************************************************************************* REM * Keyboard command routines REM ************************************************************************* REM * REM * QUIETCOMMAND = space REM * GETSTATSCOMMAND = A REM * GETSPEEDCOMMAND = B REM * SETABSOLUTEMODE = C REM * DOWNLOADPROGRAM = D REM * WAITforRESPONSE REM * ENDPAUSECOMMAND = E REM * INFILECOMMAND = F REM * GETLOCUSCOMMAND = G REM * HELPCOMMAND = H REM * INTERRUPTMOVE = I REM * FINDCENTER = J REM * MP285CENTER REM * SETRELATIVEMODE = L REM * MOVECOMMAND = M REM * PUTLOCATION REM * VFDRENEWCOMMAND = N REM * ORIGINCOMMAND = O REM * PLAYCOMMAND = P REM * MP185END = Q REM * RESETCOMMAND = R REM * SHOWSTATSCOMMAND = S REM * TESTER = T REM * UPLOADPROGRAM = U REM * VELOCITYCOMMAND = V REM * PUTVELOCITY REM * OUTFILECOMMAND = W REM * QUERYTOGGLECOMMAND = X REM * SHOWPARAMS = Y REM * SHOWINTERNALPARAMETERS REM * BOGUSCOMMAND = Z REM * REM ************************************************************************* REM * Display routines REM ************************************************************************* REM * REM * REFRESHDISPLAY REM * GETLOCATION REM * SHOWLOCATION REM * SHOWSTATS REM * GETFILENAME REM * REM ************************************************************************* REM * Initializations and others REM ************************************************************************* REM * REM * MP185INIT REM * INITCOM REM * OPENCOM REM * OPENCOM1 REM * OPENCOM2 REM * TIMEOUT REM * KEYWAIT REM * MP185RESET REM * MP185END REM * REM ************************************************************************* QUIETCOMMAND: LOCATE 1,1,0 PRINT "REMOTE DISABLED ... press any key to resume"; LOCATE 3,60,0 PRINT"Remote disabled"; WHILE NOT INSTAT : WEND MYKEY$ = "s" LOCATE 1,1,0 PRINT " "; GOSUB SHOWSTATSCOMMAND RETURN GETSTATSCOMMAND: GOSUB SHOWSTATSCOMMAND WRITE #2, "a",FLAGS.bytefield,UDIRX.bytefield,UDIRY.bytefield,UDIRZ.bytefield,_ DEAD.wordfield,UOFFSET.wordfield,URANGE.wordfield,PULSE.wordfield,_ USPEED.wordfield,POWER.bytefield,ECHOSTAT.bytefield,_ SAFELO.wordfield,SAFEHI.wordfield,RSPEED.wordfield LOCATE 24,63,0 PRINT "Line ";LCOUNTER;" saved" LCOUNTER = LCOUNTER + 1 RETURN GETSPEEDCOMMAND: GOSUB SHOWSTATSCOMMAND WRITE #2, "v",RSPEED.wordfield LOCATE 24,63,0 PRINT "Line ";LCOUNTER;" saved" LCOUNTER = LCOUNTER + 1 RETURN SETABSOLUTEMODE: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "a" PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) RETURN DOWNLOADPROGRAM: LOCATE 1,1,0 PRINT "Press 1 to confirm download" WHILE NOT INSTAT : WEND MYKEY$ = INKEY$ IF MYKEY$ <> "1" THEN LOCATE 1,1,0 PRINT " " RETURN END IF LOCATE 1,1,0 PRINT " " PRINT " " OPEN DOWNLOAD$ FOR INPUT AS #4 IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "d"; IF QUERYFLAG = 0 THEN SLEEP 1 INPUT #4, PROGRAMNUMBER.wordfield PRINT #1, PROGRAMNUMBER.twostring; IF QUERYFLAG = 0 THEN SLEEP 1 INPUT #4, NUMBERofVECTORS.wordfield PRINT #1, NUMBERofVECTORS.twostring; IF QUERYFLAG = 0 THEN SLEEP 1 INPUT #4, spacer$ PRINT #1, CHR$(13); I=0 linenumber=NUMBERofVECTORS.wordfield GOSUB WAITforRESPONSE IF DONEFLAG$ <> CHR$(13) THEN RETURN LOCATE 1,1,0 PRINT " " LOCATE 1,1,0 PRINT "Download:";PROGRAMNUMBER.wordfield FOR I=1 TO linenumber INPUT #4, VELOCITY.numbfield INPUT #4, XVAL.longfield INPUT #4, YVAL.longfield INPUT #4, ZVAL.longfield INPUT #4, spacer$ PRINT #1, VELOCITY.twostring; IF QUERYFLAG = 0 THEN SLEEP 1 PRINT #1, XVAL.fourstring; IF QUERYFLAG = 0 THEN SLEEP 1 PRINT #1, YVAL.fourstring; IF QUERYFLAG = 0 THEN SLEEP 1 PRINT #1, ZVAL.fourstring; IF QUERYFLAG = 0 THEN SLEEP 1 LOCATE 2,1,0 PRINT "Line";I;"of";linenumber; LOCATE 1,15,0 PRINT " " LOCATE 2,15,0 PRINT " "; LOCATE 1,15,0 PRINT " V: "; VELOCITY.numbfield LOCATE 2,15,0 XVAL.longfield = XVAL.longfield * STEPDIV.wordfield YVAL.longfield = YVAL.longfield * STEPDIV.wordfield ZVAL.longfield = ZVAL.longfield * STEPDIV.wordfield PRINT " X: "; XVAL.longfield; PRINT ", Y: "; YVAL.longfield; PRINT ", Z: "; ZVAL.longfield; GOSUB WAITforRESPONSE IF DONEFLAG$ <> CHR$(13) THEN RETURN NEXT I LOCATE 1,1,0 PRINT " " PRINT " "; LOCATE 1,1,0 PRINT "Download OK; Press a key. "; WHILE NOT INSTAT : WEND LOCATE 1,1,0 PRINT " "; CLOSE #4 RETURN WAITforRESPONSE: IF QUERYFLAG THEN TIMER ON DONEFLAG$=INPUT$(1,#1) TIMER OFF IF DONEFLAG$ <> CHR$(13) THEN CLOSE #4 LOCATE 3,60,0 PRINT "Error: vector ";I REM BEEP 3 WHILE NOT INSTAT : WEND END IF ELSE SLEEP 1 END IF SLEEP 0.1 RETURN ENDPAUSECOMMAND: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "e"; PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) LOCATE 1,1,0 PRINT " End pause sent " SLEEP 0.1 LOCATE 1,1,0 PRINT " " RETURN INFILECOMMAND: GOSUB GETFILENAME ROBOFILE$ = WHATFILE$ LOCATE 24,43,0 PRINT " " LOCATE 24,43,0 PRINT ROBOFILE$ LCOUNTER = 1 LOCATE 24,63,0 PRINT " " RETURN GETLOCUSCOMMAND: GOSUB GETLOCATION GOSUB SHOWLOCATION WRITE #2, "m",XVAL.longfield, YVAL.longfield, ZVAL.longfield LOCATE 24,63,0 PRINT "Line ";LCOUNTER;" saved" LCOUNTER = LCOUNTER + 1 RETURN HELPCOMMAND: CLS PRINT " PRESS A KEY TO RETURN " PRINT PRINT " M = MOVE to XYZ E = End programmed pause " PRINT " O = Reset ORIGIN and resolution X = Turn on/off position query " PRINT " V = Change speed and resolution N = Renew the VFD display " PRINT " Q = END this program S = Update stats " PRINT " R = RESET controller and END J = Centering routine " PRINT " = disable serial communication PRINT PRINT " Current program source file is: "; ROBOFILE$ PRINT " F = Name a new input file " PRINT " P = Execute command sequence saved in the input file " PRINT " C = Set absolute coordinate mode for robotics" PRINT " L = Set relative coordinate mode for robotics" PRINT " D = Download robotics program from DOWNLOAD.DAT to controller" PRINT " U = Upload robotics program from controller to UPLOAD.DAT" PRINT PRINT " Current capture file is: "; SAVEFILE$ PRINT " W = Name a new output file " PRINT " A = Save stats in output file " PRINT " G = Save XYZ coordinates in output file " PRINT " B = Save speed in output file " PRINT " Z = Bad command to test serial routines" PRINT " H = Help Y = Show input parameters " WHILE NOT INSTAT : WEND CLS GOSUB REFRESHDISPLAY RETURN INTERRUPTMOVE: RETURN REM N.B.! This hangs the controller if used to interrupt REM execution of internal robotics program. A controller REM reset after hanging will recover but it's messy. Ugh. IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, CHR$(03); PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) LOCATE 1,1,0 PRINT " Interrupt sent " SLEEP 0.1 LOCATE 1,1,0 PRINT " " RETURN FINDCENTER: LOCATE 1,1,0 PRINT "Press 1 to confirm centering routine. " WHILE NOT INSTAT : WEND MYKEY$ = INKEY$ IF MYKEY$ = "1" THEN GOTO MP285CENTER LOCATE 1,1,0 PRINT " " PRINT " " RETURN MP285CENTER: LOCATE 1,1,0 PRINT "Finding endpoint. Please be patient. " PRINT "OK to interrupt with Enter at endpoint. " XVAL.longfield=-30000*25 YVAL.longfield=-30000*25 ZVAL.longfield=-30000*25 GOSUB PUTLOCATION IF INSTAT THEN MYKEY$ = INKEY$ IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) LOCATE 1,1,0 PRINT "Endpoint found. Origin reset. Returning." PRINT " " GOSUB ORIGINCOMMAND IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) GOSUB GETLOCATION GOSUB SHOWLOCATION SLEEP 1 XVAL.longfield=30000*25 YVAL.longfield=30000*25 ZVAL.longfield=30000*25 GOSUB PUTLOCATION IF INSTAT THEN MYKEY$ = INKEY$ LOCATE 1,1,0 PRINT "Max excursion found. Centering now. " SLEEP 1 IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) GOSUB GETLOCATION GOSUB SHOWLOCATION LOCATE 2,1,0 PRINT "X: "; XVAL.longfield/25, " +/-"; XVAL.longfield/50 PRINT "Y: "; YVAL.longfield/25, " +/-"; YVAL.longfield/50 PRINT "Z: "; ZVAL.longfield/25, " +/-"; ZVAL.longfield/50 XVAL.longfield=XVAL.longfield/2 YVAL.longfield=YVAL.longfield/2 ZVAL.longfield=ZVAL.longfield/2 GOSUB PUTLOCATION IF INSTAT THEN MYKEY$ = INKEY$ SLEEP 2 GOSUB ORIGINCOMMAND IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) GOSUB GETLOCATION GOSUB SHOWLOCATION LOCATE 1,1,0 PRINT "****Centering complete. Press Enter.****"; IF INSTAT THEN MYKEY$ = INKEY$ WHILE NOT INSTAT : WEND LOCATE 1,1,0 PRINT " " PRINT " " PRINT " " PRINT " " RETURN SETRELATIVEMODE: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "b" PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) RETURN MOVECOMMAND: LOCATE 5,30,0 PRINT " Move to:"; IF DISPLAYTYPE%=1 THEN LOCATE 7,36,0 INPUT "X = ";X LOCATE 8,36,0 INPUT "Y = ";Y LOCATE 9,36,0 INPUT "Z = ";Z XVAL.longfield = X * STEPDIV.wordfield YVAL.longfield = Y * STEPDIV.wordfield ZVAL.longfield = Z * STEPDIV.wordfield ELSE LOCATE 7,36,0 INPUT "XSteps = ";XS LOCATE 7,52,0 INPUT "XæSteps = ";XUS LOCATE 8,36,0 INPUT "YSteps = ";YS LOCATE 8,52,0 INPUT "YæSteps = ";YUS LOCATE 9,36,0 INPUT "ZSteps = ";ZS LOCATE 9,52,0 INPUT "ZæSteps = ";ZUS XVAL.longfield = (XS*USTEPS)+XUS YVAL.longfield = (YS*USTEPS)+YUS ZVAL.longfield = (ZS*USTEPS)+ZUS END IF LOCATE 5,30,0 PRINT " "; LOCATE 7,36,0 PRINT " "; LOCATE 8,36,0 PRINT " "; LOCATE 9,36,0 PRINT " "; GOSUB PUTLOCATION RETURN PUTLOCATION: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "m"; PRINT #1, XVAL.fourstring; PRINT #1, YVAL.fourstring; PRINT #1, ZVAL.fourstring; PRINT #1, CHR$(13); DONEFLAG$ = "X" BLINKCOUNTER = 0 WHILE NOT INSTAT LOCATE 3,60,0 IF BLINKCOUNTER < 1000 THEN PRINT "Move in progress"; IF BLINKCOUNTER > 1000 AND BLINKCOUNTER < 2000 THEN PRINT " "; IF BLINKCOUNTER > 2000 THEN BLINKCOUNTER = 0 BLINKCOUNTER = BLINKCOUNTER + 1 IF LOC(1)>0 THEN DONEFLAG$=INPUT$(1,#1) EXIT END IF WEND IF DONEFLAG$="X" THEN PRINT #1, CHR$(03) DONEFLAG$=INPUT$(1,#1) LOCATE 3,60,0 PRINT"Move interrupted"; REM BEEP 2 ELSE LOCATE 3,60,0 PRINT" Move completed "; REM BEEP END IF RETURN VFDRENEWCOMMAND: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "n" PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) RETURN ORIGINCOMMAND: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "o" PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) RETURN PLAYCOMMAND: LOCATE 1,1,0 ENDLESSLOOP=0 INPUT "Loop continuously? (Y=yes)";ANSWER$ IF ANSWER$="Y" OR ANSWER$="y" THEN ENDLESSLOOP=1 LOCATE 1,1,0 PRINT "Now executing "; ROBOFILE$; " " PRINT "Press any key to halt " WHILE NOT INSTAT OPEN ROBOFILE$ FOR INPUT AS #3 WHILE NOT EOF(3) IF INSTAT THEN EXIT INPUT #3, CMD$ IF CMD$="m" THEN INPUT #3, XVAL.longfield INPUT #3, YVAL.longfield INPUT #3, ZVAL.longfield GOSUB PUTLOCATION GOSUB SHOWLOCATION ELSEIF CMD$="v" THEN INPUT #3, USPEED.wordfield GOSUB PUTVELOCITY GOSUB SHOWSTATSCOMMAND ELSEIF CMD$="o" THEN GOSUB ORIGINCOMMAND ELSEIF CMD$="d" THEN INPUT #3, SNOOZETIME! SLEEP SNOOZETIME ELSEIF CMD$="s" THEN GOSUB SHOWSTATSCOMMAND ELSEIF CMD$="p" THEN LOCATE 1,1,0 PRINT "Programmed pause in execution " PRINT "Press e to end program; any other to restart" WHILE NOT INSTAT : WEND MYKEY$ = INKEY$ IF MYKEY$ = "E" OR MYKEY$ = "e" THEN EXIT LOOP ELSE LOCATE 1,1,0 PRINT "Now executing "; ROBOFILE$; " " PRINT "Press any key to halt " END IF ELSE END IF IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) REM FOR I=0 TO 1000 REM NEXT I WEND CLOSE #3 IF ENDLESSLOOP=0 THEN EXIT IF MYKEY$ = "E" OR MYKEY$ = "e" THEN MYKEY$ = "" EXIT LOOP END IF WEND IF INSTAT THEN IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, CHR$(03); PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) END IF LOCATE 1,1,0 PRINT " " PRINT " " MYKEY$ = INKEY$ MYKEY$ = "" RETURN REM MP185END is at the end of this program RESETCOMMAND: LOCATE 1,1,0 PRINT "WARNING. Controller reset / program termination." PRINT "Press 1 to confirm reset" WHILE NOT INSTAT : WEND MYKEY$ = INKEY$ IF MYKEY$ = "1" THEN GOTO MP185RESET LOCATE 1,1,0 PRINT " " PRINT " " RETURN SHOWSTATSCOMMAND: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "s"; PRINT #1, CHR$(13); GOSUB GETSTATS GOSUB SHOWSTATS LOCATE 3,60,0 PRINT" OK "; DELAY 0.5 LOCATE 3,60,0 PRINT"**** Online ****"; RETURN GETSTATS: TIMER ON FLAGS.onestring = INPUT$(1,#1) UDIRX.onestring = INPUT$(1,#1) UDIRY.onestring = INPUT$(1,#1) UDIRZ.onestring = INPUT$(1,#1) DEAD.twostring = INPUT$(2,#1) UOFFSET.twostring = INPUT$(2,#1) URANGE.twostring = INPUT$(2,#1) PULSE.twostring = INPUT$(2,#1) USPEED.twostring = INPUT$(2,#1) POWER.onestring = INPUT$(1,#1) ECHOSTAT.onestring= INPUT$(1,#1) SAFELO.twostring = INPUT$(2,#1) SAFEHI.twostring = INPUT$(2,#1) BAUDHI.onestring = INPUT$(2,#1) BAUDLO.onestring = INPUT$(2,#1) STEPDIV.twostring = INPUT$(2,#1) STEPMUL.twostring = INPUT$(2,#1) XPARAM.twostring = INPUT$(2,#1) RSPEED.twostring = INPUT$(2,#1) DONEFLAG$ = INPUT$(1,#1) IF STEPMUL.wordfield=25 THEN USTEPS=10.0 IF STEPMUL.wordfield=5 THEN USTEPS=50.0 TIMER OFF RETURN TESTER: LOCATE 1,1,0 PRINT "Done. Press a key. " WHILE NOT INSTAT : WEND LOCATE 1,1,0 PRINT " " RETURN UPLOADPROGRAM: LOCATE 1,1,0 INPUT "Enter program number to upload "; PROGRAMNUMBER.wordfield LOCATE 2,1,0 PRINT "Press 1 to confirm upload" WHILE NOT INSTAT : WEND MYKEY$ = INKEY$ IF MYKEY$ <> "1" THEN LOCATE 1,1,0 PRINT " " PRINT " " RETURN END IF PRINT #1, "u"; PRINT #1, PROGRAMNUMBER.twostring REM PRINT #1, CHR$(13); UPLOADCOUNT.twostring = INPUT$(2,#1) vectorcount = UPLOADCOUNT.numbfield LOCATE 1,1,0 PRINT "Uploading ";UPLOADCOUNT.wordfield;" vectors to ";SAVEFILE$;" " PRINT " " PRINT #2, PROGRAMNUMBER.numbfield PRINT #2, UPLOADCOUNT.numbfield PRINT #2, FOR I=1 TO vectorcount RSPEED.twostring = INPUT$(2,#1) XVAL.fourstring = INPUT$(4,#1) YVAL.fourstring = INPUT$(4,#1) ZVAL.fourstring = INPUT$(4,#1) IF RSPEED.numbfield < 0 THEN PRINT #2, (RSPEED.numbfield AND &H7FFF) * -1 ELSE PRINT #2, RSPEED.numbfield END IF PRINT #2, XVAL.longfield PRINT #2, YVAL.longfield PRINT #2, ZVAL.longfield PRINT #2, NEXT I LOCATE 2,1,0 PRINT "Done. Press a key. " WHILE NOT INSTAT : WEND LOCATE 1,1,0 PRINT " " PRINT " " RETURN VELOCITYCOMMAND: LOCATE 1,1,0 PRINT "Resolution: (h/l): "; RKEY$ = INPUT$ (1) PRINT " "; RKEY$ INPUT " Speed in um/s: ", RSPEED.wordfield IF RKEY$ = "L" OR RKEY$ = "l" THEN IF RSPEED.wordfield > 1310 THEN RSPEED.wordfield = 1310 IF RSPEED.wordfield < 1 THEN RSPEED.wordfield = 1 RSPEED.wordfield = RSPEED.wordfield OR 32768 ELSE IF RSPEED.wordfield > 6553 THEN RSPEED.wordfield = 6553 IF RSPEED.wordfield < 1 THEN RSPEED.wordfield = 1 END IF GOSUB PUTVELOCITY GOSUB SHOWSTATSCOMMAND LOCATE 1,1,0 PRINT " "; PRINT " "; RETURN PUTVELOCITY: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "v"; PRINT #1, RSPEED.twostring; PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) LOCATE 14,35,0 IF RKEY$ = "L" OR RKEY$ = "l" THEN PRINT "low "; ELSE PRINT "high"; END IF LOCATE 14,18,0 PRINT RSPEED.wordfield AND &H7FFF; RETURN OUTFILECOMMAND: GOSUB GETFILENAME IF WHATFILE$ <> "" THEN CLOSE #2 SAVEFILE$ = WHATFILE$ OPEN SAVEFILE$ FOR OUTPUT AS #2 END IF LOCATE 24,65,0 PRINT " " LOCATE 24,63,0 PRINT SAVEFILE$ RETURN QUERYTOGGLECOMMAND: LOCATE 1,1,0 IF QUERYFLAG THEN INPUT "Position query off + slow download? (Y/N): "; QT$ IF QT$ = "Y" OR QT$ = "y" THEN QUERYFLAG = 0 ELSE INPUT "Turn position query on? (Y/N): "; QT$ IF QT$ = "Y" OR QT$ = "y" THEN QUERYFLAG = 1 END IF GOSUB REFRESHDISPLAY LOCATE 1,1,0 PRINT " " RETURN SHOWPARAMS: CLS GOSUB SHOWINTERNALPARAMETERS LOCATE 14,30,0 IF (FLAGS.bytefield AND 64) THEN PRINT "CONSTANT" ELSE PRINT "PULSE " END IF LOCATE 15,30,0 IF (FLAGS.bytefield AND 32) THEN PRINT "RELATIVE" ELSE PRINT "ABSOLUTE" END IF LOCATE 16,29,0 PRINT URANGE.wordfield LOCATE 17,29,0 PRINT UOFFSET.wordfield LOCATE 18,29,0 PRINT SAFELO.wordfield LOCATE 19,29,0 PRINT SAFEHI.wordfield LOCATE 20,29,0 PRINT PULSE.wordfield LOCATE 21,29,0 PRINT USPEED.wordfield LOCATE 22,29,0 IF (128 AND FLAGS.bytefield) > 0 THEN PRINT (15 AND FLAGS.bytefield)+1 ELSE PRINT " " END IF LOCATE 23,29,0 PRINT BAUDRATE LOCATE 24,29,0 PRINT USTEPS WHILE NOT INSTAT : WEND CLS GOSUB REFRESHDISPLAY RETURN SHOWINTERNALPARAMETERS: LOCATE 1,1,0 PRINT " Press ENTER to return" PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT "-----INTERNAL PROGRAM PARAMETERS----- " PRINT " " PRINT " Manual operation mode is: " PRINT " VFD display mode is: " PRINT " Constant mode speed range: " PRINT " Constant mode offset: " PRINT "Constant mode speed cutoff: " PRINT " Min constant interval: " PRINT "No. 25 nm usteps per PULSE: " PRINT " ";PULSESTR$;" " PRINT " Stored program in use: " PRINT " Current Baud rate: " PRINT " æSteps per full Step: " RETURN BOGUSCOMMAND: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "Z" DONEFLAG$ = INPUT$(1,#1) LOCATE 13,29,0 PRINT DONEFLAG$;" " LOCATE 1,1,0 PRINT "Bogus command sent" PRINT "Check SIO report sites then press a key" WHILE NOT INSTAT : WEND GOSUB VFDRENEWCOMMAND LOCATE 1,1,0 PRINT " "; PRINT " "; MYKEY$ = "X" RETURN REM ************************************************************************* REM * REM * REFRESHDISPLAY REM * GETLOCATION REM * SHOWLOCATION REM * SHOWSTATS REM * GETFILENAME REM * REM ************************************************************************* REFRESHDISPLAY: LOCATE 1,1,0 PRINT " " PRINT " ";CHR$(201);"----- Status -----";CHR$(187); PRINT " ";CHR$(186);" ";CHR$(186); PRINT " ";CHR$(200);"------------------";CHR$(188); IF QUERYFLAG THEN PRINT " Current Absolute Location:" ELSE PRINT " Location query disabled :" end if PRINT PRINT REM X = _____.___ um PRINT REM Y = _____.___ um PRINT REM Z = _____.___ um PRINT PRINT PRINT " ";CHR$(201);"------Remote Control Parameters------";CHR$(187);_ " --- File I/O data ---" PRINT " ";CHR$(186);" Serial port status is: ";CHR$(186);_ " Current source file: " PRINT " ";CHR$(186);" Remote Speed: æm/s Res: ";CHR$(186);_ " Current capture file: " PRINT " ";CHR$(200);"-------------------------------------";CHR$(188);_ " Current download file: " GOSUB SHOWSTATSCOMMAND RETURN GETLOCATION: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "c"; PRINT #1, CHR$(13); REM TIMER ON XVAL.fourstring = INPUT$(4,#1) YVAL.fourstring = INPUT$(4,#1) ZVAL.fourstring = INPUT$(4,#1) DONEFLAG$ = INPUT$(1,#1) REM TIMER OFF RETURN SHOWLOCATION: LOCATE 7,1,0 PRINT USING " X =+#####.### um ";XVAL.longfield/STEPDIV.wordfield PRINT USING " Y =+#####.### um ";YVAL.longfield/STEPDIV.wordfield PRINT USING " Z =+#####.### um ";ZVAL.longfield/STEPDIV.wordfield LOCATE 13,29,0 IF DONEFLAG$=CHR$(13) THEN PRINT "OK" ELSE PRINT DONEFLAG$;" " END IF MYKEY$ = "X" RETURN SHOWSTATS: LOCATE 13,29,0 PRINT " " LOCATE 14,18,0 PRINT " " LOCATE 13,29,0 IF DONEFLAG$=CHR$(13) THEN PRINT "OK" ELSE PRINT DONEFLAG$;" " END IF LOCATE 13,68,0 PRINT ROBOFILE$ CHECKVAL = RSPEED.wordfield AND &H8000 LOCATE 14,35,0 IF CHECKVAL <> 0 THEN PRINT "low "; ELSE PRINT "high"; END IF LOCATE 14,18,0 PRINT RSPEED.wordfield AND &H7FFF LOCATE 14,68,0 PRINT SAVEFILE$ LOCATE 15,68,0 PRINT DOWNLOAD$ RETURN GETFILENAME: LOCATE 1,1,0 INPUT "Filename: ", WHATFILE$ LOCATE 1,1,0 PRINT " " RETURN MP185INIT: COLOR 15,1,8 CLS LCOUNTER = 1 GOSUB INITCOM IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "v"; PRINT #1, RSPEED.twostring; PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) GOSUB REFRESHDISPLAY CLOSE #1 LOCATE 3,60,0 PRINT"**** Online ****"; MYKEY$ = "" RETURN INITCOM: CLS PRINT "Default Baud rate is 9600" INPUT "Enter serial IO Baud rate: ",BAUDSTR$ IF BAUDSTR$ = "" THEN BAUDRATE = 9600 ELSE BAUDRATE = VAL(BAUDSTR$) END IF PRINT "Default COM port is 1" INPUT "Enter 1 or 2: ",PORTVAL$ IF PORTVAL$ = "" THEN PORTVAL = 1 ELSE PORTVAL = 2 END IF OPENCOM: IF PORTVAL <> 1 THEN GOTO OPENCOM2 OPENCOM1: IF BAUDRATE=1200 THEN OPEN "COM1:1200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=2400 THEN OPEN "COM1:2400,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=4800 THEN OPEN "COM1:4800,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=9600 THEN OPEN "COM1:9600,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=19200 THEN OPEN "COM1:19200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=38400 THEN OPEN "COM1:38400,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=115200 THEN OPEN "COM1:115200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSE PRINT"Illegal Baud rate" GOTO INITCOM END IF RETURN OPENCOM2: IF BAUDRATE=1200 THEN OPEN "COM2:1200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=2400 THEN OPEN "COM2:2400,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=4800 THEN OPEN "COM2:4800,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=9600 THEN OPEN "COM2:9600,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=19200 THEN OPEN "COM2:19200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=38400 THEN OPEN "COM2:38400,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSEIF BAUDRATE=115200 THEN OPEN "COM2:115200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 ELSE PRINT"Illegal Baud rate" GOTO INITCOM END IF RETURN TIMEOUT: CLS PRINT "Timeout error -- program terminated"; WHILE NOT INSTAT : WEND END RETURN KEYWAIT: WHILE NOT INSTAT : WEND MYKEY$ = INKEY$ MYKEY$ = "" RETURN MP185RESET: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "r" MP185END: CLOSE #1 CLOSE #2 CLOSE #3 CLOSE #4 CLS END