fixes in convergence, mercury, phytron, triton
This commit is contained in:
parent
3563a0db16
commit
68e2e06905
@ -60,8 +60,8 @@ class HasConvergence:
|
|||||||
|
|
||||||
def cleanup(self, state):
|
def cleanup(self, state):
|
||||||
state.default_cleanup(state)
|
state.default_cleanup(state)
|
||||||
if self.stopped:
|
if state.stopped:
|
||||||
if self.stopped is Stop: # and not Restart
|
if state.stopped is Stop: # and not Restart
|
||||||
self.status = WARN, 'stopped'
|
self.status = WARN, 'stopped'
|
||||||
else:
|
else:
|
||||||
self.status = WARN, repr(state.last_error)
|
self.status = WARN, repr(state.last_error)
|
||||||
|
@ -341,6 +341,7 @@ class TemperatureLoop(TemperatureSensor, Loop, Drivable):
|
|||||||
enable_ramp = Parameter('enable ramp rate', BoolType(), readonly=False)
|
enable_ramp = Parameter('enable ramp rate', BoolType(), readonly=False)
|
||||||
setpoint = Parameter('working setpoint (differs from target when ramping)', FloatRange(0, unit='$'))
|
setpoint = Parameter('working setpoint (differs from target when ramping)', FloatRange(0, unit='$'))
|
||||||
auto_flow = Parameter('enable auto flow', BoolType(), readonly=False)
|
auto_flow = Parameter('enable auto flow', BoolType(), readonly=False)
|
||||||
|
tolerance = Parameter(default=0.1)
|
||||||
_last_setpoint_change = None
|
_last_setpoint_change = None
|
||||||
|
|
||||||
def doPoll(self):
|
def doPoll(self):
|
||||||
@ -452,6 +453,7 @@ class ValvePos(HasInput, MercuryChannel, Drivable):
|
|||||||
class PressureLoop(PressureSensor, Loop, Drivable):
|
class PressureLoop(PressureSensor, Loop, Drivable):
|
||||||
channel_type = 'PRES,AUX'
|
channel_type = 'PRES,AUX'
|
||||||
output_module = Attached(ValvePos, mandatory=False)
|
output_module = Attached(ValvePos, mandatory=False)
|
||||||
|
tolerance = Parameter(default=0.1)
|
||||||
|
|
||||||
def read_control_active(self):
|
def read_control_active(self):
|
||||||
active = self.query('PRES:LOOP:FAUT', off_on)
|
active = self.query('PRES:LOOP:FAUT', off_on)
|
||||||
|
@ -31,7 +31,7 @@ from secop.lib import clamp
|
|||||||
|
|
||||||
class PhytronIO(StringIO):
|
class PhytronIO(StringIO):
|
||||||
end_of_line = '\x03' # ETX
|
end_of_line = '\x03' # ETX
|
||||||
timeout = 0.2
|
timeout = 0.5
|
||||||
identification = [('0IVR', 'MCC Minilog .*')]
|
identification = [('0IVR', 'MCC Minilog .*')]
|
||||||
|
|
||||||
def communicate(self, command, expect_response=True):
|
def communicate(self, command, expect_response=True):
|
||||||
@ -65,8 +65,9 @@ class Motor(PersistentMixin, HasIO, Drivable):
|
|||||||
offset = PersistentParam('', FloatRange(unit='deg'), readonly=False, default=0)
|
offset = PersistentParam('', FloatRange(unit='deg'), readonly=False, default=0)
|
||||||
sign = PersistentParam('', IntRange(-1,1), readonly=False, default=1)
|
sign = PersistentParam('', IntRange(-1,1), readonly=False, default=1)
|
||||||
encoder = Parameter('encoder reading', FloatRange(unit='deg'))
|
encoder = Parameter('encoder reading', FloatRange(unit='deg'))
|
||||||
sameside_offset = Parameter('offset when always approaching from the same side',
|
backlash = Parameter("""backlash compensation\n
|
||||||
FloatRange(unit='deg'), readonly=False, default=0)
|
offset for always approaching from the same side""",
|
||||||
|
FloatRange(unit='deg'), readonly=False, default=0)
|
||||||
abslimits = Parameter('abs limits (raw values)', default=(0, 0),
|
abslimits = Parameter('abs limits (raw values)', default=(0, 0),
|
||||||
datatype=TupleOf(FloatRange(unit='deg'), FloatRange(unit='deg')))
|
datatype=TupleOf(FloatRange(unit='deg'), FloatRange(unit='deg')))
|
||||||
userlimits = PersistentParam('user limits', readonly=False, default=(0, 0), initwrite=True,
|
userlimits = PersistentParam('user limits', readonly=False, default=(0, 0), initwrite=True,
|
||||||
@ -74,7 +75,7 @@ class Motor(PersistentMixin, HasIO, Drivable):
|
|||||||
|
|
||||||
ioClass = PhytronIO
|
ioClass = PhytronIO
|
||||||
fast_poll = 0.1
|
fast_poll = 0.1
|
||||||
_sameside_pending = False
|
_backlash_pending = False
|
||||||
_mismatch_count = 0
|
_mismatch_count = 0
|
||||||
_rawlimits = None
|
_rawlimits = None
|
||||||
|
|
||||||
@ -122,10 +123,10 @@ class Motor(PersistentMixin, HasIO, Drivable):
|
|||||||
else:
|
else:
|
||||||
self.status = self.Status.BUSY, 'driving'
|
self.status = self.Status.BUSY, 'driving'
|
||||||
else:
|
else:
|
||||||
if self._sameside_pending:
|
if self._backlash_pending:
|
||||||
# drive to real target
|
# drive to real target
|
||||||
self.set('A', self.sign * (self.target + self.offset))
|
self.set('A', self.sign * (self.target + self.offset))
|
||||||
self._sameside_pending = False
|
self._backlash_pending = False
|
||||||
return pos
|
return pos
|
||||||
if (self.encoder_mode == 'CHECK' and
|
if (self.encoder_mode == 'CHECK' and
|
||||||
abs(enc - pos) > self.encoder_tolerance):
|
abs(enc - pos) > self.encoder_tolerance):
|
||||||
@ -176,12 +177,12 @@ class Motor(PersistentMixin, HasIO, Drivable):
|
|||||||
if self.status[0] == self.Status.ERROR:
|
if self.status[0] == self.Status.ERROR:
|
||||||
raise HardwareError('need reset')
|
raise HardwareError('need reset')
|
||||||
self.status = self.Status.BUSY, 'changed target'
|
self.status = self.Status.BUSY, 'changed target'
|
||||||
self._check_limits(value, value + self.sameside_offset)
|
self._check_limits(value, value + self.backlash)
|
||||||
if self.sameside_offset:
|
if self.backlash:
|
||||||
# drive first to target + sameside_offset
|
# drive first to target + backlash
|
||||||
# we do not optimize when already driving from the right side
|
# we do not optimize when already driving from the right side
|
||||||
self._sameside_pending = True
|
self._backlash_pending = True
|
||||||
self.set('A', self.sign * (value + self.offset + self.sameside_offset))
|
self.set('A', self.sign * (value + self.offset + self.backlash))
|
||||||
else:
|
else:
|
||||||
self.set('A', self.sign * (value + self.offset))
|
self.set('A', self.sign * (value + self.offset))
|
||||||
self.setFastPoll(True, self.fast_poll)
|
self.setFastPoll(True, self.fast_poll)
|
||||||
@ -207,7 +208,7 @@ class Motor(PersistentMixin, HasIO, Drivable):
|
|||||||
|
|
||||||
@Command
|
@Command
|
||||||
def reset(self):
|
def reset(self):
|
||||||
"""reset error, set position to encoder"""
|
"""Reset error, set position to encoder"""
|
||||||
self.read_value()
|
self.read_value()
|
||||||
if self.status[0] == self.Status.ERROR:
|
if self.status[0] == self.Status.ERROR:
|
||||||
enc = self.encoder + self.offset
|
enc = self.encoder + self.offset
|
||||||
|
@ -32,7 +32,7 @@ open_close = Mapped(CLOSE=False, OPEN=True)
|
|||||||
actions_map = Mapped(NONE=actions.none, COND=actions.condense, COLL=actions.collect)
|
actions_map = Mapped(NONE=actions.none, COND=actions.condense, COLL=actions.collect)
|
||||||
|
|
||||||
|
|
||||||
class Action(MercuryChannel):
|
class Action(MercuryChannel, Writable):
|
||||||
channel_type = 'ACTN'
|
channel_type = 'ACTN'
|
||||||
value = Parameter('running action', EnumType(actions))
|
value = Parameter('running action', EnumType(actions))
|
||||||
target = Parameter('valve target', EnumType(none=0, condense=1, collect=3), readonly=False)
|
target = Parameter('valve target', EnumType(none=0, condense=1, collect=3), readonly=False)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user