fixes in sim_uniax

This commit is contained in:
zolliker 2021-11-04 12:57:44 +01:00
parent ccf38f87d9
commit 7d2eacfe5c
2 changed files with 31 additions and 22 deletions

View File

@ -5,26 +5,29 @@ description = [sim] uniaxial pressure device
[INTERFACE]
uri=tcp://5000
[drv]
class = secop.simulation.SimDrivable
extra_params = speed, safe_current, safe_step, maxcurrent
description = simulated motor
value.default = 0
speed.readonly = False
speed.default = 10
interval = 0.11
[transducer]
class = secop_psi.simdpm.DPM3
description = simulated force
motor = drv
[force]
class = secop_psi.uniax.Uniax
description = uniax driver
motor = drv
transducer = transducer
[drv]
class = secop.simulation.SimDrivable
extra_params = speed, safe_current, move_limit, maxcurrent, tolerance
description = simulated motor
value.default = 0
speed.readonly = False
speed.default = 40
interval = 0.11
value.unit = deg
tolerance.default = 0.9
[transducer]
class = secop_psi.simdpm.DPM3
description = simulated force
motor = drv
value.unit = 'N'
[res]
class = secop.simulation.SimReadable
description = raw temperature sensor on the stick
@ -37,5 +40,5 @@ value.datatype = {"type":"double", "unit":"Ohm"}
class=secop_psi.softcal.Sensor
description=temperature sensor, soft calibration
rawsensor=res
calib = X132254.340
calib = /home/l_samenv/frappy/secop_psi/calcurves/X132254.340
value.unit = "K"

View File

@ -22,22 +22,28 @@
"""simulated transducer DPM3 read out"""
import random
import math
from secop.core import Readable, Parameter, FloatRange, Attached
from secop.lib import clamp
class DPM3(Readable):
motor = Attached()
jitter = Parameter('simulated jitter', FloatRange(unit='N'), default=1, readonly=False)
jitter = Parameter('simulated jitter', FloatRange(unit='N'), default=0.1, readonly=False)
hysteresis = Parameter('simulated hysteresis', FloatRange(unit='deg'), default=100, readonly=False)
friction = Parameter('friction', FloatRange(unit='N/deg'), default=1, readonly=False)
slope = Parameter('slope', FloatRange(unit='N/deg'), default=10, readonly=False)
friction = Parameter('friction', FloatRange(unit='N/deg'), default=2.5, readonly=False)
slope = Parameter('slope', FloatRange(unit='N/deg'), default=0.5, readonly=False)
offset = Parameter('offset', FloatRange(unit='N'), default=0, readonly=False)
_pos = 0 # effective piston position, main hysteresis taken into account
_pos = 0
def read_value(self):
mot = self._motor
self._pos = clamp(self._pos, mot.value - self.hysteresis * 0.5, mot.value + self.hysteresis * 0.5)
return clamp(0, 1, mot.value - self._pos) * self.friction \
+ self._pos * self.slope + self.jitter * (random.random() - random.random())
d = self.friction * self.slope
self._pos = clamp(self._pos, mot.value - d, mot.value + d)
f = (mot.value - self._pos) / self.slope
if mot.value > 0:
f = max(f, (mot.value - self.hysteresis) / self.slope)
else:
f = min(f, (mot.value + self.hysteresis) / self.slope)
return f + self.jitter * (random.random() - random.random()) * 0.5