STM32
直播中

杨勇

7年用户 1188经验值
私信 关注
[问答]

怎样去开发一种基于PySimpleGUI和VXI11的示波器小助手呢

有哪几种方法可以去建立电脑与示波器之间的连接呢?
怎样去开发一种基于PySimpleGUI和VXI11的示波器小助手呢?

回帖(1)

杨军

2021-11-5 11:07:01
  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
举报

更多回帖

发帖
×
20
完善资料,
赚取积分