使用Pyqt5制作IT7321仪器测试软件

首先第一点要先知道IT7321是基于什么通信方式的,一般与仪器通讯无非就是RS232,GPIB, USB等,而IT7321的通信方式则很丰富

四种通信方式,本文使用GPIB方式,LAN的方式试过效果不好,RS232太普遍了,没什么记录的价值,USB的好像没试过

这里只讲GPIB方式

第二就是要安装驱动,这个东西官网上也是提供有的,光盘里应该也有,就是这个东西,都装了就好了

第三查找资料关于GPIB通信的,我找了几个

http://sine.ni.com/apps/utf8/niid_web_display.download_page?p_id_guid=DB00E64E99BD1213E0440021287E6A9E

http://www.ni.com/getting-started/set-up-hardware/instrument-control/zhs/gpib-usb

https://blog.csdn.net/lonelyboy34/article/details/8443275

从这些就可以大致知道通信原理是什么了

后面叙述具体实现步骤

1. 安装visa模块

 pip install visa

下载一个visa.dll文件

准备工作就这些

2. 用PyQt5做出一个大致的发送接收窗口,便于观察数据,这里直接上代码

window.py

from PyQt5 import QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import IT7321
import images

m_it7321 = IT7321.IT7321Communication()

class IT7321Demo(QWidget):

    signalButtonWt = pyqtSignal(str)
    signalButtonRd = pyqtSignal()
    signalButtonWtRd = pyqtSignal(str)
    signalButtonOpen = pyqtSignal(str)
    signalButtonOpen_1 = pyqtSignal()

    def __init__(self):
        super(IT7321Demo,self).__init__()
        self.initUI()
        self.name = ''
        self.brush = QtGui.QBrush()
        self.brush.setStyle(Qt.SolidPattern)
        self.brush.setColor(Qt.gray)



    def initUI(self):
        self.setWindowTitle("IT7321测试")
        self.resize(500,300)
        self.setWindowIcon(QIcon(":/leaves_icon/f8.ico"))

        self.gridLayout = QtWidgets.QGridLayout()

        self.textEdit = QtWidgets.QTextEdit()
        self.textEdit.setObjectName("textEdit")
        self.textEdit.setReadOnly(True)
        self.textEdit.setStyleSheet("QTextEdit{background-color: rgb(0, 0, 0);\
                                                          color: rgb(0, 255, 0);\
                                                    font - size: 9pt;\
                                                    font - weight: 400;\
                                                    font - style: normal;}")
        self.gridLayout.addWidget(self.textEdit, 0, 0, 1, 1)
        self.hboxlayout_1 = QtWidgets.QHBoxLayout()

        self.labelCommand = QtWidgets.QLabel()
        self.labelCommand.setObjectName("labelCommand")
        self.labelCommand.setText("输入命令:")
        self.labelCommand.setMaximumWidth(100)
        self.hboxlayout_1.addWidget(self.labelCommand)
        self.comBoxInput = QtWidgets.QComboBox()
        self.comBoxInput.setObjectName('comBoxInput')
        self.itemDelegate = QtWidgets.QStyledItemDelegate()
        self.comBoxInput.setItemDelegate(self.itemDelegate)
        self.comBoxInput.setStyleSheet("QComboBox QAbstractItemView{color: rgb(45, 255, 8);"
                                       "background-color: rgb(0, 0, 0);"
                                       "border: 2px solid rgb(0,255,0);}")
        self.comBoxInput.setEditable(True)
        self.model = QtGui.QStandardItemModel()
        command = ['SYST:VERS?','SYSTem:ERRor?','SYSTem:CLEar','SYSTem:REMote','SYSTem:LOCal','SYSTem:BEEPer',
                   'CONFig:VOLTage:MINimum **','CONFig:VOLTage:MAXimum **',
                   'CONFig:FREQuency:MINimum **','CONFig:FREQuency:MAXimum **',
                   'CONFig:PROTect:CURRent:RMS **','CONFig:PROTect:CURRent:PEAK **',
                   'FREQuency **','FREQuency?','VOLTage **','VOLTage?','OUTPut 0','OUTPut 1']
        toolTip = {
             0:'该命令用来查询当前使用的 SCPI 命令的版本号',
             1:'该命令用来查询电源的错误信息情况',
             2:'这条命令用于清除出错信息。',
             3:'该命令用来设置电源为远端控制模式',
             4:'该命令设置电源为本地控制模式',
             5:'这条命令用来打开/关闭蜂鸣器,参数为 1|ON 时蜂鸣器打开,按键时蜂鸣器鸣叫',
             6: '该命令配置电压下限值,同仪器面板菜单中的 Volt-Min 设置',
             7: '该命令配置电压上限值,同仪器面板菜单中的 Volt-Max 设置',
             8: '该命令配置频率下限值,同仪器面板菜单的 Freq-Min',
             9: '该命令配置频率上限值,同仪器面板菜单的 Freq-Max',
            10: '配置电流有效值保护点,同仪器面板菜单的 Irms-Protect',
            11: '配置电流峰值保护点,同仪器面板菜单的 Ipeak-Protect',
            12: '该命令设置电源当前输出频率',
            13: '该命令查询电源当前输出频率',
            14: '该命令设定电源输出电压',
            15: '该命令查询电源输出电压',
            16: '该命令用来关闭电源的输出',
            17: '该命令用来打开电源的输出'
        }
        for index, each in enumerate(command):
            self.item = QtGui.QStandardItem(each)
            self.item.setToolTip(toolTip[index])
            self.model.appendRow(self.item)

        self.comBoxInput.setModel(self.model)
        self.hboxlayout_1.addWidget(self.comBoxInput)

        self.gridLayout.addLayout(self.hboxlayout_1, 1, 0, 1, 1)

        self.verticalLayout = QtWidgets.QVBoxLayout()

        self.labelDisplay = QtWidgets.QLabel()
        self.labelDisplay.setObjectName("labelDisplay")
        self.labelDisplay.setStyleSheet("QLabel{image:url(:/leaves_icon/VISA.png);}")

        self.buttonSearch = QtWidgets.QPushButton()
        self.buttonSearch.setObjectName("buttonSearch")
        self.buttonSearch.setText('搜索设备')
        self.buttonOpen = QtWidgets.QPushButton()
        self.buttonOpen.setObjectName("buttonOpen")
        self.buttonOpen.setText('打开设备')

        self.buttonWriteOnly = QtWidgets.QPushButton()
        self.buttonWriteOnly.setObjectName("buttonWriteOnly")
        self.buttonWriteOnly.setText('只写')

        self.buttonReadOnly = QtWidgets.QPushButton()
        self.buttonReadOnly.setObjectName("buttonReadOnly")
        self.buttonReadOnly.setText('只读')
        self.buttonReadOnly.setEnabled(False)

        self.buttonWriteRead = QtWidgets.QPushButton()
        self.buttonWriteRead.setObjectName("buttonWriteRead")
        self.buttonWriteRead.setText('读写')

        self.verticalLayout.addWidget(self.labelDisplay)
        self.verticalLayout.addWidget(self.buttonSearch)
        self.verticalLayout.addWidget(self.buttonOpen)
        self.verticalLayout.addWidget(self.buttonWriteOnly)
        self.verticalLayout.addWidget(self.buttonReadOnly)
        self.verticalLayout.addWidget(self.buttonWriteRead)

        self.gridLayout.addLayout(self.verticalLayout, 0, 1, 2, 1)

        self.setLayout(self.gridLayout)

        self.buttonSearch.clicked.connect(m_it7321.searchDevice)
        m_it7321.signalDeviceNum.connect(self.getDeviceNum)
        m_it7321.signalMessage.connect(self.getIT7321Message)
        self.signalButtonOpen.connect(m_it7321.openDevice)
        self.signalButtonOpen_1.connect(m_it7321.closeDevice)
        self.buttonOpen.clicked.connect(self.buttonOpenClicked)

        self.buttonWriteOnly.clicked.connect(self.buttonWriteOnlyClicked)
        self.buttonReadOnly.clicked.connect(self.buttonReadOnlyClicked)
        self.buttonWriteRead.clicked.connect(self.buttonReadWriteClicked)
        self.signalButtonWt.connect(m_it7321.writeOnly)
        self.signalButtonRd.connect(m_it7321.readOnly)
        self.signalButtonWtRd.connect(m_it7321.readWrite)

    def buttonOpenClicked(self):
        if self.buttonOpen.text() == "打开设备":
            self.buttonOpen.setText("关闭设备")
            self.signalButtonOpen.emit(self.name)
        elif self.buttonOpen.text() == "关闭设备":
            self.buttonOpen.setText("打开设备")
            self.signalButtonOpen_1.emit()

    def getDeviceNum(self, num):
        self.textEdit.append(num)
        self.name = num



    def getIT7321Message(self,mes):
        mes = mes.strip()
        self.textEdit.append(mes)

    def buttonWriteOnlyClicked(self):

        try:
            self.buttonReadOnly.setEnabled(True)
            self.signalButtonWt.emit(self.comBoxInput.currentText())
        except BaseException:
            pass
    def buttonReadOnlyClicked(self):
        self.buttonReadOnly.setEnabled(False)
        self.signalButtonRd.emit()

    def buttonReadWriteClicked(self):
        try:
            self.buttonReadOnly.setEnabled(False)
            self.signalButtonWtRd.emit(self.comBoxInput.currentText())
        except BaseException:
            pass






