import serial import datetime import os import time from decimal import * class prologix(object): serial: object = None debug: bool = False timeout: float = 2.5 EOL: str = "\n" def __init__(self, addr:int=22, port:str="com1", baud: int = 115200, ser_timeout: float = 3, timeout: float = 2.5, debug: bool = False): """ :param port: :param baud: :param timeout: :param debug: """ self.timeout = timeout try: self.serial = serial.Serial(port, baudrate=baud, timeout=ser_timeout) except serial.SerialException: print("!! Port " + port + " could not be opened") self.serial = None else: timeout_str = str(int(self.timeout*1000)) self.cmdWrite("++addr "+str(addr)) #select instrument gpib address self.cmdWrite("++mode 1") # Change to controller mode self.cmdWrite("++auto 0") # Do not automatically read device after each command self.cmdWrite("++eoi 1") #自动添加命令结束标识符 self.cmdWrite("++eos 2") #结束标识符为LF self.cmdWrite("++read_tmo_ms "+timeout_str) # Transmission timeout self.cmdWrite("++ifc") #self.cmdWrite("++clr") # Check for Prologix device self.cmdWrite("++ver") check = self.serial.readline() if len(check) <= 0: print("!! No responding device on port " + port + " found") self.serial = None return None else: info = "Device on Port : "+port return info def cmdWrite(self, cmd: str): """ 通过串口写入数据,无数据读回 :param cmd: 命令 :return: None """ self.serial.reset_output_buffer() self.serial.write(str.encode(cmd+self.EOL)) self.serial.flush() def cmdPoll(self, cmd: str): """ 写入命令,并读回返回值 :param cmd: :return: """ self.serial.reset_input_buffer() self.cmdWrite(cmd) ret = self.cmdRead() return ret def cmdRead(self): self.cmdWrite("++read eoi") out = self.serial.readline() #print("Read out: ", out) if len(out) == 0: return None return out def release(self): """ 解除对仪器的控制 :return: None """ self.cmdWrite("++loc") self.serial.close() class DMM_34401A(prologix): def __init__(self, addr:int=22, port:str="com1", baud: int = 115200, ser_timeout: float=3, timeout: float=2.5,debug: bool = False ): super(DMM_34401A,self).__init__(addr, port, baud, ser_timeout, timeout) self.init_setup() def init_setup(self): #self.auto_disable #self.clear_err() #self.auto_enable ret = self.cmdPoll("*IDN?") #print(ret) @property def auto_enable(self): self.cmdWrite("++auto 1") mode = self.cmdPoll("++auto") return mode @property def auto_disable(self): self.cmdWrite("++auto 0") mode = self.cmdPoll("++auto") return mode def close_dmm(self): self.release() def measure(self): ret = self.cmdPoll("*CLS;:READ?") #print(ret) if ret==None: return None value = ret.decode().strip() value = float(value) value = (value*1000) value = Decimal(value).quantize(Decimal('0.000')) return value def clear_err(self): self.cmdWrite("*CLS") def measure_multi(self, count): measure_result = [] index = 0 while index < count: ret = self.measure() if ret: measure_result.append(ret) index += 1 return measure_result def set_measure_voltage_ac(self, range:str="AUTO", band:str="20"): """ 设置测量AC电压 :param range【量程】: AUTO, MIN, MAX :param band【带宽】: 3, 20, 200 :return: Conf info """ self.cmdWrite("CONFigure:VOLTage:AC "+range) ret = self.cmdPoll("CONFigure?") print("测量模式:",ret.decode().strip()) self.cmdWrite("DETector:BANDwidth "+band) ret = self.cmdPoll("DETector:BANDwidth?") print("AC带宽:",ret.decode().strip()) def set_measure_voltage_dc(self, range:str="AUTO"): """ 设置测量DC电压 :param range【量程】: AUTO, ... :return: """ self.cmdWrite("CONFigure:VOLTage:DC "+range) ret = self.cmdPoll("CONFigure?") #print(ret) def Close(self): self.release()