182 lines
4.7 KiB
Python
Raw Permalink Normal View History

2025-04-09 09:49:42 +08:00
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()