This blog looks at the Keithley 2450 SMU’s remote interfaces and programming capability.

 

USB Connectivity

The Keithley 2450 offers both a front panel USB-A connection and a rear panel USB-B connection. The front panel supports the use of USB Mass Storage Devices with FAT/FAT32 format for saving buffer data, arbitrary data from executing scripts, screenshots and configuration data. It is also used for loading scripts and updated firmware.

 

The rear USB connection allows the device to be commanded through an USB Test and Measurement Class (IVI) driver, usually supplied by the installed system VISA library (e.g. NI-VISA). This allows for connected direct remote control of the device using the SCPI or Test Script Processor (TSP) command-sets.

The Keithley 2450 identifies with a VID of 05E6, PID of 2450 and REV of 0100.

 

LXI-LAN Connectivity

The instrument supports network connectivity, supporting the LXI version 1.4 Core 2011 at launch and version 1.5 Device Specification 2016 according to the latest firmware (1.7.1e). The web interface is quite powerful and functional compared to other instruments I have used in the past, offering an array of features for those who are not inclined to program.

 

Connecting to the IP-address of the instrument in a web browser brings up the web interface.

The homepage provides a simple summary of the instrument’s details and last LXI message. From this page, a number of options are provided along the sidebar navigation.

The admin section allows for configuration of an access password, date and time.

The LXI page offers a quick rundown of the instrument’s details including model, manufacturer, serial, description, LXI version/features, hostname, address, firmware and VISA resource strings. An ID button is also provided to make it easy to identify the instrument in a rack.

The sub-pages allow for checking and modifying the IP address configuration of the instrument and reading the error log.

The virtual front panel allows for interaction with the instrument as if you are at the front panel. It also allows downloading screenshots by right-clicking the LCD area. The refresh rate of the web panel is relatively decent, managing a few screens per second, making it a very convenient way to interact with the front panel of the instrument in a remote setting or for use in educational or remote-support circumstances.

You can also send commands to the instrument from the web interface and view the output.

The web interface also supports downloading the contents of the memory buffers of the instrument directly. This means that you could avoid the “chore” of needing to plug in a USB stick or writing a program to download the recorded information – a very useful feature.

Finally, there is the help feature, which provides a basic HTML page of help, but is not particularly necessary as the web interface is very intuitive to use.

 

As the instrument supports direct socket connections and VXI-11, this allows the instrument to be commanded over the network using SCPI or TSP commands in much the same way as USB, although perhaps with increased latency and jitter. This allows more flexible placement of the instrument and easier sharing of the instrument amongst multiple users. Later features, such as HiSLIP which improves VXI-11 performance, do not appear to be supported.

 

In fact, I did all of my testing with the unit in KickStart 2 and with my own scripts in the Instrument Performance Testing chapter via LAN connectivity which never faulted despite being continuously running for up to two weeks uninterrupted.

 

An nmap scan of the instrument revealed the following open ports:

