#%TITLE% nsc200.mac
#%NAME%
# nsc200.mac
#%CATEGORY%
#%DESCRIPTION%
# Newport NSC200 controller utils for initialization and
# configuration (nsc200 is known by spec)
#%EXAMPLE%
#%DL%
#%DT%nsc200_setup <serial_number> %DD%
#%SETUP%
#%UL%
#%LI%
#%XUL%
global NSC200_PAR
# NSC200_PAR["serial_line"]
# NSC200_PAR["sleep_time"]
def nsc200_setup '{
NSC200_PAR["serial_line"] = "$1"
NSC200_PAR["sleep_time"] = 1
printf ("NSC200 serial line = %d; sleep time=%f\n", \
NSC200_PAR["serial_line"], NSC200_PAR["sleep_time"])
}'
#
def nsc200_debug '{
NSC200_PAR["debug"] = ! NSC200_PAR["debug"]
print "NSC200 debug=" NSC200_PAR["debug"]
}'
#
# Adds an \r to the command and send it.
#
def _nsc200_send(cmd) '{
ser_par(NSC200_PAR["serial_line"], "flush", 2)
if (NSC200_PAR["debug"] ){
print "nsc200_send : cmd=" cmd
}
ser_put(NSC200_PAR["serial_line"], sprintf("%s\r",cmd))
sleep(NSC200_PAR["sleep_time"])
}'
#
def _nsc200_rec() '{
printf("%s", ser_get(NSC200_PAR["serial_line"]))
}'
# SM : save in non-volatile memory
# VU : set max velocity
# VA : set velocity
# PA : move to absolute position
# _nsc200_send("1PA")
# _nsc200_send("1VA")
# _nsc200_send("1VU")
# _nsc200_send("1SM")
# 655360 steps/mm
#
def nsc200_init_calib '{
global NSC200_PAR
print "Setting config for microscope Y motor / channel 1"
nsc200_change_chan(1)
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SL375590")
_nsc200_send("1SR8239910")
_nsc200_send("1VU2000")
_nsc200_send("1VA1000")
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SM")
print "Setting config for microscope X motor / channel 2"
nsc200_change_chan(2)
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SL100000")
_nsc200_send("1SR9925920")
_nsc200_send("1VU2000")
_nsc200_send("1VA1000")
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SM")
print "Setting config for microscope Z motor / channel 3"
nsc200_change_chan(3)
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SL-3400000")
_nsc200_send("1SR4450000")
_nsc200_send("1VU2000")
_nsc200_send("1VA1000")
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SM")
print "NSC200 motor config done"
}'
def nsc200_change_chan(chan_nb) '{
local _cmd _ans
_cmd = sprintf("1MX%d", chan_nb)
_nsc200_send(_cmd)
_cmd = "1MX?"
_nsc200_send(_cmd)
# _ans --> "1MX? 3\n\r"
_ans = ser_get(NSC200_PAR["serial_line"])
_num = substr (_ans,6,1)
if (_num != chan_nb){
print "error changing channel !!!"
}
else{
print "ok NSC200 chan is now : ", chan_nb
}
}'
# version NO LIMITS
#
def nsc200_init_calib '{
global NSC200_PAR
nsc200_init_calib_y
nsc200_init_calib_x
nsc200_init_calib_z
print "NSC200 motor config done"
}'
def nsc200_init_calib_x '{
print "Setting config for microscope X motor / channel 2"
sleep(NSC200_PAR["sleep_time"])
nsc200_change_chan(2)
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1MX?"); printf("CHAN ="); _nsc200_rec()
_nsc200_send("1SL-12000000")
_nsc200_send("1SR12000000")
_nsc200_send("1VU2000")
_nsc200_send("1VA1000")
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SM")
}'
def nsc200_init_calib_y '{
print "init calib NO LIMITS"
print "Setting config for microscope Y motor / channel 1"
nsc200_change_chan(1)
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1MX?"); printf("CHAN ="); _nsc200_rec()
_nsc200_send("1SL-11000000")
_nsc200_send("1SR11000000")
_nsc200_send("1VU2000")
_nsc200_send("1VA1000")
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SM")
}'
def nsc200_init_calib_z '{
print "Setting config for microscope Z motor / channel 3"
sleep(NSC200_PAR["sleep_time"])
nsc200_change_chan(3)
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1MX?"); printf("CHAN ="); _nsc200_rec()
_nsc200_send("1SL-9300000")
_nsc200_send("1SR9300000")
_nsc200_send("1VU2000")
_nsc200_send("1VA1000")
sleep(NSC200_PAR["sleep_time"])
_nsc200_send("1SM")
}'
#
def nsc200_show '{
nsc200_show_y
nsc200_show_x
nsc200_show_z
print "------------------------------------------"
}'
def nsc200_show_x '{
print "------------------------------------------"
print "Config of microscope X motor"
nsc200_change_chan(2)
_nsc200_send("1MX?"); printf("CHAN ="); _nsc200_rec()
_nsc200_send("1SL?"); printf("NEG LIM ="); _nsc200_rec()
_nsc200_send("1SR?"); printf("POS LIM ="); _nsc200_rec()
_nsc200_send("1VU?"); printf("MAX SPEED ="); _nsc200_rec()
_nsc200_send("1VA?"); printf("SPEED ="); _nsc200_rec()
_nsc200_send("1TP?"); printf("POSITION ="); _nsc200_rec()
}'
def nsc200_show_y '{
print "------------------------------------------"
print "Config of microscope Y motor"
nsc200_change_chan(1)
_nsc200_send("1MX?"); printf("CHAN ="); _nsc200_rec()
_nsc200_send("1SL?"); printf("NEG LIM ="); _nsc200_rec()
_nsc200_send("1SR?"); printf("POS LIM ="); _nsc200_rec()
_nsc200_send("1VU?"); printf("MAX SPEED ="); _nsc200_rec()
_nsc200_send("1VA?"); printf("SPEED ="); _nsc200_rec()
_nsc200_send("1TP?"); printf("POSITION ="); _nsc200_rec()
}'
def nsc200_show_z '{
print "------------------------------------------"
print "Config of microscope Z motor"
nsc200_change_chan(3)
_nsc200_send("1MX?"); printf("CHAN ="); _nsc200_rec()
_nsc200_send("1SL?"); printf("NEG LIM ="); _nsc200_rec()
_nsc200_send("1SR?"); printf("POS LIM ="); _nsc200_rec()
_nsc200_send("1VU?"); printf("MAX SPEED ="); _nsc200_rec()
_nsc200_send("1VA?"); printf("SPEED ="); _nsc200_rec()
_nsc200_send("1TP?"); printf("POSITION ="); _nsc200_rec()
}'
def _nsc200_get_error() '{
local _str _ans
_nsc200_send("1TE?")
_ans = ser_get(NSC200_PAR["serial_line"])
# _ans --> "1TE? 0\n\r"
print "_ans = " _ans
_ans = substr(_ans, 5, 7)
if (_ans == 0){
_str = "no error"
}
else if(_ans == 1){
_str = "Driver fault (open load)"
}
else if(_ans == 2){
_str = "Driver Fault (thermal shutdown)"
}
else if(_ans == 3){
_str = "Driver Fault (short)"
}
else if(_ans == 6){
_str = "Invalid command"
}
else if(_ans == 7){
_str = "Parameter out of range"
}
else if(_ans == 8){
_str = "No Motor connected"
}
else if(_ans == 10){
_str = "Brown-out"
}
else if(_ans == 38){
_str = "Command parameter missing"
}
else if(_ans == 24){
_str = "Positive hardware limit detected"
}
else if(_ans == 25){
_str = "Negative hardware limit detected"
}
else if(_ans == 26){
_str = "Positive software limit detected"
}
else if(_ans == 27){
_str = "Negative software limit detected"
}
else if(_ans == 210){
_str = "Max velocity exceeded"
}
else if(_ans == 211){
_str = "Max Acceleration exceeded"
}
else if(_ans == 213){
_str = "Motor not enabled"
}
else if(_ans == 214){
_str = "Switch to invalid axis"
}
else if(_ans == 220){
_str = "Homing aborted"
}
else if(_ans == 226){
_str = "Parameter change not allowed during motion"
}
else{
_str = "Unknown error : " _ans
}
return _str
}'
# ser_put(NSC200_PAR["serial_line"],"1PR-200000\r")
# ser_put(NSC200_PAR["serial_line"],"1MX3\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1SL?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1SR8000000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1VU2000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1VA1000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR200000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-100000\r")
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR-100000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-100000\r")
# ser_put(NSC200_PAR["serial_line"],"1MX2\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1VA1000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1VU2000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1SR8000000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR-300000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR300000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR300000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-600000\r")
# ser_put(NSC200_PAR["serial_line"],"1VA?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1VA1000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR-600000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-600000\r")
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR-600000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-600000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-600000\r")
# ser_put(NSC200_PAR["serial_line"],"1MX4\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# reconfigNSC200_PAR["serial_line"]
# ser_put(NSC200_PAR["serial_line"],"1MX?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# reconfigNSC200_PAR["serial_line"]
# ser_put(NSC200_PAR["serial_line"],"1MX?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1MX4\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1MX?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR-10000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-10000\r")
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR10000\r")
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR60000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR10000\r")
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1SL?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1SL-30000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR-10000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR50000\r")
# ser_put(NSC200_PAR["serial_line"],"1MX5\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1MX?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1SL-100000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR-10000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-5000\r")
# ser_put(NSC200_PAR["serial_line"],"1TP?\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1SL-120000\r"); sleep(0.3) ; p ser_get(NSC200_PAR["serial_line"])
# ser_put(NSC200_PAR["serial_line"],"1PR-10000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR-5000\r")
# ser_put(NSC200_PAR["serial_line"],"1PR55000\r")
# # ????
#
# # macros to home NSA12 motors with NSC200 contreoller from Newport.
#
# # Cyril Guilloud Mon 30 Oct 2006 19:46:10
#
# # usage :
#
# # nsc200_home_channel 4
#
#
#
# # change current channel to $1
# def nsc200_change_channel '{
#
# global NSC200_SERIAL
#
# local cmd
#
# val = $1
# cmd = sprintf("01MX%d\n\r", val)
# ser_put(NSC200_SERIAL, cmd)
# sleep(NSC200_SLEEP)
# # PC: controller does not return anything
# #r = ser_get(NSC200_SERIAL, "\n\r")
# #print r
# }'
#
# # return the current channel number
# def nsc200_get_current_channel() '{
#
# global NSC200_SERIAL
#
# local cmd
# local stab
# stab[0]=0
#
# cmd = sprintf("01MX?\n\r")
# ser_put(NSC200_SERIAL, cmd)
# sleep(NSC200_SLEEP)
# r = ser_get(NSC200_SERIAL, "\n\r")
#
# split (r, stab)
#
# return(stab[1]+0)
# }'
#
# # home the channel $1
# def nsc200_home_channel '{
#
# print "nsc200 will change to channel", $1
# nsc200_change_channel $1
# print "nsc200 is now in channel:", nsc200_get_current_channel()
# print "nsc200 will now home this channel"
# nsc200_home_current_channel
# print "waiting for homing, please be patient!"
# nsc200_waitformove
# sleep(NSC200_SLEEP*10)
# sync
# }'
#
# # home the motor $1
# def nsc200_home '{
# if (motor_par($1,"controller") == "NSC200") {
# nsc200_home_channel motor_par($1,"channel")
# }
# }'
#
# # home the current channel
# def nsc200_home_current_channel '{
#
# global NSC200_SERIAL
#
# local cmd
#
# cmd = sprintf("01OR\n\r")
# ser_put(NSC200_SERIAL, cmd)
# sleep(NSC200_SLEEP)
# #r = ser_get(NSC200_SERIAL, "\n\r")
# #print "return from controler:", r
#
# }'
#
# #print the status number : 81 is ok
# def nsc200_print_status '{
# global NSC200_SERIAL
#
# local r
# local r1
# local r2
# local stab
#
# print "status of NSC200 controller:"
# r = ser_put (NSC200_SERIAL, "01TS?\n\r")
# sleep(NSC200_SLEEP)
# r1 = ser_get (NSC200_SERIAL)
# #r2 = ser_get (NSC200_SERIAL)
#
# stab[0] = 0
# split (r1, stab)
# print stab[1]+0
#
# }'
#
# #get the status number : 81 is ok
# def nsc200_get_status() '{
# global NSC200_SERIAL
#
# local r
# local r1
# local stab
#
# r = ser_put (NSC200_SERIAL, "01TS?\n\r")
# sleep(NSC200_SLEEP)
# r1 = ser_get (NSC200_SERIAL)
# #r2 = ser_get (NSC200_SERIAL)
#
# stab[0] = 0
# split (r1, stab)
# return(stab[1]+0)
#
# }'
#
# #return the home status (1 has been homed)
# def nsc200_get_home_status() '{
# global NSC200_SERIAL
#
# local r
# local r1
# local stab
#
# r = ser_put (NSC200_SERIAL, "01OR?\n\r")
# sleep(NSC200_SLEEP)
# r1 = ser_get (NSC200_SERIAL)
# #r2 = ser_get (NSC200_SERIAL)
#
# stab[0] = 0
# split (r1, stab)
# return(stab[1]+0)
#
# }'
#
# def nsc200_waitformove '{
# while (nsc200_get_status() != 81) {sleep(NSC200_SLEEP)}
# }'
#
# # def nsc200_home_all '{
# #
# # local i
# #
# # for (i=0; i< 8; i++){
# #
# # if (nsc200_check_enable_channel i){
# # nsc200_change_channel i
# # nsc200_home_current_channel
# # }
# # }
# # }'
#
#
#
#
#
#
# def NSCsetup '{
# p "Starting up"
# # Setup Newport NSC box and ensure all axes are home
# # Assumes a reconfig has been done recently to clear serial port
#
# # scan switchbox (takes about 10 seconds)
# motor_par(0,"send","BX");
#
# sleep(10)
#
# local nsc[] n
# nsc[0]="xpc";
# nsc[1]="ypc";
# nsc[2]="zpc";
# nsc[3]="xzp";
# nsc[4]="yzp";
# nsc[5]="zzp";
# nsc[6]="thypc";
# nsc[7]="thzpc";
#
# for (n=0;n<8;n++) {
# p(sprintf("Homing %s",nsc[n]))
# eval(sprintf("home %s +",nsc[n]))
# sleep(5)
# }
# }'
#
#%MACROS%
#%IMACROS%
#%TOC%
#%DEPENDENCIES%
#%AUTHOR% C.Guilloud
#%END%
|