예제 #1
0
    def _update_speed(self):
        for i in range(len(self._direction_down)):
            if self._direction_down[i] != 0:
                if self._speed[i] == 0:
                    self._speed[i] = self._direction_down[i] * self._min_speed
                else:
                    self._speed[i] = self._speed[i] * self._accel_factor
                    if abs(self._speed[i]) >= self._max_speed:
                        self._speed[i] = sign(self._speed[i]) * self._max_speed
            else:
                self._speed[i] = self._speed[i] / self._decel_factor
                if abs(self._speed[i]) < self._min_speed:
                    self._speed[i] = 0

        if self._speed != [0, 0, 0]:
            self._step_done = True
            self._instrument.set_speed(self._speed)
            if not self._moving:
                self._instrument.start()
                self._moving = True
            return True
        else:
            self._instrument.stop()
            self._moving = False
            return False

        return ret
예제 #2
0
    def _update_speed(self):
        for i in range(len(self._direction_down)):
            if self._direction_down[i] != 0:
                if self._speed[i] == 0:
                    self._speed[i] = self._direction_down[i] * self._min_speed
                else:
                    self._speed[i] = self._speed[i] * self._accel_factor
                    if abs(self._speed[i]) >= self._max_speed:
                        self._speed[i] = sign(self._speed[i]) * self._max_speed
            else:
                self._speed[i] = self._speed[i] / self._decel_factor
                if abs(self._speed[i]) < self._min_speed:
                    self._speed[i] = 0

        if self._speed != [0, 0, 0]:
            self._step_done = True
            self._instrument.set_speed(self._speed)
            if not self._moving:
                self._instrument.start()
                self._moving = True
            return True
        else:
            self._instrument.stop()
            self._moving = False
            return False

        return ret
예제 #3
0
 def _do_single_step(self):
     for i in range(len(self._direction_down)):
         if self._direction_down[i] != 0:
             self._instrument.step(i, sign(self._direction_down[i]))
예제 #4
0
def move_abs(posins, moveins, newpos, startstep=4, maxstep=128, minstep=1, delay=0.05, channel_ofs=0):
    """
    move_abs, generic function to control read-out/positioner combo

    Input:
        posins: position reading instrument (should implement 'get_position')
        moveins: position control instrument (should implement 'step')
        newpos: new position vector, the length of this vector sets which
                channels will be used.
        startstep: start steps to use
        maxstep: maximum steps
        minstep: minimum steps for fine position
        delay: time delay after each step
        channel_ofs: if channels do not start counting at zero, change this
    """

    channels = len(newpos)
    pos = posins.get_position()
    delta = [newpos[i] - pos[i] for i in range(channels)]
    dist = [abs(delta[i]) for i in range(channels)]
    hold = [False for i in range(channels)]
    increase_steps = True
    print 'move_abs(): start pos = %r, delta = %r, dist = %r' % \
        (repr(pos), repr(delta), repr(dist))

    steps = [-misc.sign(delta[i]) * startstep for i in range(channels)]

    j = 0
    while True and j < 1000:

        # Move
        for i in range(channels):
            if not hold[i]:
                moveins.step(i + channel_ofs, steps[i])
        time.sleep(delay)

        pos2 = posins.get_position()
        delta2 = [newpos[i] - pos2[i] for i in range(channels)]
        dist2 = [abs(delta2[i]) for i in range(channels)]
#        print 'move_abs(): pos = %r, delta2 = %r' % \
#            (repr(pos2), repr(delta2))

        if increase_steps:
            for i in range(channels):
                if not hold[i]:
                    if misc.sign(delta2[i]) != misc.sign(delta[i]):
                        hold[i] = True
                    elif abs(steps[i]) != maxstep:
                        steps[i] = misc.sign(delta2[i]) * min(abs(steps[i]) * 2, maxstep)
#                        print 'move_abs(): increasing stepsize for ch%d to %f' % (i, steps[i]) 

            if _all_true(hold):
                increase_steps = False
                hold = [False for i in range(channels)]

        # Immediately reverse if we moved too far
        if not increase_steps:
            for i in range(channels):
                if not hold[i]:
                    if misc.sign(delta2[i]) != misc.sign(delta[i]):
                        if abs(steps[i]) == minstep:
                            hold[i] = True
                        else:
                            steps[i] = int(misc.sign(delta2[i]) * max(round(abs(steps[i]) / 2), minstep))
#                            print 'move_abs(): decreasing stepsize for ch%d to %f' % (i, steps[i])

            if _all_true(hold):
                print 'Moved to position!'
                break

            # Remember relative position
            delta = delta2

        j += 1
예제 #5
0
 def _do_single_step(self):
     for i in range(len(self._direction_down)):
         if self._direction_down[i] != 0:
             self._instrument.step(i, sign(self._direction_down[i]))
예제 #6
0
def move_abs(posins, moveins, newpos, startstep=4, maxstep=128, minstep=1, delay=0.05, channel_ofs=0):
    """
    move_abs, generic function to control read-out/positioner combo

    Input:
        posins: position reading instrument (should implement 'get_position')
        moveins: position control instrument (should implement 'step')
        newpos: new position vector, the length of this vector sets which
                channels will be used.
        startstep: start steps to use
        maxstep: maximum steps
        minstep: minimum steps for fine position
        delay: time delay after each step
        channel_ofs: if channels do not start counting at zero, change this
    """

    channels = len(newpos)
    pos = posins.get_position()
    delta = [newpos[i] - pos[i] for i in range(channels)]
    dist = [abs(delta[i]) for i in range(channels)]
    hold = [False for i in range(channels)]
    increase_steps = True
    print 'move_abs(): start pos = %r, delta = %r, dist = %r' % \
        (repr(pos), repr(delta), repr(dist))

    steps = [-misc.sign(delta[i]) * startstep for i in range(channels)]

    j = 0
    while True and j < 1000:

        # Move
        for i in range(channels):
            if not hold[i]:
                moveins.step(i + channel_ofs, steps[i])
        time.sleep(delay)

        pos2 = posins.get_position()
        delta2 = [newpos[i] - pos2[i] for i in range(channels)]
        dist2 = [abs(delta2[i]) for i in range(channels)]
#        print 'move_abs(): pos = %r, delta2 = %r' % \
#            (repr(pos2), repr(delta2))

        if increase_steps:
            for i in range(channels):
                if not hold[i]:
                    if misc.sign(delta2[i]) != misc.sign(delta[i]):
                        hold[i] = True
                    elif abs(steps[i]) != maxstep:
                        steps[i] = misc.sign(delta2[i]) * min(abs(steps[i]) * 2, maxstep)
#                        print 'move_abs(): increasing stepsize for ch%d to %f' % (i, steps[i]) 

            if _all_true(hold):
                increase_steps = False
                hold = [False for i in range(channels)]

        # Immediately reverse if we moved too far
        if not increase_steps:
            for i in range(channels):
                if not hold[i]:
                    if misc.sign(delta2[i]) != misc.sign(delta[i]):
                        if abs(steps[i]) == minstep:
                            hold[i] = True
                        else:
                            steps[i] = int(misc.sign(delta2[i]) * max(round(abs(steps[i]) / 2), minstep))
#                            print 'move_abs(): decreasing stepsize for ch%d to %f' % (i, steps[i])

            if _all_true(hold):
                print 'Moved to position!'
                break

            # Remember relative position
            delta = delta2

        j += 1