PORT     STATE SERVICE     VERSION
23/tcp   open telnet
80/tcp   open http        Allegro RomPager 4.62
|_http-favicon: Unknown favicon MD5: D06A75D73D7D56A130EC48928EB4DFC5
|_http-generator: HTML Tidy for Windows (vers 1st July 2004), see www.w3.org
| http-methods: 
|_  Supported Methods: GET HEAD POST
|_http-title: Keithley Instruments
111/tcp  open rpcbind     2 (RPC #100000)
| rpcinfo: 
|   program version   port/proto service
|   100000 2            111/tcp  rpcbind
|_  395183 1           1024/tcp  
1024/tcp open  kdm         1 (RPC #395183)
1025/tcp open  NFS-or-IIS?
5025/tcp open  scpi-raw?
| fingerprint-strings: 
|   GenericLines: 
|_    FAILURE: A command from another interface is running, use ABORT to stop it
5030/tcp open  surfpass?
5044/tcp open  lxi-evntsvc?
111/udp  open rpcbind     2 (RPC #100000)
| rpcinfo: 
|   program version   port/proto service
|   100000 2            111/tcp  rpcbind
|_  395183 1           1024/tcp  
5353/udp open  mdns        DNS-based service discovery
| dns-service-discovery: 
|   23/tcp scpi-telnet
|     txtvers=1
|     Manufacturer=Keithley Instruments
|     Model=2450
|     SerialNumber=xxxxxxxx
|     FirmwareVersion=1.7.1e
|     Address=192.168.xxx.xxx
|   80/tcp http
|     txtvers=1
|     path=/
|     Manufacturer=Keithley Instruments
|     Model=2450
|     SerialNumber=xxxxxxxx
|     FirmwareVersion=1.7.1e
|     Address=192.168.xxx.xxx
|   80/tcp lxi
|     txtvers=1
|     Manufacturer=Keithley Instruments
|     Model=2450
|     SerialNumber=xxxxxxxx
|     FirmwareVersion=1.7.1e
|     Address=192.168.xxx.xxx
|   1024/tcp vxi-11
|     txtvers=1
|     Manufacturer=Keithley Instruments
|     Model=2450
|     SerialNumber=xxxxxxxx
|     FirmwareVersion=1.7.1e
|     Address=192.168.xxx.xxx
|   5025/tcp scpi-raw
|     txtvers=1
|     Manufacturer=Keithley Instruments
|     Model=2450
|     SerialNumber=xxxxxxxx
|     FirmwareVersion=1.7.1e
|_    Address=192.168.xxx.xxx

 

The instrument has quite a few services available, including telnet, HTTP, RPC, SCPI, LXI/VXI and mDNS. It survived the nmap scan without abnormal behaviour, so it is at least a bit more robust than some other LAN connectivity implementations and the password security feature which can be enabled to lock access to the instrument’s commands is better than most which have no security at all.

 

TSP-Link, GPIB and Digital I/O Connectivity

Additionally, the 2450 supports the use of TSP-Link, a Keithley-specific instrument bus which can be used to link together multiple SMUs in a daisy-chain configuration. This bus has the advantages of being able to pass commands and synchronised hardware trigger signals to the downstream devices, allowing the group of SMUs to behave more akin to a single multi-channel instrument with tight synchronisation and a main SMU that can execute a program across all connected units. This mode of connection is no longer supported by Keithley KickStart 2 software which instead requires direct connection of each instrument, but can still be used in end-user programs through either SCPI or TSP scripts.

 

The older industry standard GPIB bus is also supported. While perhaps considered more of a “legacy” system which can be rather expensive to implement nowadays, it is supported as it also offers hardware trigger lines which provide tighter synchronisation compared to USB or LAN connectivity. It also allows for better backwards compatibility with near-drop-in replacement modes for replacing older model SMUs with minimal programming changes.

 

Finally, the unit also offers digital I/O connectivity through a 9-pin DE-9 female connector on the rear of the device. This offers six lines of GPIO, a current-limited 5V power supply, a Vext line with flyback diode protection for use with relays and a ground line. All GPIO lines can be configured as input, output or open-drain for use as digital bits or triggers. This allows the unit to receive and send digital I/O to both Keithley and non-Keithley equipment. This may be especially useful in production scenarios when dealing with handler interfaces, especially because of the ability to use these I/Os under SCPI or TSP control. This can also be used with an optional cable to provide connectivity with earlier Keithley TriggerLink buses.

 

SCPI versus Keithley Test Script Processor (TSP) Programming

Traditionally, remote controllable test equipment typically uses the SCPI command set as a quasi-standardised format for commands and responses. This standard has existed for a long time and is simple to implement, being mostly an ASCII command-response style exchange and continues to remain popular due to the standardisation of core commands across instruments of a particular category. This means that programs which are written to take advantage of the core SCPI commands could run across different instruments, although in reality, subtle differences in implementations may cause issues. This is why “higher level” abstractions are used in certain environments (e.g. LabVIEW) which require instrument drivers to bridge the gap between this and the command-set of the instrument.

 

However, most commands in the SCPI model generally rely on a powerful “host” controlling instruments. In this arrangement, the program logic and flow is run by the host, while the actual measurements and outputs are generated by the instruments on command. In essence, the instrument is a “dumb” device which follows what the host requests. This works fine for many applications, but has some drawbacks especially because of the latency of command generation, transmission and processing causes bottlenecks in testing speed. Furthermore, ensuring synchronisation between different devices can be difficult in that arrangement.

 

Keithley have decided to think a little outside the box and introduced their TSP system. This is an implementation of a Lua-based programming/scripting language on the test instrument itself which offers an alternative to the traditional SCPI command set. All commands offered through SCPI have a TSP-based equivalent, documented in the reference manual, but the big advantage is that conditional structures such as branches (ifs) and loops (while, for) can be implemented in the script for the instrument to execute thus reducing the latency and unnecessary data flow. Combined with the big memory buffers of the instrument which can handle 100,000 time-stamped readings by default but can be expanded further, it is possible to make use of the full speed of the instrument to run a test and store the data in the buffer, freeing the program from bus-imposed bottlenecks.

 

But an even more interesting idea is the possibility of eschewing the computer altogether and running tests using the SMU as the main host. This is a possibility as these TSP commands can be saved into a script file and loaded via USB onto the SMU for execution. The environment provides the capability of logging values or recording arbitrary data to the USB as well, making it fully functional for a variety of experiments. With such power comes great responsibility – to help users with this, Keithley provides the free Test Script Builder (TSB) software which I look at in the next section.

 

On the whole, TSP appears to be a rather innovative and powerful idea, but the biggest downside is that it is only available on Keithley instruments and is not part of a broader standard. But that doesn’t mean that all is lost if you have devices from other vendors – check out the chapter on I-V Tracer App Comparison to see how tspnet commands can be used to work with other instruments.

 

Keithley Test Script Builder (TSB)

To help users create and debug their TSP programs, Keithley provides a free program called the Test Script Builder (TSB) which provides an Eclipse-based IDE and connected interactive debugger.

The software is a sizeable download. Installation is as easy as following the instructions and rebooting once completed.

The user interface will be familiar to any users of Eclipse. Helpfully, Keithley have provided a number of sample TSP programs which perform various tests, many of them targeted at other SMU and DMM models. It is definitely a good place to get started. The Instrument Reference Manual provides the full list of supported commands, while the programming syntax basically conforms to Lua standards.

 

Experiment: Keithley Karaoke with the 2450

To show how versatile TSP is, I thought I’d break with tradition about being serious and instead try something a bit different … more in line with my previous element14 Project14 postings. Say hello to Keithley Karaoke!

In case you’re curious, this is coded entirely using TSP commands. A MIDI file was parsed to get the notes, that was converted to TSP using a short Python program into beeper.beep() commands. Using the TSB, I debugged the program in real-time, allowing for me to set breakpoints where I could throw in display.settext() commands to write out the lyrics.

The finalised script was written to a USB and executed directly from there. I came up with the idea for this demo purely because we were debugging a hardware issue with the channel outputs and I decided to discontinue using them until I received further advice from Keithley due to unusual behaviour. As this doesn’t involve the outputs at all, this proved to be the ideal demo to try and get my feet wet with TSP programming.

 

If you’re interested in trying this yourself, the code for the demo is below:

-- Keithley Karaoke Demo by Gough Lui (goughlui.com) - June 2020
-- As Part of the element14 RoadTest Program (on a diversion)
-- Note - Display top line 20 char, bottom line 32 char

display.clear()
display.settext(display.TEXT1, "Keithley Karaoke")
display.settext(display.TEXT2, "Demo by Gough Lui - Jun 2020")
delay(2.0)
display.settext(display.TEXT1, "Survivor")
display.settext(display.TEXT2, "by Destiny's Child")
delay(2.0)
-- Now that you're out of my life, I'm so much better.
display.settext(display.TEXT1, "Now that you're out")
display.settext(display.TEXT2, "of my life, I'm so much better.")
beeper.beep(0.269,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.087,466.16)
delay(0.095)
beeper.beep(0.178,493.88)
delay(0.004)
beeper.beep(0.087,466.16)
delay(0.095)
beeper.beep(0.064,415.30)
delay(0.117)
beeper.beep(0.360,415.30)
delay(0.004)
beeper.beep(0.064,415.30)
delay(0.117)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,493.88)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.186)
-- You thought that I'd be weak without you, but I'm stronger.
display.settext(display.TEXT1, "You thought that I'd")
display.settext(display.TEXT2, "be weak without you,")
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,392.00)
delay(0.061)
beeper.beep(0.087,311.13)
delay(0.095)
beeper.beep(0.246,392.00)
delay(0.117)
display.settext(display.TEXT1, "but I'm stronger.")
display.settext(display.TEXT2, " ")
beeper.beep(0.178,392.00)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.367)
-- You thought that I'd be broke without you, but I'm richer.
display.settext(display.TEXT1, "You thought that I'd")
display.settext(display.TEXT2, "be broke without you,")
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,493.88)
delay(0.004)
beeper.beep(0.087,466.16)
delay(0.095)
beeper.beep(0.064,415.30)
delay(0.117)
display.settext(display.TEXT1, "but I'm richer.")
display.settext(display.TEXT2, " ")
beeper.beep(0.360,415.30)
delay(0.004)
beeper.beep(0.178,311.13)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,493.88)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.367)
-- You thought that I'd be sad without you, I laugh harder.
display.settext(display.TEXT1, "You thought that I'd")
display.settext(display.TEXT2, "be sad without you,")
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.269,392.00)
delay(0.095)
beeper.beep(0.087,392.00)
delay(0.095)
beeper.beep(0.269,392.00)
delay(0.095)
display.settext(display.TEXT1, "I laugh harder.")
display.settext(display.TEXT2, " ")
beeper.beep(0.178,392.00)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.087,466.16)
delay(0.095)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.367)
-- You thought I wouldn't grow without you, now I'm wiser.
display.settext(display.TEXT1, "You thought I")
display.settext(display.TEXT2, "wouldn't grow without you,")
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,493.88)
delay(0.004)
beeper.beep(0.087,466.16)
delay(0.095)
beeper.beep(0.064,415.30)
delay(0.117)
beeper.beep(0.246,415.30)
delay(0.117)
display.settext(display.TEXT1, "now I'm wiser.")
display.settext(display.TEXT2, " ")
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,493.88)
delay(0.004)
beeper.beep(0.303,554.37)
delay(0.061)
beeper.beep(0.178,493.88)
delay(0.186)
-- Thought that I'd be helpless without you, but I'm smarter.
display.settext(display.TEXT1, "Thought that I'd be")
display.settext(display.TEXT2, "helpless without you,")
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.087,392.00)
delay(0.095)
beeper.beep(0.087,392.00)
delay(0.095)
beeper.beep(0.087,392.00)
delay(0.095)
beeper.beep(0.223,392.00)
delay(0.140)
display.settext(display.TEXT1, "but I'm smarter.")
display.settext(display.TEXT2, " ")
beeper.beep(0.178,392.00)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.064,466.16)
delay(0.117)
beeper.beep(0.178,466.16)
delay(0.004)
-- You thought that I'd be stressed without you, but I'm chillin'.
display.settext(display.TEXT1, "You thought that I'd be")
display.settext(display.TEXT2, "stressed without you,")
beeper.beep(0.178,415.30)
delay(0.367)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.246,493.88)
delay(0.117)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.360,493.88)
delay(0.004)
beeper.beep(0.087,415.30)
delay(0.095)
display.settext(display.TEXT1, "but I'm chillin'.")
display.settext(display.TEXT2, " ")
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.178,493.88)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.367)
-- You thought I wouldn't sell without you, sold 9 million.
display.settext(display.TEXT1, "You thought I ")
display.settext(display.TEXT2, "wouldn't sell without you,")
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.087,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.246,392.00)
delay(0.117)
beeper.beep(0.064,392.00)
delay(0.117)
beeper.beep(0.246,392.00)
delay(0.117)
beeper.beep(0.178,392.00)
delay(0.004)
display.settext(display.TEXT1, "sold 9 million.")
display.settext(display.TEXT2, " ")
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.064,466.16)
delay(0.117)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.178,415.30)
delay(0.367)
-- I'm a survivor. I'm not gon' give up.
display.settext(display.TEXT1, "I'm a survivor.")
display.settext(display.TEXT2, "I'm not gon' give up.")
beeper.beep(0.155,415.30)
delay(0.117)
beeper.beep(0.155,415.30)
delay(0.117)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,493.88)
delay(0.061)
beeper.beep(0.223,415.30)
delay(0.140)
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.155,415.30)
delay(0.117)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,493.88)
delay(0.061)
beeper.beep(0.269,415.30)
delay(0.095)
-- I'm not gon' stop. I'm gon' work harder.
display.settext(display.TEXT1, "I'm not gon' stop.")
display.settext(display.TEXT2, "I'm gon' work harder.")
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.155,415.30)
delay(0.117)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.269,392.00)
delay(0.095)
beeper.beep(0.303,392.00)
delay(0.061)
beeper.beep(0.155,392.00)
delay(0.117)
beeper.beep(0.178,392.00)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,466.16)
delay(0.061)
beeper.beep(0.246,415.30)
delay(0.117)
-- I'm a survivor. I'm gonna make it.
display.settext(display.TEXT1, "I'm a survivor.")
display.settext(display.TEXT2, "I'm gonna make it.")
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.269,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.303,493.88)
delay(0.061)
beeper.beep(0.269,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,493.88)
delay(0.061)
beeper.beep(0.303,415.30)
delay(0.061)
-- I will survive. Keep on survivin'.
display.settext(display.TEXT1, "I will survive.")
display.settext(display.TEXT2, "Keep on survivin'.")
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.269,392.00)
delay(0.095)
beeper.beep(0.269,392.00)
delay(0.095)
beeper.beep(0.155,392.00)
delay(0.117)
beeper.beep(0.178,392.00)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,466.16)
delay(0.061)
beeper.beep(0.155,415.30)
delay(0.208)
-- I'm a survivor. I'm not gon' give up.
display.settext(display.TEXT1, "I'm a survivor.")
display.settext(display.TEXT2, "I'm not gon' give up.")
beeper.beep(0.087,415.30)
delay(0.186)
beeper.beep(0.269,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.303,493.88)
delay(0.061)
beeper.beep(0.178,415.30)
delay(0.186)
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.133,415.30)
delay(0.140)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,493.88)
delay(0.061)
beeper.beep(0.178,415.30)
delay(0.186)
-- I'm not gon' stop. I'm gon' work harder.
display.settext(display.TEXT1, "I'm not gon' stop.")
display.settext(display.TEXT2, "I'm gon' work harder.")
beeper.beep(0.155,415.30)
delay(0.117)
beeper.beep(0.155,415.30)
delay(0.117)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.269,392.00)
delay(0.095)
beeper.beep(0.223,392.00)
delay(0.140)
beeper.beep(0.155,392.00)
delay(0.117)
beeper.beep(0.178,392.00)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,466.16)
delay(0.061)
beeper.beep(0.246,415.30)
delay(0.117)
-- I'm a survivor. I'm gonna make it.
display.settext(display.TEXT1, "I'm a survivor.")
display.settext(display.TEXT2, "I'm gonna make it.")
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.303,493.88)
delay(0.061)
beeper.beep(0.269,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.269,415.30)
delay(0.004)
beeper.beep(0.178,466.16)
delay(0.004)
beeper.beep(0.303,493.88)
delay(0.061)
beeper.beep(0.269,415.30)
delay(0.095)
-- I will survive. Keep on survivin'.
display.settext(display.TEXT1, "I will survive.")
display.settext(display.TEXT2, "Keep on survivin'.")
beeper.beep(0.155,415.30)
delay(0.117)
beeper.beep(0.178,415.30)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,392.00)
delay(0.061)
beeper.beep(0.269,392.00)
delay(0.095)
beeper.beep(0.155,392.00)
delay(0.117)
beeper.beep(0.178,392.00)
delay(0.095)
beeper.beep(0.178,415.30)
delay(0.004)
beeper.beep(0.303,466.16)
delay(0.061)
beeper.beep(0.133,415.30)
delay(0.231)
display.settext(display.TEXT1, "Hope you enjoyed")
display.settext(display.TEXT2, "this unexpected detour.")

 

