Skip to content

Instantly share code, notes, and snippets.

@kitmonisit
Created April 4, 2012 13:42
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save kitmonisit/2301119 to your computer and use it in GitHub Desktop.
Save kitmonisit/2301119 to your computer and use it in GitHub Desktop.
Controlling a GPIB instrument with Python and pyVISA
import time
import datetime
import visa
import numpy as np
class YokogawaWT1600(visa.GpibInstrument):
__GPIB_ADDRESS = 2
def __init__(self, reset=True):
visa.GpibInstrument.__init__(self, self.__GPIB_ADDRESS, timeout=3)
if reset:
self.resetDefault()
def resetDefault(self):
def setupMeasurements(measurements):
num = range(1, len(measurements) + 1)
for n, m in zip(num, measurements):
s = "item{0} {1},1".format(n, m) #item{0} {1},1 | item{0} {1},2
yield s
print "Resetting the Yokogawa WT1600..."
measureItems = ["URMS", "IRMS", "S", "P", "LAMBda", "WH", "AH", "TIME"]
self.write("*RST")
time.sleep(5)
self.write("*CLS")
self.ask("*IDN?")
s = [":rate 1",
":input:voltage:range:element1 300", #element1 300 | element2 300
":input:current:range:element1 500MA", #element1 500MA | element2 10A
":display:numeric:normal:iamount {0}".format(len(measureItems)),
";".join(setupMeasurements(measureItems)),
":numeric:normal:number {0}".format(len(measureItems)),
";".join(setupMeasurements(measureItems)),
":store:memory:initialize",
":store:direction memory",
"interval 0,0,0",
"item numeric",
"smode integrate",
"mode store",
"numeric:normal:all off",
"element1 on", #element1 on | element2 on
";".join(["{0} ON".format(m) for m in measureItems])]
self.write(";".join(s))
def queryMeasurements(self):
"""Returns a list of 8 measurements seen on the preset display:
URMS, IRMS, S, P, LAMBda, WH, AH, TIME
"""
values = self.ask(":numeric:normal:value?")
values = values.split(',')
data = [float(i) for i in values]
return data
def getIntegrateState(self):
return self.ask(":integrate:state? 1")
def startIntegrator(self):
"""Returns integrator startTime.
"""
if self.getIntegrateState() != "RES": self.resetIntegrator()
print "\nStarting integrator...\n"
self.write(":integrate:independent OFF; start")
integrateStartTime = time.time()
if self.getIntegrateState() == "STAR": print "Integrator has started."
return integrateStartTime
def stopIntegrator(self):
if self.getIntegrateState() == "STAR":
print "\nStopping integrator...\n"
self.write(":integrate:stop")
time.sleep(1)
state = self.getIntegrateState()
if state == "STOP": print "Integrator has stopped."
elif state == "RES": print "Integrator has reset."
def resetIntegrator(self):
if self.getIntegrateState() != "STOP": self.stopIntegrator()
print "\nResetting integrator...\n"
self.write(":integrate:reset")
if self.getIntegrateState() == "RES": print "Integrator has reset."
def storeReady(self, duration):
"""duration is in minutes
"""
storeCount = duration * 60 # based on 1s update rate
def convertDuration(duration):
duration = float(duration)
h = s = 0
m = duration
if duration > 59:
h = duration / 60
m = (h - int(h)) * 60
return "{0:02},{1:02},{2:02}".format(int(h), int(m), s)
self.stopIntegrator()
self.resetIntegrator()
s = [":store:memory:initialize",
":store:count {0}".format(storeCount),
":integrate:timer {0}".format(convertDuration(duration)),
":store:mode store",
":store:start"]
self.write(";".join(s))
def recallMemory(self):
self.resetIntegrator()
self.write(":store:mode recall")
dataCount = int(self.ask_for_values(":store:count?").pop())
for n in range(1, dataCount + 1):
self.write(":store:recall {0}".format(n))
data = self.queryMeasurements()
TIME = "{0:>10.3f}".format(data[7])
VOLTAGE = "{0}".format(data[0]) if not np.isinf(data[0]) else "Out of range"
CURRENT = "{0}".format(data[1]) if not np.isinf(data[1]) else "Out of range"
APPARENT_PWR = "{0}".format(data[2]) if not np.isinf(data[2]) else "Out of range"
TRUE_PWR = "{0}".format(data[3]) if not np.isinf(data[3]) else "Out of range"
PF = "{0}".format(data[4]) if not np.isinf(data[4]) else "Out of range"
WATT_HR = "{0}".format(data[5]) if not np.isinf(data[5]) else "Out of range"
AMP_HR = "{0}\n".format(data[6]) if not np.isinf(data[6]) else "Out of range"
s = [TIME, VOLTAGE, CURRENT, APPARENT_PWR, TRUE_PWR, PF, WATT_HR, AMP_HR]
s = ",".join(s)
yield s
self.write(":store:mode store")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment