diff --git a/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.ini b/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.ini
index acf4f58d1a3966001120a43e7f6e8e5678f86e69..437ef831b9a672ce347e79e7f6b822fc972a5d53 100644
--- a/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.ini
+++ b/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.ini
@@ -182,6 +182,7 @@ datatype: BOOLEAN
def_value: False
set_cmd: :SENS:AVER
group: Acquisition
+model_value_1: E5071C
[# of averages]
datatype: DOUBLE
@@ -190,6 +191,7 @@ low_lim: 1
high_lim: 65536
set_cmd: :SENS:AVER:COUN
group: Acquisition
+model_value_1: E5071C
[Wait for new trace]
datatype: BOOLEAN
diff --git a/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.py b/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.py
index 1d19371a62ee4a47997ac1f387e2b2347b937314..4c7711705fe53441c31c9494abc078d7434e47a8 100644
--- a/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.py
+++ b/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.py
@@ -56,17 +56,12 @@ class Driver(VISA_Driver):
# create new measurement, if enabled is true
if value:
newName = 'LabC_%s' % param
- self.writeAndLog("CALC:PAR:EXT '%s','%s'" % (newName, param))
+ if self.getModel() in ('E8364B'):
+ self.writeAndLog("CALC:PAR:DEF '%s',%s" % (newName, param))
+ else:
+ self.writeAndLog("CALC:PAR:EXT '%s','%s'" % (newName, param))
# show on PNA screen
iTrace = 1 + ['S11', 'S21', 'S12', 'S22'].index(param)
- # sPrev = self.askAndLog('DISP:WIND:CAT?')
- # if sPrev.find('EMPTY')>0:
- # # no previous traces
- # iTrace = 1
- # else:
- # # previous traces, add new
- # lTrace = sPrev[1:-1].split(',')
- # iTrace = int(lTrace[-1]) + 1
self.writeAndLog("DISP:WIND:TRAC%d:FEED '%s'" % (iTrace, newName))
# add to dict with list of measurements
self.dMeasParam[param] = [newName]
@@ -88,6 +83,7 @@ class Driver(VISA_Driver):
self.getActiveMeasurements()
# get selected parameter
param = quant.name[:3]
+ self.log(self.dMeasParam)
value = (param in self.dMeasParam)
elif quant.name in ('S11', 'S21', 'S12', 'S22'):
# check if channel is on
@@ -109,10 +105,14 @@ class Driver(VISA_Driver):
* (self.getValue('# of averages') if bAverage else 1))
# wait for trace, either in averaging or normal mode
if bWaitTrace:
- self.writeAndLog(':ABOR;:TRIG:SOUR BUS;:INIT:CONT OFF;:INIT:IMM;')
- if bAverage:
- self.writeAndLog(':TRIG:AVER ON')
- self.writeAndLog(':TRIG:SING;')
+ if self.getModel() not in ('E8364B'):
+ self.writeAndLog(":ABOR;:TRIG:SOUR BUS;:INIT:CONT OFF;:INIT:IMM;")
+ if bAverage:
+ self.writeAndLog(':TRIG:AVER ON')
+ self.writeAndLog(':TRIG:SING;')
+
+ else:
+ self.writeAndLog(":ABOR;:INIT:CONT OFF;:INIT:IMM;")
self.writeAndLog('*OPC')
# wait some time before first check
self.wait(0.03)
@@ -140,7 +140,11 @@ class Driver(VISA_Driver):
self.write(':FORM REAL,32;CALC:DATA? SDATA', bCheckError=False)
sData = self.read(ignore_termination=True)
if bWaitTrace:
- self.writeAndLog(':TRIG:SOUR INT;:TRIG:AVER OFF;:ABOR;')
+ if self.getModel() in ('E8364B'):
+ self.writeAndLog(':TRIG:SOUR MAN;:ABOR;')
+
+ else:
+ self.writeAndLog(':TRIG:SOUR INT;:TRIG:AVER OFF;:ABOR;')
# strip header to find # of points
i0 = sData.find(b'#')
@@ -187,7 +191,10 @@ class Driver(VISA_Driver):
sParam = self.askAndLog(":CALC:PAR%d:DEF?" % (n+1))
self.dMeasParam[sParam] = (n+1)
else:
- sAll = self.askAndLog("CALC:PAR:CAT:EXT?")
+ if self.getModel() in ('E8364B'):
+ sAll = self.askAndLog("CALC:PAR:CAT?")
+ else:
+ sAll = self.askAndLog("CALC:PAR:CAT:EXT?")
# strip "-characters
sAll = sAll[1:-1]
# parse list, format is channel, parameter, ...
diff --git a/Triton/Triton.ini b/Triton/Triton.ini
index 1293fd9da694d220e0f7040e686ebfb2a44f8d24..4905850ffb32bdd02d71265ed7d39bc20092b3c3 100755
--- a/Triton/Triton.ini
+++ b/Triton/Triton.ini
@@ -6,7 +6,7 @@
name: Triton 200 dilution fridge
# The version string should be updated whenever changes are made to this config file
-version: 1.2.1
+version: 1.3.0
# Name of folder containing the code defining a custom driver. Do not define this item
# or leave it blank for any standard driver based on the built-in VISA interface.
@@ -210,6 +210,243 @@ get_cmd: READ:DEV:T13:TEMP:SIG:TEMP
section: Temperature
high_lim: 300
+[T14]
+datatype: DOUBLE
+group: Temperatures
+permission: READ
+unit: K
+get_cmd: READ:DEV:T14:TEMP:SIG:TEMP
+section: Temperature
+high_lim: 300
+
+[T15]
+datatype: DOUBLE
+group: Temperatures
+permission: READ
+unit: K
+get_cmd: READ:DEV:T15:TEMP:SIG:TEMP
+section: Temperature
+high_lim: 300
+
+[T16]
+datatype: DOUBLE
+group: Temperatures
+permission: READ
+unit: K
+get_cmd: READ:DEV:T16:TEMP:SIG:TEMP
+section: Temperature
+high_lim: 300
+
+[P1]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P1:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[P2]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P2:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[P3]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P3:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[P4]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P4:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[P5]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P5:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[OVC]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P6:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[TurboState]
+group: Turbopump
+label: Turbopump state
+datatype: STRING
+def_value: NONE
+permission: READ
+section: Turbopump
+get_cmd: READ:DEV:TURB1:PUMP:SIG:STATE
+
+[TurboStatus]
+group: Turbopump
+tooltip: The status is usually an error code
+label: Turbopump status
+datatype: DOUBLE
+def_value: 0
+permission: READ
+section: Turbopump
+get_cmd: READ:DEV:TURB1:PUMP:STATUS
+
+[TurboHours]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: h
+get_cmd: READ:DEV:TURB1:PUMP:SIG:HRS
+section: Turbopump
+high_lim: 35040
+
+[TurboPower]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: W
+get_cmd: READ:DEV:TURB1:PUMP:SIG:POWR
+section: Turbopump
+
+[TurboSpeed]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: Hz
+get_cmd: READ:DEV:TURB1:PUMP:SIG:SPD
+section: Turbopump
+
+[PowerStageTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:PST
+section: Turbopump
+
+[MotorTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:MT
+section: Turbopump
+
+[BearingTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:BT
+section: Turbopump
+
+[PumpBottomTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:PBT
+section: Turbopump
+
+[ElectronicTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:ET
+section: Turbopump
+
+[WaterInTemp]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: C
+get_cmd: READ:DEV:C1:PTC:SIG:WIT
+section: Compressor
+high_lim: 30
+
+[WaterOutTemp]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: C
+get_cmd: READ:DEV:C1:PTC:SIG:WOT
+section: Compressor
+high_lim: 30
+
+[OilTemp]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: C
+get_cmd: READ:DEV:C1:PTC:SIG:OILT
+section: Compressor
+high_lim: 30
+
+[HeliumTemp]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: C
+get_cmd: READ:DEV:C1:PTC:SIG:HT
+section: Compressor
+high_lim: 30
+
+[LowPressure]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: bar
+get_cmd: READ:DEV:C1:PTC:SIG:HLP
+section: Compressor
+high_lim: 20
+
+[HighPressure]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: bar
+get_cmd: READ:DEV:C1:PTC:SIG:HHP
+section: Compressor
+high_lim: 20
+
+[MotorCurrent]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: A
+get_cmd: READ:DEV:C1:PTC:SIG:MCUR
+section: Compressor
+high_lim: 4
+
+[Hours]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: h
+get_cmd: READ:DEV:C1:PTC:SIG:HRS
+section: Compressor
+high_lim: 20000
+
[ControlLoop]
datatype: BOOLEAN
label: Temperature control loop
@@ -254,6 +491,16 @@ get_cmd: READ:DEV:T<c>:TEMP:LOOP:RANGE
set_cmd: SET:DEV:T<c>:TEMP:LOOP:RANGE:<*>
section: Temperature
+[HeaterPower]
+datatype: DOUBLE
+label: Heater Setpoint
+group: Heater
+unit: uW
+get_cmd: READ:DEV:H<c>:HTR:SIG:POWR
+set_cmd: SET:DEV:H<c>:HTR:SIG:POWR:<*>
+section: Temperature
+high_lim: 20000
+
[CoordSys]
label: Coordinate System
datatype: COMBO
@@ -398,3 +645,12 @@ option_value_1: switch heater
section: Switch heater
get_cmd: READ:SYS:VRM:POC
set_cmd: SET:SYS:VRM:POC:<*>
+
+[STATE]
+label: Triton Automation Routine
+tooltip: Currently running name of the automation routine.
+datatype: STRING
+def_value: NONE
+permission: READ
+section: System
+get_cmd: READ:SYS:DR:ACTN
\ No newline at end of file
diff --git a/Triton/Triton.py b/Triton/Triton.py
index f56d80e85953f637d5934415827918222e40e513..904e87bb4581adec0e69d57cc89f8e73a177ed20 100755
--- a/Triton/Triton.py
+++ b/Triton/Triton.py
@@ -6,9 +6,9 @@ import visa
from InstrumentConfig import InstrumentQuantity
import numpy as np
import string
-from builtins import str
+import re
-__version__ = "0.0.1"
+__version__ = "0.0.3" #user expansion Triton1 19.02.2018
class Error(Exception):
pass
@@ -23,25 +23,32 @@ class Driver(VISA_Driver):
#Detect options: (vector) magnet and swicth heater
detectedOptions = []
- table = str.maketrans(dict.fromkeys(string.ascii_letters+'/'))
- rate = self.askAndLog('READ:SYS:VRM:RFMX').strip().rsplit(':',1)[1][1:-1].translate(table).split()
- if float(rate[0]) > 0:
- detectedOptions.append("x magnet")
- if float(rate[1]) > 0:
- detectedOptions.append("y magnet")
- if float(rate[2]) > 0:
- detectedOptions.append("z magnet")
- heater = self.askAndLog('READ:SYS:VRM:SWHT').strip().rsplit(':',1)[1][1:-1].split()
- if heater[0] != "NOSW" or heater[1] != "NOSW" or heater[2] != "NOSW":
- detectedOptions.append("switch heater")
-
+ #rate = self.askAndLog('READ:SYS:VRM:RFMX').strip().rsplit(':',1)[1][1:-1].encode('utf-8').translate(None, string.ascii_letters + "/").split()
+ try:
+ rate = self.askAndLog('READ:SYS:VRM:RFMX').strip().rsplit(':',1)[1][1:-1].translate({ord(c): None for c in (string.ascii_letters + "/")}).split()
+ if float(rate[0]) > 0:
+ detectedOptions.append("x magnet")
+ if float(rate[1]) > 0:
+ detectedOptions.append("y magnet")
+ if float(rate[2]) > 0:
+ detectedOptions.append("z magnet")
+ except IndexError:
+ pass
+ try:
+ heater = self.askAndLog('READ:SYS:VRM:SWHT').strip().rsplit(':',1)[1][1:-1].split()
+ if heater[0] != "NOSW" or heater[1] != "NOSW" or heater[2] != "NOSW":
+ detectedOptions.append("switch heater")
+ except IndexError:
+ pass
+
self.instrCfg.setInstalledOptions(detectedOptions)
# Make sure that the coordinate system matches the device
- coordFunc = self.instrCfg.getQuantity('CoordSys')
- v = self.performGetValue(coordFunc)
- coordFunc.setValue(v)
+ if detectedOptions:
+ coordFunc = self.instrCfg.getQuantity('CoordSys')
+ v = self.performGetValue(coordFunc)
+ coordFunc.setValue(v)
def performGetValue(self, quant, options={}):
@@ -50,11 +57,30 @@ class Driver(VISA_Driver):
if self.isFirstCall(options):
self.Bresult = []
# check type of quantity
- if quant.name in ('T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10', 'T11', 'T12', 'T13'):
+ if quant.name in ('T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10', 'T11', 'T12', 'T13', 'T14', 'T15', 'T16', 'WaterInTemp', 'WaterOutTemp', 'OilTemp', 'HeliumTemp', 'PowerStageTemp', 'MotorTemp', 'BearingTemp', 'PumpBottomTemp', 'ElectronicTemp'):
+ # temperatures, get value strings
+ sAns = self.askAndLog(quant.get_cmd).strip()
+ # convert string to float by taking everything after last colon, ignoring final 'K'
+ sAnsC = re.compile('(\d+.\d+)\s*(\w+)').match(sAns.rsplit(':',1)[1])
+ if not sAnsC:
+ sAnsC = re.compile('(\d+)\s*(\w+)').match(sAns.rsplit(':',1)[1])
+ if sAns:
+ value = float(sAnsC.groups()[0])
+ else:
+ value = -np.inf
+ elif quant.name in ('P1', 'P2', 'P3', 'P4', 'P5', 'OVC', 'LowPressure', 'HighPressure', 'MotorCurrent', 'Hours', 'TurboHours', 'TurboPower', 'TurboSpeed'):
# temperatures, get value strings
sAns = self.askAndLog(quant.get_cmd).strip()
# convert string to float by taking everything after last colon, ignoring final 'K'
- value = float(sAns.rsplit(':',1)[1][:-1])
+ sAnsC = re.compile('(\d+.\d+)\s*(\w+)').match(sAns.rsplit(':',1)[1])
+ if not sAnsC:
+ sAnsC = re.compile('(\d+)\s*(\w+)').match(sAns.rsplit(':',1)[1])
+ if sAns:
+ value = float(sAnsC.groups()[0])
+ if "m" in sAnsC.groups()[1]:
+ value *= 1e-3
+ else:
+ value = -np.inf
elif quant.name in ('ControlLoop'):
for i in range(1,14):
pass
@@ -77,6 +103,13 @@ class Driver(VISA_Driver):
if sAns != "NOT_FOUND":
value = quant.getValueFromCmdString(sAns[:-2])
break
+ elif quant.name in ('HeaterPower'):
+ for i in range(1,3):
+ sAns = self.askAndLog(quant.get_cmd.replace('<c>', str(i))).strip()
+ sAns = sAns.rsplit(':',1)[1]
+ if sAns != "NOT_FOUND":
+ value = quant.getValueFromCmdString(sAns[:-2])
+ break
elif quant.name in ('PoC'):
sAns = self.askAndLog(quant.get_cmd).strip()
value = (sAns.rsplit(':',1)[1] == "ON")
@@ -87,10 +120,13 @@ class Driver(VISA_Driver):
coordFunc = self.instrCfg.getQuantity('CoordSys')
if not self.Bresult:
vectValue = self.askAndLog(quant.get_cmd).strip()
- table = str.maketrans(dict.fromkeys(string.ascii_letters))
- self.Bresult = vectValue.rsplit(':',1)[1][1:-1].translate(table).split()
+ #self.Bresult = vectValue.rsplit(':',1)[1][1:-1].encode('utf-8').translate(None,string.ascii_letters).split()
+ self.Bresult = vectValue.rsplit(':',1)[1][1:-1].translate({ord(c): None for c in (string.ascii_letters)}).split()
#Vector results depend on the coordinate system
value = float('nan')
+ self.log(vectValue)
+ if not len(self.Bresult) == 3:
+ self.Bresult = ["NaN", "NaN", "NaN"]
if coordFunc.getValue() == 'Cartesian':
if quant.name == 'Bx':
return float(self.Bresult[0])
@@ -112,6 +148,9 @@ class Driver(VISA_Driver):
return float(self.Bresult[1])
elif quant.name == 'Bphi':
return float(self.Bresult[2])
+ elif quant.name in ('STATE'):
+ sAns = self.askAndLog(quant.get_cmd).strip()
+ value = sAns.rsplit(':',1)[1]
else:
# for all other cases, call VISA driver
cmd = quant.get_cmd
@@ -158,6 +197,13 @@ class Driver(VISA_Driver):
if sAns != "NOT_FOUND":
self.askAndLog(quant.set_cmd.replace('<c>', str(i)).replace('<*>', quant.getCmdStringFromValue(value)))
break
+ elif quant.name in ('HeaterPower'):
+ for i in range(1,3):
+ sAns = self.askAndLog(quant.get_cmd.replace('<c>', str(i))).strip()
+ sAns = sAns.rsplit(':',1)[1]
+ if sAns != "NOT_FOUND":
+ self.askAndLog(quant.set_cmd.replace('<c>', str(i)).replace('<*>', quant.getCmdStringFromValue(value)))
+ break
elif quant.name in ('PoC'):
vstring = "OFF"
if value:
@@ -193,12 +239,12 @@ class Driver(VISA_Driver):
coordFunc = self.instrCfg.getQuantity('CoordSys')
if self.Bchanged == False:
self.askAndLog('SET:SYS:VRM:ACTN:HOLD')
- self.waitForIdle()
+ waitForIdle()
self.performSetValue(coordFunc, coordFunc.getValue())
self.performGetValue(coordFunc)
vectValue = self.askAndLog("READ:SYS:VRM:VSET").strip()
- table = str.maketrans(dict.fromkeys(string.ascii_letters))
- a,b,c = vectValue.rsplit(':',1)[1][1:-1].translate(table).split()
+ #a,b,c = vectValue.rsplit(':',1)[1][1:-1].encode('utf-8').translate(None,string.ascii_letters).split()
+ a,b,c = vectValue.rsplit(':',1)[1][1:-1].translate({ord(c): None for c in (string.ascii_letters)}).split()
if coordFunc.getValue() == 'Cartesian':
if axis == 'Bx':
a = value