Conclusion

The Keithley 2450 SMU offers a vast array of remote-control connectivity options, including USB, LAN, GPIB, TSP-Link and Digital I/O. The USB interface allows for front-panel usage of USB Mass Storage Devices in FAT/FAT32 format for recording data, settings and screenshots from the instrument and for loading scripts and firmware upgrades. The rear USB interface allows for use as a USB-TMC compliant instrument. The instrument’s LAN interface is compliant with LXI Version 1.5 (2016) as of the latest firmware upgrade, offering a powerful web interface, direct socket and VXI-11 connectivity. The web interface is especially commendable for its implementation of the virtual front panel and buffer download capabilities which makes remote working with the instrument without programming a breeze. The unit offers GPIB connectivity to ensure near-drop-in backwards compatibility with older SMUs with a minimal amount of programming changes while offering an industry-standard bus with hardware trigger synchronisation. Alternatively, the Keithley-specific TSP-Link daisy-chain bus is also supported, along with TriggerLink using an adapter with the digital I/O port. The digital I/O port offers six I/O lines, configurable as input, output or open collector for use as digital bits or trigger, and additionally a Vext line for use with relays, making it a very versatile arrangement for interfacing with both Keithley and non-Keithley equipment.

 

During testing, I made use of the LAN interface extensively and found it to be reliable throughout the two-week long command sequences used in the Instrument Performance Testing chapter. The consideration of security of the LAN interface through the use of passwords and security levels to prevent authorised use of the instrument is also a first amongst the instruments I have tested, making it less likely for instruments to be accidentally or intentionally misused.

 

