#!/bin/env python # # file name: $HOME/sardanaMacros/lsFind.py # import PyTango import time """ this macro finds a reference mark defined by a Lichtschranke """ hsh = { 'dett': { 'ireg': 'eh_ireg06', 'start': 22, 'stop': 24, 'velReduction': 0.1}, } __all__ = ["lsFind"] from sardana.macroserver.macro import Macro, Type class lsFind(Macro): """ find a reference mark (optical barrier). An input register is read while a motor is moving. If the ireg goes to 1, the motor is stopped. The coarse search is done at full speed, the fine search is done with reduces velocity. """ param_def = [ [ "motorLS", Type.Motor, None, "the motor to be moved over the reference mark" ], ] def run(self, motorLS): if not hsh.has_key( motorLS.name): self.output( "lsFind: failed to identify %s" % motorLS.name) return try: motor = PyTango.DeviceProxy( motorLS.name) ireg = PyTango.DeviceProxy( hsh[motorLS.name]['ireg']) except Exception, e: self.output( "lsFind: failed to create proxies, %s" % (motorLS.name)) self.output( "lsFind: %s" % repr( e)) return start = hsh[motorLS.name]['start'] stop = hsh[motorLS.name]['stop'] velReduction = hsh[motorLS.name]['velReduction'] self.output( "Motor: %s" % motor.name()) self.output( "IReg: %s" % ireg.name()) self.output( "start: %g" % start) self.output( "stop: %g" % stop) self.output( "velReduction: %g" % velReduction) velOld = motor.velocity self.output( "Coarse: %s is at %g, move to start %g" % (motor.name(), motor.position, start)) self.mv( motorLS, start) self.output( "Coarse: %s is at %g, move to stop %g" % (motor.name(), motor.position, stop)) motor.position = stop while motor.state() == PyTango.DevState.MOVING: if ireg.value == 1: self.output( "coarse: ireg == 1 at %g, stopping" % motor.position) motor.stop() break else: self.output( "find-coarse failed, change interval or reduce speed") return rangeFine = 0.2 self.output( "Fine: %s is at %g, move to start %g" % (motor.name(), motor.position, motor.position - rangeFine)) self.mv( motorLS, motor.position - rangeFine) motor.velocity = motor.velocity * velReduction self.output( "fine: %s is at %g, move to stop %g" % (motor.name(), motor.position, motor.position + 2.*rangeFine)) motor.position = motor.position + 2.*rangeFine while motor.state() == PyTango.DevState.MOVING: if ireg.value == 1: self.output( "ireg == 1 at %g, stopping" % motor.position) motor.stop() break motor.velocity = velOld