fixes in sim_uniax
This commit is contained in:
parent
ccf38f87d9
commit
7d2eacfe5c
@ -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"
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user