diff --git a/cfg/sim_uniax.cfg b/cfg/sim_uniax.cfg index fc7c0e3..ab56ee7 100644 --- a/cfg/sim_uniax.cfg +++ b/cfg/sim_uniax.cfg @@ -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" diff --git a/secop_psi/simdpm.py b/secop_psi/simdpm.py index b6fb768..9d6e28d 100644 --- a/secop_psi/simdpm.py +++ b/secop_psi/simdpm.py @@ -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