Description

The code is organized in 2 layers; a low-level communication layer, and a highter level which allows to describe precisely a GPIB device, communicate asynchronously with it, etc.

Low level

The low level communication process is managed by the module pygpibtoolkit.prologix, in which there is a class names GPIB that knows how to initialize the GPIB device, send commands and receive data from the bus, perform GPIB polls, etc.

Example:

from pygpibtoolkit.prologix import GPIB
cnx = GPIB() # by default, it is the controller in charge
idn = cnx.send_command("*IDN?", 12) # sends the idn command to device at GPIBaddress 12
print idn

cnx.set_address(12) # we will talk to this device 12 for a while
datablock = cnx.send_command('DDBN')

if cnx.check_srq():
    print "A Service Request has been sent"

But that’s basically it. You can send commands to devices, wait for an answer, check SRQ line.

High level

The high level API is organized around a GPIB controller class (pygpibtoolkit.gpibcontroller.GPIBController) which is responsible for managing every connection stuff. It will run a thread responsible for communication processes, will regularly check SRQ line (and respond accordingly, with ability to register callbacks), etc.

It will also provide a send_command method, but this latter will have a much higher means: the operation can be done synchronously or asynchronously (with a callback to call upon completion), etc.

It will also hold device managers for found devices on the GPIB bus.

Each device manager is a class responsible for communication specifically with a specified device. It will provide (if the device manager has been written) simple ways to send GPIB commands of the device; every GPIB command will be presented as a method of the manager.

Talking with a device can then be as simple as:

from pygpibtoolkit.gpibcontroller import GPIBController
c = GPIBController()
devices = c.detect_devices()
# devices is a dict which keys are the GPIB addresses
# and values, the managers for each device
hp3562 = devices[3]

# ok, let's tell the HP3562 to put channel 1 in AC couplig mode,
hp3562.C1AC("AC")
# and put it in linear measure mode
hp3562.LNRS() #EMEAS("LINEAR RES")
# and Freq response mode
hp3562.FRQR()
# set span freq and center freq
hp3562.FRS("10khz")
hp3562.CF("7212hz")
# then get the resulting trace data block
trace = hp3562.DDBN()
# which we can easily display
header, data = hp3562.decode_trace(trace)
import pylab
pylab.plot(data)
pylab.show()

# ok, let's stop gracefully our cession
c.stop()