python控制儀器實現自動化常用pyvisa庫,基本控制可大致分為創建儀器控制對象、寫入控制指令、讀取儀表信息和查詢儀表狀態,下面進行基本的講解。
pyvisa庫創建儀表控制對象
import tkinter.messagebox
import pyvisaclass InstrumentControl:inst = Nonedef __init__(self, equipment_name: str, equipment_visa: str, visa_dll='c:/Windows/System32/visa32.dll'):"""建立儀器初始對象@param equipment_name: 儀器名@param equipment_visa: 儀器visa地址@param visa_dll: visa.all地址"""try:self.rm = pyvisa.ResourceManager(visa_dll)print("打開visa32.dll文件成功")self.inst = self.open_by_name(equipment_name, equipment_visa)except Exception as e:tkinter.messagebox.showerror('錯誤', '在{}中找不到visa32.dll,請確認正確安裝了NI-MAX和驅動')print(f"打開visa32.dll文件失敗, 報錯原因:{e}")def open_by_name(self, device_name, gpib_ip):"""儀表通訊@param device_name:@param gpib_ip:@return: 儀器控制對象"""self.inst = self.rm.open_resource(gpib_ip)print(self.inst)print("打開資源:" + gpib_ip)query_name_str = self.command_query("*IDN?")print("查詢名稱為:" + query_name_str)if device_name in query_name_str:print("打開儀表成功,打開的是:" + device_name)print("打開儀表成功,打開的是:" + device_name)return self.instreturn self.inst
寫入控制指令
def command_write(self, write_cmd):"""命令寫入@param write_cmd: 寫入指令@return: 執行結果"""print("執行了寫入指令:" + write_cmd)ret_res = self.inst.write(write_cmd)print("返回了:" + str(ret_res))return ret_res
讀取儀表信息
def command_read(self, read_cmd):"""命令讀取@param read_cmd: 讀取指令@return: 讀取信息"""print("執行了讀取指令:" + read_cmd)ret_res = self.inst.read(read_cmd)print("返回了:" + str(ret_res))return ret_res
查詢儀表狀態
def command_query(self, query_cmd):"""命令查詢@param query_cmd: 查詢指令@return: 查詢信息"""print("執行了查詢指令:" + query_cmd)ret_res = self.inst.query(query_cmd).replace('\n', '')print("返回了:" + str(ret_res))return ret_res
完整代碼如下:
import tkinter.messagebox
import pyvisaclass InstrumentControl:inst = Nonedef __init__(self, equipment_name: str, equipment_visa: str, visa_dll='c:/Windows/System32/visa32.dll'):"""建立儀器初始對象@param equipment_name: 儀器名@param equipment_visa: 儀器visa地址@param visa_dll: visa.all地址"""try:self.rm = pyvisa.ResourceManager(visa_dll)print("打開visa32.dll文件成功")self.inst = self.open_by_name(equipment_name, equipment_visa)except Exception as e:tkinter.messagebox.showerror('錯誤', '在{}中找不到visa32.dll,請確認正確安裝了NI-MAX和驅動')print(f"打開visa32.dll文件失敗, 報錯原因:{e}")passdef open_by_name(self, device_name, gpib_ip):"""儀表通訊@param device_name:@param gpib_ip:@return: 儀器控制對象"""self.inst = self.rm.open_resource(gpib_ip)print(self.inst)print("打開資源:" + gpib_ip)query_name_str = self.command_query("*IDN?")print("查詢名稱為:" + query_name_str)if device_name in query_name_str:print("打開儀表成功,打開的是:" + device_name)print("打開儀表成功,打開的是:" + device_name)return self.instreturn self.instdef command_write(self, write_cmd):"""命令寫入@param write_cmd: 寫入指令@return: 執行結果"""print("執行了寫入指令:" + write_cmd)ret_res = self.inst.write(write_cmd)print("返回了:" + str(ret_res))return ret_resdef command_read(self, read_cmd):"""命令讀取@param read_cmd: 讀取指令@return: 讀取信息"""print("執行了讀取指令:" + read_cmd)ret_res = self.inst.read(read_cmd)print("返回了:" + str(ret_res))return ret_resdef command_query(self, query_cmd):"""命令查詢@param query_cmd: 查詢指令@return: 查詢信息"""print("執行了查詢指令:" + query_cmd)ret_res = self.inst.query(query_cmd).replace('\n', '')print("返回了:" + str(ret_res))return ret_res
儀器控制底層寫完,用程控電源D66319來進行調用,例子如下:
class D66319(InstrumentControl):def __init__(self, equipment_name: str, equipment_visa: str):"""電源D66319儀器控制:param equipment_name: 儀器名稱:param equipment_visa: 儀器visa地址"""super(D66319, self).__init__(equipment_name, equipment_visa)def query_equipment_info(self):"""查詢設備信息:return: """result = self.command_query("*IDN?")return resultdef open_output(self):"""打開電源輸出開關"""self.command_write('OUTP1 ON')
基本的儀器控制邏輯,能實現自動化控制儀器,到此結束,我是活動的笑臉,有疑問歡迎找博主解答。