"""
``Instrument`` representation of a Keithley 6220 DC Current Source
"""
__all__ = ['Keithley6220']
import logging
from math import fabs
from src.core import instrument as inst
from src.core.action import Action, ActionSpec, ParameterSpec
from src.core.instrument import visa
MIN_CURRENT = 0.105
CURRENT_STRING = ':SOURce:CURRent:LEVel:IMMediate:AMPlitude'
[docs]class Keithley6220(inst.Instrument):
"""Driver for a Keithley 6220 current source."""
def __init__(self, experiment, name='Keithley6220: DC current source',
spec=None):
super(Keithley6220, self).__init__(experiment, name, spec)
self._instrument = None
self._info = 'Name: ' + self.getName()
self._info += '\nModel: Keithley6220 DC current source'
[docs] def initialize(self):
"""Open the communication channel."""
self._instrument = visa.instrument(self.getSpecification()[0].value)
self._info += '\n' + self._instrument.ask('*IDN?')
[docs] def finalize(self):
"""Close the communication channel."""
self._instrument.write(CURRENT_STRING + ' 0')
[docs] def getAddress(self):
"""Return the instrument's VISA resource address."""
return self.getSpecification()[0].value
[docs] def setCurrent(self, current):
"""Set the current source's output current."""
if fabs(current) <= MIN_CURRENT:
logging.error(self.getName() + ': Current ' + str(current) +
' out of range. Setting to zero.')
self._instrument.write(CURRENT_STRING + ' 0')
else:
self._instrument.write(CURRENT_STRING + ' %.6e' % current)
return ()
[docs] def getCurrent(self):
"""Read the output current from the current source."""
return (float(self._instrument.ask(CURRENT_STRING + '?')), )
[docs] def setOutput(self, output):
"""Toggle the output current on and off."""
self._instrument.write(':OUTPut ' + output)
return ()
[docs] def getActions(self):
"""Get the list of supported actions."""
return [
ActionSpec('set_current', Action,
{'experiment': self._expt,
'instrument': self,
'description': 'Set current',
'inputs': [
ParameterSpec('current',
{'experiment': self._expt,
'description': 'Current',
'formatString': '%.6e',
'binName': 'Current',
'binType': 'column'})
],
'string': 'Set current to $current.',
'method': self.setCurrent}
),
ActionSpec('get_current', Action,
{'experiment': self._expt,
'instrument': self,
'description': 'Get current',
'outputs': [
ParameterSpec('current',
{'experiment': self._expt,
'description': 'Current',
'formatString': '%.6e',
'binName': 'Current',
'binType': 'column'})
],
'string': 'Read current.',
'method': self.getCurrent}
),
ActionSpec('set_outp', Action,
{'experiment': self._expt,
'instrument': self,
'description': 'Toggle current output',
'inputs': [
ParameterSpec('output',
{'experiment': self._expt,
'description': 'Output',
'formatString': '%s',
'value': 'On',
'allowed': ['On', 'Off']})
],
'string': 'Turn current output $output.',
'method': self.setOutput}
)
]
#===========================================================================
# Class methods
#===========================================================================
@classmethod
def getRequiredParameters(cls):
return [inst.InstrumentParameter('VISA Address', '',
inst.getVisaAddresses, '%s')]