fixes for uniax device

This commit is contained in:
2021-06-11 16:45:45 +02:00
parent 6c4bb78f97
commit b30bd308a9
11 changed files with 456 additions and 33 deletions

View File

@@ -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