PLESTY Keithley 2410 SourceMeter
A PLESTY device module for the Keithley 2410 SourceMeter, a high-voltage source-measure unit (SMU). An SMU sources a voltage or a current and measures both at the same time. The 2410 sources up to 1100 V or 1.05 A and talks SCPI (the standard text command language of laboratory instruments) over VISA (the standard software layer for GPIB, serial and USB instruments) on GPIB or RS-232.
The source can put hazardous voltage on its terminals, so this module refuses before it acts. Read Safety rules before switching anything on.
This module replaces an older PLEXY driver for the same instrument. It is not backwards-compatible with it.
Supported hardware
| Instrument | Link | Notes |
|---|---|---|
| Keithley 2410 SourceMeter | GPIB or RS-232 | The preflight check requires MODEL 2410 and refuses other models |
Installation
git clone https://gitlab.com/plesty/hub/devices/keithley/plesty-k2410-source-meter.git
cd plesty-k2410-source-meter
uv sync
A VISA backend must be available to talk to a real instrument (for example NI-VISA, plus a
GPIB adapter for a GPIB link). The mock address needs none.
Configuration
The address of the instrument is configuration, not code. Copy .env.example to .env and
edit it:
| Variable | Default | Meaning |
|---|---|---|
K2410_ADDRESS |
GPIB0::24::INSTR |
VISA resource name of the instrument |
K2410_TCP_PORT |
5555 |
ZMQ port the device server binds for remote clients |
- GPIB:
GPIB0::<n>::INSTR. The factory GPIB address is 24; the front panel shows the current one under MENU > COMMUNICATION > GPIB. - RS-232:
ASRL<n>::INSTR. Set the instrument to 9600 baud, 8N1, CR terminator. - mock: the word
mockruns an in-memory simulator of the instrument, with no hardware.
Each value resolves as CLI argument, then environment variable.
Quick start
Run the device as a TCP server:
cp .env.example .env # set K2410_ADDRESS
uv run python -m plesty.k2410_source_meter
uv run python -m plesty.k2410_source_meter --address ASRL3::INSTR --tcp-port 5555
uv run python -m plesty.k2410_source_meter --address mock # simulator
Use it from Python (local, on the simulator):
from plesty.k2410_source_meter import Device
dev = Device(address="mock") # a VISA address such as "GPIB0::24::INSTR" for the instrument
dev.init()
dev.connect()
reading = dev.source_and_measure(
source_function="VOLT", level=5.0, compliance=1e-3, source_range=20.0
)
print(reading["voltage"], reading["current"])
dev.disconnect()
Preflight
Before the server binds its port, the module opens the configured address, reads the
identification string (*IDN?) and requires MODEL 2410. When the configured address does
not answer as a 2410 but another GPIB address does, the message names that address and tells
you to set K2410_ADDRESS to it; the address is never changed for you. --skip-preflight
serves anyway, for protocol work.
Safety rules
The 2410 answers a bad setting with an error-queue entry only after it has acted on the neighbouring ones, which is too late for a source that may carry 1100 V. So every rule below is checked in software before the first command is sent; a violation raises a refusal and sends nothing.
- Explicit compliance. The compliance is the limit on the quantity that is not sourced
(amperes while sourcing voltage, volts while sourcing current).
output_onis refused untilconfigure_sourceset one explicitly since connect. There is no default compliance. voltage_limitdefaults to 20 V. This is the instrument's hardware over-voltage protection. It is applied as 20 V on connect, so any higher voltage needs a deliberate write ofvoltage_limitfirst, while the output is off. A level above it is refused.output_onramps from 0 V. It switches the output on at 0 and steps up to the configured level (steps of at most 10 V, a tenth of the range, with a short wait between steps). A warning is logged whenvoltage_limitis above 30 V.- Operating boundary. Above 21 V the current compliance must be 21 mA or less; above 21 mA the voltage compliance must be 21 V or less.
- Compliance floor. A compliance may not be below 0.1 % of the measure range in force.
- Sourced quantity on the source range. The 2410 measures the quantity it sources on the
source range and rejects a measure range for it (error 823). So
voltage_measure_rangeand its_autoflag are refused while sourcing voltage, and the current ones while sourcing current; setvoltage_rangeorcurrent_rangeinstead. - No reading with the output off.
measurenever switches the output on. - Stepped level changes. With the output on,
set_levelwalks to the new level in steps. - Refusals when unsafe.
output_onis also refused while the instrument's error queue is not empty or, wheninterlockis on, while the interlock line is open. - Shutdown on failure.
safe_shutdownwalks the level to zero in steps and then switches the output off. Every failure with the output on, anddisconnect, do the same. A refusal changes nothing, so it does not shut down.
Parameters
Read with dev.query(name) and write with dev.write(name, value); dev.state returns all
of them at once. Values are in volts, amperes and seconds.
| Parameter | Type | Range / options | Default | Meaning |
|---|---|---|---|---|
source_function |
str | VOLT, CURR |
VOLT |
What is sourced |
voltage_level |
float, V | -1100 to 1100 | 0 | Level when sourcing voltage |
current_level |
float, A | -1.05 to 1.05 | 0 | Level when sourcing current |
voltage_range |
float, V | 0.2 to 1100 | 20 | Voltage source range |
voltage_range_auto |
bool | off | Instrument picks the range | |
current_range |
float, A | 1e-6 to 1.05 | 1e-4 | Current source range |
current_range_auto |
bool | off | Instrument picks the range | |
current_compliance |
float, A | 1e-9 to 1.05 | 1e-4 | Current limit while sourcing voltage |
voltage_compliance |
float, V | 2e-4 to 1100 | 1 | Voltage limit while sourcing current |
voltage_limit |
float, V | 20, 40, 100, 200, 300, 400, 500, 1100 | 20 | Over-voltage protection (1100 is none) |
sense_function |
str | VOLT_CURR, VOLT, CURR, RES |
VOLT_CURR |
What measure returns |
current_measure_range |
float, A | 1e-6 to 1.05 | 1e-4 | Current measure range |
current_measure_range_auto |
bool | on | Instrument picks the range | |
voltage_measure_range |
float, V | 0.2 to 1100 | 20 | Voltage measure range |
voltage_measure_range_auto |
bool | on | Instrument picks the range | |
nplc |
float, PLC | 0.01 to 10 | 1 | Integration time of one reading, in power line cycles |
source_delay |
float, s | 0 to 9999.999 | 0 | Settling time before each measurement |
remote_sense |
bool | off | 4-wire measurement at the load | |
terminals |
str | FRON, REAR |
FRON |
Which connector carries the output |
output_off_mode |
str | ZERO, NORM, GUAR, HIMP |
ZERO |
Terminal behaviour while off |
interlock |
bool | off | Hardware interlock of the rear Digital I/O connector | |
output_state |
bool | read only | off | Whether the output is on |
The compliance written by configure_source is what allows output_on; the value applied on
connect is a conservative baseline, not a choice. Change source_function, remote_sense,
terminals and voltage_limit only while the output is off.
Functions
| Function | Arguments | Returns |
|---|---|---|
get_identity() |
manufacturer, model, serial_number, firmware | |
configure_source(source_function, level, compliance, source_range=None) |
compliance is required | values read back; output stays off |
output_on() |
output state | |
output_off() |
output state; immediate, no step down | |
safe_shutdown(step=None, delay=None) |
output_state, level | |
set_level(level, step=None, delay=None) |
level read back | |
measure() |
voltage, current, resistance, timestamp, status, compliance, overrange, ovp_tripped | |
sweep(source_function, start, stop, points, compliance, spacing="LIN", delay=None, return_to_zero=True) |
2 to 2500 points | iv_curve, points, compliance_hit |
read_errors() |
errors, count (reads and clears the queue) |
A compliance flag of True on a reading means the source did not reach its setpoint, so the
reading is a limit and not a measurement.
Composite operations
Two methods of Device chain the functions above into a complete measurement. Both step the
source down and switch the output off afterwards, also on failure.
source_and_measure(source_function, level, compliance, source_range=None, keep_output_on=False)configures, switches on, takes one reading and switches off.run_iv_sweep(source_function, start, stop, points, compliance, spacing="LIN", delay=None, source_range=None)configures at the first level, switches on, sweeps and switches off.
The full generated reference (types, ranges, per-function arguments) is in the documentation
under docs/; build it locally with CI= uv run plesty check.
Open items for the field test
Verified on a real 2410 over GPIB (2026-10-20, open terminals, at most 5 V):
- The instrument accepts
:SYST:ERR:ALL?(read the whole error queue at once). :OUTP:INT:TRIP?answers 0 while the interlock is open and 1 while it is closed. The manual contradicts itself here; its SCPI reference table is right. With the interlock enabled and open,:OUTP ONis blocked with error 802.- The five-element
:READ?reading and its status bits;output_onstepping up from 0,set_level,safe_shutdownand a 6-point sweep; GPIB terminators.
Still to confirm, marked in the code:
- Whether
NONEis the right setting for the 1100 V over-voltage protection. - Whether
:READ?behaves as expected with the output off (the driver refuses it anyway). - The ramp step size (10 V) and wait (30 ms) on a real load, and compliance on a load.
- How the integration time is shared between the voltage, current and resistance functions.
- RS-232 line terminators.
License
LGPL-3.0-or-later. See LICENSE and COPYING.
Metadata
Release files for plesty-k2410-source-meter 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| plesty_k2410_source_meter-0.1.0.tar.gz | 230.5 kB | Without provenance | Details for plesty_k2410_source_meter-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| plesty_k2410_source_meter-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for plesty_k2410_source_meter-0.1.0-py3-none-any.whl |
Total release size: 301.0 kB
Release files / plesty_k2410_source_meter-0.1.0.tar.gz
| Download URL | plesty_k2410_source_meter-0.1.0.tar.gz |
|---|---|
| Size | 230.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d3899ac899618eb89c6260c6294e400a48368d18288fb2451a8e1b0e5112aac3
|
|
BLAKE2b-256 checksum How to use checksums |
5c2d3649beb6ff5213d6170a9f2e41dab89bf4934b0566a07f8f57203290bba0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / plesty_k2410_source_meter-0.1.0-py3-none-any.whl
| Download URL | plesty_k2410_source_meter-0.1.0-py3-none-any.whl |
|---|---|
| Size | 70.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1b1b0cb96b1e1149eceff859bc47ee0854d21266a1b73031ebf2c14aed6df6d0
|
|
BLAKE2b-256 checksum How to use checksums |
7ad5c6a1c2e69a01d8b3ea5c27c3559fbb4a7cd6866fdcfe2408cdeab31d358a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for plesty-k2410-source-meter 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.