Skip to content

Commit

Permalink
Merge pull request #614 from BCDA-APS/559-Eurotherm-2216e
Browse files Browse the repository at this point in the history
Eurotherm 2216e temperature controller
  • Loading branch information
prjemian authored Jan 10, 2022
2 parents d88ed38 + 5e903ef commit dc41894
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/unit-tests-epics-base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
- name: Install dependencies
run: |
$CONDA/bin/conda install epics-base --name $ENV_NAME
$CONDA/bin/conda install epics-base "readline!=8.1.2" --name $ENV_NAME
$CONDA/bin/conda list -r --name $ENV_NAME
env:
ENV_NAME: anaconda-test-env
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# local developer code
dev_*.py

db/
log/
Expand Down
1 change: 1 addition & 0 deletions apstools/devices/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from .axis_tuner import AxisTunerException
from .axis_tuner import AxisTunerMixin
from .description_mixin import EpicsDescriptionMixin
from .eurotherm_2216e import Eurotherm2216e
from .kohzu_monochromator import KohzuSeqCtl_Monochromator
from .linkam_controllers import Linkam_CI94_Device
from .linkam_controllers import Linkam_T96_Device
Expand Down
92 changes: 92 additions & 0 deletions apstools/devices/eurotherm_2216e.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
"""
Eurotherm 2216e Temperature Controller
++++++++++++++++++++++++++++++++++++++
The 2216e is a temperature controller from Eurotherm.
.. autosummary::
~Eurotherm2216e
According to their website, the [Eurotherm 2216e Temperature
Controller](https://www.eurothermcontrollers.com/eurotherm-2216e-series-controller-now-obsolete/)
is obsolete. Please see replacement
[EPC3016](https://www.eurothermcontrollers.com/eurotherm-epc3016-1-16-din-process-and-temperature-controller/)
in our [EPC3000 Series](https://www.eurothermcontrollers.com/epc3000-series).
New in apstools 1.6.0.
"""

import logging

from ophyd import Component
from ophyd import EpicsSignal
from ophyd import EpicsSignalRO
from ophyd import Signal

from .positioner_soft_done import PVPositionerSoftDoneWithStop

logger = logging.getLogger(__name__)


class Eurotherm2216e(PVPositionerSoftDoneWithStop):
"""
Eurotherm 2216e Temperature Controller
"""

# temperature value in dC, needs conversion: readback = 0.1 * sensor
sensor = Component(EpicsSignalRO, "SetPointSensor", kind="omitted")
readback = Component(Signal, value=0, kind="hinted")
setpoint = Component(
EpicsSignal,
"SetPointTemp",
kind="hinted",
write_pv="SetPointTempWrite",
put_complete=True,
)
# temp1 & temp2 PVs have no useful values : ignore here
# temp1 = Component(EpicsSignalRO, "Temp1", kind="hinted")
# temp2 = Component(EpicsSignalRO, "Temp2", kind="hinted")
power = Component(
EpicsSignal,
"SetPointPower",
kind="config",
write_pv="SetPointPowerWrite",
put_complete=True,
)

mode = Component(
EpicsSignal,
"SetPointSensor",
kind="config",
write_pv="ModeWrite",
string=True,
)
program_number = Component(EpicsSignalRO, "ProgramNumber", kind="config")
# program_status = Component(
# EpicsSignalRO,
# "ProgramStatus",
# kind="config",
# string=True
# )

target = None # remove from PVPositionerSoftDoneWithStop

def cb_sensor(self, *args, **kwargs):
"units: Convert dC from sensor to C"
self.readback.put(0.1 * self.sensor.get())

def __init__(
self, prefix="", *, tolerance=None, update_target=True, **kwargs
):
super().__init__(
prefix=prefix,
readback_pv="ignoreRBV",
setpoint_pv="ignore",
tolerance=tolerance,
update_target=update_target,
**kwargs
)
self.update_target = False # remove from PVPositionerSoftDoneWithStop
self.sensor.subscribe(self.cb_sensor)
self.tolerance.put(1) # because setpoint is integer
2 changes: 1 addition & 1 deletion apstools/devices/positioner_soft_done.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ def inposition(self):

def stop(self, *, success=False):
"""
Hold the current readback when stop() is called and not inposition.
Hold the current readback when stop() is called and not :meth:`inposition`.
"""
if not self.inposition:
self.setpoint.put(self.position)
Expand Down
28 changes: 28 additions & 0 deletions apstools/devices/tests/test_eurotherm_2216e.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""
test the Eurotherm 2216e device support
Hardware is not available so test with best efforts
"""

from .. import eurotherm_2216e

IOC = "gp:"
PV_PREFIX = f"phony:{IOC}2216e:"


def test_device():
euro = eurotherm_2216e.Eurotherm2216e(PV_PREFIX, name="controller")
assert not euro.connected
assert euro.tolerance.get() == 1

cns = """
readback setpoint
""".split()
assert sorted(euro.read_attrs) == sorted(cns)

cns += """
sensor
done tolerance report_dmov_changes
mode power program_number
""".split()
assert sorted(euro.component_names) == sorted(cns)
4 changes: 4 additions & 0 deletions docs/source/api/_devices.rst
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ Temperature Controllers

.. autosummary::

~apstools.devices.eurotherm_2216e.Eurotherm2216e
~apstools.devices.linkam_controllers.Linkam_CI94_Device
~apstools.devices.linkam_controllers.Linkam_T96_Device
~apstools.devices.ptc10_controller.PTC10AioChannel
Expand Down Expand Up @@ -168,6 +169,9 @@ All Submodules
.. automodule:: apstools.devices.description_mixin
:members:

.. automodule:: apstools.devices.eurotherm_2216e
:members:

.. automodule:: apstools.devices.kohzu_monochromator
:members:

Expand Down
1 change: 1 addition & 0 deletions environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ dependencies:
- pyqt =5
- pyRestTable
- qt =5
- readline !=8.1.2
- spec2nexus
- sphinx
- pip:
Expand Down

0 comments on commit dc41894

Please sign in to comment.