"""LakeShore 331 Class
Python Class for EPICS LakeShore 331
:platform: Unix
:synopsis: Python Class for EPICS LakeShore 331
.. moduleauthor:: Douglas Bezerra Beniz <douglas.beniz@lnls.br>
.. note:: 06/07/2015 [douglas.beniz] first version released
"""
from epics import Device
from enum import Enum
from time import sleep
from py4syn.epics.IScannable import IScannable
from py4syn.epics.StandardDevice import StandardDevice
class LakeShore_t(Enum):
"""
Enumeration of LakeShore channels.
"""
Channel_A = 0 # channel A
Channel_B = 1 # channel B
class ControoLoopMode_t(Enum):
"""
Enumeration of Control Loop Modes.
"""
CLM_Manual_PID = 1
CLM_Zone = 2
CLM_OpenLoop = 3
CLM_AutoTune_PID = 4
CLM_AutoTune_PI = 5
CLM_AutoTune_P = 6
[docs]class LakeShore331 (IScannable, StandardDevice):
"""
Python class to help configuration and control of LakeShore 331 devices via Hyppie
over EPICS.
Examples
--------
>>> from py4syn.epics.LakeShore331 import LakeShore331
>>> ls331 = LakeShore331("DXAS:LS331", "ls331", channel=0) # Use 1 for Ch B
>>> ls331.setValue(120) # 120 degrees Celsius
"""
def __init__ (self, pvPrefix="", mnemonic="", channel=0):
"""
**Constructor**
See :class:`py4syn.epics.StandardDevice`
Parameters
----------
pvPrefix : `string`
LakeShore331's device base naming of the PV (Process Variable); Like DXAS:LS331;
mnemonic : `string`
LakeShore331's mnemonic
"""
StandardDevice.__init__(self, mnemonic)
self.lakeshore331 = Device(pvPrefix+':',
('GetHEAT', 'GetHeaterRange', 'GetAPIDD',
'GetAPIDI', 'GetAPIDP', 'GetASetPoint',
'GetBPIDD', 'GetBPIDI', 'GetBPIDP',
'GetBSetPoint', 'GetCTempA', 'GetCTempB',
'GetKTempA', 'GetKTempB', 'SetHeaterRange',
'SetAPIDD', 'SetAPIDI', 'SetAPIDP',
'SetASetPoint', 'SetBPIDD', 'SetBPIDI',
'SetBPIDP', 'SetBSetPoint', 'GetCmode',
'SetCmode'))
self.ls331_control = Device(pvPrefix + ':CONTROL:', ['SetAPID', 'SetBPID', 'Trigger'])
if (channel == 1):
self.ls331_channel = LakeShore_t.Channel_B
else:
# Default
self.ls331_channel = LakeShore_t.Channel_A
[docs] def getHeat(self):
"""
Heater output query
Returns
-------
Value: Float, e.g.: 0.001
Examples
--------
>>> ls331.getHeat()
>>> 51.530
"""
return self.lakeshore331.get('GetHEAT')
[docs] def getHeaterRange(self):
"""
Heater range command.
Returns
-------
Value: Float, e.g.: 0.001
Examples
--------
>>> ls331.getHeaterRange()
>>> 51.530
"""
return self.lakeshore331.get('GetHeaterRange')
[docs] def getAPIDD(self):
"""
Returns Value D of PID for channel A.
Returns
-------
Value: Integer, e.g.: 10
Examples
--------
>>> ls331.getAPIDD()
>>> 31
"""
return self.lakeshore331.get('GetAPIDD')
[docs] def getBPIDD(self):
"""
Returns Value D of PID for channel B.
Returns
-------
Value: Integer, e.g.: 10
Examples
--------
>>> ls331.getBPIDD()
>>> 32
"""
return self.lakeshore331.get('GetBPIDD')
[docs] def getAPIDI(self):
"""
Returns Value I of PID for channel A.
Returns
-------
Value: Integer, e.g.: 10
Examples
--------
>>> ls331.getAPIDI()
>>> 31
"""
return self.lakeshore331.get('GetAPIDI')
[docs] def getBPIDI(self):
"""
Returns Value I of PID for channel B.
Returns
-------
Value: Integer, e.g.: 10
Examples
--------
>>> ls331.getBPIDI()
>>> 32
"""
return self.lakeshore331.get('GetBPIDI')
[docs] def getAPIDP(self):
"""
Returns Value P of PID for channel A.
Returns
-------
Value: Integer, e.g.: 10
Examples
--------
>>> ls331.getAPIDP()
>>> 31
"""
return self.lakeshore331.get('GetAPIDP')
[docs] def getBPIDP(self):
"""
Returns Value P of PID for channel B.
Returns
-------
Value: Integer, e.g.: 10
Examples
--------
>>> ls331.getBPIDP()
>>> 32
"""
return self.lakeshore331.get('GetBPIDP')
[docs] def getASetPoint(self):
"""
Returns setpoint value for channel A.
Returns
-------
Value: float, e.g.: 0.001
Examples
--------
>>> ls331.getASetPoint()
>>> 67.87
"""
return self.lakeshore331.get('SetASetPoint')
[docs] def getBSetPoint(self):
"""
Returns setpoint value for channel B.
Returns
-------
Value: float, e.g.: 0.001
Examples
--------
>>> ls331.getBSetPoint()
>>> 67.87
"""
return self.lakeshore331.get('GetBSetPoint')
[docs] def getCTempA(self):
"""
Returns channel A temperature in Celsius degrees.
Returns
-------
Value: float, e.g.: 0.001
Examples
--------
>>> ls331.getCTempA()
>>> 32.56
"""
return self.lakeshore331.get('GetCTempA')
[docs] def getCTempB(self):
"""
Returns channel B temperature in Celsius degrees.
Returns
-------
Value: float, e.g.: 0.001
Examples
--------
>>> ls331.getCTempB()
>>> 32.56
"""
return self.lakeshore331.get('GetCTempB')
[docs] def getKTempA(self):
"""
Returns channel A temperature in Kelvin.
Returns
-------
Value: float, e.g.: 0.001
Examples
--------
>>> ls331.getKTempA()
>>> 32.56
"""
return self.lakeshore331.get('GetKTempA')
[docs] def getKTempB(self):
"""
Returns channel B temperature in Kelvin.
Returns
-------
Value: float, e.g.: 0.001
Examples
--------
>>> ls331.getKTempB()
>>> 32.56
"""
return self.lakeshore331.get('GetKTempB')
[docs] def setHeaterRange(self, heaterRange):
"""
Heater range command.
Parameters
----------
heaterRange : `float`
"""
self.lakeshore331.put('SetHeaterRange', heaterRange, wait=True)
[docs] def setASetPoint(self, setPoint):
"""
Set a setpoint value for channel A.
Parameters
----------
setPoint : `float`
"""
self.lakeshore331.put('SetASetPoint', setPoint, wait=True)
[docs] def setBSetPoint(self, setPoint):
"""
Set a setpoint value for channel B.
Parameters
----------
setPoint : `float`
"""
self.lakeshore331.put('SetBSetPoint', setPoint, wait=True)
[docs] def setAPIDD(self, pid_d):
"""
D parameter value of PID for channel A.
Parameters
----------
pid_d : `integer`
"""
self.lakeshore331.put('SetAPIDD', pid_d, wait=True)
[docs] def setBPIDD(self, pid_d):
"""
D parameter value of PID for channel B.
Parameters
----------
pid_d : `integer`
"""
self.lakeshore331.put('SetBPIDD', pid_d, wait=True)
[docs] def setAPIDI(self, pid_i):
"""
I parameter value of PID for channel A.
Parameters
----------
pid_i : `integer`
"""
self.lakeshore331.put('SetAPIDI', pid_i, wait=True)
[docs] def setBPIDI(self, pid_i):
"""
I parameter value of PID for channel B.
Parameters
----------
pid_i : `integer`
"""
self.lakeshore331.put('SetBPIDI', pid_i, wait=True)
[docs] def setAPIDP(self, pid_p):
"""
P parameter value of PID for channel A.
Parameters
----------
pid_p : `integer`
"""
self.lakeshore331.put('SetAPIDP', pid_p, wait=True)
[docs] def setBPIDP(self, pid_p):
"""
P parameter value of PID for channel B.
Parameters
----------
pid_p : `integer`
"""
self.lakeshore331.put('SetBPIDP', pid_p, wait=True)
# Get Control Loop Mode
def getCMode(self):
return self.lakeshore331.get('GetCmode')
# Set CMode (Control Loop Mode)
def setCMode(self, cmode):
self.lakeshore331.put('SetCmode', cmode, wait=True)
[docs] def setControlAPID(self, a_pid):
"""
PID for channel A.
Parameters
----------
a_pid : `integer`
"""
self.ls331_control.put('SetAPID', a_pid, wait=True)
[docs] def setControlBPID(self, b_pid):
"""
PID for channel B.
Parameters
----------
b_pid : `integer`
"""
self.ls331_control.put('SetBPID', b_pid, wait=True)
[docs] def setControlTrigger(self, trigger):
"""
Trigger.
Parameters
----------
trigger : `integer`
"""
self.ls331_control.put('Trigger', trigger, wait=True)
[docs] def getValue(self):
"""
Returns ...
Returns
-------
`float`, Temperature in Celsius degrees
"""
if (self.ls331_channel == LakeShore_t.Channel_A):
return self.getCTempA()
else:
return self.getCTempB()
[docs] def setValue(self, temperature):
"""
Sets ...
Parameters
----------
temperature : `float`, Temperature in Celsius degrees
"""
if (self.ls331_channel == LakeShore_t.Channel_A):
self.setASetPoint(temperature)
else:
self.setBSetPoint(temperature)
[docs] def wait(self):
"""
Wait...
"""
sleep(0)
[docs] def getLowLimitValue(self):
"""
Gets ...
Returns
-------
`float`
"""
# Mininum is 0 K... -272.15 .oC
return -272.15
[docs] def getHighLimitValue(self):
"""
Gets ...
Returns
-------
`float`
"""
# Unsure about maximum... let's put 325 K... 51.85 .oC
return 51.85