fixes for uniax device
This commit is contained in:
@@ -16,11 +16,13 @@
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# Module authors:
|
||||
# ...
|
||||
# M. Zolliker <markus.zolliker@psi.ch>
|
||||
#
|
||||
# *****************************************************************************
|
||||
"""transducer DPM3 read out"""
|
||||
|
||||
from secop.core import Readable, Parameter, FloatRange, BoolType, StringIO, HasIodev, IntRange, Done
|
||||
from secop.core import Drivable, Parameter, FloatRange, BoolType, StringIO,\
|
||||
HasIodev, IntRange, Done, Attached, Command
|
||||
|
||||
|
||||
class DPM3IO(StringIO):
|
||||
@@ -43,7 +45,7 @@ def float2hex(value, digits):
|
||||
return '%06X' % intvalue
|
||||
|
||||
|
||||
class DPM3(HasIodev, Readable):
|
||||
class DPM3(HasIodev, Drivable):
|
||||
OFFSET = 0x8f
|
||||
SCALE = 0x8c
|
||||
|
||||
@@ -52,8 +54,11 @@ class DPM3(HasIodev, Readable):
|
||||
|
||||
iodevClass = DPM3IO
|
||||
|
||||
motor = Attached()
|
||||
digits = Parameter('number of digits for value', IntRange(0, 5), initwrite=True, readonly=False)
|
||||
value = Parameter(unit='N')
|
||||
target = Parameter(unit='N')
|
||||
step = Parameter('maximum motor step', FloatRange(unit='deg'), default=5, readonly=False)
|
||||
|
||||
offset = Parameter('', FloatRange(-1e5, 1e5), readonly=False, poll=True)
|
||||
|
||||
@@ -62,6 +67,8 @@ class DPM3(HasIodev, Readable):
|
||||
thus a maximl output of 1500. 10=150/f
|
||||
"""
|
||||
scale_factor = Parameter('', FloatRange(-1e5, 1e5, unit='input_units/N'), readonly=False, poll=True)
|
||||
_target = None
|
||||
fast_pollfactor = 0.01
|
||||
|
||||
def query(self, adr, value=None):
|
||||
if value is not None:
|
||||
@@ -93,7 +100,7 @@ class DPM3(HasIodev, Readable):
|
||||
return value/mag
|
||||
else:
|
||||
return hex2float(hexvalue, self.digits)
|
||||
|
||||
|
||||
def write_digits(self, value):
|
||||
# value defines the number of digits
|
||||
back_value=self._iodev.communicate('*1F135%02X\r*1G135' % (value + 1))
|
||||
@@ -108,9 +115,37 @@ class DPM3(HasIodev, Readable):
|
||||
return int(back_value,16) - 1
|
||||
|
||||
def read_value(self):
|
||||
value = self._iodev.communicate('*1B1')
|
||||
return float(value)
|
||||
value = float(self._iodev.communicate('*1B1'))
|
||||
if self._target is not None:
|
||||
mot = self._motor
|
||||
if self._direction * (self._target - value) > 0:
|
||||
if not mot.isBusy():
|
||||
step = self.step * self._direction
|
||||
mot.write_target(mot.value + step)
|
||||
else:
|
||||
print(value)
|
||||
self.stop()
|
||||
self.status = self.Status.IDLE, 'target reached'
|
||||
return value
|
||||
|
||||
def write_target(self, target):
|
||||
self._target = target
|
||||
if target - self.value > 0:
|
||||
self._direction = 1
|
||||
else:
|
||||
self._direction = -1
|
||||
print('direction', self._direction)
|
||||
self.status = self.Status.BUSY, 'moving motor'
|
||||
if self._motor.status[0] == self.Status.ERROR:
|
||||
self._motor.reset()
|
||||
return target
|
||||
|
||||
@Command()
|
||||
def stop(self):
|
||||
self._target = None
|
||||
self._motor.stop()
|
||||
self.status = self.Status.IDLE, 'stopped'
|
||||
|
||||
def read_offset(self):
|
||||
reply = self.query(self.OFFSET)
|
||||
return reply
|
||||
|
||||
Reference in New Issue
Block a user