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