esrf

Beamline Instrument Software Support
SPEC Macro documentation: [ Macro Index | BCU Home ]

#%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%