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