REM ************************************************************************* REM * REM * (C) Copyright Sutter Instrument Company 1996 REM * Version 1.3 February 1996 REM * Version 1.2 July 1995 REM * REM * N.B.: This is written in Power BASIC REM * REM * Important 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 * Note: N, Z do not behave properly unless vectors are displayed on VFD REM * Only the D command is documented on the program display REM * Parity must be implemented by modifying the lines below REM * REM * 6) Speeds are now in terms of æSteps/s rather than intervals in æs REM * REM ************************************************************************* ROBOFILE$ = "TEST.DAT" SAVEFILE$ = "MP185.DAT" KEY 15, CHR$(&H03, &H037) ON KEY (15) GOSUB MP185END KEY (15) ON OPEN SAVEFILE$ FOR OUTPUT AS #2 UNION fourbytes longfield AS LONG fourstring AS STRING*4 END UNION UNION twobytes wordfield 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 USTEPS AS WORD DISPLAYTYPE%=1 PULSESTR$="PULSE speed (æSteps/s):" BAUDRATE=9600 RSPEED.wordfield=10000.0 GOSUB MP185INIT WHILE(1) REM OPEN "COM1:19200,E,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024 GOSUB OPENCOM WHILE NOT INSTAT GOSUB GETLOCATION GOSUB SHOWLOCATION DELAY 0.1 WEND MYKEY$ = INKEY$ IF MYKEY$ = " " THEN GOSUB QUIETCOMMAND ELSEIF MYKEY$ = "P" OR MYKEY$ = "p" THEN GOSUB PLAYCOMMAND ELSEIF MYKEY$ = "F" OR MYKEY$ = "f" THEN GOSUB INFILECOMMAND ELSEIF MYKEY$ = "W" OR MYKEY$ = "w" THEN GOSUB OUTFILECOMMAND ELSEIF MYKEY$ = "M" OR MYKEY$ = "m" THEN GOSUB MOVECOMMAND ELSEIF MYKEY$ = "O" OR MYKEY$ = "o" THEN GOSUB ORIGINCOMMAND ELSEIF MYKEY$ = "V" OR MYKEY$ = "v" THEN GOSUB VELOCITYCOMMAND ELSEIF MYKEY$ = "G" OR MYKEY$ = "g" THEN GOSUB GETLOCUSCOMMAND ELSEIF MYKEY$ = "B" OR MYKEY$ = "b" THEN GOSUB GETSPEEDCOMMAND ELSEIF MYKEY$ = "A" OR MYKEY$ = "a" THEN GOSUB GETSTATSCOMMAND ELSEIF MYKEY$ = "S" OR MYKEY$ = "s" THEN GOSUB SHOWSTATSCOMMAND ELSEIF MYKEY$ = "N" OR MYKEY$ = "n" THEN GOSUB VFDRENEWCOMMAND ELSEIF MYKEY$ = "Z" OR MYKEY$ = "z" THEN GOSUB BOGUSCOMMAND ELSEIF MYKEY$ = "D" OR MYKEY$ = "d" THEN GOSUB DISPLAYTOGGLECOMMAND ELSEIF MYKEY$ = "Q" OR MYKEY$ = "q" THEN GOTO MP185END ELSEIF MYKEY$ = "E" OR MYKEY$ = "e" THEN GOTO MP185END ELSEIF LEN(MYKEY$) = 2 THEN GOTO MP185END ELSE IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, CHR$(03); PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) END IF IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) CLOSE #1 WEND QUIETCOMMAND: LOCATE 1,1,0 PRINT "REMOTE DISABLED ... press any key to resume"; LOCATE 3,60,0 PRINT"Remote disabled"; WHILE NOT INSTAT ON KEY (15) GOSUB MP185END WEND MYKEY$ = INKEY$ MYKEY$ = "s" LOCATE 1,1,0 PRINT " "; GOSUB SHOWSTATSCOMMAND 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 OUTFILECOMMAND: GOSUB GETFILENAME IF WHATFILE$ <> "" THEN CLOSE #2 SAVEFILE$ = WHATFILE$ OPEN SAVEFILE$ FOR OUTPUT AS #2 END IF LOCATE 24,63,0 PRINT " " LOCATE 24,63,0 PRINT SAVEFILE$ 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 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 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 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 ORIGINCOMMAND: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "o" PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) RETURN VFDRENEWCOMMAND: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "n" PRINT #1, CHR$(13); DONEFLAG$ = INPUT$(1,#1) RETURN BOGUSCOMMAND: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "Z" DONEFLAG$ = INPUT$(1,#1) LOCATE 13,69,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 VELOCITYCOMMAND: LOCATE 1,1,0 INPUT "Step Interval: ", RSPEED.wordfield GOSUB PUTVELOCITY GOSUB SHOWSTATSCOMMAND LOCATE 1,1,0 PRINT " " RETURN GETSPEEDCOMMAND: GOSUB SHOWSTATSCOMMAND WRITE #2, "v",USPEED.wordfield LOCATE 24,63,0 PRINT "Line ";LCOUNTER;" saved" LCOUNTER = LCOUNTER + 1 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 DISPLAYTOGGLECOMMAND: DISPLAYTYPE% = DISPLAYTYPE% XOR 1 LOCATE 10,16,0 IF DISPLAYTYPE%=1 THEN PRINT " " ELSE PRINT "steps.æsteps" END IF GOSUB SHOWSTATSCOMMAND GOSUB SHOWLOCATION 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 GETLOCATION: IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1) PRINT #1, "c"; PRINT #1, CHR$(13); XVAL.fourstring = INPUT$(4,#1) YVAL.fourstring = INPUT$(4,#1) ZVAL.fourstring = INPUT$(4,#1) DONEFLAG$ = INPUT$(1,#1) 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: 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 RETURN GETFILENAME: LOCATE 1,1,0 INPUT "Filename: ", WHATFILE$ LOCATE 1,1,0 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,68,0 PRINT RSPEED.wordfield 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"; ELSE LOCATE 3,60,0 PRINT" Move completed "; END IF RETURN SHOWLOCATION: LOCATE 7,1,0 IF DISPLAYTYPE%=1 THEN PRINT USING " X =+#####.### um ";XVAL.longfield/STEPDIV.wordfield PRINT USING " Y =+#####.### um ";YVAL.longfield/STEPDIV.wordfield PRINT USING " Z =+#####.### um ";ZVAL.longfield/STEPDIV.wordfield ELSE IF USTEPS=10 THEN PRINT USING " X =+#####.# ";XVAL.longfield/USTEPS PRINT USING " Y =+#####.# ";YVAL.longfield/USTEPS PRINT USING " Z =+#####.# ";ZVAL.longfield/USTEPS ELSE PRINT USING " X =+#####. ";XVAL.longfield/USTEPS PRINT USING " Y =+#####. ";YVAL.longfield/USTEPS PRINT USING " Z =+#####. ";ZVAL.longfield/USTEPS LOCATE 7,22,0 PRINT USING "##";XVAL.longfield mod USTEPS LOCATE 8,22,0 PRINT USING "##";YVAL.longfield mod USTEPS LOCATE 9,22,0 PRINT USING "##";ZVAL.longfield mod USTEPS END IF END IF LOCATE 13,69,0 IF DONEFLAG$=CHR$(13) THEN PRINT "OK" ELSE PRINT DONEFLAG$;" " END IF MYKEY$ = "X" RETURN SHOWSTATS: GOSUB CLEARSTATS LOCATE 13,69,0 IF DONEFLAG$=CHR$(13) THEN PRINT "OK" ELSE PRINT DONEFLAG$;" " END IF LOCATE 14,68,0 PRINT RSPEED.wordfield LOCATE 14,30,0 IF (FLAGS.bytefield AND 64) THEN PRINT "CONSTANT" ELSE PRINT "PULSE " END IF LOCATE 15,68,0 PRINT USTEPS 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 RETURN CLEARSTATS: LOCATE 13,69,0 PRINT " " LOCATE 14,68,0 PRINT " " LOCATE 14,30,0 PRINT " " LOCATE 15,68,0 PRINT " " LOCATE 15,30,0 PRINT " " LOCATE 16,29,0 PRINT " " LOCATE 17,29,0 PRINT " " LOCATE 18,29,0 PRINT " " LOCATE 19,29,0 PRINT " " LOCATE 20,29,0 PRINT " " LOCATE 21,29,0 PRINT " " LOCATE 22,29,0 PRINT " " LOCATE 23,29,0 PRINT " " LOCATE 24,29,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 REFRESHDISPLAY: LOCATE 1,1,0 PRINT " " PRINT " ";CHR$(201);"----- Status -----";CHR$(187); PRINT " ";CHR$(186);" ";CHR$(186); PRINT " ";CHR$(200);"------------------";CHR$(188); PRINT " Current Absolute Location:" PRINT PRINT REM X = _____.___ um PRINT REM Y = _____.___ um PRINT REM Z = _____.___ um PRINT PRINT PRINT "-----INTERNAL PROGRAM PARAMETERS----- ";CHR$(201);"------Remote Control Parameters------";CHR$(187); PRINT " ";CHR$(186);" Serial port status is: ";CHR$(186); PRINT " Manual operation mode is: ";CHR$(186);" Remote æSteps per sec: ";CHR$(186); PRINT " VFD display mode is: ";CHR$(186);" æSteps per full Step: ";CHR$(186); PRINT " Constant mode speed range: ";CHR$(204);"---------Program Control Keys--------";CHR$(185); PRINT " Constant mode offset: ";CHR$(186);" = disable Q = stop program";CHR$(186); PRINT "Constant mode speed cutoff: ";CHR$(186);" P = play input file S = update stats";CHR$(186); PRINT " Min constant interval: ";CHR$(186);" M = move to XYZ A = save stats ";CHR$(186); PRINT "No. 25 nm usteps per PULSE: ";CHR$(186);" O = reset origin G = save XYZ ";CHR$(186); PRINT " ";PULSESTR$;" ";CHR$(186);" V = change interval B = save intrval";CHR$(186); PRINT " Stored program in use: ";CHR$(186);" D = toggle display N = renew disp. ";CHR$(186); PRINT " Current Baud rate: ";CHR$(186);" F = input file W = output file ";CHR$(186); PRINT " æSteps per full Step: ";CHR$(200);"-------------------------------------";CHR$(188); LOCATE 24,43,0 PRINT ROBOFILE$ LOCATE 24,63,0 PRINT SAVEFILE$ GOSUB SHOWSTATSCOMMAND 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 OPENCOM: 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 MP185END: CLOSE #1 CLOSE #2 CLS END