界面最后像这样

 按钮什么都做好了,就开始编写发送接收的函数调用就行了

IT7321.py

import visa
import easygui
visa_dll = "./DLL/visa32.dll"
from PyQt5.QtCore import QObject, pyqtSignal

class IT7321Communication(QObject):
    signalDeviceNum = pyqtSignal(str)
    signalMessage = pyqtSignal(str)
    signalReDraw = pyqtSignal()
    signalChangeGray = pyqtSignal()

    def __init__(self):
        super(IT7321Communication,self).__init__()
        self.deviceNum = ('','')

        #self.inst = pyvisa.resources.usb.USBInstrument

    def searchDevice(self):
        self.rm = visa.ResourceManager()
        self.deviceNum = self.rm.list_resources()

        if self.deviceNum:
            self.signalDeviceNum.emit(self.deviceNum[0])
        #return self.deviceNum[0]  ,image='./background/bk0.png'
        else:
            self.rm.close()
            easygui.msgbox(title='提示', msg='未搜索到设备,请检查IT7321仪器是否打开',ok_button='确定',image="./Gif/09macos00.gif")

    def openDevice(self, device):
        try:
            self.inst = self.rm.open_resource(device)
            self.signalReDraw.emit()

        #print(self.inst)
        except BaseException:
            pass
    def closeDevice(self):
        self.rm.close()
        self.signalChangeGray.emit()

    def DealError(self):
        error = self.inst.query('SYSTem:ERRor?')
        easygui.msgbox(title="命令类型错误", msg=error, ok_button="确定")
        self.inst.write('SYSTem:CLEar')


    def setVoltage(self, vol):
        command = 'VOLTage:IMMediate ' + vol
        self.inst.write(command)
    def queryVoltage(self):
        return self.inst.query('VOLTage?')

    def writeOnly(self, command):
        try:
            self.inst.write(command)
        except BaseException:
            self.DealError()

    def readOnly(self):
        try:
            data = self.inst.read()
            self.signalMessage.emit(data)
        except BaseException:
            pass
    def readWrite(self, command):
        if command.endswith('?'):
            try:
                data = self.inst.query(command)
                self.signalMessage.emit(data)
            except BaseException:
                self.DealError()
        else:
            easygui.msgbox(title="命令类型错误",msg="请输入以“?”结尾的查询命令",ok_button="确定")

里面包含一个一个visa32.dll文件还有一些图片文件

图片文件转成了.py文件,太长了9000行了都,这里就不放了,就放一下images.qrc资源文件里面的内容把

 

<RCC>
    <qresource prefix="/">
        <file>leaves_icon/f8.ico</file>
        <file>leaves_icon/VISA.png</file>
    </qresource>
</RCC>

将资源文件转为.py文件可以找一下我的博文,比较简单,就是容易忘,也记录了下来

剩下的就是main.py

import sys
from PyQt5.QtWidgets import QApplication, QWidget,QMainWindow
import window

if __name__ == '__main__':
    myapp = QApplication(sys.argv)
    ui = window.IT7321Demo()
    ui.show()
    sys.exit(myapp.exec())

整个代码结构如图

 这个我是已经生成了exe的,方便使用

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值