首先第一点要先知道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的,方便使用