from qolab.hardware.basic import BasicInstrument from qolab.hardware.multimeter import Multimeter from qolab.hardware.scpi import SCPI_PROPERTY from pyvisa import constants as pyvisa_constants import time class BK_5491(Multimeter): """ BK 5491 multimeter """ """ rm = pyvisa.ResourceManager() instr=rm.open_resource('ASRL/dev/ttyUSB0::INSTR') Make sure to switch off the ECHO at the multimeter communication setup """ def __init__(self, resource, *args, **kwds): super().__init__(*args, **kwds) self.resource = resource self.config['Device model']='HP 34401' self.resource.read_termination = '\r\n' self.resource.baud_rate = 9600 self.resource.data_bits = 8 self.resource.parity = pyvisa_constants.Parity.none self.resource.stop_bits = pyvisa_constants.StopBits.one self.resource.timeout = 5000 self.write = self.resource.write self.read = self.resource.read self.query = self.resource.query self.read_bytes = self.resource.read_bytes self.read_binary_values = self.resource.read_binary_values self.query_binary_values = self.resource.query_binary_values self.switchTime = 0.5 # switch time in seconds for Function/Measurement change self.deviceProperties.update({}) def isPrompt(self, string): if string[1] == '>': return True return False def isPromptGood(self, prompt): if prompt[0:2] == '=>': return True print(f'Error detected {prompt=}') return False def sendCmd(self, cmd_string, expect_reply=True, Nattemts=5): """ Set command to instrument or query it readings (which is also a command) BK_5491 in not SCPI instrument, so we get some replies (prompts *>, =>, etc) even if we just send a command not a query. So we have to work around this. """ # print(f"dbg: {cmd_string=}") self.write(cmd_string) if expect_reply: reply = self.read() # this should be result # print(f"dbg: {reply=}") if self.isPrompt(reply): # print(f'Error: we ask {cmd_string=} and got prompt "{reply}" instead of result') prompt = reply if prompt[0] == '@': if Nattemts >= 2: # print('dbg: numeric reading is not available yet, attempt one more time') time.sleep(self.switchTime) return self.sendCmd(cmd_string, expect_reply=expect_reply, Nattemts=Nattemts-1) return None else: reply = None prompt = self.read() # this should be prompt self.isPromptGood(prompt) # print(f"dbg: {prompt=}") return reply def getReading(self): """ Report current measurement """ ret_string = self.sendCmd('R1') # print(f'dbg: getReading received "{ret_string}"') return float(ret_string) def setFunction(self, key_string): """ BK_5491 set the measurement functions according to the front panel keys: K1 - Vdc K2 - Adc K3 - Vac K4 - Aac K5 - Resistance K6 - Diode K7 - Frequency (Hz) K8 - Auto K9 - Up key K10 - Down key K11 - MinMax key K12 - Hold key K13 - Local (manual does not specify, but it works this way) K14 - Rel key K15 - Shift key K16 - 2nd key K17 - Vdc and Vac keys simultaneously K18 - Adc and Aac keys simultaneously K19 - Shift then Up keys (increasing the intensity of the VFD display) K20 - Shift then Down keys (decreasing the intensity of the VFD display) """ def getVdc(self): self.sendCmd('K1') return self.getReading() def getVac(self): self.sendCmd('K3') return self.getReading() def getAdc(self): self.sendCmd('K2') return self.getReading() def getAac(self): self.sendCmd('K4') return self.getReading() def getResistance(self): self.sendCmd('K5') return self.getReading() def getDiode(self): self.sendCmd('K6') return self.getReading() def getFreq(self): self.sendCmd('K7') return self.getReading() def toLocal(self): self.sendCmd('K13', expect_reply=False) if __name__ == '__main__': import pyvisa print("testing") rm = pyvisa.ResourceManager() print(rm.list_resources()) instr=rm.open_resource('ASRL/dev/ttyUSB0::INSTR') multimeter = BK_5491(instr) print('------ Header start -------------') print(str.join('\n', multimeter.getHeader())) print('------ Header ends -------------')