182 lines
4.7 KiB
Python
182 lines
4.7 KiB
Python
|
|
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()
|
|||
|
|
|
|||
|
|
|