1、项目描述
(1)开发一个工具,可以使计算机通过网线操控示波器,完成指令下发、保存截图、运行脚本等功能;
(2)环境配置:windows10 PC、Tek示波器(兼容3k、5k系列);
(3)使用vxi11完成示波器的通信等操作、使用PySimpleGUI开发工具界面;
(4)对tekvisa的原始指令进行二次封装,提高编写脚本的效率;
2、原理介绍
(1)VISA、e*Scope与Socket
有三种方式可以建立电脑与示波器之间的连接,分别是visa、escope和socket。
visa是Virtual Instrument Software Architecture的缩写,是一套由NI主导的,定义了设备和计算机之间的通信方式的协议。目前主流的设备厂商一般都会有基于VISA所封装好的库,例如tek的有tekVisa等。这些封装库定义了设备和计算机之间的会话连接、资源访问、信息交互等方式,可以很方便的实现PC和OSC之间的交互。需要注意的是,visa的封装已经做到了接口无关,计算机可以使用多种接口(GPIB、USB、LAN、Serial等)完成和设备的交互。而剩下两种都是通过网线做交互的。
1、项目描述
(1)开发一个工具,可以使计算机通过网线操控示波器,完成指令下发、保存截图、运行脚本等功能;
(2)环境配置:windows10 PC、Tek示波器(兼容3k、5k系列);
(3)使用vxi11完成示波器的通信等操作、使用PySimpleGUI开发工具界面;
(4)对tekvisa的原始指令进行二次封装,提高编写脚本的效率;
2、原理介绍
(1)VISA、e*Scope与Socket
有三种方式可以建立电脑与示波器之间的连接,分别是visa、escope和socket。
visa是Virtual Instrument Software Architecture的缩写,是一套由NI主导的,定义了设备和计算机之间的通信方式的协议。目前主流的设备厂商一般都会有基于VISA所封装好的库,例如tek的有tekVisa等。这些封装库定义了设备和计算机之间的会话连接、资源访问、信息交互等方式,可以很方便的实现PC和OSC之间的交互。需要注意的是,visa的封装已经做到了接口无关,计算机可以使用多种接口(GPIB、USB、LAN、Serial等)完成和设备的交互。而剩下两种都是通过网线做交互的。
escope是示波器内集成的一套程序,可以使主机在和设备接上网线,配置完成IP后,直接点开网页,输入示波器的IP地址即可获取示波器的实时界面。类似一种KVM技术。
socket是指对于一些示波器,支持使用Socket网络编程实现数据的交互。在该协议下,对示波器的操作完全按照Socket套接字的方式执行。
(2)tekVisa、pyvisa和vxi11
tekVisa是tek公司推出的一套基于VISA规范的API库,用户可以使用tekVisa来自行开发工具。除此之外,tek还推出了tekVisa的官方版的简单易用的图形化工具openChoice,工具可以完成和示波器的交互。界面如下图所示。这个工具虽然简单使用,但是对于很多操作来说都非常的”不智能“,例如对于示波器的某些操作需要一些较长的时间,此时希望程序能在执行该操作后等待几秒钟再执行下一条,但是对于这样的一个简单的动作,openChoice却无法完成,不得不利用卡bug的方法来完成”等待“的动作。也是基于此原因,令作者产生了自行开发一套更加简单易用的工具的想法。
除了上述的tekVisa以及基于tekVisa开发的官方工具OpenChoise外,还需要每台示波器的指令集才能完成对示波器的操控。事实上,计算机和示波器之间的通信原理实际上可以描述为,使用网线将PC和OSC互联,配置好IP后,使用基于Visa协议的工具建立计算机和示波器之间的通信的通道。而我们对示波器的操作,实际上是封装成了一条一条的指令,单独列在另一份随示波器提供给用户的文档里。不同的机器有不同的指令集。对于tek的设备来说,其指令的格式如下所示:
例如:DPO5104示波器中将CH1的标签名字命名为test的操作指令为,CH1:label:name “test”
将上述指令输入到command输入框中,点击write主机就通过OpenChoise调用TekVisa中的API将该指令发到设备端,设备端解析后会自行执行相应的动作。
tekVisa的API是基于C语言的,实际上python中也提供了visa的封装库,叫做pyvisa,使用pip install pyvisa即可完成安装。pyvisa是将visa库的接口做了符合python使用习惯的封装。该python库是开源的,经笔者测试部分功能还存在bug(例如LAN connection功能有问题,疑似和IO Buffer有关),况且VISA协议是一套很大的协议,包括很多接口形式,但实际上本次使用LAN口来通信,因此很多接口我们都是用不上的,因此有没有一个小一点的专门针对网络的封装库呢?
感谢伟大的Python开发者们,经寻找发现使用vxi11可以很好的符合我们的需求(pip install vxi11),vxi-11是一套网络协议,是专门用于仪器和主机间通信的一套协议。实际上我们可以看到tekVisa中的LAN接口的连接也是基于vxi11实现的。因此本次项目使用vxi11来做设备和主机之间的通信功能。
(3)PySimpleGUI
有了基本的骨架后,剩下的实际上就是添加一副易于操作和显示的皮囊。为加快开发效率,这里选择了PySimpleGUI来做界面的开发。PySimpleGUI是一套优秀的GUI框架。相比于tkinter来说,PySimpleGUI的设计更符合我们普通人的行为习惯,只需要按照我们想要的顺序将对象放在数组里,最终这些对象也都是按照我们拜访的顺序出现在窗口中。最终完成品的界面如下所示:其界面将一些常用的设置放在了面板上、提供了保存文件的接口、提供了运行脚本的入口和一个输出界面。
3、程序实现
(1)使用vxi11建立计算机和示波器之间的联系
核心代码如下:调用vxi11的Instrument方法,参数中的IP地址为device的IP,可以是静态IP也可以是动态分配的IP。
import vxi11
inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’)
print(inst.ask(‘*IND?’))
之后发送指令*IDN?验证是否连接成功,可以返回设备的设备名,即说明连接成功。
(2)向示波器发送指令,读取返回结果和查询指令。
其中ask的函数实际上等价于write+read。这三个指令用于计算机向示波器发送对应的指令,并读取示波器返回的数据。不同示波器的指令不同,需要在官网上找到自己型号的示波器,然后下载对应的文档。例如:《MSO3000-and-DPO3000-Programmer-Manual》类似的文档,里面包含所有可使用的指令。另外,部分指令使用时需要拓展模块,如果示波器上没有相应的配件的话,也无法执行。
inst.write(‘*IND?’)
print(inst.read())
print(inst.ask(‘*IDN?’))
(3)从示波器里读出一张图片,并保存在本地路径下。
核心代码如下所示:需要注意的是,不同的示波器存图的方式是不一样的,对于没有安装操作系统的示波器,可以通过hardcopy的方式来将图片发送给计算机,对于有安装操作系统的,可以先使用hardcopy将截图存在本地,然后使用filesystem.read来将结果读出发送给主机。
#以下MDO3054示波器的保存图片的方式,使用的hardcopy
import vxi11
inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’)
inst.write(‘HARDCopy:PRINTer:ADD “labprn2”, “”, “192.168.1.177”’)
inst.write(‘HARDCopy:ACTIVeprinter “labprn2”’)
inst.write(‘Hardcopy start’)
image = inst.read_raw()
my_file = open(“D:/workspace/python/test2.png”, “wb”)
my_file.write(image)
my_file.close()
inst.close()
#以下是DPO5104B示波器的保存图片的方式,使用的filesystem.read()
inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’)
inst.write(‘HARDCOPY:PORT FILE’)
inst.write(‘HARDCOPY:FILENAME “C:/Windows/temp”’)
inst.write(‘Hardcopy start’)
time.sleep(0.5)
inst.write(‘filesystem:readfile “C:/Windows/temp.png”’)
image = inst.read_raw()
temp = filePath+‘/’+fileName+“.png”
my_file = open( temp , “wb”)
my_file.write(image)
inst.write(‘FILESystem:DELEte “C:/Windows/temp.png”’)
inst.close()
(4)关于图形界面的使用
项目里代码主要用来设计图形用户界面,关于PysimpleGUI的使用,本文不再赘述,基本上是笔者用过的最好用的GUI框架。下文中会给出源代码和最终的可执行程序的链接,供大家学习和使用。
(5)其他
除此之外,本项目使用pyinstaller来将脚本封装为一个exe的可执行文件,封装的时候发现windows defender会报警,网上搜索提示说是和icon有关,使用自带的icon会设计系统调用等内容,导致报警,后续自行从网上扣了个图作为icon。
本项目将指令做了二次封装。使得脚本的编写更加简单。例如,正常情况下,执行测量I2C的建立时间的操作,需要如下指令:
MEASUrement:MEAS1:TYPe delayMEASUrement:MEAS1:SOUrce1 CH2MEASUrement:MEAS1:SOUrce2 CH1MEASUrement:MEAS1:DELay:DIREction backwardsMEASUrement:MEAS1:DELay:EDGE1 riseMEASUrement:MEAS1:DELay:EDGE2 rise 使用封装之后的指令:
delay》》ch2》》rise》》ch1》》rise 脚本还封装了其他常用的操作,可以根据sample里的描述自行设计脚本,加速测试的效率。
当然,最后不能忘的还是最初让笔者决定开发小助手工具的动机:wait。项目里使用time.sleep()函数,来为程序做延时。脚本里当键入wait指令时,会在该位置处暂停2s钟,等待示波器的测试结果稳定,然后再继续执行。
4、测试结果
经测试,本项目的核心功能:自动测量及存图,效果良好。且脚本很简单:可以在1分钟内完成i2c的所有测试项(大约15张图)的测量和保存。大大提升了研发效率。
#设置ch1的label的名称为name
label》》ch1》》clk
label》》ch2》》dat
#等待2s
wait
#一次性执行完频率、上升沿、下降沿、高电平、低电平的测试并存图
time》》FRU_clk》》ch1
#一次性执行完上升沿、下降沿、高电平、低电平的测试并存图
data》》FRU_dat》》ch2
#测量建立时间
delay》》ch2》》fall》》ch1》》rise
wait
save》》FRU_setup
wait
#测量保持时间
delay》》ch1》》fall》》ch2》》fall
wait
save》》FRU_hold
wait
1、项目描述
(1)开发一个工具,可以使计算机通过网线操控示波器,完成指令下发、保存截图、运行脚本等功能;
(2)环境配置:windows10 PC、Tek示波器(兼容3k、5k系列);
(3)使用vxi11完成示波器的通信等操作、使用PySimpleGUI开发工具界面;
(4)对tekvisa的原始指令进行二次封装,提高编写脚本的效率;
2、原理介绍
(1)VISA、e*Scope与Socket
有三种方式可以建立电脑与示波器之间的连接,分别是visa、escope和socket。
visa是Virtual Instrument Software Architecture的缩写,是一套由NI主导的,定义了设备和计算机之间的通信方式的协议。目前主流的设备厂商一般都会有基于VISA所封装好的库,例如tek的有tekVisa等。这些封装库定义了设备和计算机之间的会话连接、资源访问、信息交互等方式,可以很方便的实现PC和OSC之间的交互。需要注意的是,visa的封装已经做到了接口无关,计算机可以使用多种接口(GPIB、USB、LAN、Serial等)完成和设备的交互。而剩下两种都是通过网线做交互的。
1、项目描述
(1)开发一个工具,可以使计算机通过网线操控示波器,完成指令下发、保存截图、运行脚本等功能;
(2)环境配置:windows10 PC、Tek示波器(兼容3k、5k系列);
(3)使用vxi11完成示波器的通信等操作、使用PySimpleGUI开发工具界面;
(4)对tekvisa的原始指令进行二次封装,提高编写脚本的效率;
2、原理介绍
(1)VISA、e*Scope与Socket
有三种方式可以建立电脑与示波器之间的连接,分别是visa、escope和socket。
visa是Virtual Instrument Software Architecture的缩写,是一套由NI主导的,定义了设备和计算机之间的通信方式的协议。目前主流的设备厂商一般都会有基于VISA所封装好的库,例如tek的有tekVisa等。这些封装库定义了设备和计算机之间的会话连接、资源访问、信息交互等方式,可以很方便的实现PC和OSC之间的交互。需要注意的是,visa的封装已经做到了接口无关,计算机可以使用多种接口(GPIB、USB、LAN、Serial等)完成和设备的交互。而剩下两种都是通过网线做交互的。
escope是示波器内集成的一套程序,可以使主机在和设备接上网线,配置完成IP后,直接点开网页,输入示波器的IP地址即可获取示波器的实时界面。类似一种KVM技术。
socket是指对于一些示波器,支持使用Socket网络编程实现数据的交互。在该协议下,对示波器的操作完全按照Socket套接字的方式执行。
(2)tekVisa、pyvisa和vxi11
tekVisa是tek公司推出的一套基于VISA规范的API库,用户可以使用tekVisa来自行开发工具。除此之外,tek还推出了tekVisa的官方版的简单易用的图形化工具openChoice,工具可以完成和示波器的交互。界面如下图所示。这个工具虽然简单使用,但是对于很多操作来说都非常的”不智能“,例如对于示波器的某些操作需要一些较长的时间,此时希望程序能在执行该操作后等待几秒钟再执行下一条,但是对于这样的一个简单的动作,openChoice却无法完成,不得不利用卡bug的方法来完成”等待“的动作。也是基于此原因,令作者产生了自行开发一套更加简单易用的工具的想法。
除了上述的tekVisa以及基于tekVisa开发的官方工具OpenChoise外,还需要每台示波器的指令集才能完成对示波器的操控。事实上,计算机和示波器之间的通信原理实际上可以描述为,使用网线将PC和OSC互联,配置好IP后,使用基于Visa协议的工具建立计算机和示波器之间的通信的通道。而我们对示波器的操作,实际上是封装成了一条一条的指令,单独列在另一份随示波器提供给用户的文档里。不同的机器有不同的指令集。对于tek的设备来说,其指令的格式如下所示:
例如:DPO5104示波器中将CH1的标签名字命名为test的操作指令为,CH1:label:name “test”
将上述指令输入到command输入框中,点击write主机就通过OpenChoise调用TekVisa中的API将该指令发到设备端,设备端解析后会自行执行相应的动作。
tekVisa的API是基于C语言的,实际上python中也提供了visa的封装库,叫做pyvisa,使用pip install pyvisa即可完成安装。pyvisa是将visa库的接口做了符合python使用习惯的封装。该python库是开源的,经笔者测试部分功能还存在bug(例如LAN connection功能有问题,疑似和IO Buffer有关),况且VISA协议是一套很大的协议,包括很多接口形式,但实际上本次使用LAN口来通信,因此很多接口我们都是用不上的,因此有没有一个小一点的专门针对网络的封装库呢?
感谢伟大的Python开发者们,经寻找发现使用vxi11可以很好的符合我们的需求(pip install vxi11),vxi-11是一套网络协议,是专门用于仪器和主机间通信的一套协议。实际上我们可以看到tekVisa中的LAN接口的连接也是基于vxi11实现的。因此本次项目使用vxi11来做设备和主机之间的通信功能。
(3)PySimpleGUI
有了基本的骨架后,剩下的实际上就是添加一副易于操作和显示的皮囊。为加快开发效率,这里选择了PySimpleGUI来做界面的开发。PySimpleGUI是一套优秀的GUI框架。相比于tkinter来说,PySimpleGUI的设计更符合我们普通人的行为习惯,只需要按照我们想要的顺序将对象放在数组里,最终这些对象也都是按照我们拜访的顺序出现在窗口中。最终完成品的界面如下所示:其界面将一些常用的设置放在了面板上、提供了保存文件的接口、提供了运行脚本的入口和一个输出界面。
3、程序实现
(1)使用vxi11建立计算机和示波器之间的联系
核心代码如下:调用vxi11的Instrument方法,参数中的IP地址为device的IP,可以是静态IP也可以是动态分配的IP。
import vxi11
inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’)
print(inst.ask(‘*IND?’))
之后发送指令*IDN?验证是否连接成功,可以返回设备的设备名,即说明连接成功。
(2)向示波器发送指令,读取返回结果和查询指令。
其中ask的函数实际上等价于write+read。这三个指令用于计算机向示波器发送对应的指令,并读取示波器返回的数据。不同示波器的指令不同,需要在官网上找到自己型号的示波器,然后下载对应的文档。例如:《MSO3000-and-DPO3000-Programmer-Manual》类似的文档,里面包含所有可使用的指令。另外,部分指令使用时需要拓展模块,如果示波器上没有相应的配件的话,也无法执行。
inst.write(‘*IND?’)
print(inst.read())
print(inst.ask(‘*IDN?’))
(3)从示波器里读出一张图片,并保存在本地路径下。
核心代码如下所示:需要注意的是,不同的示波器存图的方式是不一样的,对于没有安装操作系统的示波器,可以通过hardcopy的方式来将图片发送给计算机,对于有安装操作系统的,可以先使用hardcopy将截图存在本地,然后使用filesystem.read来将结果读出发送给主机。
#以下MDO3054示波器的保存图片的方式,使用的hardcopy
import vxi11
inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’)
inst.write(‘HARDCopy:PRINTer:ADD “labprn2”, “”, “192.168.1.177”’)
inst.write(‘HARDCopy:ACTIVeprinter “labprn2”’)
inst.write(‘Hardcopy start’)
image = inst.read_raw()
my_file = open(“D:/workspace/python/test2.png”, “wb”)
my_file.write(image)
my_file.close()
inst.close()
#以下是DPO5104B示波器的保存图片的方式,使用的filesystem.read()
inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’)
inst.write(‘HARDCOPY:PORT FILE’)
inst.write(‘HARDCOPY:FILENAME “C:/Windows/temp”’)
inst.write(‘Hardcopy start’)
time.sleep(0.5)
inst.write(‘filesystem:readfile “C:/Windows/temp.png”’)
image = inst.read_raw()
temp = filePath+‘/’+fileName+“.png”
my_file = open( temp , “wb”)
my_file.write(image)
inst.write(‘FILESystem:DELEte “C:/Windows/temp.png”’)
inst.close()
(4)关于图形界面的使用
项目里代码主要用来设计图形用户界面,关于PysimpleGUI的使用,本文不再赘述,基本上是笔者用过的最好用的GUI框架。下文中会给出源代码和最终的可执行程序的链接,供大家学习和使用。
(5)其他
除此之外,本项目使用pyinstaller来将脚本封装为一个exe的可执行文件,封装的时候发现windows defender会报警,网上搜索提示说是和icon有关,使用自带的icon会设计系统调用等内容,导致报警,后续自行从网上扣了个图作为icon。
本项目将指令做了二次封装。使得脚本的编写更加简单。例如,正常情况下,执行测量I2C的建立时间的操作,需要如下指令:
MEASUrement:MEAS1:TYPe delayMEASUrement:MEAS1:SOUrce1 CH2MEASUrement:MEAS1:SOUrce2 CH1MEASUrement:MEAS1:DELay:DIREction backwardsMEASUrement:MEAS1:DELay:EDGE1 riseMEASUrement:MEAS1:DELay:EDGE2 rise 使用封装之后的指令:
delay》》ch2》》rise》》ch1》》rise 脚本还封装了其他常用的操作,可以根据sample里的描述自行设计脚本,加速测试的效率。
当然,最后不能忘的还是最初让笔者决定开发小助手工具的动机:wait。项目里使用time.sleep()函数,来为程序做延时。脚本里当键入wait指令时,会在该位置处暂停2s钟,等待示波器的测试结果稳定,然后再继续执行。
4、测试结果
经测试,本项目的核心功能:自动测量及存图,效果良好。且脚本很简单:可以在1分钟内完成i2c的所有测试项(大约15张图)的测量和保存。大大提升了研发效率。
#设置ch1的label的名称为name
label》》ch1》》clk
label》》ch2》》dat
#等待2s
wait
#一次性执行完频率、上升沿、下降沿、高电平、低电平的测试并存图
time》》FRU_clk》》ch1
#一次性执行完上升沿、下降沿、高电平、低电平的测试并存图
data》》FRU_dat》》ch2
#测量建立时间
delay》》ch2》》fall》》ch1》》rise
wait
save》》FRU_setup
wait
#测量保持时间
delay》》ch1》》fall》》ch2》》fall
wait
save》》FRU_hold
wait
举报