use strict; use Win32::SerialPort; # user control ###### # STILL TO DO ##### # PROMPT USER FOR INPUT # Z axis is Velmex Bislide E01 # E01 - 1 step = 0.00025" # X, Y axis is Velmex Bislide E04 # E04 - 1 step = 0.001" # need to be 4 cm higher # 4 cm = 1.57480315" devided by 0.00025 (inches per step) # = 6299.213 steps my $y_adjust = 5300 - 6250;#jg changed from 6000 to 6250 nov07,2005 #### # STILL TO DO #### # files of positions and offsets # these are hardwired at the moment my $filter_definition_file = "filters.in"; # ideally I would like to read these in my @x_filter_offset_positions = (0, 53, 106, 27, 80, 133, 0, 53, 106, 27, 80, 133); my @y_filter_offset_positions = (0, 0, 0, 39, 39, 39, 79, 79, 79, 118, 118, 118); my @x_wash_positions = (0,0,0,0); my @y_wash_positions = (1500,5250,9000,12750); my @x_plate_positions = (6000, 6030, 6004, 6004, 12010, 12000); my @y_plate_positions = (20, 3997, 8015, 12015, 5, 3990); my @x_filter_positions = (18000, 18000, 18000, 18000, 23000, 23000, 23000, 23000, 28000, 28000, 28000, 28000, 33000, 33000, 33000, 33000, 38000, 38000, 38000, 38000, 43000, 43000, 43000, 43000, 48000, 48000, 48000, 48000); my @y_filter_positions = (0, 3850, 7700, 11550, 0, 3850, 7700, 11550, 0, 3850, 7700, 11550, 0, 3850, 7700, 11550, 0, 3850, 7700, 11550, 0, 3850, 7700, 11550, 0, 3850, 7700, 11550); # speeds and heights my $x_speed = 3000; my $y_speed = 3000; my $z_speed = 2000; my $time_of_pause = 30; $time_of_pause = $time_of_pause*10; # heights my $z_safe_up = 9921 - $y_adjust; my $z_filter_down = 15000 - $y_adjust; my $z_plate_down = 14200 - $y_adjust; my $z_wash_down = 13780 - $y_adjust; my $z_plate_and_filter_up = 11750 - $y_adjust; #safe for plates and filters BUT NOT WASH my $z_plate_change_speed = 12800 - $y_adjust; #change speed pulling out of plates my $z_filter_change_speed = 14200 - $y_adjust; #change speed pulling out of filters # mapping of motors # changing these would be VERY VERY BAD # do not ever change these unless you REALLY REALLY know what you are doing my $x_motor = 1; my $y_motor = 3; my $z_motor = 2; ######################## # MAIN PROGRAM STARTS HERE ######################## my $wait_for_it = ''; # start talking to COM my $ob = Win32::SerialPort->new ('COM1') || die; $ob->user_msg(1); # misc. warnings $ob->error_msg(1); # hardware and data errors #initialize COM1 $ob->baudrate(9600); $ob->parity("none"); # $ob->parity_enable(1); # for any parity except "none" $ob->databits(8); $ob->stopbits(1); $ob->handshake('none'); #write settings $ob->write_settings; $ob->save("tpj4.cfg"); print "wrote configuration file tpj4.cfg\n"; #open port for talking $ob -> write("F"); home_machine(); my $filter_number=1; my $plate_number=1; my $plate_or_filter=1; my $ready_to_go = 0; my $go_again = 1; while ($go_again == 1){ print "INPUT: Check Filter (1) or plate (2)??\n"; $plate_or_filter = ; chomp $plate_or_filter; if($plate_or_filter == 1){ $filter_number = 40; while($filter_number > 28){ print "INPUT: Check Filter Number??\n"; $filter_number = ; chomp $filter_number; print "It appears that you want to check filter number $filter_number\n"; print "Is the above information all correct (1=yes, 0=no)???\n"; $ready_to_go = ; if($filter_number > 28) {print "ONLY 28 FILTERS MAX!\n";} } $filter_number = $filter_number - 1; check_filter($filter_number,0); $ready_to_go = 0; print "Check OFFSET?? (1=yes, 0=no)???\n"; $ready_to_go = ; check_filter($filter_number,11); $go_again = 0; } if($plate_or_filter == 2){ $plate_number = 10; while($plate_number > 6){ print "INPUT: Check Plate Number??\n"; $plate_number = ; chomp $plate_number; print "It appears that you want to check plate number $plate_number\n"; print "Is the above information all correct (1=yes, 0=no)???\n"; $ready_to_go = ; if($plate_number > 6) {print "ONLY 6 PLATES MAX!\n";} } $plate_number = $plate_number - 1; check_plate($plate_number); $go_again = 0; } print "Do you want to check another filter or plate (1=yes, 0=no)???\n"; $go_again = ; } send_to_velmex( "C,(IA".$z_motor."M500, R"); send_to_velmex( "C,(IA".$y_motor."M500,IA".$x_motor."M500,)R"); $ob -> write("Q"); undef $ob; exit; ############functions######### ################### # check filter ################### sub check_filter{ my ($filter_number,$offset_number) = @_; # filternumber + offset my $true_x = $x_filter_positions[$filter_number] + $x_filter_offset_positions[$offset_number]; my $true_y = $y_filter_positions[$filter_number] + $y_filter_offset_positions[$offset_number]; # position xy, z = speed change, slow, z = bottom, z = speed change, fast, z = filter&plate height send_to_velmex( "C,(IA".$y_motor."M".$true_y.",IA".$x_motor."M".$true_x.",)R"); # send_to_velmex( "C, IA".$z_motor."M".$z_filter_change_speed.", R"); # send_to_velmex( "C, S".$z_motor."M200, R"); send_to_velmex( "C, IA".$z_motor."M".$z_filter_down.", R"); print "PRESS RETURN TO CONTINUE\n"; my $sweet_nothing = ; # send_to_velmex( "C, IA".$z_motor."M".$z_filter_change_speed.", R"); # send_to_velmex( "C, S".$z_motor."M".$z_speed.", R"); send_to_velmex( "C, IA".$z_motor."M".$z_plate_and_filter_up.", R"); return; } ################### # check plate ################### sub check_plate{ my ($plate_number) = @_; # position xy, z = speed change, slow, z = bottom, z = speed change, fast, z = filter&plate height send_to_velmex( "C,(IA".$y_motor."M".$y_plate_positions[$plate_number].",IA".$x_motor."M".$x_plate_positions[$plate_number].",)R"); # send_to_velmex( "C, IA".$z_motor."M".$z_plate_change_speed.", R"); # send_to_velmex( "C, S".$z_motor."M".$z_speed_liquid.", R"); send_to_velmex( "C, IA".$z_motor."M".$z_plate_down.", R"); my $platewait = ''; print "After checking position press return to continue\n"; $platewait = ; # send_to_velmex( "C, IA".$z_motor."M".$z_plate_change_speed.", R"); # send_to_velmex( "C, S".$z_motor."M".$z_speed.", R"); send_to_velmex( "C, IA".$z_motor."M".$z_plate_and_filter_up.", R"); return; } ########### # home all 3 axis # go to safe height ########### sub home_machine{ # slow speed send_to_velmex( "C, S2M200, R"); send_to_velmex( "C, S1M200, R"); send_to_velmex( "C, S3M200, R"); # home send_to_velmex( "C, I2M-0, I2M200, IA2M-0,R"); send_to_velmex( "C, I1M-0, I1M200, IA1M-0,R"); send_to_velmex( "C, I3M-0, I3M200, IA3M-0,R"); # return to fast speeds send_to_velmex( "C, S".$z_motor."M".$z_speed.", R"); send_to_velmex( "C, S".$x_motor."M".$x_speed.", R"); send_to_velmex( "C, S".$y_motor."M".$y_speed.", R"); # go to safe height send_to_velmex( "C, IA".$z_motor."M".$z_safe_up.", R"); return; } ################ # send commands to the arrayer ################ sub send_to_velmex{ my ($print_command) = @_; # print "Here is the command to send to Velmex ".$print_command."\n"; $ob -> write($print_command); my $result = ''; do{ $result = $ob->input; } until ($result eq '^'); # print "Command Has Now Run, Press Return to Continue\n"; # $wait_for_it = ; return; }