But by far the biggest asset of the 2450 are its large memory buffers, dual-dialect support for SCPI commands and Test Script Processor (TSP) commands, and implementation of TSP scripts through the Test Script Builder (TSB). This allows a break away from the traditional SCPI model of smart host controlling “dumb” instruments, which suffers from bottlenecks due to command transmission and processing latencies which often limit the speed at which these systems can operate and impose synchronisation challenges. Instead, by making a Lua-based programming/scripting language interpreter in the instrument accessible to the user, these issues can be overcome by allowing the test logic (branches, loops) to execute on the instrument directly, storing results into a capacious buffer or front panel USB. When combined with the ability to prepare and debug scripts interactively through TSB, it is a fully-featured Eclipse-based development environment for TSP scripts which makes transitioning from SCPI just that little bit easier. The authored scripts can be saved to USB for loading and executing on the SMU, thereby also allowing users to eschew the use of a PC if they desire.

 

The only downside to TSP is that it is a Keithley-specific feature that is not otherwise standardised, so any scripts developed are “tied” to Keithley equipment with TSP capabilities. However, that may not be such a big issue for some, as there are ways to use TSP on a Keithley instrument to provide remote control of non-Keithley instruments through the use of tspnet commands. I show how this is done in the chapter on I-V Tracer App Comparison. It’s definitely a powerful feature, and if you don’t like it, well you still have good-ol’ SCPI.

 

---

This blog is part of the Keithley 2450 SMU with I-V Tracer RoadTest.