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] [INTERFACE]
uri=tcp://5000 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] [force]
class = secop_psi.uniax.Uniax class = secop_psi.uniax.Uniax
description = uniax driver description = uniax driver
motor = drv motor = drv
transducer = transducer 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] [res]
class = secop.simulation.SimReadable class = secop.simulation.SimReadable
description = raw temperature sensor on the stick description = raw temperature sensor on the stick
@ -37,5 +40,5 @@ value.datatype = {"type":"double", "unit":"Ohm"}
class=secop_psi.softcal.Sensor class=secop_psi.softcal.Sensor
description=temperature sensor, soft calibration description=temperature sensor, soft calibration
rawsensor=res rawsensor=res
calib = X132254.340 calib = /home/l_samenv/frappy/secop_psi/calcurves/X132254.340
value.unit = "K" value.unit = "K"

View File

@ -22,22 +22,28 @@
"""simulated transducer DPM3 read out""" """simulated transducer DPM3 read out"""
import random import random
import math
from secop.core import Readable, Parameter, FloatRange, Attached from secop.core import Readable, Parameter, FloatRange, Attached
from secop.lib import clamp from secop.lib import clamp
class DPM3(Readable): class DPM3(Readable):
motor = Attached() 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) hysteresis = Parameter('simulated hysteresis', FloatRange(unit='deg'), default=100, readonly=False)
friction = Parameter('friction', FloatRange(unit='N/deg'), default=1, readonly=False) friction = Parameter('friction', FloatRange(unit='N/deg'), default=2.5, readonly=False)
slope = Parameter('slope', FloatRange(unit='N/deg'), default=10, readonly=False) slope = Parameter('slope', FloatRange(unit='N/deg'), default=0.5, readonly=False)
offset = Parameter('offset', FloatRange(unit='N'), default=0, 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): def read_value(self):
mot = self._motor mot = self._motor
self._pos = clamp(self._pos, mot.value - self.hysteresis * 0.5, mot.value + self.hysteresis * 0.5) d = self.friction * self.slope
return clamp(0, 1, mot.value - self._pos) * self.friction \ self._pos = clamp(self._pos, mot.value - d, mot.value + d)
+ self._pos * self.slope + self.jitter * (random.random() - random.random()) 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