High Level Interfaces

ICICLE currently provides a limited set of instrument-independent interfaces designed to allow external dependencies and scripts to use some functionality without needing to refer to a particular instrument’s command set. These are implemented manually on a per-instrument basis, and designed to provide as close to identical functionality on each instrument as possible. However, it cannot be guaranteed that they will be independent of initial conditions or instrument-specific behaviours (e.g. voltage/current ranges, measurement ranges, instrument-specific warnings/trips/states, etc.).

The Channel Concept

The high-level interfaces follow the Channel concept, in which a minimal working datapoint is provided to read from and/or write to. For example, a Multimeter might provide multiple read-only (Measure-) Channels: VOLT:DC, VOLT:AC, CURR:DC, RES (resistance), etc., depending on its capabilities. On the other hand, a cooling system may provide a writable temperature channel that is targeted, alongside read-only channels for the current setpoint temperature, the actual temperature, and the humidity.

Interfaces for channels should be scoped to the icicle.instrument.Instrument class, and will then be subclassed in relevant instruments to provide concrete implementations. For example, icicle.instrument.Instrument.MeasureChannel is subclassed by an explicit implementation in icicle.keithley2000.Keithley2000.MeasureChannel.

Channels should be instantiated via calls to the icicle.instrument.Instrument.channel() on a given instrument that the channel should be sourced from, passing the Instrument.<channel_type> superclass and a channel number and further required arguments. For instantiation examples, see the icicle.powerchannel_cli and icicle.measurechannel_cli command-line interfaces.

MeasureChannel

The icicle.instrument.Instrument.MeasureChannel class provides a simple interface for a single read-only value that may be read or measured from a device. This is usually used for e.g. the real-time voltage/current output of a power supply, or the response of a digital multimeter or temperature of a coldbox. Implementations must provide the value property, and may optionally also provide a status value (instrument-specific definition, but should remain stable over time if everything is ok), and a unit.

For more explicit API details, see the icicle.instrument.Instrument.MeasureChannel API reference.

PowerChannel

The icicle.instrument.Instrument.PowerChannel class represents a singular power output on a power supply or similar device. It encompasses a setpoint for voltage, current, and limits on each, as well as two MeasureChannel object to allow measurements of the actual output voltage and current. In addition, voltage and current trip conditions may be queried and/or reset, and again a device-dependent status is available.

For more explicit API details, see the icicle.instrument.Instrument.PowerChannel API reference.

TemperatureChannel

The icicle.instrument.Instrument.TemperatureChannel class represents a singular temperature control variable on a power supply or similar device. It encompasses a setpoint for temperature_setpoint and speed. The latter is currently a device-dependent control variable setting something like a pump speed or PID control variables in the underlying device.

For more explicit API details, see the icicle.instrument.Instrument.TemperatureChannel API reference.

MeasureChannelWrapper

The icicle.instrument.Instrument.MeasureChannelWrapper interface is designed as a unique way to wrap MeasureChannel objects in order to respond to measurement requests (before or after) via a secondary instrument, or in order to transform the measurement output. For example, connections of particular channels to a multimeter via a RelayBoard are well expressed using the MeasureChannelWrapper interface, as may be seen for example in icicle.relay_board.RelayBoard.MeasureChannelWrapper. The API for MeasureChannelWrapper is still considered WIP (work-in-progress), and may be subject to revision or change.

For more explicit API details, see the icicle.instrument.Instrument.MeasureChannelWrapper API reference.

Instantiation

These interfaces can be instantiated via the icicle.instrument.Instrument.channel() factory, and are tied to the instrument in terms of lifetime on instantiation. Destroying or removing a device will also unload all associated Instrument.Channel derivatives.

The factory can be used with the following syntax instrument.channel(CHANNEL_TYPE, CHANNEL, ...). The additional arguments pass channel-specific parameters, such as measure_type for a Instrument.MeasureChannel instance, and wrapped_channel as well as wrapper_type for Instrument.MeasureChannelWrapper. Here’s an example:

instrument = ICICLE.TTI(...)
output1 = instrument.channel(Instrument.PowerChannel, 1)
output2 = instrument.channel("PowerChannel", 2)
monitor_voltage1 = instrument.channel("MeasureChannel", 1, measure_type='VOLT:DC')